on xenial help sign in
Merge trunk.
commit0a9e4a77e143a02c7f251393aaf353df6aa77069 authorMichał Sawicz <michal.sawicz@canonical.com> dateThu 17 Apr 2014, 10:06 (13 years ago) parentdde65cba07cba7
205 files changed+6062−5673
.bazaar/plugins/makecheck_unity_phablet.py+1−1 build+3 cmake/modules/QmlTest.cmake+75−2 data/unity8.conf+3−2 debian/changelog+250 debian/control+12−8 debian/unity8-autopilot.install+1 debian/unity8-fake-env.install+1 debian/unity8.install+1−1 include/paths.h.in+10 plugins/DashViews/listviewwithpageheader.cpp+1−6 plugins/Powerd/CMakeLists.txt+8 plugins/Powerd/Powerd.cpp+17 plugins/Powerd/Powerd.h+3 plugins/Unity/Indicators/CMakeLists.txt−3 plugins/Unity/Indicators/indicatorsmanager.cpp−33 plugins/Unity/Indicators/indicatorsmanager.h−2 plugins/Utils/CMakeLists.txt+2−3 plugins/Utils/albumartprovider.cpp−236 plugins/Utils/albumartprovider.h−56 plugins/Utils/easingcurve.cpp+67 plugins/Utils/easingcurve.h+70 plugins/Utils/mediaartcache.cpp−178 plugins/Utils/mediaartcache.h−54 plugins/Utils/plugin.cpp+2−14 po/am.po+24−30 po/ar.po+38−35 po/ast.po+19−33 po/az.po+34−31 po/bg.po+20−34 po/br.po+164 po/bs.po+16−29 po/ca.po+33−30 po/ckb.po+34−31 po/cs.po+35−32 po/da.po+16−29 po/de.po+34−31 po/el.po+34−31 po/en_AU.po+34−31 po/en_GB.po+34−31 po/eo.po+16−29 po/es.po+19−33 po/eu.po+19−33 po/fa.po+16−29 po/fi.po+19−33 po/fo.po+16−29 po/fr.po+34−31 po/gd.po+36−33 po/gl.po+19−33 po/he.po+34−31 po/hi.po+19−29 po/hr.po+16−29 po/hu.po+34−31 po/hy.po+16−29 po/id.po+16−29 po/is.po+34−31 po/it.po+34−31 po/ja.po+24−30 po/km.po+33−30 po/kn.po+16−29 po/ko.po+16−29 po/ky.po+16−29 po/lo.po+24−30 po/lt.po+35−32 po/lv.po+16−29 po/ml.po+34−31 po/mr.po+16−29 po/ms.po+34−31 po/my.po+25−31 po/nb.po+16−29 po/nl.po+34−31 po/pl.po+35−32 po/pt.po+16−29 po/pt_BR.po+34−31 po/ro.po+16−29 po/ru.po+26−40 po/shn.po+16−29 po/si.po+16−29 po/sl.po+36−33 po/sq.po+28−31 po/sr.po+16−29 po/sv.po+16−29 po/sw.po+19−29 po/ta.po+35−32 po/te.po+16−29 po/tr.po+34−31 po/ug.po+22−35 po/uk.po+35−32 po/unity8.pot+14−28 po/vi.po+16−29 po/xh.po+16−29 po/zh_CN.po+16−29 po/zh_HK.po+33−30 po/zh_TW.po+33−30 qml/CMakeLists.txt+1−1 qml/Components/AnimationControllerWithSignals.qml−64 qml/Components/ApplicationManagerWrapper.qml−169 qml/Components/ApplicationScreenshot.qml−61 qml/Components/ApplicationsModelStageFiltered.qml−49 qml/Components/Carousel.qml+82−82 qml/Components/FilterGrid.qml+1 qml/Components/LazyImage.qml+2−2 qml/Components/ResponsiveFlowView.qml+3−10 qml/Components/ResponsiveGridView.qml+1 qml/Components/Stage.qml−571 qml/Dash/Apps/RunningApplicationTile.qml+14−24 qml/Dash/Apps/RunningApplicationsGrid.qml+5−20 qml/Dash/Card.qml+130−90 qml/Dash/CardCarousel.qml+1−1 qml/Dash/CardFilterGrid.qml+5−6 qml/Dash/CardHeader.qml+41−31 qml/Dash/DashApps.qml+5−6 qml/Dash/DashContent.qml+5−10 qml/Dash/DashRenderer.qml+2−6 qml/Dash/GenericScopeView.qml+19−27 qml/Dash/Previews/PreviewRatingDisplay.qml+4−2 qml/Dash/Previews/PreviewRatingInput.qml+4−2 qml/Dash/Previews/PreviewVideoPlayback.qml+1 qml/Dash/ScopeDelegateMapper.qml−30 qml/Launcher/Launcher.qml+2−1 qml/Notifications/Notification.qml+61−4 qml/Notifications/NotificationMenuItemFactory.qml+2−1 qml/Notifications/Notifications.qml+4 qml/Panel/Panel.qml+1−1 qml/Shell.qml+200−309 qml/SideStage/SideStage.qml−73 qml/Stages/PhoneStage.qml+499 qml/SideStage/SidestageHandle.qml → qml/Stages/SidestageHandle.qml qml/Stages/SpreadDelegate.qml+55 qml/Stages/StageWithSideStage.qml+407 qml/Stages/SwitchingApplicationImage.qml+81 qml/Stages/TransformedSpreadDelegate.qml+327 qml/Stages/graphics/dropshadow.png qml/SideStage/graphics/sidestage_handle@20.png → qml/Stages/graphics/sidestage_handle@20.png qml/SideStage/graphics/sidestage_handle@20.sci → qml/Stages/graphics/sidestage_handle@20.sci qml/graphics/phone_background.jpg qml/graphics/tablet_background.jpg run+15−1 src/ApplicationArguments.h+2−2 src/Panel/Indicators/client/indicatorsclient.cpp+2−2 src/main.cpp+3−6 tests/CMakeLists.txt+2−2 tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49 tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+56−72 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+8−39 tests/autopilot/unity8/indicators/tests/__init__.py+17 tests/autopilot/unity8/indicators/tests/test_indicators.py+69−13 tests/autopilot/unity8/process_helpers.py+16 tests/autopilot/unity8/shell/emulators/__init__.py+2−6 tests/autopilot/unity8/shell/emulators/dash.py+35−10 tests/autopilot/unity8/shell/emulators/main_window.py+33−3 tests/autopilot/unity8/shell/tests/__init__.py+1−1 tests/autopilot/unity8/shell/tests/test_emulators.py+27−17 tests/autopilot/unity8/shell/tests/test_notifications.py+3−4 tests/autopilot/unity8/shell/tests/test_system_integration.py+3−2 tests/mocks/Ubuntu/CMakeLists.txt+1 tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txt+7 tests/mocks/Ubuntu/Thumbnailer/qmldir+2 tests/mocks/Unity/Application/ApplicationInfo.cpp+9 tests/mocks/Unity/Application/ApplicationInfo.h+2 tests/mocks/Unity/Application/ApplicationManager.cpp+109−3 tests/mocks/Unity/Application/ApplicationManager.h+16 tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp+77 tests/mocks/Unity/Application/ApplicationScreenshotProvider.h+34 tests/mocks/Unity/Application/CMakeLists.txt+15 tests/mocks/Unity/Application/plugin.cpp+18−3 tests/mocks/Unity/Application/plugin.h+1 tests/plugins/DashViews/listviewwithpageheadertest.cpp−1 tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+3−3 tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−11 tests/plugins/Unity/Launcher/launchermodeltest.cpp+5 tests/qmltests/CMakeLists.txt+4−7 tests/qmltests/Components/CMakeLists.txt+2−10 tests/qmltests/Components/tst_AnimationControllerWithSignals.qml−142 tests/qmltests/Components/tst_Carousel.qml+224−171 tests/qmltests/Components/tst_LazyImage.qml+7 tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−2 tests/qmltests/Components/tst_Stage.qml−278 tests/qmltests/Components/tst_Stage/AppControl.qml−42 tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qml−53 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+50−117 tests/qmltests/Dash/qml/FakeScopeView.qml−45 tests/qmltests/Dash/qml/fake_generic_scopeView.qml−24 tests/qmltests/Dash/qml/fake_scopeView1.qml−24 tests/qmltests/Dash/qml/fake_scopeView2.qml−24 tests/qmltests/Dash/qml/fake_scopeView3.qml−24 tests/qmltests/Dash/qml/fake_scopeView4.qml−24 tests/qmltests/Dash/tst_Card.qml+12−10 tests/qmltests/Dash/tst_CardBenchmark.qml+94 tests/qmltests/Dash/tst_CardHeader.qml+1−1 tests/qmltests/Dash/tst_Dash.qml−11 tests/qmltests/Dash/tst_DashContent.qml+27−51 tests/qmltests/Dash/tst_GenericScopeView.qml+14−2 tests/qmltests/Launcher/tst_Launcher.qml+1 tests/qmltests/Notifications/tst_Notifications.qml+27−13 tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qml+238 tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+1 tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1 tests/qmltests/SideStage/tst_SideStage.qml−52 tests/qmltests/Stages/tst_PhoneStage.qml+288 tests/qmltests/tst_Shell.qml+27−8 tests/uqmlscene/main.cpp+13 tools/CMakeLists.txt+2 tools/scopetool.cpp+1 tools/unlock-device+42
.bazaar/plugins/makecheck_unity_phablet.py+1−1
@@ -18,7 +18,7 @@ from bzrlib import branch, errors
1818from bzrlib.urlutils import dirname, local_path_from_url
1919
2020def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
21− if not master_branch.basis_tree().has_filename("Shell.qml"):
21+ if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
2222 return
2323
2424 os.chdir(local_path_from_url(master_branch.base))
build+3
@@ -41,16 +41,19 @@ install_dependencies() {
4141 sudo apt-get install devscripts \
4242 equivs \
4343 gsettings-desktop-schemas \
44+ gsettings-ubuntu-schemas \
4445 qmenumodel-qml \
4546 qtdeclarative5-dee-plugin \
4647 qtdeclarative5-gsettings1.0 \
4748 qtdeclarative5-ubuntu-ui-toolkit-plugin \
4849 qtdeclarative5-ubuntu-settings-components \
50+ qtdeclarative5-ubuntu-thumbnailer0.1 \
4951 unity-notifications-impl \
5052 qtdeclarative5-xmllistmodel-plugin \
5153 unity-scope-home \
5254 unity-lens-applications \
5355 unity-plugin-scopes \
56+ xvfb \
5457 || exit 5
5558}
5659
cmake/modules/QmlTest.cmake+75−2
@@ -58,13 +58,22 @@ macro(add_manual_qml_test SUBPATH COMPONENT_NAME)
5858
5959endmacro(add_manual_qml_test)
6060
61+macro(add_qml_benchmark SUBPATH COMPONENT_NAME ITERATIONS)
62+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} ${ITERATIONS})
63+endmacro(add_qml_benchmark)
64+
6165macro(add_qml_test SUBPATH COMPONENT_NAME)
66+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} 0)
67+endmacro(add_qml_test)
68+
69+macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
6270 set(options NO_ADD_TEST NO_TARGETS)
6371 set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
6472
6573 cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
6674
6775 set(qmltest_TARGET test${COMPONENT_NAME})
76+ set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
6877 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
6978
7079 set(qmltestrunner_imports "")
@@ -80,13 +89,78 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
8089 endforeach(IMPORT_PATH)
8190 endif()
8291
92+ string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
93+ if(cmake_generator_lower STREQUAL "unix makefiles")
94+ set(function_ARGS $(FUNCTION))
95+ else()
96+ set(function_ARGS "")
97+ endif()
98+
99+ if (${ITERATIONS} GREATER 0)
100+ set(ITERATIONS_STRING "-iterations" ${ITERATIONS})
101+ else()
102+ set(ITERATIONS_STRING "")
103+ endif()
104+
83105 set(qmltest_command
84106 env ${qmltest_ENVIRONMENT}
85107 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
86108 ${qmltestrunner_imports}
109+ ${ITERATIONS_STRING}
110+ -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
111+ -o -,txt
112+ ${function_ARGS}
113+ )
114+ find_program( HAVE_GCC gcc )
115+ if (NOT ${HAVE_GCC} STREQUAL "")
116+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
117+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
118+ endif()
119+ set(qmltest_xvfb_command
120+ env ${qmltest_ENVIRONMENT} ${LD_PRELOAD_PATH}
121+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
122+ ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
123+ ${qmltestrunner_imports}
87124 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
88125 -o -,txt
126+ ${function_ARGS}
89127 )
128+
129+ add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
130+ add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
131+ add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
132+endmacro(add_qml_test_internal)
133+
134+macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
135+ set(testCommand
136+ LD_LIBRARY_PATH=${LD_PATH}
137+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
138+ -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
139+ -o -,txt)
140+
141+ add_qmltest_target(test${CLASS_NAME} "${testCommand}" FALSE TRUE)
142+ add_dependencies(test${CLASS_NAME} ${CLASS_NAME}TestExec ${DEPS})
143+
144+ find_program( HAVE_GCC gcc )
145+ if (NOT ${HAVE_GCC} STREQUAL "")
146+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
147+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
148+ endif()
149+ set(xvfbtestCommand
150+ ${LD_PRELOAD_PATH}
151+ LD_LIBRARY_PATH=${LD_PATH}
152+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
153+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
154+ -o ${CMAKE_BINARY_DIR}/${CLASS_NAME}Test.xml,xunitxml
155+ -o -,txt)
156+
157+ add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
158+ add_dependencies(qmluitests xvfbtest${CLASS_NAME})
159+
160+ add_manual_qml_test(. ${CLASS_NAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
161+endmacro(add_binary_qml_test)
162+
163+macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
90164 add_custom_target(${qmltest_TARGET} ${qmltest_command})
91165
92166 if(NOT "${qmltest_PROPERTIES}" STREQUAL "")
@@ -117,5 +191,4 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
117191 endif()
118192 endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
119193
120− add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
121−endmacro(add_qml_test)
194+endmacro(add_qmltest_target)
data/unity8.conf+3−2
@@ -1,12 +1,12 @@
11description "Unity Shell v8"
22author "Ricardo Mendoza <ricmm@ubuntu.com>"
33
4−emits scope-ui-starting
4+emits scope-ui-starting indicator-services-start
55
66start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
77stop on desktop-end
88
9−kill timeout 30
9+kill timeout 120
1010
1111respawn
1212expect stop
@@ -42,6 +42,7 @@ pre-start script
4242 fi
4343
4444 initctl emit scope-ui-starting
45+ initctl emit indicator-services-start
4546end script
4647
4748exec ${BINARY:-unity8} $ARGS
debian/changelog+250
@@ -1,3 +1,253 @@
1+unity8 (7.85+14.04.20140416-0ubuntu1) trusty; urgency=low
2+
3+ [ Albert Astals ]
4+ * Fix last item X position Fixes clicking on the last item sometimes
5+ not working (LP: #1301871)
6+ * Use upstart in ./run Makes it so that you can use the lock button on
7+ the device without getting that nasty hwc crash
8+ * Remove AnimationControllerWithSignals.
9+ * Use the correct delegate base item for the Carousel test
10+ * Some simplification in DashContent Kill the ScopeDelegateMapper in
11+ favour of a simple if (that will eventually go away). Removal of all
12+ the fake scopes in the tests that added nothing of value to the
13+ tests. Removal of movementEnded signal that was unused. Removal of
14+ movementStarted and positionedAtBeginning signals that were being
15+ used as function calls. Rework DashContent tests so they what the
16+ function does what it is supposed to do instead of just making sure
17+ QML signals work .
18+ * Improve Card creation time by adding loaders that make sure only
19+ what's needed is loaded In my computer it goes from RESULT :
20+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
21+ l": 3.217 msecs per iteration (total: 3,218, iterations: 1000)
22+ RESULT :
23+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
24+ 1.647 msecs per iteration (total: 1,648, iterations: 1000) RESULT :
25+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.514
26+ msecs per iteration (total: 1,515, iterations: 1000) RESULT :
27+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.471 msecs per
28+ iteration (total: 1,471, iterations: 1000) RESULT :
29+ qmltestrunner::benchmark_time:"cardArtModel": 1.447 msecs per
30+ iteration (total: 1,448, iterations: 1000) RESULT :
31+ qmltestrunner::benchmark_time:"cardTitleModel": 1.276 msecs per
32+ iteration (total: 1,276, iterations: 1000) to RESULT :
33+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
34+ l": 2.916 msecs per iteration (total: 2,917, iterations: 1000)
35+ RESULT :
36+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
37+ 1.504 msecs per iteration (total: 1,504, iterations: 1000) RESULT :
38+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.060
39+ msecs per iteration (total: 1,061, iterations: 1000) RESULT :
40+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.052 msecs per
41+ iteration (total: 1,053, iterations: 1000) RESULT :
42+ qmltestrunner::benchmark_time:"cardArtModel": 0.727 msecs per
43+ iteration (total: 728, iterations: 1000) RESULT :
44+ qmltestrunner::benchmark_time:"cardTitleModel": 0.817 msecs per
45+ iteration (total: 818, iterations: 1000) (LP: #1297197)
46+
47+ [ Allan LeSage ]
48+ * DashApps emulator get_applications should return a list ordered by
49+ visible y, x.
50+
51+ [ Andrea Cimitan ]
52+ * Workaround for lp1301309 until fixes for palette in ui toolkit (LP:
53+ #1301309)
54+
55+ [ Leo Arias ]
56+ * Reverted the change that returns application cards instead of
57+ titles.
58+
59+ [ Nick Dedekind ]
60+ * Indicator services started by unity8 upstart configuration rather
61+ than manual emmision from indicator manager.
62+
63+ [ Mirco Müller ]
64+ * Fix notification ap-test assertions.
65+
66+ [ Michael Terry ]
67+ * Use new tablet and phone backgrounds from Design.
68+
69+ [ Michael Zanetti ]
70+ * workaround the QTestLogger assertion issue with make tryXyz and our
71+ custom uqmlscene
72+
73+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 16 Apr 2014 13:45:01 +0000
74+
75+unity8 (7.85+14.04.20140415.2-0ubuntu1) trusty; urgency=low
76+
77+ [ Michael Terry ]
78+ * When an application requests focus, handle it in Shell.qml by hiding
79+ the greeter and stopping any edge demo. (LP: #1227753)
80+
81+ [ Leo Arias ]
82+ * Use subprocess.check_call when caling url-dispatcher, so an error
83+ will be raised if it fails.
84+ * Test application life cycle with fake apps, instead of messaging and
85+ address book.
86+
87+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 15 Apr 2014 12:47:11 +0000
88+
89+unity8 (7.85+14.04.20140410.1-0ubuntu1) trusty; urgency=medium
90+
91+ [ Didier Roche ]
92+ * Resync trunk with previous revert upload
93+
94+ [ Michał Sawicz ]
95+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
96+ lp:1291575 (LP: #1291575)
97+
98+ [ Albert Astals ]
99+ * Take into account the originY when specifying the delegate ranges
100+ Fixes bug #1300302 (LP: #1300302)
101+
102+ [ CI bot ]
103+ * Resync trunk
104+
105+ [ Allan LeSage ]
106+ * Swiping open an indicator must show its correct title--protect
107+ against lp:1253804 . (LP: #1253804)
108+
109+ [ Alexander Sack ]
110+ * Fix TypeError: issue seen in system_integration autopilot test on
111+ image 279. (LP: #1303685)
112+
113+ [ Bill Filler ]
114+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
115+ lp:1291575 (LP: #1291575)
116+
117+ [ Leo Arias ]
118+ * Added a search autopilot helper.
119+
120+ [ Michael Terry ]
121+ * Provide a all-in-one script for getting a device to an unlocked
122+ state.
123+
124+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Apr 2014 10:03:31 +0000
125+
126+unity8 (7.85+14.04.20140404.is.7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=medium
127+
128+ * Revert to previous version as it's linked to latest sdk change which
129+ is making gallery-app AP tests failing on the CI dashboard
130+
131+ -- Didier Roche <didrocks@ubuntu.com> Tue, 08 Apr 2014 13:53:47 +0200
132+
133+unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
134+
135+ [ Albert Astals ]
136+ * Adapt to new TabBar
137+
138+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Apr 2014 15:03:00 +0000
139+
140+unity8 (7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=low
141+
142+ [ Michael Terry ]
143+ * Re-enable test_networkmanager_integration autopilot test on phone
144+ platforms
145+
146+ [ CI bot ]
147+ * Resync trunk
148+
149+ [ Leo Arias ]
150+ * Reverted the open_preview autopilot helper to return a Preview
151+ object.
152+
153+ [ Albert Astals ]
154+ * If not running in Mir load the "fake" application manager (LP:
155+ #1301547)
156+ * Remove unused properties from DashRenderer
157+
158+ [ Michael Zanetti ]
159+ * Fix tests after right edge merge. Drop old stages tests. Fix right
160+ edge tests if someone doesn't have the GRID_UNIT_PX exported. make
161+ GenericScopeView test more robust that broke because the ordering
162+ changed
163+ * add "make xvfbtestSomething" target to run qml tests in xvfb
164+ * make the "make test" commit hook work again
165+
166+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Apr 2014 10:38:53 +0000
167+
168+unity8 (7.85+14.04.20140401.3-0ubuntu1) trusty; urgency=medium
169+
170+ [ Michał Sawicz ]
171+ * Bump version to ensure incompatibility with previous Unity.Application
172+ implementations.
173+ * We'll only have the unity-mir and mock Ubuntu.Application plugins
174+ now, no need for mangling the import paths.
175+
176+ [ Michal Hruby ]
177+ * Remove the albumart image provider. (LP: #1262711)
178+ * Don't reset search string after 2 seconds. (LP: #1297246)
179+
180+ [ James Henstridge ]
181+ * Remove the albumart image provider. (LP: #1262711)
182+
183+ [ Albert Astals ]
184+ * Carousel: Add test to make sure we only create the needed delegates
185+ and not more
186+ * LVWPH: Remove processEvents() call from updatePolish() It causes
187+ some reentrancy issues and in some times you end up in polishItems()
188+ with items that have been deleted because you called processEvents()
189+ This means i need a small tweak in itemGeometryChanged to not
190+ reposition items if we are inside a setContentHeight call and two
191+ small tweaks to tests since now things happen in a different order
192+ and numbers are different (though equivalent) (LP: #1297240)
193+ * Card.qml binding loops are gone. hooray \o/ Also made the aspect
194+ properties readonly
195+
196+ [ Mirco Müller ]
197+ * A potential fix for "Cannot read property 'state' of null"-failure
198+ on Jenkins with the VisualSnapDecisionsQueue QML-test of
199+ notifications.
200+
201+ [ Michael Terry ]
202+ * Pass user's preference for auto-brightness on to powerd. (LP:
203+ #1273174)
204+
205+ [ Michael Zanetti ]
206+ * Registers a dummy QObject as QTestRootObject in uqmlscene in order
207+ to fix make trySomething with Qt 5.2.
208+
209+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Apr 2014 22:56:52 +0000
210+
211+unity8 (7.84+14.04.20140327.1-0ubuntu2) trusty; urgency=medium
212+
213+ * For now, have libunity-private depending on libunity-core-6.0-9 as the
214+ gsettings schema is here. The dependency wasn't direct and dropped from
215+ Touch image #271. Consequently, unity8 didn't start (gsettings
216+ segfaulting).
217+ Proper strategy will be to include the schema in another package to only
218+ pull it.
219+
220+ -- Didier Roche <didrocks@ubuntu.com> Tue, 01 Apr 2014 09:52:14 +0200
221+
222+unity8 (7.84+14.04.20140327.1-0ubuntu1) trusty; urgency=low
223+
224+ [ Michał Sawicz ]
225+ * Increase kill timeout so that crashes are not truncated.
226+
227+ [ Ying-Chun Liu ]
228+ * Fix a small typo in LazyImage: scale -> scaleTo
229+
230+ [ Albert Astals ]
231+ * Make geometry calls for autopilot work again -geometry is a internal
232+ Qt argument that only works for QWidget based apps Before it was
233+ being returned to us in -args but now it's eaten so we need to use a
234+ different one, -windowgeometry
235+ * Make "Recent" translatable and update pot file
236+
237+ [ Mirco Müller ]
238+ * Make visual queue of (up to five) snap-decisions contract and expand
239+ according to visual design-spec.
240+
241+ [ Michael Terry ]
242+ * Pass user's preference for auto-brightness on to powerd. (LP:
243+ #1273174)
244+
245+ [ Michael Zanetti ]
246+ * allow executing a single test function example: make testShell
247+ FUNCTION="Shell::test_background"
248+
249+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 27 Mar 2014 12:38:21 +0000
250+
1251unity8 (7.84+14.04.20140324.4-0ubuntu1) trusty; urgency=low
2252
3253 [ Michal Hruby ]
debian/control+12−8
@@ -13,13 +13,10 @@ Build-Depends: cmake,
1313 libgles2-mesa-dev[armhf],
1414 libgsettings-qt-dev,
1515 libhud-client2-dev,
16− libnih-dbus-dev,
17− libnih-dev,
1816 libpulse-dev,
1917 libqmenumodel-dev (>= 0.2.7),
20− libunity-api-dev (>= 7.80.4),
18+ libunity-api-dev (>= 7.80.6),
2119 libunity-mir-dev,
22− libupstart-dev,
2320 libusermetricsoutput1-dev,
2421 libxcb1-dev,
2522 libglib2.0-dev,
@@ -80,12 +77,15 @@ Depends: gsettings-desktop-schemas,
8077 qtdeclarative5-dee-plugin,
8178 qtdeclarative5-gsettings1.0,
8279 qtdeclarative5-ubuntu-settings-components,
80+ qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
81+ ubuntu-thumbnailer-impl-0,
8382 qtdeclarative5-ubuntu-ui-toolkit-plugin (>= 0.1.47),
8483 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
8584 qtdeclarative5-xmllistmodel-plugin,
85+ unity-application-impl-2,
8686 unity-launcher-impl-3,
8787 unity-notifications-impl-2,
88− unity8-fake-env | qtubuntu-shell,
88+ unity8-fake-env | unity-application-impl,
8989 unity8-private (= ${binary:Version}),
9090 unity8-private | unity-launcher-impl,
9191 unity-plugin-scopes | unity-scopes-impl,
@@ -97,7 +97,8 @@ Depends: gsettings-desktop-schemas,
9797Recommends: unity-scope-click,
9898 unity-scope-mediascanner2,
9999 unity-scope-scopes,
100−Breaks: indicator-network (<< 0.5.1)
100+Breaks: indicator-network (<< 0.5.1),
101+ ubuntu-touch-session (<< 0.107),
101102Replaces: ubuntu-touch-session (<< 0.82~)
102103Description: Unity 8 shell
103104 The Unity 8 shell is the primary user interface for Ubuntu devices.
@@ -134,7 +135,8 @@ Multi-Arch: same
134135Pre-Depends: ${misc:Pre-Depends},
135136Depends: ${misc:Depends},
136137 ${shlibs:Depends},
137−Provides: qtubuntu-shell,
138+Provides: unity-application-impl,
139+ unity-application-impl-2,
138140Description: Fake environment for running Unity 8 shell
139141 Provides fake implementations of some QML modules used by Unity 8 shell
140142 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
@@ -143,8 +145,10 @@ Package: unity8-private
143145Architecture: any
144146Multi-Arch: same
145147Pre-Depends: ${misc:Pre-Depends},
146−Depends: ${misc:Depends},
148+Depends: gsettings-ubuntu-schemas,
149+ ${misc:Depends},
147150 ${shlibs:Depends},
151+ libunity-core-6.0-9,
148152Provides: unity-launcher-impl,
149153 unity-launcher-impl-3,
150154Description: Unity 8 private libs
debian/unity8-autopilot.install+1
@@ -1 +1,2 @@
11usr/lib/python*/*/unity*
2+usr/share/unity8/unlock-device
debian/unity8-fake-env.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/unity8/qml/nonmirplugins
12usr/lib/*/unity8/qml/mocks
23usr/lib/*/unity8/qml/scopefakes
34usr/share/unity8/mocks
debian/unity8.install+1−1
@@ -10,6 +10,6 @@ usr/share/unity8/Launcher
1010usr/share/unity8/Notifications
1111usr/share/unity8/Panel
1212usr/share/unity8/Shell.qml
13−usr/share/unity8/SideStage
13+usr/share/unity8/Stages
1414usr/share/unity8/graphics
1515data/unity8.conf usr/share/upstart/sessions/
include/paths.h.in+10
@@ -57,6 +57,16 @@ inline QStringList overrideImportPaths() {
5757 return paths;
5858}
5959
60+inline QStringList nonMirImportPaths() {
61+ QStringList paths;
62+ if (isRunningInstalled()) {
63+ paths << QString("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
64+ } else {
65+ paths << QString("@CMAKE_BINARY_DIR@/nonmirplugins");
66+ }
67+ return paths;
68+}
69+
6070inline QStringList fallbackImportPaths() {
6171 QStringList paths;
6272 if (isRunningInstalled()) {
plugins/DashViews/listviewwithpageheader.cpp+1−6
@@ -1097,7 +1097,7 @@ void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QR
10971097{
10981098 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
10991099 if (heightDiff != 0) {
1100− if (oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1100+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
11011101 ListItem *firstItem = m_visibleItems.first();
11021102 firstItem->setY(firstItem->y() - heightDiff);
11031103 adjustMinYExtent();
@@ -1293,11 +1293,6 @@ void ListViewWithPageHeader::updatePolish()
12931293 refill();
12941294
12951295 if (m_contentHeightDirty) {
1296− // We need to make sure all bindings have updated otherwise
1297− // we may end up with bindings updating when we call setContentHeight
1298− // and then everything gets out of sync, i.e. testHeaderPositionBug1240118
1299− QCoreApplication::instance()->processEvents();
1300−
13011296 qreal contentHeight;
13021297 if (m_visibleItems.isEmpty()) {
13031298 contentHeight = m_headerItem ? m_headerItem->height() : 0;
plugins/Powerd/CMakeLists.txt+8
@@ -1,4 +1,11 @@
11include(Plugins)
2+include(FindPkgConfig)
3+
4+pkg_search_module(GIO REQUIRED gio-2.0)
5+
6+include_directories(
7+ ${GIO_INCLUDE_DIRS}
8+)
29
310add_definitions(-DSM_BUSNAME=systemBus)
411
@@ -8,6 +15,7 @@ add_library(Powerd-qml MODULE
815 )
916
1017qt5_use_modules(Powerd-qml DBus Qml)
18+target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
1119
1220export_qmlfiles(Powerd Powerd)
1321export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/Powerd/Powerd.cpp+17
@@ -17,6 +17,13 @@
1717 */
1818
1919#include "Powerd.h"
20+#include <QDBusPendingCall>
21+
22+void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface *powerd)
23+{
24+ bool value = g_settings_get_boolean(settings, key);
25+ powerd->asyncCall("userAutobrightnessEnable", QVariant(value));
26+}
2027
2128Powerd::Powerd(QObject* parent)
2229 : QObject(parent),
@@ -33,4 +40,14 @@ Powerd::Powerd(QObject* parent)
3340 "DisplayPowerStateChange",
3441 this,
3542 SIGNAL(displayPowerStateChange(int, unsigned int)));
43+
44+ systemSettings = g_settings_new("com.ubuntu.touch.system");
45+ g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), powerd);
46+ autoBrightnessChanged(systemSettings, "auto-brightness", powerd);
47+}
48+
49+Powerd::~Powerd()
50+{
51+ g_signal_handlers_disconnect_by_data(systemSettings, powerd);
52+ g_object_unref(systemSettings);
3653}
plugins/Powerd/Powerd.h+3
@@ -20,6 +20,7 @@
2020#ifndef UNITY_POWERD_H
2121#define UNITY_POWERD_H
2222
23+#include <gio/gio.h>
2324#include <QtCore/QObject>
2425#include <QtDBus/QDBusInterface>
2526
@@ -43,12 +44,14 @@ public:
4344 };
4445
4546 explicit Powerd(QObject *parent = 0);
47+ ~Powerd();
4648
4749Q_SIGNALS:
4850 void displayPowerStateChange(int status, unsigned int flags);
4951
5052private:
5153 QDBusInterface *powerd;
54+ GSettings *systemSettings;
5255};
5356
5457#endif
plugins/Unity/Indicators/CMakeLists.txt−3
@@ -6,7 +6,6 @@ project(IndicatorsQml)
66pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
77pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
88pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
9−pkg_check_modules(LIBUPSTART REQUIRED libupstart libnih libnih-dbus dbus-1)
109
1110find_package(Qt5Core REQUIRED)
1211find_package(Qt5Quick REQUIRED)
@@ -19,7 +18,6 @@ include_directories(
1918 ${GLIB_INCLUDE_DIRS}
2019 ${GIO_INCLUDE_DIRS}
2120 ${QMENUMODEL_INCLUDE_DIRS}
22− ${LIBUPSTART_INCLUDE_DIRS}
2321)
2422
2523set(IndicatorsQML_SOURCES
@@ -54,7 +52,6 @@ target_link_libraries(IndicatorsQml
5452 ${GLIB_LIBRARIES}
5553 ${GIO_LIBRARIES}
5654 ${QMENUMODEL_LDFLAGS}
57− ${LIBUPSTART_LIBRARIES}
5855)
5956
6057qt5_use_modules(IndicatorsQml Core Qml Quick)
plugins/Unity/Indicators/indicatorsmanager.cpp−33
@@ -21,9 +21,6 @@
2121#include <QSettings>
2222#include <QDebug>
2323
24−#include <upstart.h>
25−#include <nih/alloc.h>
26−
2724#include <paths.h>
2825
2926
@@ -216,36 +213,6 @@ void IndicatorsManager::setLoaded(bool loaded)
216213 {
217214 m_loaded = loaded;
218215 Q_EMIT loadedChanged(m_loaded);
219−
220− auto upstartsession = qgetenv("UPSTART_SESSION");
221− NihDBusProxy * upstart = NULL;
222−
223− if (!upstartsession.isNull()) {
224− DBusConnection * conn = NULL;
225− conn = dbus_connection_open(upstartsession.constData(), NULL);
226− if (conn != NULL) {
227− upstart = nih_dbus_proxy_new(NULL, conn,
228− NULL,
229− DBUS_PATH_UPSTART,
230− NULL, NULL);
231− dbus_connection_unref(conn);
232− }
233− }
234−
235− if (upstart != NULL) {
236− int event_sent = 0;
237− if (m_loaded) {
238− event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-start", NULL, 0);
239− } else {
240− event_sent = upstart_emit_event_sync(NULL, upstart, "indicator-services-end", NULL, 0);
241− }
242−
243− if (event_sent != 0) {
244− qWarning() << "Unable to send indicator event to Upstart";
245− }
246− nih_unref(upstart, NULL);
247− upstart = NULL;
248− }
249216 }
250217}
251218
plugins/Unity/Indicators/indicatorsmanager.h−2
@@ -28,8 +28,6 @@
2828#include <QHash>
2929#include <QSharedPointer>
3030
31−typedef struct nih_dbus_proxy NihDBusProxy;
32−
3331class UNITYINDICATORS_EXPORT IndicatorsManager : public QObject
3432{
3533 Q_OBJECT
plugins/Utils/CMakeLists.txt+2−3
@@ -11,13 +11,12 @@ include_directories(
1111)
1212
1313set(QMLPLUGIN_SRC
14− albumartprovider.cpp
1514 bottombarvisibilitycommunicatorshell.cpp
16− mediaartcache.cpp
1715 qlimitproxymodelqml.cpp
1816 qsortfilterproxymodelqml.cpp
1917 timeformatter.cpp
2018 unitymenumodelpaths.cpp
19+ easingcurve.cpp
2120 plugin.cpp
2221 )
2322
@@ -33,7 +32,7 @@ target_link_libraries(Utils-qml ${GIO_LDFLAGS})
3332# files directly in targets.
3433set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
3534
36−qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Concurrent)
35+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Gui Concurrent)
3736
3837# export the qmldir qmltypes and plugin files
3938export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cppdeleted−236
@@ -1,236 +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: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17− * Pawel Stolowski <pawel.stolowski@canonical.com>
18−*/
19−
20−#include "albumartprovider.h"
21−#include <QString>
22−#include <QNetworkAccessManager>
23−#include <QEventLoop>
24−#include <QNetworkRequest>
25−#include <QNetworkReply>
26−#include <QXmlQuery>
27−#include <QTemporaryFile>
28−#include <QBuffer>
29−#include <QDebug>
30−#include <QFile>
31−#include <QStringList>
32−#include <QByteArray>
33−#include <QImage>
34−#include <QUrl>
35−#include <QUrlQuery>
36−#include <QtConcurrent>
37−
38−using namespace std;
39−
40−const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
41−const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
42−
43−static QByteArray download(QString url) {
44− QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
45− QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
46− QEventLoop loop;
47− QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
48− loop.exec();
49−
50− if (reply->error() != QNetworkReply::NoError) {
51− qWarning() << "Error downloading from the network:" << reply->errorString();
52− return QByteArray();
53− }
54− return reply->readAll();
55−}
56−
57−AlbumArtProvider::AlbumArtProvider()
58− : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
59− m_settings(nullptr)
60−{
61− auto schemas = g_settings_list_schemas();
62− if (schemas) {
63− for (int i = 0; schemas[i]; i++) {
64− if (g_strcmp0(schemas[i], UNITY_LENS_SCHEMA.c_str()) == 0) {
65− m_settings = g_settings_new(UNITY_LENS_SCHEMA.c_str());
66− break;
67− }
68− }
69− }
70− if (m_settings == nullptr) {
71− qWarning() << "Missing" << QString::fromStdString(UNITY_LENS_SCHEMA) << "schema";
72− }
73−}
74−
75−AlbumArtProvider::~AlbumArtProvider()
76−{
77− if (m_settings)
78− g_object_unref(m_settings);
79−}
80−
81−std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
82− QString artist = QString::fromStdString(ai.artist);
83− QString album = QString::fromStdString(ai.album);
84− // audioscrobbler wants it without any / (as it would break the URL)
85− artist.remove('/');
86− album.remove('/');
87−
88− /// @todo: this is the old API which will probably get axed at some point in the future
89− /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
90− /// to it should be done ASAP.
91− QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
92− .arg(album)
93− .toHtmlEscaped();
94− QFuture<QByteArray> future = QtConcurrent::run(download, request);
95− QByteArray arr = future.result();
96− if(arr.size() == 0) {
97− return "";
98− }
99− QXmlQuery query;
100− QBuffer tmp;
101− tmp.setData(arr);
102− tmp.open(QIODevice::ReadOnly);
103− query.bindVariable("reply", &tmp);
104− query.setQuery("doc($reply)/album/coverart/large[1]/text()");
105− QString image;
106− query.evaluateTo(&image);
107− image = image.trimmed();
108−
109− // return empty if last.fm tries to offer their default
110− // fallback artwork
111− if (image.contains("catalogue/noimage")) {
112− return "";
113− }
114−
115− return image.toStdString();
116−}
117−
118−bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
119− QString url = QString::fromStdString(image_url);
120− QString fileName = QString::fromStdString(output_file);
121− QFuture<QByteArray> future = QtConcurrent::run(download, url);
122− QByteArray arr = future.result();
123− if (arr.size() == 0) {
124− return false;
125− }
126− QFile file(fileName);
127− if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
128− qWarning() << "Could not open file for writing:" << file.errorString();
129− return false;
130− }
131− if (file.write(arr) == -1){
132− qWarning() << "Could not write the image:" << file.error();
133− return false;
134− }
135−
136− return true;
137−}
138−
139−void AlbumArtProvider::fix_format(const std::string &fname) {
140− // MediaArtSpec requires jpg. Convert to it if necessary.
141− FILE *f = fopen(fname.c_str(), "r");
142− if(!f)
143− return;
144− unsigned char buf[2];
145− fread(buf, 1, 2, f);
146− fclose(f);
147− if(buf[0] == 0xff && buf[1] == 0xd8) {
148− return;
149− }
150− QImage im(fname.c_str());
151− im.save(fname.c_str(), "JPEG");
152−}
153−
154−std::string AlbumArtProvider::get_image(const std::string &artist, const std::string &album) {
155− albuminfo info;
156−
157− info.artist = artist;
158− info.album = album;
159−
160− if(info.album.empty() || info.artist.empty()) {
161− return DEFAULT_ALBUM_ART;
162− }
163− if(cache.has_art(info.artist, info.album)) {
164− // Image may have expired from cache between these two lines.
165− // It might expire before we return. C'est la vie.
166− return cache.get_art_file(info.artist, info.album);
167− }
168−
169− if (m_settings != nullptr && g_strcmp0(g_settings_get_string(m_settings, "remote-content-search"), "all") !=0) {
170− qDebug() << "Remote content disabled";
171− return DEFAULT_ALBUM_ART;
172− }
173−
174− std::string image_url = get_lastfm_url(info);
175− if(image_url.empty()) {
176− return DEFAULT_ALBUM_ART;
177− }
178− QTemporaryFile tempFile;
179− tempFile.open();
180− tempFile.setAutoRemove(true);
181− QString fname = tempFile.fileName();
182− std::string tmpname = fname.toUtf8().data();
183−
184− if(!download_and_store(image_url, tmpname)) {
185− return DEFAULT_ALBUM_ART;
186− }
187− fix_format(tmpname.c_str());
188− QFile f(fname);
189− if(!f.open(QIODevice::ReadWrite)) {
190− return DEFAULT_ALBUM_ART;
191− }
192− QByteArray arr = f.readAll();
193− f.close();
194−
195− cache.add_art(info.artist, info.album, arr.data(), arr.size());
196− try {
197− std::string res = cache.get_art_file(info.artist, info.album);
198− if(res.empty())
199− return DEFAULT_ALBUM_ART;
200− return res;
201− } catch(...) {
202− }
203− return DEFAULT_ALBUM_ART;
204−}
205−
206−QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
207− Q_UNUSED(requestedSize)
208−
209− QUrlQuery query(id);
210− if (!query.hasQueryItem(QStringLiteral("artist")) || !query.hasQueryItem(QStringLiteral("album"))) {
211− qWarning() << "Invalid albumart uri:" << id;
212− return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
213− }
214− const QString artist = query.queryItemValue(QStringLiteral("artist"), QUrl::FullyEncoded);
215− const QString album = query.queryItemValue(QStringLiteral("album"), QUrl::FullyEncoded);
216−
217− std::string tgt_path;
218− try {
219− tgt_path = get_image(artist.toStdString(), album.toStdString());
220− if(!tgt_path.empty()) {
221− QImage image;
222− image.load(QString::fromStdString(tgt_path));
223− // FIXME: Rescale to requested size preserving aspect.
224− *realSize = image.size();
225− return image;
226− }
227− } catch(std::exception &e) {
228− qDebug() << "Album art loader failed: " << e.what();
229− } catch(...) {
230− qDebug() << "Unknown error when generating image.";
231− }
232−
233− QImage fallback(QString::fromStdString(DEFAULT_ALBUM_ART));
234− *realSize = fallback.size();
235− return fallback;
236−}
plugins/Utils/albumartprovider.hdeleted−56
@@ -1,56 +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: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17−*/
18−
19−#ifndef ALBUMART_PROVIDER_H_
20−#define ALBUMART_PROVIDER_H_
21−
22−#include <string>
23−#include <stdexcept>
24−#include <QQuickImageProvider>
25−#include <gio/gio.h>
26−
27−#include "mediaartcache.h"
28−
29−struct albuminfo {
30− std::string artist;
31− std::string album;
32−};
33−
34−class AlbumArtProvider : public QQuickImageProvider
35−{
36−public:
37− AlbumArtProvider();
38− ~AlbumArtProvider();
39− QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
40−
41− std::string get_image(const std::string &artist, const std::string &album);
42−
43− const static std::string DEFAULT_ALBUM_ART;
44− const static std::string UNITY_LENS_SCHEMA;
45−private:
46− MediaArtCache cache;
47− GSettings *m_settings;
48−
49− void fix_format(const std::string &fname);
50−
51− std::string get_lastfm_url(const albuminfo &ai);
52−
53− bool download_and_store(const std::string &image_url, const std::string &output_file);
54−};
55−
56−#endif
plugins/Utils/easingcurve.cppnew file+67
@@ -0,0 +1,67 @@
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 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#include "easingcurve.h"
20+
21+
22+EasingCurve::EasingCurve(QObject *parent):
23+ QObject(parent)
24+{
25+
26+}
27+
28+QEasingCurve::Type EasingCurve::type() const
29+{
30+ return m_easingCurve.type();
31+}
32+
33+void EasingCurve::setType(const QEasingCurve::Type &type)
34+{
35+ m_easingCurve.setType(type);
36+ Q_EMIT typeChanged();
37+}
38+
39+qreal EasingCurve::period() const
40+{
41+ return m_easingCurve.period();
42+}
43+
44+void EasingCurve::setPeriod(qreal period)
45+{
46+ m_easingCurve.setPeriod(period);
47+ Q_EMIT periodChanged();
48+}
49+
50+qreal EasingCurve::progress() const
51+{
52+ return m_progress;
53+}
54+
55+void EasingCurve::setProgress(qreal progress)
56+{
57+ if (m_progress != progress) {
58+ m_progress = progress;
59+ m_value = m_easingCurve.valueForProgress(m_progress);
60+ Q_EMIT progressChanged();
61+ }
62+}
63+
64+qreal EasingCurve::value() const
65+{
66+ return m_value;
67+}
plugins/Utils/easingcurve.hnew file+70
@@ -0,0 +1,70 @@
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 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#ifndef EASINGCURVE_H
20+#define EASINGCURVE_H
21+
22+#include <QObject>
23+#include <QEasingCurve>
24+
25+/**
26+ * @brief The EasingCurve class
27+ *
28+ * This class exposes the QEasingCurve C++ API to QML.
29+ * This is useful for user interactive animations. While the QML Animation types
30+ * all require a "from", "to" and "duration", this one is based on "period" and
31+ * "progress". So you can control the position of the aimation by changing the
32+ * progress, also going back and forward in the animation. Depending on the type
33+ * of the easing curve, value will return the transformed progress.
34+ */
35+
36+class EasingCurve: public QObject
37+{
38+ Q_OBJECT
39+ Q_ENUMS(QEasingCurve::Type)
40+ Q_PROPERTY(QEasingCurve::Type type READ type WRITE setType NOTIFY typeChanged)
41+ Q_PROPERTY(qreal period READ period WRITE setPeriod NOTIFY periodChanged)
42+ Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
43+ Q_PROPERTY(qreal value READ value NOTIFY progressChanged)
44+
45+public:
46+ EasingCurve(QObject *parent = 0);
47+
48+ QEasingCurve::Type type() const;
49+ void setType(const QEasingCurve::Type &type);
50+
51+ qreal period() const;
52+ void setPeriod(qreal period);
53+
54+ qreal progress() const;
55+ void setProgress(qreal progress);
56+
57+ qreal value() const;
58+
59+Q_SIGNALS:
60+ void typeChanged();
61+ void periodChanged();
62+ void progressChanged();
63+
64+private:
65+ QEasingCurve m_easingCurve;
66+ qreal m_progress;
67+ qreal m_value;
68+};
69+
70+#endif
plugins/Utils/mediaartcache.cppdeleted−178
@@ -1,178 +0,0 @@
1−/*
2− * This file is part of the Ubuntu TV Media Scanner
3− * Copyright (C) 2012-2013 Canonical Ltd.
4− *
5− * This program is free software: you can redistribute it and/or modify
6− * it under the terms of the GNU Lesser General Public License version 3 as
7− * published by the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− *
17− * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18− */
19−
20−#include"mediaartcache.h"
21−
22−#include<dirent.h>
23−#include<sys/stat.h>
24−#include<fcntl.h>
25−#include<unistd.h>
26−#include<errno.h>
27−#include<stdio.h>
28−#include<string.h>
29−#include<stdlib.h>
30−#include<assert.h>
31−#include<utime.h>
32−
33−#include<glib.h>
34−
35−#include<vector>
36−#include<algorithm>
37−#include<stdexcept>
38−
39−using namespace std;
40−
41−static string md5(const string &str) {
42− const unsigned char *buf = (const unsigned char *)str.c_str();
43− char *normalized = g_utf8_normalize((const gchar*)buf, str.size(), G_NORMALIZE_ALL);
44− string final;
45− gchar *result;
46−
47− if(normalized) {
48− buf = (const unsigned char*)normalized;
49− }
50− gssize bytes = str.length();
51−
52− result = g_compute_checksum_for_data(G_CHECKSUM_MD5, buf, bytes);
53− final = result;
54− g_free((gpointer)normalized);
55− g_free(result);
56− return final;
57−}
58−
59−MediaArtCache::MediaArtCache() {
60− string xdg_base = g_get_user_cache_dir();
61−
62− if (xdg_base == "") {
63− string s("Could not determine cache dir.");
64− throw runtime_error(s);
65− }
66− int ec = mkdir(xdg_base.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
67− if (ec < 0 && errno != EEXIST) {
68− string s("Could not create base dir.");
69− throw runtime_error(s);
70− }
71− root_dir = xdg_base + "/media-art";
72− ec = mkdir(root_dir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
73− if (ec < 0 && errno != EEXIST) {
74− string s("Could not create cache dir.");
75− throw runtime_error(s);
76− }
77−}
78−
79−bool MediaArtCache::has_art(const std::string &artist, const std::string &album) const {
80− string fname = get_art_file(artist, album);
81− return access(fname.c_str(), R_OK) == 0;
82−}
83−
84−void MediaArtCache::add_art(const std::string &artist, const std::string &album,
85− char *data, unsigned int datalen) {
86− string abs_fname = get_full_filename(artist, album);
87− GError *err = nullptr;
88− if(!g_file_set_contents(abs_fname.c_str(), data, datalen, &err)) {
89− string e("Could not write file ");
90− e += abs_fname;
91− e += ": ";
92− e += err->message;
93− g_error_free(err);
94− throw runtime_error(e);
95− }
96−}
97−
98−string MediaArtCache::get_art_file(const std::string &artist, const std::string &album) const {
99− string abs_fname = get_full_filename(artist, album);
100−
101− if (access(abs_fname.c_str(), R_OK) == 0) {
102− utime(abs_fname.c_str(), nullptr); // update access times to current time
103− return abs_fname;
104− }
105− return "";
106−}
107−
108−std::string MediaArtCache::get_full_filename(const std::string &artist, const std::string & album) const {
109− return root_dir + "/" + compute_base_name(artist, album);
110−}
111−
112−
113−std::string MediaArtCache::compute_base_name(const std::string &artist, const std::string &album) const {
114− string type = "album";
115− string h1 = md5(artist);
116− string h2 = md5(album);
117− return type + "-" + h1 + "-" + h2 + ".jpg";
118−}
119−
120−
121−void MediaArtCache::clear() const {
122− DIR *d = opendir(root_dir.c_str());
123− if(!d) {
124− string s = "Something went wrong.";
125− throw runtime_error(s);
126− }
127− struct dirent *entry, *de;
128− entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
129− while(readdir_r(d, entry, &de) == 0 && de) {
130− string basename = entry->d_name;
131− if (basename == "." || basename == "..")
132− continue;
133− string fname = root_dir + "/" + basename;
134− if(remove(fname.c_str()) < 0) {
135− // This is not really an error worth
136− // halting everything for.
137− fprintf(stderr, "Could not delete file %s: %s.\n", fname.c_str(),
138− strerror(errno));
139− }
140− }
141− free(entry);
142− closedir(d);
143−}
144−
145−void MediaArtCache::prune() {
146− vector<pair<double, string>> mtimes;
147− DIR *d = opendir(root_dir.c_str());
148− if(!d) {
149− string s = "Something went wrong.";
150− throw runtime_error(s);
151− }
152− struct dirent *entry, *de;
153− entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
154− while(readdir_r(d, entry, &de) == 0 && de) {
155− string basename = entry->d_name;
156− if (basename == "." || basename == "..")
157− continue;
158− string fname = root_dir + "/" + basename;
159− struct stat sbuf;
160− if(stat(fname.c_str(), &sbuf) != 0) {
161− continue;
162− }
163− // Use mtime because atime is not guaranteed to work if, for example
164− // the filesystem is mounted with noatime or relatime.
165− mtimes.push_back(make_pair(sbuf.st_mtim.tv_sec + sbuf.st_mtim.tv_nsec/1000000000.0, fname));
166− }
167− free(entry);
168− closedir(d);
169− if (mtimes.size() <= MAX_SIZE)
170− return;
171− sort(mtimes.begin(), mtimes.end());
172− for(size_t i=0; i < mtimes.size()-MAX_SIZE; i++) {
173− if(remove(mtimes[i].second.c_str()) < 0) {
174− fprintf(stderr, "Could not remove file %s: %s.\n",
175− mtimes[i].second.c_str(), strerror(errno));
176− }
177− }
178−}
plugins/Utils/mediaartcache.hdeleted−54
@@ -1,54 +0,0 @@
1−/*
2− * This file is part of the Ubuntu TV Media Scanner
3− * Copyright (C) 2012-2013 Canonical Ltd.
4− *
5− * This program is free software: you can redistribute it and/or modify
6− * it under the terms of the GNU Lesser General Public License version 3 as
7− * published by the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− *
17− * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18− */
19−
20−#ifndef MEDIAARTCACHE_H
21−#define MEDIAARTCACHE_H
22−
23−#include<string>
24−
25−/*
26− * A class to store thumbnails for files according to
27− * https://wiki.gnome.org/MediaArtStorageSpec
28− *
29− * As this class deals mostly with the filesystem, all
30− * errors are reported with runtime_error exceptions.
31− */
32−
33−
34−class MediaArtCache {
35−private:
36− std::string root_dir;
37−
38− std::string compute_base_name(const std::string &artist, const std::string &album) const;
39− std::string get_full_filename(const std::string &artist, const std::string & album) const;
40−
41−public:
42− static const unsigned int MAX_SIZE = 200;
43−
44− MediaArtCache();
45− bool has_art(const std::string &artist, const std::string &album) const;
46− void add_art(const std::string &artist, const std::string &album,
47− char *data, unsigned int datalen);
48− std::string get_art_file(const std::string &artist, const std::string &album) const;
49− void clear() const;
50− void prune();
51− std::string get_cache_dir() const { return root_dir; }
52−};
53−
54−#endif
plugins/Utils/plugin.cpp+2−14
@@ -26,12 +26,12 @@
2626#include "plugin.h"
2727
2828// local
29−#include "albumartprovider.h"
3029#include "bottombarvisibilitycommunicatorshell.h"
3130#include "qlimitproxymodelqml.h"
3231#include "qsortfilterproxymodelqml.h"
3332#include "timeformatter.h"
3433#include "unitymenumodelpaths.h"
34+#include "easingcurve.h"
3535
3636static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
3737static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
@@ -46,25 +46,13 @@ void UtilsPlugin::registerTypes(const char *uri)
4646 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
4747 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
4848 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
49+ qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
4950}
5051
5152void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
5253{
5354 QQmlExtensionPlugin::initializeEngine(engine, uri);
5455
55− try
56− {
57− engine->addImageProvider(QLatin1String("albumart"), new AlbumArtProvider);
58− }
59− catch (const std::runtime_error &e)
60− {
61− qWarning() << "Failed to register image provider for albumart:" << e.what();
62− }
63− catch (...)
64− {
65− qWarning() << "Failed to register image provider for albumart (unknown error)";
66− }
67−
6856 QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
6957 BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
7058 QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
po/am.po+24−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,27 +81,18 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "መላኪያ"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "አስተያየቶች:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "መፈለጊያ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "እባክዎን ያስገቡ %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "አስተያየቶች:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/ar.po+38−35
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-21 11:19+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
7878"الشاشة للبدء"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "عمليات البحث الأخيرة"
8383
@@ -85,31 +85,18 @@ msgstr "عمليات البحث الأخيرة"
8585msgid "See more"
8686msgstr "شاهد المزيد"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "شاهد أقل"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "قيّم ذلك"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "لا تعليقات (%1)"
108−msgstr[1] "تعليق واحد (%1)"
109−msgstr[2] "تعليقان (%1)"
110−msgstr[3] "%1 تعليقات"
111−msgstr[4] "%1 تعليقا"
112−msgstr[5] "%1 تعليق"
98+msgid "%1 Preview"
99+msgstr ""
113100
114101#: qml/Dash/Previews/PreviewActionCombo.qml:34
115102msgid "More..."
@@ -119,22 +106,18 @@ msgstr "المزيد..."
119106msgid "Less..."
120107msgstr "أقل..."
121108
122−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "قيّم ذلك"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123114msgid "Add a review"
124115msgstr "أضف تعليق"
125116
126−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127118msgid "Send"
128119msgstr "أرسل"
129120
130−#: qml/Dash/Previews/Reviews.qml:86
131−msgid "Review"
132−msgstr "التعليق"
133−
134−#: qml/Dash/Previews/Reviews.qml:139
135−msgid "Comments:"
136−msgstr "التعليقات:"
137−
138121#: qml/Greeter/Lockscreen.qml:149
139122msgid "Emergency Call"
140123msgstr "مكالمة طوارئ"
@@ -180,7 +163,27 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
180163msgid "Search"
181164msgstr "ابحث"
182165
183−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
184167#, qt-format
185168msgid "Please enter %1"
186169msgstr "من فضلك أدخِل %1"
170+
171+#~ msgid "Review"
172+#~ msgstr "التعليق"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "التعليقات:"
180+
181+#, qt-format
182+#~ msgid "%1 review"
183+#~ msgid_plural "%1 reviews"
184+#~ msgstr[0] "لا تعليقات (%1)"
185+#~ msgstr[1] "تعليق واحد (%1)"
186+#~ msgstr[2] "تعليقان (%1)"
187+#~ msgstr[3] "%1 تعليقات"
188+#~ msgstr[4] "%1 تعليقا"
189+#~ msgstr[5] "%1 تعليق"
po/ast.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-01 16:51+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-04 02:16+0000\n"
1212"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +76,7 @@ msgstr ""
7776"Agora domina los xestos de los bordes y pue principiar a usar el "
7877"teléfonu<br><br>Toque la pantalla pa comenzar"
7978
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8180msgid "Recent searches"
8281msgstr "Busques recientes"
8382
@@ -85,27 +84,18 @@ msgstr "Busques recientes"
8584msgid "See more"
8685msgstr "Ver más"
8786
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8988msgid "See less"
9089msgstr "Ver menos"
9190
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Valorar esto"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr "Reciente"
9594
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
95+#: qml/Dash/PreviewListView.qml:52
9896#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 reseña"
108−msgstr[1] "%1 reseñes"
97+msgid "%1 Preview"
98+msgstr "Vista previa de %1"
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Más…"
115105msgid "Less..."
116106msgstr "Menos…"
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Valorar esto"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120114msgstr "Amestar una reseña"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Unviar"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Revisar"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Comentarios:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Llamada d'emerxencia"
@@ -176,7 +162,7 @@ msgstr "Escriba'l PIN de la SIM"
176162msgid "Search"
177163msgstr "Guetar"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Introduz %1"
po/az.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Son axtarışlar"
8080
@@ -82,27 +82,18 @@ msgstr "Son axtarışlar"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Qiymət ver"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rəy"
105−msgstr[1] "%1 rəy"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Qiymət ver"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Rəy yaz"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr "Göndər"
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Rəy"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Şərhlər:"
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr "Zərurət zəngi"
@@ -173,7 +160,23 @@ msgstr ""
173160msgid "Search"
174161msgstr "Axtar"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr "Xahiş edirik daxil edin: %1"
167+
168+#~ msgid "Comments:"
169+#~ msgstr "Şərhlər:"
170+
171+#~ msgid "Review"
172+#~ msgstr "Rəy"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 rəy"
178+#~ msgstr[1] "%1 rəy"
179+
180+#, qt-format
181+#~ msgid "(%1)"
182+#~ msgstr "(%1)"
po/bg.po+20−34
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-28 19:22+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,7 +79,7 @@ msgid ""
8079"phone<br><br>Tap on the screen to start"
8180msgstr ""
8281
83−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8483msgid "Recent searches"
8584msgstr "Последни търсения"
8685
@@ -88,27 +87,18 @@ msgstr "Последни търсения"
8887msgid "See more"
8988msgstr ""
9089
91−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9291msgid "See less"
9392msgstr ""
9493
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
96−msgid "Rate this"
97−msgstr "Оценете това"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
103−msgstr "(%1)"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
96+msgstr "Последни"
10497
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
106−#: qml/Dash/Previews/Header.qml:105
98+#: qml/Dash/PreviewListView.qml:52
10799#, qt-format
108−msgid "%1 review"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 отзив"
111−msgstr[1] "%1 отзива"
100+msgid "%1 Preview"
101+msgstr ""
112102
113103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114104msgid "More..."
@@ -116,24 +106,20 @@ msgstr ""
116106
117107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118108msgid "Less..."
119−msgstr ""
109+msgstr "По-малко..."
120110
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оценете това"
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122116msgid "Add a review"
123117msgstr "Добави отзив"
124118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126120msgid "Send"
127121msgstr "Изпрати"
128122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзив"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Коментари:"
136−
137123#: qml/Greeter/Lockscreen.qml:149
138124msgid "Emergency Call"
139125msgstr "Спешно повикване"
@@ -179,7 +165,7 @@ msgstr ""
179165msgid "Search"
180166msgstr "Търсене"
181167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183169#, qt-format
184170msgid "Please enter %1"
185171msgstr "Моля, въведете %1"
po/br.ponew file+164
@@ -0,0 +1,164 @@
1+# Breton translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-15 18:15+0000\n"
12+"Last-Translator: Rouxel <vincent.rouxel@mailoo.org>\n"
13+"Language-Team: Breton <br@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"X-Launchpad-Export-Date: 2014-04-16 07:12+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
19+
20+#: plugins/Unity/Launcher/launcheritem.cpp:43
21+#: plugins/Unity/Launcher/launcheritem.cpp:73
22+msgid "Lock to Launcher"
23+msgstr ""
24+
25+#: plugins/Unity/Launcher/launcheritem.cpp:73
26+msgid "Unlock from Launcher"
27+msgstr ""
28+
29+#: qml/Components/EdgeDemoOverlay.qml:151
30+msgid "Skip intro"
31+msgstr ""
32+
33+#: qml/Components/EdgeDemo.qml:113
34+msgid "Right edge"
35+msgstr ""
36+
37+#: qml/Components/EdgeDemo.qml:114
38+msgid "Try swiping from the right edge to unlock the phone"
39+msgstr ""
40+
41+#: qml/Components/EdgeDemo.qml:145
42+msgid "Top edge"
43+msgstr ""
44+
45+#: qml/Components/EdgeDemo.qml:146
46+msgid "Try swiping from the top edge to access the indicators"
47+msgstr ""
48+
49+#: qml/Components/EdgeDemo.qml:171
50+msgid "Close"
51+msgstr "Serriñ"
52+
53+#: qml/Components/EdgeDemo.qml:172
54+msgid "Swipe up again to close the settings screen"
55+msgstr ""
56+
57+#: qml/Components/EdgeDemo.qml:199
58+msgid "Left edge"
59+msgstr ""
60+
61+#: qml/Components/EdgeDemo.qml:200
62+msgid "Swipe from the left to reveal the launcher for quick access to apps"
63+msgstr ""
64+
65+#: qml/Components/EdgeDemo.qml:227
66+msgid "Well done"
67+msgstr ""
68+
69+#: qml/Components/EdgeDemo.qml:228
70+msgid ""
71+"You have now mastered the edge gestures and can start using the "
72+"phone<br><br>Tap on the screen to start"
73+msgstr ""
74+
75+#: qml/Components/PageHeader.qml:365
76+msgid "Recent searches"
77+msgstr ""
78+
79+#: qml/Components/SeeMore.qml:35
80+msgid "See more"
81+msgstr ""
82+
83+#: qml/Components/SeeMore.qml:58
84+msgid "See less"
85+msgstr ""
86+
87+#: qml/Dash/DashApps.qml:38
88+msgid "Recent"
89+msgstr ""
90+
91+#: qml/Dash/PreviewListView.qml:52
92+#, qt-format
93+msgid "%1 Preview"
94+msgstr ""
95+
96+#: qml/Dash/Previews/PreviewActionCombo.qml:34
97+msgid "More..."
98+msgstr ""
99+
100+#: qml/Dash/Previews/PreviewActionCombo.qml:34
101+msgid "Less..."
102+msgstr ""
103+
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
105+msgid "Rate this"
106+msgstr ""
107+
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
109+msgid "Add a review"
110+msgstr ""
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
113+msgid "Send"
114+msgstr ""
115+
116+#: qml/Greeter/Lockscreen.qml:149
117+msgid "Emergency Call"
118+msgstr ""
119+
120+#: qml/Greeter/PassphraseLockscreen.qml:59
121+#, qt-format
122+msgid "Hello %1"
123+msgstr ""
124+
125+#: qml/Greeter/PassphraseLockscreen.qml:59
126+msgid "Hello"
127+msgstr ""
128+
129+#: qml/Hud/HudParametrizedActionsPage.qml:132
130+msgid "Confirm"
131+msgstr ""
132+
133+#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
134+msgid "Type or say a command"
135+msgstr ""
136+
137+#: qml/Hud/Hud.qml:84
138+msgid "Loading. Please Wait..."
139+msgstr ""
140+
141+#: qml/Hud/Hud.qml:89
142+msgid "Speak Now..."
143+msgstr ""
144+
145+#: qml/Hud/Hud.qml:94
146+msgid "Speaking..."
147+msgstr ""
148+
149+#: qml/Notifications/NotificationMenuItemFactory.qml:91
150+msgid "Show password"
151+msgstr ""
152+
153+#: qml/Notifications/NotificationMenuItemFactory.qml:103
154+msgid "Please enter SIM PIN"
155+msgstr ""
156+
157+#: qml/Panel/SearchIndicator.qml:27
158+msgid "Search"
159+msgstr ""
160+
161+#: qml/Shell.qml:417
162+#, qt-format
163+msgid "Please enter %1"
164+msgstr ""
po/bs.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr ""
8080
@@ -82,28 +82,19 @@ msgstr ""
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr ""
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/ca.po+33−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-10 07:45+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -79,7 +79,7 @@ msgid ""
7979"phone<br><br>Tap on the screen to start"
8080msgstr ""
8181
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8383msgid "Recent searches"
8484msgstr "Cerques recents"
8585
@@ -87,27 +87,18 @@ msgstr "Cerques recents"
8787msgid "See more"
8888msgstr ""
8989
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9191msgid "See less"
9292msgstr ""
9393
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
95−msgid "Rate this"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
9696msgstr ""
9797
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:93
100−#, qt-format
101−msgid "(%1)"
102−msgstr "(%1)"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
98+#: qml/Dash/PreviewListView.qml:52
10699#, qt-format
107−msgid "%1 review"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 ressenya"
110−msgstr[1] "%1 ressenyes"
100+msgid "%1 Preview"
101+msgstr ""
111102
112103#: qml/Dash/Previews/PreviewActionCombo.qml:34
113104msgid "More..."
@@ -117,22 +108,18 @@ msgstr ""
117108msgid "Less..."
118109msgstr ""
119110
120−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr ""
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
121116msgid "Add a review"
122117msgstr "Afegiu una ressenya"
123118
124−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
125120msgid "Send"
126121msgstr "Envia"
127122
128−#: qml/Dash/Previews/Reviews.qml:86
129−msgid "Review"
130−msgstr "Ressenya"
131−
132−#: qml/Dash/Previews/Reviews.qml:139
133−msgid "Comments:"
134−msgstr "Comentaris:"
135−
136123#: qml/Greeter/Lockscreen.qml:149
137124msgid "Emergency Call"
138125msgstr "Trucada d'emergència"
@@ -178,7 +165,23 @@ msgstr ""
178165msgid "Search"
179166msgstr "Cerca"
180167
181−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
182169#, qt-format
183170msgid "Please enter %1"
184171msgstr "Introduïu %1"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Comentaris:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Ressenya"
182+
183+#, qt-format
184+#~ msgid "%1 review"
185+#~ msgid_plural "%1 reviews"
186+#~ msgstr[0] "%1 ressenya"
187+#~ msgstr[1] "%1 ressenyes"
po/ckb.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "دوایین گەڕانەکان"
7979
@@ -81,27 +81,18 @@ msgstr "دوایین گەڕانەکان"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "پلە دابنی بۆی"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 پێداچوونەوە"
104−msgstr[1] "%1 پێداچوونەوەکان"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "پلە دابنی بۆی"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "پێداچوونەوە زۆر بکە"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ناردن"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "پێداچوونەوە"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "لێدوانەکان:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "هێڵی فریاگوزاری"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "گەڕان"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "تکایە %1 بنووسە"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "لێدوانەکان:"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 پێداچوونەوە"
178+#~ msgstr[1] "%1 پێداچوونەوەکان"
179+
180+#~ msgid "Review"
181+#~ msgstr "پێداچوونەوە"
po/cs.po+35−32
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Poslední vyhledávání"
7979
@@ -81,28 +81,18 @@ msgstr "Poslední vyhledávání"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Ohodnoťte to"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recenze"
104−msgstr[1] "%1 recenze"
105−msgstr[2] "%1 recenzí"
94+msgid "%1 Preview"
95+msgstr ""
10696
10797#: qml/Dash/Previews/PreviewActionCombo.qml:34
10898msgid "More..."
@@ -112,22 +102,18 @@ msgstr ""
112102msgid "Less..."
113103msgstr ""
114104
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Ohodnoťte to"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116110msgid "Add a review"
117111msgstr "Přidat recenzi"
118112
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120114msgid "Send"
121115msgstr "Odeslat"
122116
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Recenze"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Komentáře:"
130−
131117#: qml/Greeter/Lockscreen.qml:149
132118msgid "Emergency Call"
133119msgstr "Tísňové volání"
@@ -173,7 +159,24 @@ msgstr ""
173159msgid "Search"
174160msgstr "Hledat"
175161
176−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
177163#, qt-format
178164msgid "Please enter %1"
179165msgstr "Zadejte prosím %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Komentáře:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#~ msgid "Review"
175+#~ msgstr "Recenze"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 recenze"
181+#~ msgstr[1] "%1 recenze"
182+#~ msgstr[2] "%1 recenzí"
po/da.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/de.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 11:01+0000\n"
1212"Last-Translator: Dennis Baudys <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Letzte Suchbegriffe"
8181
@@ -83,27 +83,18 @@ msgstr "Letzte Suchbegriffe"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Bewerten"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 Bewertung"
106−msgstr[1] "%1 Bewertungen"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Bewerten"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Bewertung hinzufügen"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Senden"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Bewertung"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentare:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Notruf"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Suchen"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Bitte geben Sie %1 ein"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Kommentare:"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#~ msgid "Review"
177+#~ msgstr "Bewertung"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 Bewertung"
183+#~ msgstr[1] "%1 Bewertungen"
po/el.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
7878"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Πρόσφατες αναζητήσεις"
8383
@@ -85,27 +85,18 @@ msgstr "Πρόσφατες αναζητήσεις"
8585msgid "See more"
8686msgstr "Περρισότερα"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "Λιγότερα"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Βαθμολογήστε το"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 αξιολόγηση"
108−msgstr[1] "%1 αξιολογήσεις"
98+msgid "%1 Preview"
99+msgstr ""
109100
110101#: qml/Dash/Previews/PreviewActionCombo.qml:34
111102msgid "More..."
@@ -115,22 +106,18 @@ msgstr ""
115106msgid "Less..."
116107msgstr ""
117108
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Βαθμολογήστε το"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119114msgid "Add a review"
120115msgstr "Προσθέστε την αξιολόγησή σας"
121116
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123118msgid "Send"
124119msgstr "Αποστολή"
125120
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Αξιολόγηση"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Σχόλια:"
133−
134121#: qml/Greeter/Lockscreen.qml:149
135122msgid "Emergency Call"
136123msgstr "Κλήση έκτακτης ανάγκης"
@@ -176,7 +163,23 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
176163msgid "Search"
177164msgstr "Αναζήτηση"
178165
179−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
180167#, qt-format
181168msgid "Please enter %1"
182169msgstr "Πληκτρολογήστε %1"
170+
171+#, qt-format
172+#~ msgid "%1 review"
173+#~ msgid_plural "%1 reviews"
174+#~ msgstr[0] "%1 αξιολόγηση"
175+#~ msgstr[1] "%1 αξιολογήσεις"
176+
177+#, qt-format
178+#~ msgid "(%1)"
179+#~ msgstr "(%1)"
180+
181+#~ msgid "Comments:"
182+#~ msgstr "Σχόλια:"
183+
184+#~ msgid "Review"
185+#~ msgstr "Αξιολόγηση"
po/en_AU.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recent searches"
7979
@@ -81,27 +81,18 @@ msgstr "Recent searches"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Rate this"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 review"
104−msgstr[1] "%1 reviews"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Rate this"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Add a review"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Send"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Review"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Comments:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Emergency Call"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Search"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Please enter %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Comments:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Review"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 review"
177+#~ msgstr[1] "%1 reviews"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/en_GB.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-07 13:27+0000\n"
1212"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgstr ""
7575"You have now mastered the edge gestures and can start using the "
7676"phone<br><br>Tap on the screen to start"
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Recent searches"
8181
@@ -83,27 +83,18 @@ msgstr "Recent searches"
8383msgid "See more"
8484msgstr "See more"
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr "See less"
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Rate this"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 review"
106−msgstr[1] "%1 reviews"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr "More..."
113104msgid "Less..."
114105msgstr "Less..."
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Rate this"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Add a review"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Send"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Review"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comments:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Emergency Call"
@@ -174,7 +161,23 @@ msgstr "Please enter SIM PIN"
174161msgid "Search"
175162msgstr "Search"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Please enter %1"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Comments:"
171+
172+#~ msgid "Review"
173+#~ msgstr "Review"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "%1 review"
179+#~ msgstr[1] "%1 reviews"
180+
181+#, qt-format
182+#~ msgid "(%1)"
183+#~ msgstr "(%1)"
po/eo.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/es.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-20 05:43+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-03-28 22:37+0000\n"
1212"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-03-29 07:34+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +77,7 @@ msgstr ""
7877"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
7978"la pantalla para comenzar"
8079
81−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8281msgid "Recent searches"
8382msgstr "Búsquedas recientes"
8483
@@ -86,27 +85,18 @@ msgstr "Búsquedas recientes"
8685msgid "See more"
8786msgstr "Ver más"
8887
89−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
9089msgid "See less"
9190msgstr "Ver menos"
9291
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Valorar esto"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr "Recientes"
9695
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
96+#: qml/Dash/PreviewListView.qml:52
9997#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
102−
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
105−#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 reseña"
109−msgstr[1] "%1 reseñas"
98+msgid "%1 Preview"
99+msgstr "Previsualización de %1"
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr "Más…"
116106msgid "Less..."
117107msgstr "Menos…"
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Valorar esto"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Añadir una reseña"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Enviar"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Reseñar"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Comentarios:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Llamada de emergencia"
@@ -177,7 +163,7 @@ msgstr "Escriba el PIN de la SIM"
177163msgid "Search"
178164msgstr "Buscar"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Introduzca %1"
po/eu.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-17 20:56+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-03-31 06:44+0000\n"
18+"X-Generator: Launchpad (build 16967)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +76,7 @@ msgstr ""
7776"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
7877"zaitezke<br><br>Ukitu pantaila hasteko"
7978
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8180msgid "Recent searches"
8281msgstr "Azken bilaketak"
8382
@@ -85,27 +84,18 @@ msgstr "Azken bilaketak"
8584msgid "See more"
8685msgstr "Ikusi gehiago"
8786
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8988msgid "See less"
9089msgstr "Ikusi gutxiago"
9190
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Puntuatu hau"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr "Azkenak"
9594
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
95+#: qml/Dash/PreviewListView.qml:52
9896#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "kritika %1"
108−msgstr[1] "%1 kritika"
97+msgid "%1 Preview"
98+msgstr "%1 aurrebista"
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Gehiago..."
115105msgid "Less..."
116106msgstr "Gutxiago..."
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Puntuatu hau"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120114msgstr "Gehitu kritika"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Bidali"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Egin kritika"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Iruzkinak:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Larrialdi-deia"
@@ -176,7 +162,7 @@ msgstr "Sartu SIMaren PINa"
176162msgid "Search"
177163msgstr "Bilatu"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Sartu %1"
po/fa.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/fi.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-09 19:22+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-05 09:57+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +74,7 @@ msgstr ""
7574"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
7675"käytön<br><br>Napauta näyttöä aloittaaksesi"
7776
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7978msgid "Recent searches"
8079msgstr "Viimeisimmät haut"
8180
@@ -83,27 +82,18 @@ msgstr "Viimeisimmät haut"
8382msgid "See more"
8483msgstr "Näytä lisää"
8584
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8786msgid "See less"
8887msgstr "Näytä vähemmän"
8988
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Arvioi tämä"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr "Viimeisimmät"
9392
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9694#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 arvostelu"
106−msgstr[1] "%1 arvostelua"
95+msgid "%1 Preview"
96+msgstr "%1 esikatselu"
10797
10898#: qml/Dash/Previews/PreviewActionCombo.qml:34
10999msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Lisää..."
113103msgid "Less..."
114104msgstr "Vähemmän..."
115105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Arvioi tämä"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117111msgid "Add a review"
118112msgstr "Lisää arvostelu"
119113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121115msgid "Send"
122116msgstr "Lähetä"
123117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Arvostelu"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentit:"
131−
132118#: qml/Greeter/Lockscreen.qml:149
133119msgid "Emergency Call"
134120msgstr "Hätäpuhelu"
@@ -174,7 +160,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
174160msgid "Search"
175161msgstr "Hae"
176162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178164#, qt-format
179165msgid "Please enter %1"
180166msgstr "Kirjoita %1"
po/fo.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Leita"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/fr.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-28 00:34+0000\n"
1212"Last-Translator: Pierre <Unknown>\n"
1313"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recherches récentes"
7979
@@ -81,27 +81,18 @@ msgstr "Recherches récentes"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Evaluez ceci"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 avis"
104−msgstr[1] "%1 avis"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Evaluez ceci"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Ajouter un avis"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Envoyer"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Avis"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Commentaires :"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Appel d'urgence"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Rechercher"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Veuillez saisir %1"
166+
167+#~ msgid "Review"
168+#~ msgstr "Avis"
169+
170+#, qt-format
171+#~ msgid "%1 review"
172+#~ msgid_plural "%1 reviews"
173+#~ msgstr[0] "%1 avis"
174+#~ msgstr[1] "%1 avis"
175+
176+#~ msgid "Comments:"
177+#~ msgstr "Commentaires :"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/gd.po+36−33
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-09-30 10:34+0000\n"
1212"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
1313"Language-Team: Gaelic; Scottish <gd@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,7 +80,7 @@ msgid ""
8080"phone<br><br>Tap on the screen to start"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:340
83+#: qml/Components/PageHeader.qml:365
8484msgid "Recent searches"
8585msgstr "Na lorg thu o chionn goirid"
8686
@@ -88,29 +88,18 @@ msgstr "Na lorg thu o chionn goirid"
8888msgid "See more"
8989msgstr ""
9090
91−#: qml/Components/SeeMore.qml:57
91+#: qml/Components/SeeMore.qml:58
9292msgid "See less"
9393msgstr ""
9494
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
96−msgid "Rate this"
97−msgstr "Rangaich seo"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
103−msgstr "(%1)"
95+#: qml/Dash/DashApps.qml:38
96+msgid "Recent"
97+msgstr ""
10498
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
106−#: qml/Dash/Previews/Header.qml:105
99+#: qml/Dash/PreviewListView.qml:52
107100#, qt-format
108−msgid "%1 review"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 lèirmheas"
111−msgstr[1] "%1 lèirmheas"
112−msgstr[2] "%1 lèirmheasan"
113−msgstr[3] "%1 lèirmheas"
101+msgid "%1 Preview"
102+msgstr ""
114103
115104#: qml/Dash/Previews/PreviewActionCombo.qml:34
116105msgid "More..."
@@ -120,22 +109,18 @@ msgstr ""
120109msgid "Less..."
121110msgstr ""
122111
123−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
112+#: qml/Dash/Previews/PreviewRatingInput.qml:81
113+msgid "Rate this"
114+msgstr "Rangaich seo"
115+
116+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124117msgid "Add a review"
125118msgstr "Cuir lèirmheas ris"
126119
127−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128121msgid "Send"
129122msgstr "Cuir"
130123
131−#: qml/Dash/Previews/Reviews.qml:86
132−msgid "Review"
133−msgstr "Lèirmheas"
134−
135−#: qml/Dash/Previews/Reviews.qml:139
136−msgid "Comments:"
137−msgstr "Beachdan"
138−
139124#: qml/Greeter/Lockscreen.qml:149
140125msgid "Emergency Call"
141126msgstr "Gairm èiginn"
@@ -181,7 +166,25 @@ msgstr ""
181166msgid "Search"
182167msgstr "Lorg"
183168
184−#: qml/Shell.qml:440
169+#: qml/Shell.qml:417
185170#, qt-format
186171msgid "Please enter %1"
187172msgstr "Cuir a-steach %1"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "Beachdan"
180+
181+#~ msgid "Review"
182+#~ msgstr "Lèirmheas"
183+
184+#, qt-format
185+#~ msgid "%1 review"
186+#~ msgid_plural "%1 reviews"
187+#~ msgstr[0] "%1 lèirmheas"
188+#~ msgstr[1] "%1 lèirmheas"
189+#~ msgstr[2] "%1 lèirmheasan"
190+#~ msgstr[3] "%1 lèirmheas"
po/gl.po+19−33
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-03-08 06:58+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-08 07:04+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-09 07:31+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +74,7 @@ msgstr ""
7574"Agora xa domina os xestos do bordo e pode comezar a usar o "
7675"teléfono<br><br>Toque na pantalla para comezar"
7776
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7978msgid "Recent searches"
8079msgstr "Buscas recentes"
8180
@@ -83,27 +82,18 @@ msgstr "Buscas recentes"
8382msgid "See more"
8483msgstr "Ver máis"
8584
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8786msgid "See less"
8887msgstr "Ver menos"
8988
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Valore isto"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr "Recentes"
9392
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9694#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 opinión"
106−msgstr[1] "%1 opinións"
95+msgid "%1 Preview"
96+msgstr "%1 previsualización"
10797
10898#: qml/Dash/Previews/PreviewActionCombo.qml:34
10999msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Máis…"
113103msgid "Less..."
114104msgstr "Menos..."
115105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Valore isto"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117111msgid "Add a review"
118112msgstr "Engadir unha opinión"
119113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121115msgid "Send"
122116msgstr "Enviar"
123117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Opinión"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentarios:"
131−
132118#: qml/Greeter/Lockscreen.qml:149
133119msgid "Emergency Call"
134120msgstr "Chamada de emerxencia"
@@ -174,7 +160,7 @@ msgstr "Introduza o PIN da SIM"
174160msgid "Search"
175161msgstr "Buscar"
176162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178164#, qt-format
179165msgid "Please enter %1"
180166msgstr "Introduza %1"
po/he.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-20 08:30+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "חיפושים אחרונים"
7979
@@ -81,27 +81,18 @@ msgstr "חיפושים אחרונים"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "דירוג היישום"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "סקירה %1"
104−msgstr[1] "%1 סקירות"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "דירוג היישום"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "הוספת סקירה"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "שליחה"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "סקירה"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "הערות:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "שיחת חירום"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "חיפוש"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "נא להזין %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "הערות:"
173+
174+#~ msgid "Review"
175+#~ msgstr "סקירה"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "סקירה %1"
181+#~ msgstr[1] "%1 סקירות"
po/hi.po+19−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "पिछले खोजों"
7979
@@ -81,28 +81,19 @@ msgstr "पिछले खोजों"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "समीक्षा दे"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "भेजें"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "समीक्षा"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr ""
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "आपातकालीन कॉल"
@@ -172,7 +159,10 @@ msgstr ""
172159msgid "Search"
173160msgstr "खोजें"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Review"
168+#~ msgstr "समीक्षा"
po/hr.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Nedavne pretrage"
8080
@@ -82,28 +82,19 @@ msgstr "Nedavne pretrage"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Pretraživanje"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/hu.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Legutóbbi keresések"
8181
@@ -83,27 +83,18 @@ msgstr "Legutóbbi keresések"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Osztályzás"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 értékelés"
106−msgstr[1] "%1 értékelés"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Osztályzás"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Értékelés hozzáadása"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Küldés"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Értékelés"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Hozzászólások:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Vészhívás"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Keresés"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Adja meg a következőt: %1"
168+
169+#, qt-format
170+#~ msgid "%1 review"
171+#~ msgid_plural "%1 reviews"
172+#~ msgstr[0] "%1 értékelés"
173+#~ msgstr[1] "%1 értékelés"
174+
175+#, qt-format
176+#~ msgid "(%1)"
177+#~ msgstr "(%1)"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Hozzászólások:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Értékelés"
po/hy.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Վերջին որոնումներ"
7979
@@ -81,28 +81,19 @@ msgstr "Վերջին որոնումներ"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Որոնում"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/id.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/is.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Nýlegar leitir"
8080
@@ -82,27 +82,18 @@ msgstr "Nýlegar leitir"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Gefa þessu einkunn"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 ummæli"
105−msgstr[1] "%1 ummæli"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Gefa þessu einkunn"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Gefa umsögn"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr "Senda"
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Umsögn"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Athugasemdir:"
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr "Neyðarsímtal"
@@ -173,7 +160,23 @@ msgstr ""
173160msgid "Search"
174161msgstr "Leita"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
167+
168+#, qt-format
169+#~ msgid "(%1)"
170+#~ msgstr "(%1)"
171+
172+#~ msgid "Comments:"
173+#~ msgstr "Athugasemdir:"
174+
175+#~ msgid "Review"
176+#~ msgstr "Umsögn"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ummæli"
182+#~ msgstr[1] "%1 ummæli"
po/it.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-22 09:15+0000\n"
1212"Last-Translator: Domenico <domenico.verde125@live.it>\n"
1313"Language-Team: Italian <it@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgid ""
7878"phone<br><br>Tap on the screen to start"
7979msgstr ""
8080
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
8282msgid "Recent searches"
8383msgstr "Ricerche recenti"
8484
@@ -86,27 +86,18 @@ msgstr "Ricerche recenti"
8686msgid "See more"
8787msgstr ""
8888
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
9090msgid "See less"
9191msgstr ""
9292
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Valuta"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
93+#: qml/Dash/DashApps.qml:38
94+msgid "Recent"
95+msgstr ""
10296
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
97+#: qml/Dash/PreviewListView.qml:52
10598#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 recensione"
109−msgstr[1] "%1 recensioni"
99+msgid "%1 Preview"
100+msgstr ""
110101
111102#: qml/Dash/Previews/PreviewActionCombo.qml:34
112103msgid "More..."
@@ -116,22 +107,18 @@ msgstr ""
116107msgid "Less..."
117108msgstr ""
118109
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Valuta"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120115msgid "Add a review"
121116msgstr "Aggiungi una recensione"
122117
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124119msgid "Send"
125120msgstr "Invia"
126121
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Recensisci"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Commenti:"
134−
135122#: qml/Greeter/Lockscreen.qml:149
136123msgid "Emergency Call"
137124msgstr "Chiamata di emergenza"
@@ -177,7 +164,23 @@ msgstr ""
177164msgid "Search"
178165msgstr "Cerca"
179166
180−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
181168#, qt-format
182169msgid "Please enter %1"
183170msgstr "Inserire %1"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 recensione"
180+#~ msgstr[1] "%1 recensioni"
181+
182+#~ msgid "Comments:"
183+#~ msgstr "Commenti:"
184+
185+#~ msgid "Review"
186+#~ msgstr "Recensisci"
po/ja.po+24−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近の検索"
7979
@@ -81,27 +81,18 @@ msgstr "最近の検索"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "送信"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "コメント:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "検索"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "コメント:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/km.po+33−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-04 02:32+0000\n"
1212"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
1313"Language-Team: Khmer <km@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
7777"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
7878"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "ការ​ស្វែងរក​ថ្មី"
8383
@@ -85,26 +85,18 @@ msgstr "ការ​ស្វែងរក​ថ្មី"
8585msgid "See more"
8686msgstr "មើល​ច្រើន​ទៀត"
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr "មើល​តិច​ជាង"
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "វាយតម្លៃ​វា"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "ពិនិត្យ​មើល %1"
98+msgid "%1 Preview"
99+msgstr ""
108100
109101#: qml/Dash/Previews/PreviewActionCombo.qml:34
110102msgid "More..."
@@ -114,22 +106,18 @@ msgstr "ច្រើនជាង​..."
114106msgid "Less..."
115107msgstr "តិច​ជាង..."
116108
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "វាយតម្លៃ​វា"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118114msgid "Add a review"
119115msgstr "បន្ថែម​ការ​ពិនិត្យ"
120116
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122118msgid "Send"
123119msgstr "ផ្ញើ"
124120
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "ការ​ពិនិត្យ"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "មតិយោបល់៖"
132−
133121#: qml/Greeter/Lockscreen.qml:149
134122msgid "Emergency Call"
135123msgstr "ការ​ហៅ​ពេល​អាសន្ន"
@@ -175,7 +163,22 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
175163msgid "Search"
176164msgstr "ស្វែង​រក"
177165
178−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
179167#, qt-format
180168msgid "Please enter %1"
181169msgstr "សូម​បញ្ចូល %1"
170+
171+#, qt-format
172+#~ msgid "(%1)"
173+#~ msgstr "(%1)"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "ពិនិត្យ​មើល %1"
179+
180+#~ msgid "Comments:"
181+#~ msgstr "មតិយោបល់៖"
182+
183+#~ msgid "Review"
184+#~ msgstr "ការ​ពិនិត្យ"
po/kn.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
7979
@@ -81,28 +81,19 @@ msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "ಹುಡುಕು"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ko.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "최근 검색"
7979
@@ -81,28 +81,19 @@ msgstr "최근 검색"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "검색"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ky.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Соңку издөөлөр"
7979
@@ -81,28 +81,19 @@ msgstr "Соңку издөөлөр"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Издөө"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/lo.po+24−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,27 +81,18 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ສົ່ງ"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "ຄໍ່ເຫັນ"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "ຊອກຫາ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "ກະລູນາປ້ອນ %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "ຄໍ່ເຫັນ"
po/lt.po+35−32
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-15 12:42+0000\n"
1212"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
7777"phone<br><br>Tap on the screen to start"
7878msgstr ""
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Paskiausios paieškos"
8383
@@ -85,28 +85,18 @@ msgstr "Paskiausios paieškos"
8585msgid "See more"
8686msgstr ""
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr ""
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Įvertinkite tai"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 apžvalga"
108−msgstr[1] "%1 apžvalgos"
109−msgstr[2] "%1 apžvalgų"
98+msgid "%1 Preview"
99+msgstr ""
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116106msgid "Less..."
117107msgstr ""
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Įvertinkite tai"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Pridėkite apžvalgą"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Siųsti"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Apžvalga"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Komentarai:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Pagalbos skambutis"
@@ -177,7 +163,24 @@ msgstr ""
177163msgid "Search"
178164msgstr "Paieška"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Prašom įvesti %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Komentarai:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Apžvalga"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 apžvalga"
181+#~ msgstr[1] "%1 apžvalgos"
182+#~ msgstr[2] "%1 apžvalgų"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/lv.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-11 16:48+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Nesen veiktās meklēšanas"
7979
@@ -81,28 +81,19 @@ msgstr "Nesen veiktās meklēšanas"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Meklēt"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ml.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
1212"Last-Translator: STyM Alfazz <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "സമീപകാല തിരയലുകള്‍"
8181
@@ -83,27 +83,18 @@ msgstr "സമീപകാല തിരയലുകള്‍"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "ഇത് അവലോകനം ചെയ്യുക"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 അവലോകനം"
106−msgstr[1] "%1 അവലോകനങ്ങള്‍"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "ഇത് അവലോകനം ചെയ്യുക"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "അയയ്‌ക്കുക"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "അവലോകനം"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "അഭിപ്രായങ്ങള്‍:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "അടിയന്തിര വിളി"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "തിരയുക"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "ദയവായി %1 നല്‍കുക"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#~ msgid "Comments:"
174+#~ msgstr "അഭിപ്രായങ്ങള്‍:"
175+
176+#~ msgid "Review"
177+#~ msgstr "അവലോകനം"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 അവലോകനം"
183+#~ msgstr[1] "%1 അവലോകനങ്ങള്‍"
po/mr.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/ms.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Gelintar baru-baru ini"
7979
@@ -81,27 +81,18 @@ msgstr "Gelintar baru-baru ini"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Kadar ini"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 ulasan"
104−msgstr[1] "%1 ulasan"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Kadar ini"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Tambah ulasan"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Hantar"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Tinjauan"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Ulasan:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "panggilan Kecemasan"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Gelintar"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Sila masukkan %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Ulasan:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Tinjauan"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 ulasan"
177+#~ msgstr[1] "%1 ulasan"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/my.po+25−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
7979
@@ -81,27 +81,18 @@ msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "ပို့မည်"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "မှတ်ချက်များ-"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "အရေးပေါ်ခေါ်မည်"
@@ -172,7 +159,14 @@ msgstr ""
172159msgid "Search"
173160msgstr "ရှာဖွေ"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "%1ကိုရိုက်ထည့်ပါ"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "မှတ်ချက်များ-"
po/nb.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-27 07:02+0000\n"
1212"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Siste søk"
7979
@@ -81,28 +81,19 @@ msgstr "Siste søk"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "Søk"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/nl.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "Recente zoekopdrachten"
7979
@@ -81,27 +81,18 @@ msgstr "Recente zoekopdrachten"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "Beoordeel dit"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recensie"
104−msgstr[1] "%1 recensies"
94+msgid "%1 Preview"
95+msgstr ""
10596
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Beoordeel dit"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr "Voeg recensie toe"
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Versturen"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Recensie"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Reacties:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr "Noodoproep"
@@ -172,7 +159,23 @@ msgstr ""
172159msgid "Search"
173160msgstr "Zoeken"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr "Voer %1 in"
166+
167+#, qt-format
168+#~ msgid "%1 review"
169+#~ msgid_plural "%1 reviews"
170+#~ msgstr[0] "%1 recensie"
171+#~ msgstr[1] "%1 recensies"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Reacties:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Recensie"
po/pl.po+35−32
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-10 11:38+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgid ""
7676"phone<br><br>Tap on the screen to start"
7777msgstr ""
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "Ostatnie wyszukiwania"
8282
@@ -84,28 +84,18 @@ msgstr "Ostatnie wyszukiwania"
8484msgid "See more"
8585msgstr ""
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr ""
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "Oceń to"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 opinia"
107−msgstr[1] "%1 opinie"
108−msgstr[2] "%1 opinii"
97+msgid "%1 Preview"
98+msgstr ""
10999
110100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111101msgid "More..."
@@ -115,22 +105,18 @@ msgstr ""
115105msgid "Less..."
116106msgstr ""
117107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oceń to"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119113msgid "Add a review"
120114msgstr "Dodaj recenzję"
121115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123117msgid "Send"
124118msgstr "Wyślij"
125119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Recenzja"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Komentarze:"
133−
134120#: qml/Greeter/Lockscreen.qml:149
135121msgid "Emergency Call"
136122msgstr "Telefon ratunkowy"
@@ -176,7 +162,24 @@ msgstr ""
176162msgid "Search"
177163msgstr "Szukaj"
178164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180166#, qt-format
181167msgid "Please enter %1"
182168msgstr "Wprowadź %1"
169+
170+#~ msgid "Comments:"
171+#~ msgstr "Komentarze:"
172+
173+#~ msgid "Review"
174+#~ msgstr "Recenzja"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 opinia"
180+#~ msgstr[1] "%1 opinie"
181+#~ msgstr[2] "%1 opinii"
182+
183+#, qt-format
184+#~ msgid "(%1)"
185+#~ msgstr "(%1)"
po/pt.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/pt_BR.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-18 23:24+0000\n"
1212"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
7777
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
7979msgid "Recent searches"
8080msgstr "Pesquisas recentes"
8181
@@ -83,27 +83,18 @@ msgstr "Pesquisas recentes"
8383msgid "See more"
8484msgstr ""
8585
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
8787msgid "See less"
8888msgstr ""
8989
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "Avaliar isto"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
90+#: qml/Dash/DashApps.qml:38
91+msgid "Recent"
92+msgstr ""
9993
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
94+#: qml/Dash/PreviewListView.qml:52
10295#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 análise"
106−msgstr[1] "%1 análises"
96+msgid "%1 Preview"
97+msgstr ""
10798
10899#: qml/Dash/Previews/PreviewActionCombo.qml:34
109100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113104msgid "Less..."
114105msgstr ""
115106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Avaliar isto"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117112msgid "Add a review"
118113msgstr "Adicionar uma análise"
119114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121116msgid "Send"
122117msgstr "Enviar"
123118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Revisão"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentários:"
131−
132119#: qml/Greeter/Lockscreen.qml:149
133120msgid "Emergency Call"
134121msgstr "Chamada de emergência"
@@ -174,7 +161,23 @@ msgstr ""
174161msgid "Search"
175162msgstr "Pesquisar"
176163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178165#, qt-format
179166msgid "Please enter %1"
180167msgstr "Por favor, digite %1"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 análise"
177+#~ msgstr[1] "%1 análises"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Comentários:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Revisão"
po/ro.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Căutări recente"
8080
@@ -82,28 +82,19 @@ msgstr "Căutări recente"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Căutare"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/ru.po+26−40
@@ -7,17 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-26 15:56+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-03 13:07+0000\n"
1212"Last-Translator: Zonov Roman <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-04 07:12+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2119
2220#: plugins/Unity/Launcher/launcheritem.cpp:43
2321#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,62 +76,50 @@ msgid ""
7876"You have now mastered the edge gestures and can start using the "
7977"phone<br><br>Tap on the screen to start"
8078msgstr ""
79+"Вы научились пользоваться Ubuntu и можете начать использовать свой "
80+"телефон<br><br>Нажмите на экран"
8181
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
8383msgid "Recent searches"
8484msgstr "Последние поисковые запросы"
8585
8686#: qml/Components/SeeMore.qml:35
8787msgid "See more"
88−msgstr ""
88+msgstr "Подробнее"
8989
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
9191msgid "See less"
92−msgstr ""
92+msgstr "Вкратце"
9393
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
95−msgid "Rate this"
96−msgstr "Оцените это"
94+#: qml/Dash/DashApps.qml:38
95+msgid "Recent"
96+msgstr "Недавние"
9797
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:93
98+#: qml/Dash/PreviewListView.qml:52
10099#, qt-format
101−msgid "(%1)"
102−msgstr "(%1)"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
106−#, qt-format
107−msgid "%1 review"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 отзыв"
110−msgstr[1] "%1 отзыва"
111−msgstr[2] "%1 отзывов"
100+msgid "%1 Preview"
101+msgstr "Просмотр %1"
112102
113103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114104msgid "More..."
115−msgstr ""
105+msgstr "Ещё..."
116106
117107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118108msgid "Less..."
119−msgstr ""
109+msgstr "Меньше..."
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оцените это"
120114
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122116msgid "Add a review"
123117msgstr "Добавьте отзыв"
124118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126120msgid "Send"
127121msgstr "Отправить"
128122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзыв"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Комментарии:"
136−
137123#: qml/Greeter/Lockscreen.qml:149
138124msgid "Emergency Call"
139125msgstr "Экстренный вызов"
@@ -173,13 +159,13 @@ msgstr "Показать пароль"
173159
174160#: qml/Notifications/NotificationMenuItemFactory.qml:103
175161msgid "Please enter SIM PIN"
176−msgstr ""
162+msgstr "Введите PIN код"
177163
178164#: qml/Panel/SearchIndicator.qml:27
179165msgid "Search"
180166msgstr "Поиск"
181167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183169#, qt-format
184170msgid "Please enter %1"
185171msgstr "Пожалуйста, введите %1"
po/shn.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/si.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/sl.po+36−33
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-02-21 16:38+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgstr ""
7878"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
7979"telefon<br><br>Tapnite na zaslon za začetek"
8080
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
8282msgid "Recent searches"
8383msgstr "Nedavna iskanja"
8484
@@ -86,29 +86,18 @@ msgstr "Nedavna iskanja"
8686msgid "See more"
8787msgstr "Pokaži več"
8888
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
9090msgid "See less"
9191msgstr "Pokaži manj"
9292
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94−msgid "Rate this"
95−msgstr "Ocenite"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
93+#: qml/Dash/DashApps.qml:38
94+msgid "Recent"
95+msgstr ""
10296
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
97+#: qml/Dash/PreviewListView.qml:52
10598#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 ocen"
109−msgstr[1] "%1 ocena"
110−msgstr[2] "%1 oceni"
111−msgstr[3] "%1 ocene"
99+msgid "%1 Preview"
100+msgstr ""
112101
113102#: qml/Dash/Previews/PreviewActionCombo.qml:34
114103msgid "More..."
@@ -118,22 +107,18 @@ msgstr "Več ..."
118107msgid "Less..."
119108msgstr "Manj ..."
120109
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Ocenite"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122115msgid "Add a review"
123116msgstr "Dodaj oceno"
124117
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126119msgid "Send"
127120msgstr "Pošlji"
128121
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Ocena"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Opombe:"
136−
137122#: qml/Greeter/Lockscreen.qml:149
138123msgid "Emergency Call"
139124msgstr "Klic v sili"
@@ -179,7 +164,25 @@ msgstr "Vnesite PIN kartice SIM"
179164msgid "Search"
180165msgstr "Iskanje"
181166
182−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
183168#, qt-format
184169msgid "Please enter %1"
185170msgstr "Vnesite %1"
171+
172+#~ msgid "Review"
173+#~ msgstr "Ocena"
174+
175+#~ msgid "Comments:"
176+#~ msgstr "Opombe:"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ocen"
182+#~ msgstr[1] "%1 ocena"
183+#~ msgstr[2] "%1 oceni"
184+#~ msgstr[3] "%1 ocene"
185+
186+#, qt-format
187+#~ msgid "(%1)"
188+#~ msgstr "(%1)"
po/sq.po+28−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:25+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr ""
8080
@@ -82,27 +82,18 @@ msgstr ""
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
91−msgstr "Vlerësoje këtë"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr ""
9892
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10194#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rishikim"
105−msgstr[1] "%1 rishikime"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Vlerësoje këtë"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "Shto një rishikim"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr ""
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr ""
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr ""
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr ""
@@ -173,7 +160,17 @@ msgstr ""
173160msgid "Search"
174161msgstr ""
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
167+
168+#, qt-format
169+#~ msgid "%1 review"
170+#~ msgid_plural "%1 reviews"
171+#~ msgstr[0] "%1 rishikim"
172+#~ msgstr[1] "%1 rishikime"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
po/sr.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
7676
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7878msgid "Recent searches"
7979msgstr "Скорашње претраге"
8080
@@ -82,28 +82,19 @@ msgstr "Скорашње претраге"
8282msgid "See more"
8383msgstr ""
8484
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8686msgid "See less"
8787msgstr ""
8888
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90−msgid "Rate this"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
9191msgstr ""
9292
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
93+#: qml/Dash/PreviewListView.qml:52
9594#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
9796msgstr ""
9897
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112103msgid "Less..."
113104msgstr ""
114105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116−msgid "Add a review"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
121108msgstr ""
122109
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
111+msgid "Add a review"
125112msgstr ""
126113
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
115+msgid "Send"
129116msgstr ""
130117
131118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173160msgid "Search"
174161msgstr "Претрага"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr ""
po/sv.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Swedish <sv@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/sw.po+19−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas Mlabwa <Unknown>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115110msgid "Add a review"
116111msgstr ""
117112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119114msgid "Send"
120115msgstr "Tuma"
121116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Maoni:"
129−
130117#: qml/Greeter/Lockscreen.qml:149
131118msgid "Emergency Call"
132119msgstr ""
@@ -172,7 +159,10 @@ msgstr ""
172159msgid "Search"
173160msgstr "Tafuta"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Maoni:"
po/ta.po+35−32
@@ -7,16 +7,16 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12−"Last-Translator: Thangamani Arun - தங்கமணி அருண் <thangam.arunx@gmail.com>\n"
12+"Last-Translator: Arun Kumar -அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020"Language: ta\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -76,7 +76,7 @@ msgid ""
7676"phone<br><br>Tap on the screen to start"
7777msgstr ""
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "கடையாக தேடப்பட்டவைகள்"
8282
@@ -84,27 +84,18 @@ msgstr "கடையாக தேடப்பட்டவைகள்"
8484msgid "See more"
8585msgstr ""
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr ""
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "இதை மதிப்பிடு"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 பரிசீலனை"
107−msgstr[1] "%1 பரிசீலனைகள்"
97+msgid "%1 Preview"
98+msgstr ""
10899
109100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110101msgid "More..."
@@ -114,22 +105,18 @@ msgstr ""
114105msgid "Less..."
115106msgstr ""
116107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "இதை மதிப்பிடு"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118113msgid "Add a review"
119114msgstr "ஒரு பரிசீலனையை சேர்"
120115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122117msgid "Send"
123118msgstr "அனுப்பு"
124119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "மறுஆய்வு"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "கருத்துகள்:"
132−
133120#: qml/Greeter/Lockscreen.qml:149
134121msgid "Emergency Call"
135122msgstr "அவசர அழைப்பு"
@@ -175,7 +162,23 @@ msgstr ""
175162msgid "Search"
176163msgstr "தெடு"
177164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179166#, qt-format
180167msgid "Please enter %1"
181168msgstr "தயவுச்செய்து %1 உள்ளிடு"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 பரிசீலனை"
178+#~ msgstr[1] "%1 பரிசீலனைகள்"
179+
180+#~ msgid "Review"
181+#~ msgstr "மறுஆய்வு"
182+
183+#~ msgid "Comments:"
184+#~ msgstr "கருத்துகள்:"
po/te.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/tr.po+34−31
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2014-03-05 08:54+0000\n"
1212"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgstr ""
7676"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
7777"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
7878
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
8080msgid "Recent searches"
8181msgstr "Son aramalar"
8282
@@ -84,27 +84,18 @@ msgstr "Son aramalar"
8484msgid "See more"
8585msgstr "Daha fazlası"
8686
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
8888msgid "See less"
8989msgstr "Daha azını gör"
9090
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92−msgid "Rate this"
93−msgstr "Oyla"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
91+#: qml/Dash/DashApps.qml:38
92+msgid "Recent"
93+msgstr ""
10094
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
102−#: qml/Dash/Previews/Header.qml:105
95+#: qml/Dash/PreviewListView.qml:52
10396#, qt-format
104−msgid "%1 review"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 inceleme"
107−msgstr[1] "%1 inceleme"
97+msgid "%1 Preview"
98+msgstr ""
10899
109100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110101msgid "More..."
@@ -114,22 +105,18 @@ msgstr "Daha fazlası..."
114105msgid "Less..."
115106msgstr "Daha az.."
116107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oyla"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118113msgid "Add a review"
119114msgstr "Bir inceleme ekle"
120115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122117msgid "Send"
123118msgstr "Gönder"
124119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "İnceleme"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "Yorumlar:"
132−
133120#: qml/Greeter/Lockscreen.qml:149
134121msgid "Emergency Call"
135122msgstr "Acil Arama"
@@ -175,7 +162,23 @@ msgstr "Lütfen SIM PIN'inizi girin"
175162msgid "Search"
176163msgstr "Ara"
177164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179166#, qt-format
180167msgid "Please enter %1"
181168msgstr "Lütfen %1 girin"
169+
170+#~ msgid "Review"
171+#~ msgstr "İnceleme"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 inceleme"
177+#~ msgstr[1] "%1 inceleme"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
182+
183+#~ msgid "Comments:"
184+#~ msgstr "Yorumlar:"
po/ug.po+22−35
@@ -7,16 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-15 12:09+0000\n"
12−"Last-Translator: Gheyret T.Kenji <Unknown>\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"PO-Revision-Date: 2014-04-14 09:31+0000\n"
12+"Last-Translator: volkhan <Unknown>\n"
1313"Language-Team: Uyghur <ug@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
17+"X-Launchpad-Export-Date: 2014-04-15 07:57+0000\n"
18+"X-Generator: Launchpad (build 16976)\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +74,7 @@ msgstr ""
7574"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگەللەپ "
7675"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
7776
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
7978msgid "Recent searches"
8079msgstr "يېقىنقى ئىزدەشلەر"
8180
@@ -83,51 +82,39 @@ msgstr "يېقىنقى ئىزدەشلەر"
8382msgid "See more"
8483msgstr "جىقراق كۆرۈش"
8584
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
8786msgid "See less"
8887msgstr "ئازراق كۆرۈش"
8988
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91−msgid "Rate this"
92−msgstr "بۇنى باھالاڭ"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
89+#: qml/Dash/DashApps.qml:38
90+msgid "Recent"
91+msgstr "يېقىنقى"
9992
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
93+#: qml/Dash/PreviewListView.qml:52
10294#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 باھا"
95+msgid "%1 Preview"
96+msgstr ""
10697
10798#: qml/Dash/Previews/PreviewActionCombo.qml:34
10899msgid "More..."
109−msgstr ""
100+msgstr "تېخىمۇ كۆپ…"
110101
111102#: qml/Dash/Previews/PreviewActionCombo.qml:34
112103msgid "Less..."
113−msgstr ""
104+msgstr "ئازراق..."
105+
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "بۇنى باھالاڭ"
114109
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116111msgid "Add a review"
117112msgstr "باھا قوشۇش"
118113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120115msgid "Send"
121116msgstr "ئەۋەت"
122117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "تەكشۈر"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "ئىنكاس:"
130−
131118#: qml/Greeter/Lockscreen.qml:149
132119msgid "Emergency Call"
133120msgstr "جىددىي تېلېفون"
@@ -173,7 +160,7 @@ msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
173160msgid "Search"
174161msgstr "ئىزدە"
175162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177164#, qt-format
178165msgid "Please enter %1"
179166msgstr "%1 نى كىرگۈزۈڭ"
po/uk.po+35−32
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-11-23 12:37+0000\n"
1212"Last-Translator: Ignat Kizenko <Unknown>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20+"X-Generator: Launchpad (build 16967)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
7777"phone<br><br>Tap on the screen to start"
7878msgstr ""
7979
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
8181msgid "Recent searches"
8282msgstr "Нещодавні пошуки"
8383
@@ -85,28 +85,18 @@ msgstr "Нещодавні пошуки"
8585msgid "See more"
8686msgstr ""
8787
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
8989msgid "See less"
9090msgstr ""
9191
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93−msgid "Rate this"
94−msgstr "Оцінити"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
92+#: qml/Dash/DashApps.qml:38
93+msgid "Recent"
94+msgstr ""
10195
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
96+#: qml/Dash/PreviewListView.qml:52
10497#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 рецензія"
108−msgstr[1] "%1 рецензії"
109−msgstr[2] "%1 рецензій"
98+msgid "%1 Preview"
99+msgstr ""
110100
111101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116106msgid "Less..."
117107msgstr ""
118108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Оцінити"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120114msgid "Add a review"
121115msgstr "Додати рецензію"
122116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124118msgid "Send"
125119msgstr "Надіслати"
126120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Рецензія"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Коментарі:"
134−
135121#: qml/Greeter/Lockscreen.qml:149
136122msgid "Emergency Call"
137123msgstr "Терміновий виклик"
@@ -177,7 +163,24 @@ msgstr ""
177163msgid "Search"
178164msgstr "Пошук"
179165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181167#, qt-format
182168msgid "Please enter %1"
183169msgstr "Будь ласка, введіть %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Коментарі:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Рецензія"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 рецензія"
181+#~ msgstr[1] "%1 рецензії"
182+#~ msgstr[2] "%1 рецензій"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/unity8.pot+14−28
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -16,7 +16,6 @@ msgstr ""
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=CHARSET\n"
1818"Content-Transfer-Encoding: 8bit\n"
19−"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
2019
2120#: plugins/Unity/Launcher/launcheritem.cpp:43
2221#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +72,7 @@ msgid ""
7372"phone<br><br>Tap on the screen to start"
7473msgstr ""
7574
76−#: qml/Components/PageHeader.qml:340
75+#: qml/Components/PageHeader.qml:365
7776msgid "Recent searches"
7877msgstr ""
7978
@@ -81,28 +80,19 @@ msgstr ""
8180msgid "See more"
8281msgstr ""
8382
84−#: qml/Components/SeeMore.qml:57
83+#: qml/Components/SeeMore.qml:58
8584msgid "See less"
8685msgstr ""
8786
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
87+#: qml/Dash/DashApps.qml:38
88+msgid "Recent"
9089msgstr ""
9190
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
91+#: qml/Dash/PreviewListView.qml:52
9492#, qt-format
95−msgid "(%1)"
93+msgid "%1 Preview"
9694msgstr ""
9795
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10696#: qml/Dash/Previews/PreviewActionCombo.qml:34
10797msgid "More..."
10898msgstr ""
@@ -111,20 +101,16 @@ msgstr ""
111101msgid "Less..."
112102msgstr ""
113103
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
105+msgid "Rate this"
120106msgstr ""
121107
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
109+msgid "Add a review"
124110msgstr ""
125111
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
113+msgid "Send"
128114msgstr ""
129115
130116#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +158,7 @@ msgstr ""
172158msgid "Search"
173159msgstr ""
174160
175−#: qml/Shell.qml:440
161+#: qml/Shell.qml:417
176162#, qt-format
177163msgid "Please enter %1"
178164msgstr ""
po/vi.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/xh.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr ""
7979
@@ -81,28 +81,19 @@ msgstr ""
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr ""
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/zh_CN.po+16−29
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
1111"PO-Revision-Date: 2013-10-09 13:51+0000\n"
1212"Last-Translator: Aron Xu <Unknown>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "近期搜索"
7979
@@ -81,28 +81,19 @@ msgstr "近期搜索"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
9090msgstr ""
9191
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
92+#: qml/Dash/PreviewListView.qml:52
9493#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
9695msgstr ""
9796
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
10697#: qml/Dash/Previews/PreviewActionCombo.qml:34
10798msgid "More..."
10899msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111102msgid "Less..."
112103msgstr ""
113104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115−msgid "Add a review"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
120107msgstr ""
121108
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
110+msgid "Add a review"
124111msgstr ""
125112
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
114+msgid "Send"
128115msgstr ""
129116
130117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172159msgid "Search"
173160msgstr "搜索"
174161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176163#, qt-format
177164msgid "Please enter %1"
178165msgstr ""
po/zh_HK.po+33−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近的搜尋"
7979
@@ -81,26 +81,18 @@ msgstr "最近的搜尋"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "評價"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 評論"
94+msgid "%1 Preview"
95+msgstr ""
10496
10597#: qml/Dash/Previews/PreviewActionCombo.qml:34
10698msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110102msgid "Less..."
111103msgstr ""
112104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "評價"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114110msgid "Add a review"
115111msgstr "新增評論"
116112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118114msgid "Send"
119115msgstr "傳送"
120116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "評論"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "評論:"
128−
129117#: qml/Greeter/Lockscreen.qml:149
130118msgid "Emergency Call"
131119msgstr "緊急電話"
@@ -171,7 +159,22 @@ msgstr ""
171159msgid "Search"
172160msgstr "搜尋"
173161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175163#, qt-format
176164msgid "Please enter %1"
177165msgstr "請輸入 %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "評論:"
169+
170+#~ msgid "Review"
171+#~ msgstr "評論"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 評論"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
po/zh_TW.po+33−30
@@ -7,7 +7,7 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-18 06:26+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19+"X-Generator: Launchpad (build 16967)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
7575
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
7777msgid "Recent searches"
7878msgstr "最近搜尋"
7979
@@ -81,26 +81,18 @@ msgstr "最近搜尋"
8181msgid "See more"
8282msgstr ""
8383
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
8585msgid "See less"
8686msgstr ""
8787
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89−msgid "Rate this"
90−msgstr "對此評比"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
88+#: qml/Dash/DashApps.qml:38
89+msgid "Recent"
90+msgstr ""
9791
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
92+#: qml/Dash/PreviewListView.qml:52
10093#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 回覆"
94+msgid "%1 Preview"
95+msgstr ""
10496
10597#: qml/Dash/Previews/PreviewActionCombo.qml:34
10698msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110102msgid "Less..."
111103msgstr ""
112104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "對此評比"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114110msgid "Add a review"
115111msgstr "新增回覆"
116112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118114msgid "Send"
119115msgstr "發送"
120116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "回覆"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "備註:"
128−
129117#: qml/Greeter/Lockscreen.qml:149
130118msgid "Emergency Call"
131119msgstr "緊急連絡"
@@ -171,7 +159,22 @@ msgstr ""
171159msgid "Search"
172160msgstr "搜尋"
173161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175163#, qt-format
176164msgid "Please enter %1"
177165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "備註:"
169+
170+#~ msgid "Review"
171+#~ msgstr "回覆"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 回覆"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
qml/CMakeLists.txt+1−1
@@ -13,7 +13,7 @@ set(QML_DIRS
1313 Hud
1414 Panel
1515 Launcher
16− SideStage
16+ Stages
1717 Notifications
1818 )
1919
qml/Components/AnimationControllerWithSignals.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−AnimationController {
20− signal animationCompletedAtBeginning()
21− signal animationCompletedAtEnd()
22− readonly property bool completed: progress == 1.0 || progress == 0.0
23− property bool completing: false
24−
25− function __completeAtBeginning() {
26− completing = false;
27− animationCompletedAtBeginning();
28− }
29−
30− function __completeAtEnd() {
31− completing = false;
32− animationCompletedAtEnd();
33− }
34−
35− function completeToBeginningWithSignal() {
36− if (progress == 0.0) {
37− __completeAtBeginning()
38− } else {
39− completing = true;
40− completeToBeginning();
41− }
42− }
43−
44− function completeToEndWithSignal() {
45− if (progress == 1.0) {
46− __completeAtEnd()
47− } else {
48− completing = true;
49− completeToEnd();
50− }
51− }
52−
53− onProgressChanged: {
54− if (!completing) {
55− return;
56− }
57−
58− if (progress == 0.0) {
59− __completeAtBeginning()
60− } else if (progress == 1.0) {
61− __completeAtEnd()
62− }
63− }
64−}
qml/Components/ApplicationManagerWrapper.qmldeleted−169
@@ -1,169 +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 Unity.Application 0.1
19−
20−Item {
21− id: root
22−
23− property alias mainStageApplications: mainStageModel
24− property alias sideStageApplications: sideStageModel
25− property variant mainStageFocusedApplication: null
26− property variant sideStageFocusedApplication: null
27− property bool sideStageEnabled: true
28− property bool keyboardVisible: ApplicationManager.keyboardVisible
29− property int keyboardHeight: ApplicationManager.keyboardHeight
30−
31− property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
32−
33− signal focusRequested(string appId)
34−
35− ApplicationsModelStageFiltered {
36− id: mainStageModel
37− stage: ApplicationInfo.MainStage
38− }
39−
40− ApplicationsModelStageFiltered {
41− id: sideStageModel
42− stage: ApplicationInfo.SideStage
43− }
44−
45− Connections {
46− target: ApplicationManager
47− onFocusedApplicationIdChanged: {
48− var app = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId)
49− if (!app) { //nothing at all focused, so clear all
50− mainStageFocusedApplication = null;
51− sideStageFocusedApplication = null;
52− } else {
53− if (app.stage == ApplicationInfo.MainStage) {
54− mainStageFocusedApplication = app;
55− // possible the side stage app being unfocused fired this signal, so check for it
56− if (sideStageFocusedApplication && !sideStageFocusedApplication.focused)
57− sideStageFocusedApplication = null;
58− } else {
59− sideStageFocusedApplication = app;
60− // possible the main stage app being unfocused fired this signal, so check for it
61− if (mainStageFocusedApplication && !mainStageFocusedApplication.focused)
62− mainStageFocusedApplication = null;
63− }
64− }
65− }
66−
67− onFocusRequested: {
68− // if no side stage enabled, override application's stage parameter
69− var app = ApplicationManager.findApplication(appId);
70− if (app && app.stage === ApplicationInfo.SideStage && !sideStageEnabled) {
71− app.stage = ApplicationInfo.MainStage;
72− }
73−
74− root.focusRequested(appId);
75− }
76− }
77−
78− function activateApplication(desktopFile, argument) {
79− var appId;
80−
81− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
82− // TODO: convert entire shell to use appId only.
83− if (desktopFile.indexOf(".desktop") >= 0) {
84− appId = desktopFileToAppId(desktopFile);
85− } else {
86− appId = desktopFile;
87− }
88−
89− var application = ApplicationManager.findApplication(appId);
90− if (application !== null) {
91− return application;
92− }
93−
94− var execFlags = sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
95−
96− if (argument) {
97− return ApplicationManager.startApplication(appId, execFlags, [argument]);
98− } else {
99− return ApplicationManager.startApplication(appId, execFlags);
100− }
101− }
102−
103− function stopApplication(application) {
104− var appId;
105−
106− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
107− // TODO: convert entire shell to use appId only.
108− if (typeof application == "string") {
109− appId = application;
110− } else {
111− appId = desktopFileToAppId(application.desktopFile);
112− }
113−
114− ApplicationManager.stopApplication(appId);
115− }
116−
117− function focusApplication(application) {
118− if (application == null || application == undefined) {
119− return;
120− }
121−
122− ApplicationManager.focusApplication(application.appId);
123− }
124−
125− function unfocusCurrentApplication() {
126− ApplicationManager.unfocusCurrentApplication();
127− }
128−
129− function moveRunningApplicationStackPosition(from, to, stage) {
130− if (from == to || from < 0 || to < 0) return;
131−
132− if (stage == ApplicationInfo.SideStage) {
133− sideStageModel.move(from, to);
134− } else {
135− mainStageModel.move(from, to);
136− }
137− }
138−
139− function getApplicationFromDesktopFile(desktopFile, stage) {
140− var appId;
141−
142− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
143− // TODO: convert entire shell to use appId only.
144− if (desktopFile.indexOf(".desktop") >= 0) {
145− appId = desktopFileToAppId(desktopFile);
146− } else {
147− appId = desktopFile;
148− }
149−
150− for (var i = 0, len = ApplicationManager.count; i < len; i++ ) {
151− var app = ApplicationManager.get(i);
152−
153− // if stage not specified, return whichever app running on either stage
154− if (app.appId == appId && (stage == undefined || app.stage == stage)) {
155− return app;
156− }
157− }
158− }
159−
160− function desktopFileToAppId(desktopFile) {
161− var right = desktopFile.lastIndexOf(".desktop");
162− var left = desktopFile.lastIndexOf("/");
163− if (left == -1 || right == -1 || left == right) {
164− console.log("ApplicationManagerWrapper: unable to extract appId from '" + desktopFile + "'");
165− return "";
166− }
167− return desktopFile.substring(left+1, right);
168− }
169−}
qml/Components/ApplicationScreenshot.qmldeleted−61
@@ -1,61 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Unity.Application 0.1
20−
21−Item {
22− id: applicationScreenshot
23−
24− property var application: null
25− property bool withBackground: false
26− property bool ready: applicationImage.ready || withBackground
27−
28− function setApplication(application) {
29− applicationScreenshot.application = application
30− }
31−
32− function clearApplication() {
33− applicationScreenshot.withBackground = false;
34− applicationScreenshot.application = null
35− applicationScreenshot.scheduleUpdate();
36− }
37−
38− function scheduleUpdate() {
39− applicationImage.scheduleUpdate()
40− }
41−
42− function updateFromCache() {
43− applicationImage.updateFromCache()
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "white" // FIXME should use normal background color of Suru theme
50− visible: applicationScreenshot.withBackground
51− }
52−
53− ApplicationImage {
54− id: applicationImage
55− objectName: "screenshot image"
56− width: applicationScreenshot.application ? parent.width : 0
57− height: applicationScreenshot.application ? parent.height : 0
58− visible: applicationScreenshot.application != null && ready
59− source: ApplicationManager.findApplication((application) ? application.appId : "")
60− }
61−}
qml/Components/ApplicationsModelStageFiltered.qmldeleted−49
@@ -1,49 +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 Utils 0.1
19−import Unity.Application 0.1
20−
21−SortFilterProxyModel {
22− id: root
23− property int stage
24−
25− function get(index) {
26− return model.get(mapRowToSource(index));
27− }
28−
29− function move(from, to) {
30− var realFrom = mapRowToSource(from);
31− if (realFrom == -1) {
32− console.log("ERROR; invalid from=" + from + " index in move operation");
33− return;
34− }
35− var realTo = mapRowToSource(to);
36− if (realTo == -1) {
37− // assuming wanting to move to end of list
38− realTo = model.count - 1;
39− }
40−
41− if (realFrom == realTo) return;
42− model.move(realFrom, realTo);
43− }
44−
45− model: ApplicationManager
46− dynamicSortFilter: true
47− filterRole: ApplicationManager.RoleStage
48− filterRegExp: RegExp(stage)
49−}
qml/Components/Carousel.qml+82−82
@@ -75,6 +75,7 @@ Item {
7575 The scaling of the items is controlled by the variable continuousIndex, described below. */
7676 ListView {
7777 id: listView
78+ objectName: "listView"
7879
7980 property int highlightIndex: -1
8081 property real minimumTileWidth: 0
@@ -148,15 +149,19 @@ Item {
148149 maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
149150 orientation: ListView.Horizontal
150151
151− function itemClicked(index, delegateItem) {
152− listView.currentIndex = index
153− var x = CarouselJS.getXFromContinuousIndex(index,
152+ function getXFromContinuousIndex(index) {
153+ return CarouselJS.getXFromContinuousIndex(index,
154154 realWidth,
155− realContentWidth,
155+ footerItem.x,
156156 tileWidth,
157157 gapToMiddlePhase,
158158 gapToEndPhase,
159159 carousel.drawBuffer)
160+ }
161+
162+ function itemClicked(index, delegateItem) {
163+ listView.currentIndex = index
164+ var x = getXFromContinuousIndex(index);
160165
161166 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
162167 /* We're clicking the selected item and
@@ -174,13 +179,7 @@ Item {
174179 }
175180
176181 function itemPressAndHold(index, delegateItem) {
177− var x = CarouselJS.getXFromContinuousIndex(index,
178− realWidth,
179− realContentWidth,
180− tileWidth,
181− gapToMiddlePhase,
182− gapToEndPhase,
183− carousel.drawBuffer);
182+ var x = getXFromContinuousIndex(index);
184183
185184 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
186185 /* We're pressAndHold the selected item and
@@ -209,22 +208,17 @@ Item {
209208 newContentX = disabledNewContentX
210209 }
211210 onMovementEnded: {
212− if (realContentX > 0 && realContentX < realContentWidth - realWidth)
211+ if (realContentX > 0)
213212 stepAnimation.start()
214213 }
215214
216215 SmoothedAnimation {
217216 id: stepAnimation
217+ objectName: "stepAnimation"
218218
219219 target: listView
220220 property: "contentX"
221− to: CarouselJS.getXFromContinuousIndex(listView.selectedIndex,
222− listView.realWidth,
223− listView.realContentWidth,
224− listView.tileWidth,
225− listView.gapToMiddlePhase,
226− listView.gapToEndPhase,
227− carousel.drawBuffer)
221+ to: listView.getXFromContinuousIndex(listView.selectedIndex)
228222 duration: 450
229223 velocity: 200
230224 easing.type: Easing.InOutQuad
@@ -261,77 +255,83 @@ Item {
261255 listView.gapToEndPhase,
262256 listView.translationXViewFactor)
263257
264− delegate: Loader {
265− property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
266− property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
267− readonly property bool explicitScale: (!listView.moving ||
268− listView.realContentX <= 0 ||
269− listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
270− listView.newContentX === listView.disabledNewContentX &&
271− index === listView.selectedIndex
272− readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
273− readonly property real distance: listView.continuousIndex - index
274− readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
275− (index + 0.5), // good approximation of scale while changing selected item
276− listView.count,
277− listView.visibleTilesScaleFactor)
278− readonly property real itemScale: CarouselJS.getItemScale(distance,
279− listView.continuousIndex,
280− listView.count,
281− listView.visibleTilesScaleFactor)
282− readonly property real translationX: CarouselJS.getItemTranslation(index,
283− listView.selectedIndex,
284− distance,
285− itemScale,
286− itemTranslationScale,
287− listView.maximumItemTranslation)
288−
289− readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
290− readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
291−
292− width: listView.tileWidth
293− height: listView.tileHeight
294− scale: itemScale * explicitScaleFactor
295− sourceComponent: itemComponent
296− z: cachedTiles - Math.abs(index - listView.selectedIndex)
297−
298− transform: Translate {
299− x: xTransform
300− }
258+ delegate: tileWidth > 0 && tileHeight > 0 ? loaderComponent : undefined
259+
260+ Component {
261+ id: loaderComponent
262+
263+ Loader {
264+ property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
265+ property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
266+ readonly property bool explicitScale: (!listView.moving ||
267+ listView.realContentX <= 0 ||
268+ listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
269+ listView.newContentX === listView.disabledNewContentX &&
270+ index === listView.selectedIndex
271+ readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
272+ readonly property real distance: listView.continuousIndex - index
273+ readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
274+ (index + 0.5), // good approximation of scale while changing selected item
275+ listView.count,
276+ listView.visibleTilesScaleFactor)
277+ readonly property real itemScale: CarouselJS.getItemScale(distance,
278+ listView.continuousIndex,
279+ listView.count,
280+ listView.visibleTilesScaleFactor)
281+ readonly property real translationX: CarouselJS.getItemTranslation(index,
282+ listView.selectedIndex,
283+ distance,
284+ itemScale,
285+ itemTranslationScale,
286+ listView.maximumItemTranslation)
287+
288+ readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
289+ readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
290+
291+ width: listView.tileWidth
292+ height: listView.tileHeight
293+ scale: itemScale * explicitScaleFactor
294+ sourceComponent: itemComponent
295+ z: cachedTiles - Math.abs(index - listView.selectedIndex)
296+
297+ transform: Translate {
298+ x: xTransform
299+ }
301300
302− Behavior on explicitScaleFactor {
303− SequentialAnimation {
304− ScriptAction {
305− script: if (!explicitScale)
306− explicitlyScaled = false
307− }
308− NumberAnimation {
309− duration: explicitScaleFactor === 1.0 ? 250 : 150
310− easing.type: Easing.InOutQuad
311− }
312− ScriptAction {
313− script: if (explicitScale)
314− explicitlyScaled = true
301+ Behavior on explicitScaleFactor {
302+ SequentialAnimation {
303+ ScriptAction {
304+ script: if (!explicitScale)
305+ explicitlyScaled = false
306+ }
307+ NumberAnimation {
308+ duration: explicitScaleFactor === 1.0 ? 250 : 150
309+ easing.type: Easing.InOutQuad
310+ }
311+ ScriptAction {
312+ script: if (explicitScale)
313+ explicitlyScaled = true
314+ }
315315 }
316316 }
317− }
318317
319− onLoaded: {
320− item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
321− item.model = Qt.binding(function() { return model; })
322− }
318+ onLoaded: {
319+ item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
320+ item.model = Qt.binding(function() { return model; })
321+ }
323322
324− MouseArea {
325− id: mouseArea
323+ MouseArea {
324+ id: mouseArea
326325
327− anchors.fill: parent
326+ anchors.fill: parent
328327
329− onClicked: {
330− listView.itemClicked(index, item)
331− }
328+ onClicked: {
329+ listView.itemClicked(index, item)
330+ }
332331
333− onPressAndHold: {
334− listView.itemPressAndHold(index, item)
332+ onPressAndHold: {
333+ listView.itemPressAndHold(index, item)
334+ }
335335 }
336336 }
337337 }
qml/Components/FilterGrid.qml+1
@@ -59,6 +59,7 @@ Item {
5959 property alias cellHeight: iconTileGrid.cellHeight
6060 property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
6161 property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
62+ readonly property alias originY: iconTileGrid.originY
6263 readonly property alias flicking: iconTileGrid.flicking
6364 readonly property alias moving: iconTileGrid.moving
6465 readonly property alias pressDelay: iconTileGrid.pressDelay
qml/Components/LazyImage.qml+2−2
@@ -99,10 +99,10 @@ Item {
9999 horizontalAlignment: Image.AlignHCenter
100100 verticalAlignment: Image.AlignVCenter
101101 sourceSize.width: root.scaleTo == "width" ? root.width
102− : root.scaleTo == "fit" && root.width < root.height ? root.width
102+ : root.scaleTo == "fit" && root.width <= root.height ? root.width
103103 : 0
104104 sourceSize.height: root.scaleTo == "height" ? root.height
105− : root.scale == "fit" && root.height < root.width ? root.height
105+ : root.scaleTo == "fit" && root.height <= root.width ? root.height
106106 : 0
107107 }
108108 }
qml/Components/ResponsiveFlowView.qml+3−10
@@ -27,9 +27,8 @@ Item {
2727 property alias verticalSpacing: flow.verticalSpacing
2828 property alias horizontalSpacing: flow.horizontalSpacing
2929 property int referenceDelegateWidth
30− property alias firstModel: repeater1.model
31− property alias secondModel: repeater2.model
32− property alias delegate: repeater1.delegate
30+ property alias model: repeater.model
31+ property alias delegate: repeater.delegate
3332 readonly property int cellWidth: referenceDelegateWidth + horizontalSpacing
3433 readonly property int cellHeight: referenceDelegateWidth + verticalSpacing
3534 property alias move: flow.move
@@ -69,13 +68,7 @@ Item {
6968 property int margin: allocatableVerticalSpace - columns * horizontalSpacing
7069
7170 Repeater {
72− id: repeater1
73− model: (root.model) ? root.model[0] : null
74− }
75− Repeater {
76− id: repeater2
77− model: (root.model) ? root.model[1] : null
78− delegate: repeater1.delegate
71+ id: repeater
7972 }
8073 }
8174}
qml/Components/ResponsiveGridView.qml+1
@@ -40,6 +40,7 @@ Item {
4040 readonly property alias flicking: gridView.flicking
4141 readonly property alias moving: gridView.moving
4242 readonly property alias pressDelay: gridView.pressDelay
43+ readonly property alias originY: gridView.originY
4344 property alias delegateCreationBegin: gridView.delegateCreationBegin
4445 property alias delegateCreationEnd: gridView.delegateCreationEnd
4546 property alias highlightIndex: gridView.highlightIndex
qml/Components/Stage.qmldeleted−571
@@ -1,571 +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 Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import Ubuntu.Gestures 0.1
21−
22−/*
23− Responsible for application switching.
24−
25− Drag from the right edge to switch to the next application.
26− While being dragged, this component will show an animation for the user to
27− visualize that he's changing the stacking of applications (next/new app comes from
28− right edge and current/old app fades out).
29− */
30−Showable {
31− id: stage
32−
33− width: units.gu(40)
34− height: units.gu(71)
35−
36− property int type: ApplicationInfo.MainStage
37− property var applicationManager
38− readonly property var applications:
39− type == ApplicationInfo.MainStage ? applicationManager.mainStageApplications
40− : applicationManager.sideStageApplications
41− property bool fullyShown: false
42− property bool fullyHidden: true
43− readonly property var focusedApplication:
44− type == ApplicationInfo.MainStage ? applicationManager.mainStageFocusedApplication
45− : applicationManager.sideStageFocusedApplication
46− property bool shouldUseScreenshots: true
47−
48− /* Will be true whenever application screenshots are being shown.
49− i.e. during application window transitions */
50− readonly property bool usingScreenshots: {
51− if (newApplicationScreenshot.application != null && oldApplicationScreenshot.application != null) {
52− return newApplicationScreenshot.ready && oldApplicationScreenshot.ready;
53− } else {
54− return newApplicationScreenshot.ready || oldApplicationScreenshot.ready;
55− }
56− }
57−
58− property bool rightEdgeEnabled: true
59− property bool switchingFromFullscreenToFullscreen: false
60−
61− property alias rightEdgeDraggingAreaWidth: rightEdgeDraggingArea.width
62−
63− // Y coordinate for non-fullscreen applications
64− property int normalApplicationY: 0
65−
66− function activateApplication(desktopFile, addDelay) {
67− var application = applicationManager.getApplicationFromDesktopFile(desktopFile, stage.type);
68− if (application == null) {
69− return;
70− } else if (application == stage.focusedApplication) {
71− stage.show();
72− return;
73− }
74−
75− showStartingApplicationAnimation.prepare(application);
76− if (!stage.fullyShown) {
77− // if launching this app reveals the stage, make new application screenshot visible
78− newApplicationScreenshot.visible = true;
79− stage.show();
80− } else {
81− showStartingApplicationAnimation.start();
82− }
83−
84− if (addDelay) {
85− stage.__startingApplicationDesktopFile = desktopFile;
86− }
87− }
88−
89− Connections {
90− target: applicationManager
91− onFocusRequested: activateApplication(appId)
92− }
93−
94− /* Keep a reference to the focused application so that we can safely
95− unfocus it when the stage is not fully shown and refocus it when the stage
96− is fully shown again.
97− */
98− property var focusedApplicationWhenUsingScreenshots
99− onShouldUseScreenshotsChanged: {
100− if (showStartingApplicationAnimation.running || switchToApplicationAnimation.running) {
101− return;
102− }
103−
104− if (shouldUseScreenshots) {
105− stage.__focusApplicationUsingScreenshots(stage.focusedApplication);
106− } else {
107− if (stage.focusedApplicationWhenUsingScreenshots) {
108− stage.__focusActualApplication(stage.focusedApplicationWhenUsingScreenshots);
109− }
110− }
111− }
112−
113−
114− property Item newApplicationScreenshot: ApplicationScreenshot {
115− parent: stage
116− width: stage.width
117− height: stage.height - y
118− }
119− property Item oldApplicationScreenshot: ApplicationScreenshot {
120− parent: stage
121− width: stage.width
122− height: stage.height - y
123− }
124−
125− function __getApplicationIndex(application) {
126− if (!application)
127− return -1
128− for (var i = 0; i < stage.applications.count; i++ ) {
129− if (stage.applications.get(i).desktopFile == application.desktopFile) {
130− return i
131− }
132− }
133− return -1
134− }
135−
136−
137− property string __startingApplicationDesktopFile
138−
139− Timer {
140− id: delayedHideScreenshots
141− interval: 500 // on Galaxy Nexus, Telephony app is slowest application to draw a frame so needs this delay
142− onTriggered: {
143− __hideScreenshots();
144− }
145− }
146−
147− Timer {
148− id: hideScreenshotsAfterBriefDelay
149− // Since Mir & Qt have independent event loops, Mir often applies a focus request a frame later than when Qt
150− // asks for it. To work around, delay removing the screenshots a touch so Mir has definitely shown the app.
151− interval: 10
152− onTriggered: stage.__hideScreenshots();
153− }
154−
155− function __hideScreenshots() {
156− newApplicationScreenshot.clearApplication();
157− oldApplicationScreenshot.clearApplication();
158− newApplicationScreenshot.visible = false;
159− oldApplicationScreenshot.visible = false;
160− }
161−
162− function __focusApplication(application) {
163− if (!application) return
164− if (shouldUseScreenshots) {
165− stage.__focusApplicationUsingScreenshots(application);
166− } else {
167− stage.__focusActualApplication(application);
168− }
169− }
170−
171−
172− function __focusActualApplication(application) {
173− if (application == null) {
174− return;
175− }
176−
177− if (stage.focusedApplication == application) {
178− /* FIXME: this case is reached when showing the sidestage, we
179− need to refocus the side stage app in order to show it.
180− FIXME: this case is reached when doing a right edge swipe
181− while in the dash to bring back the stage.
182− FIXME: this case is reached when showStartingApplicationAnimation
183− finishes after the newly started application has been focused
184− automatically by the ApplicationManager.
185− */
186− if (stage.type == ApplicationInfo.SideStage) {
187− applicationManager.focusApplication(application);
188− }
189− if (!delayedHideScreenshots.running) {
190− hideScreenshotsAfterBriefDelay.start();
191− }
192− } else {
193− /* FIXME: calling ApplicationManager::focusApplication does not focus
194− the application immediately nor show the application's surface
195− immediately. Delay hiding the screenshots until it has done so.
196− */
197− delayedHideScreenshots.stop();
198− applicationManager.focusApplication(application);
199− }
200− stage.focusedApplicationWhenUsingScreenshots = null;
201− }
202−
203− function __focusApplicationUsingScreenshots(application) {
204− delayedHideScreenshots.stop();
205− if (application == null) {
206− return;
207− }
208−
209− if (newApplicationScreenshot.application != null) {
210− stage.focusedApplicationWhenUsingScreenshots = application;
211− return;
212− }
213−
214− newApplicationScreenshot.setApplication(application);
215− newApplicationScreenshot.scheduleUpdate();
216− newApplicationScreenshot.opacity = 1.0;
217− newApplicationScreenshot.x = 0.0;
218− newApplicationScreenshot.y = __getApplicationY(application);
219− newApplicationScreenshot.scale = 1.0;
220− newApplicationScreenshot.visible = true;
221− stage.focusedApplicationWhenUsingScreenshots = application;
222− stage.switchingFromFullscreenToFullscreen = false;
223− }
224−
225− function __getApplicationY(application) {
226− return Qt.binding( function(){
227− return (application && application.fullscreen
228− && application.stage !== ApplicationInfo.SideStage)
229− ? 0 : normalApplicationY;
230− } )
231− }
232−
233− /* FIXME: should hide the screenshots when the focused application's surface
234− is visible. There is no API in QtUbuntu to support that yet.
235− */
236− Connections {
237− target: stage
238− onFocusedApplicationChanged: {
239− if (stage.focusedApplication != null) {
240− /* Move application to the beginning of the list of running applications */
241− var index = stage.__getApplicationIndex(stage.focusedApplication);
242− applicationManager.moveRunningApplicationStackPosition(index, 0, stage.type);
243−
244− var startingApplication = applicationManager.getApplicationFromDesktopFile(
245− stage.__startingApplicationDesktopFile, stage.type);
246−
247− if (stage.focusedApplication == startingApplication) {
248− stage.__startingApplicationDesktopFile = "";
249−
250− /* Screenshots might still be in use at this point and their
251− use can be stopped before delayedHideScreenshots is complete.
252− Prepare for that case by setting appropriately
253− stage.focusedApplicationWhenUsingScreenshots.
254− */
255− stage.focusedApplicationWhenUsingScreenshots = stage.focusedApplication;
256−
257− /* FIXME: should hide the screenshots when the focused application's window
258− is visible. There is no API in qtubuntu to support that yet. Therefore
259− we delay their hiding to avoid a state where neither the screenshot nor
260− the application's window is visible.
261− */
262− delayedHideScreenshots.start();
263− } else {
264− stage.focusedApplicationWhenUsingScreenshots = null;
265− hideScreenshotsAfterBriefDelay.start();
266− }
267− }
268− }
269− }
270−
271− Connections {
272− target: stage.applications
273− onCountChanged: { __discardObsoleteScreenshots(); }
274− ignoreUnknownSignals: true
275− }
276− onFullyHiddenChanged: { __discardObsoleteScreenshots(); }
277− function __discardObsoleteScreenshots() {
278− if (stage.fullyHidden && stage.applications && stage.applications.count == 0) {
279− stage.focusedApplicationWhenUsingScreenshots = undefined;
280− stage.__hideScreenshots();
281− }
282− }
283−
284−
285− SequentialAnimation {
286− id: showStartingApplicationAnimation
287−
288− function prepare(newApplication) {
289− var oldApplication = stage.focusedApplication;
290− newApplicationScreenshot.setApplication(newApplication);
291− newApplicationScreenshot.updateFromCache();
292− oldApplicationScreenshot.setApplication(oldApplication);
293− oldApplicationScreenshot.scheduleUpdate();
294− newApplicationScreenshot.withBackground = true; // FIXME: should be withBackground = newApplication.state == Application.Starting
295− newApplicationScreenshot.y = __getApplicationY(newApplication);
296− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
297− stage.focusedApplicationWhenUsingScreenshots = newApplication;
298− stage.switchingFromFullscreenToFullscreen = false;
299− }
300−
301− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
302− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
303− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 0}
304− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 1}
305− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 0.8}
306− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
307− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 0.0}
308− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
309− PropertyAction {target: newApplicationScreenshot; property: "x"; value: 0.0}
310− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
311−
312− ParallelAnimation {
313− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
314− NumberAnimation {
315− target: newApplicationScreenshot
316− property: "scale"
317− duration: 500
318− easing.type: Easing.OutQuad
319− to: 1.0
320− }
321− NumberAnimation {
322− target: newApplicationScreenshot
323− property: "opacity"
324− duration: 500
325− easing.type: Easing.OutQuad
326− to: 1.0
327− }
328−
329− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
330−
331− NumberAnimation {
332− target: oldApplicationScreenshot
333− property: "x"
334− duration: 400
335− easing.type: Easing.OutQuad
336− to: stage.width
337− }
338− }
339−
340− ScriptAction {
341− script: {
342− // FIXME: only here to support case where application does
343− // not exist yet but is about to
344− if (stage.focusedApplicationWhenUsingScreenshots) {
345− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
346− }
347− }
348− }
349− }
350−
351−
352− SequentialAnimation {
353− id: switchToApplicationAnimation
354−
355− function prepare(newApplication) {
356− var oldApplication = stage.focusedApplication;
357− newApplicationScreenshot.setApplication(newApplication);
358− newApplicationScreenshot.updateFromCache();
359− oldApplicationScreenshot.setApplication(oldApplication);
360− oldApplicationScreenshot.scheduleUpdate();
361− newApplicationScreenshot.withBackground = false;
362− newApplicationScreenshot.y = __getApplicationY(newApplication);
363− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
364− stage.focusedApplicationWhenUsingScreenshots = newApplication;
365− stage.switchingFromFullscreenToFullscreen = newApplication && newApplication.fullscreen;
366− }
367−
368− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
369− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
370− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 1}
371− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 0}
372− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 1.0}
373− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
374− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 1.0}
375− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
376− PropertyAction {target: newApplicationScreenshot; property: "x"; value: stage.width}
377− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
378− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
379− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
380−
381− ParallelAnimation {
382− NumberAnimation {
383− target: oldApplicationScreenshot
384− property: "scale"
385− duration: 500
386− easing.type: Easing.OutQuad
387− to: 0.8
388− }
389− NumberAnimation {
390− target: oldApplicationScreenshot
391− property: "opacity"
392− duration: 500
393− easing.type: Easing.OutQuad
394− to: 0.0
395− }
396−
397− NumberAnimation {
398− target: newApplicationScreenshot
399− property: "x"
400− duration: 500
401− easing.type: Easing.OutQuad
402− to: 0
403− }
404− }
405−
406− ScriptAction {
407− script: {
408− // move previously focused application to the end of the list of running applications
409− var oldApplication = oldApplicationScreenshot.application;
410− if (oldApplication != null) {
411− var oldApplicationIndex = stage.__getApplicationIndex(oldApplicationScreenshot.application);
412− applicationManager.moveRunningApplicationStackPosition(
413− oldApplicationIndex, stage.applications.count - 1, stage.type);
414− }
415−
416− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
417− }
418− }
419− }
420−
421−
422− function __dragValueToProgress(dragValue, startValue, applicationsCount) {
423− if (applicationsCount == 0) {
424− return 0;
425− } else if (applicationsCount == 1) {
426− // prevent the current app from moving more than 1/4 of the screen
427− var elasticValue = __elastic(dragValue, startValue/4);
428− return elasticValue / startValue;
429− } else {
430− return dragValue / startValue;
431− }
432− }
433−
434− function __elastic(x, limit) {
435− return limit * ( 1 - Math.pow( ( limit - 1 ) / limit, x ) )
436− }
437−
438− property real __startValue: stage.width
439−
440− AnimationControllerWithSignals {
441− id: switchToApplicationAnimationController
442−
443− onAnimationCompletedAtBeginning: {
444− animation = null;
445− stage.__focusApplication(oldApplicationScreenshot.application);
446− }
447− }
448−
449− EdgeDragEvaluator {
450− id: dragEvaluator
451− trackedPosition: rightEdgeDraggingArea.touchX
452− direction: rightEdgeDraggingArea.direction
453− maxDragDistance: stage.width
454− }
455−
456− EdgeDragArea {
457− id: rightEdgeDraggingArea
458−
459− enabled: {
460− if (status == DirectionalDragArea.WaitingForTouch) {
461− return switchToApplicationAnimationController.completed
462− && stage.applications.count > 0 && stage.rightEdgeEnabled
463− && !delayedHideScreenshots.running
464− } else {
465− return true
466− }
467− }
468− width: units.gu(2)
469− anchors.top: parent.top
470− anchors.bottom: parent.bottom
471− anchors.right: parent.right
472−
473− direction: Direction.Leftwards
474−
475− onDistanceChanged: {
476− if (status !== DirectionalDragArea.Recognized)
477− return
478−
479− var targetProgress = __dragValueToProgress(-distance, __startValue,
480− stage.applications.count)
481− var delta = targetProgress - switchToApplicationAnimationController.progress
482−
483− // When the gesture finally gets recognized, the finger will likely be
484− // reasonably far from the edge. If we made the progress immediately
485− // follow the finger position it would be visually unpleasant as there
486− // would be a jump to meet the finger's current position.
487− //
488− // The trick is not to go all the way (1.0) as it would cause the
489− // aforementioned jump.
490− switchToApplicationAnimationController.progress += 0.4 * delta
491− }
492−
493− property int lastStatus: -1
494−
495− onStatusChanged: {
496− if (status == DirectionalDragArea.Undecided) {
497− onUndecided();
498− } else if (status == DirectionalDragArea.WaitingForTouch) {
499− if (lastStatus == DirectionalDragArea.Undecided) {
500− // got rejected
501− switchToApplicationAnimationController.completeToBeginningWithSignal();
502− } else {
503− onGestureEnded();
504− }
505− }
506− lastStatus = status;
507− }
508−
509− function onUndecided() {
510− dragEvaluator.reset();
511−
512− var nextApplication = null;
513− if (stage.applications.count > 1) {
514− nextApplication = stage.applications.get(1);
515− }
516− switchToApplicationAnimationController.progress = 0
517− switchToApplicationAnimation.prepare(nextApplication);
518− switchToApplicationAnimationController.animation = switchToApplicationAnimation;
519−
520− }
521−
522− function onGestureEnded() {
523− if (stage.applications.count > 1 && dragEvaluator.shouldAutoComplete()) {
524− switchToApplicationAnimationController.completeToEndWithSignal();
525− } else {
526− switchToApplicationAnimationController.completeToBeginningWithSignal();
527− }
528− }
529− }
530−
531−
532− // FIXME: very bad hack to detect when an application was closed or crashed
533− property var __previouslyFocusedApplication
534− Connections {
535− target: stage
536− onFocusedApplicationChanged: {
537− if (stage.focusedApplication == null
538− && __getApplicationIndex(stage.__previouslyFocusedApplication) == -1) {
539− stage.__onFocusedApplicationClosed();
540− }
541− stage.__previouslyFocusedApplication = stage.focusedApplication;
542− }
543− }
544−
545− function __onFocusedApplicationClosed() {
546− if (!stage.shown) {
547− return;
548− }
549−
550− if (stage.applications.count > 0) {
551− // Do not change the focused application from within onFocusedApplicationChanged.
552− // This causes binding loop warnings besides being a bad practice in general
553− // (setting a property from within its "changed" signal handling)
554− // Hence the timer.
555− focusTopmostAppTimer.start();
556− } else {
557− stage.hide();
558− }
559− }
560−
561− Timer {
562− id: focusTopmostAppTimer
563− interval: 1; repeat: false
564− onTriggered: {
565− if (stage.applications.count > 0) {
566− stage.__focusApplication(stage.applications.get(0));
567− }
568− }
569− }
570−
571−}
qml/Dash/Apps/RunningApplicationTile.qml+14−24
@@ -23,7 +23,6 @@ import "../../Components/ListItems"
2323AbstractButton {
2424 id: root
2525 property var application
26− property bool __sideStageEnabled: shell.applicationManager.sideStageEnabled
2726
2827 signal requestedApplicationActivation(var application)
2928 signal requestedApplicationTermination(var application)
@@ -34,7 +33,7 @@ AbstractButton {
3433 // To avoid "binding loop" warning
3534 height: shapedApplicationImage.height + labelContainer.height
3635
37− width: shapedApplicationImage.width
36+ width: shapedApplicationImage.width <= units.gu(11) ? units.gu(11) : height
3837
3938 property bool terminationModeEnabled: false
4039
@@ -51,32 +50,23 @@ AbstractButton {
5150 }
5251 }
5352
54− function updateScreenshotFromCache() {
55− applicationImage.updateFromCache();
56− }
57−
58− // FIXME: should use UbuntuShape from SDK
59− UbuntuShapeForItem {
53+ UbuntuShape {
6054 id: shapedApplicationImage
61− anchors {
62− top: parent.top
63− horizontalCenter: parent.horizontalCenter
64− }
55+ anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
6556
66− // FIXME: width and height should be defined according to the
67− // application window's aspect ratio.
68− width: (application.stage === ApplicationInfo.MainStage && __sideStageEnabled) ?
69− units.gu(22) : units.gu(11)
70− height: (__sideStageEnabled) ? units.gu(22) : units.gu(19)
57+ height: units.gu(17)
58+ width: applicationImage.width
7159 radius: "medium"
72− image: applicationImage
73− }
7460
75− ApplicationImage {
76− id: applicationImage
77− source: ApplicationManager.findApplication((application) ? application.appId : "")
78− width: shapedApplicationImage.width
79− height: shapedApplicationImage.height
61+ image: Image {
62+ id: applicationImage
63+ source: application.screenshot
64+ // height : width = ss.height : ss.width
65+ height: shapedApplicationImage.height
66+ fillMode: Image.PreserveAspectCrop
67+ width: Math.min(height, height * sourceSize.width / sourceSize.height)
68+ }
69+
8070 }
8171
8272 UbuntuShape {
qml/Dash/Apps/RunningApplicationsGrid.qml+5−20
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import "../../Components"
1919
2020import Ubuntu.Gestures 0.1
21+import Unity.Application 0.1
2122
2223ResponsiveFlowView {
2324 id: root
@@ -25,13 +26,7 @@ ResponsiveFlowView {
2526
2627 signal updateScreenshots
2728 property alias enableHeightBehavior: heightBehaviour.enabled
28− property bool enableHeightBehaviorOnNextCreation: firstModel.count + secondModel.count == 0
29−
30− Connections {
31− target: shell
32− onDashShownChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
33− onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
34− }
29+ property bool enableHeightBehaviorOnNextCreation: model.count === 0
3530
3631 Behavior on height {
3732 id: heightBehaviour
@@ -40,13 +35,7 @@ ResponsiveFlowView {
4035 }
4136
4237 Connections {
43− target: root.firstModel
44− onCountChanged: {
45− heightBehaviour.enabled = true;
46− }
47− }
48− Connections {
49− target: root.secondModel
38+ target: root.model
5039 onCountChanged: {
5140 heightBehaviour.enabled = true;
5241 }
@@ -85,17 +74,13 @@ ResponsiveFlowView {
8574 root.terminationModeEnabled = true
8675 }
8776 onRequestedApplicationTermination: {
88− shell.applicationManager.stopApplication(model.appId)
77+ ApplicationManager.stopApplication(model.appId)
8978 }
9079 onRequestedApplicationActivation: {
91− shell.activateApplication(model.appId)
80+ ApplicationManager.requestFocusApplication(model.appId)
9281 }
9382
9483 terminationModeEnabled: root.terminationModeEnabled
95−
96− Component.onCompleted: {
97− root.updateScreenshots.connect(updateScreenshotFromCache);
98− }
9984 }
10085 }
10186
qml/Dash/Card.qml+130−90
@@ -16,6 +16,8 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+// For image://albumart and image://thumbnailer image providers
20+import Ubuntu.Thumbnailer 0.1
1921
2022AbstractButton {
2123 id: root
@@ -23,47 +25,53 @@ AbstractButton {
2325 property var components
2426 property var cardData
2527
26− property alias fontScale: header.fontScale
27− property alias headerAlignment: header.headerAlignment
28− property alias headerHeight: header.height
29− readonly property alias title: header.title
28+ property real fontScale: 1.0
29+ property int headerAlignment: Text.AlignLeft
30+ readonly property int headerHeight: headerLoader.item ? headerLoader.item.height : 0
31+ property int fixedHeaderHeight: -1
32+ readonly property string title: cardData && cardData["title"] || ""
3033
3134 property bool showHeader: true
3235
3336 implicitWidth: childrenRect.width
34− implicitHeight: summary.y + summary.height + (summary.text && background.visible ? units.gu(1) : 0)
37+ implicitHeight: summary.y + summary.height + (summary.text && backgroundLoader.active ? units.gu(1) : 0)
3538
36− UbuntuShape {
37− id: background
38− objectName: "background"
39− radius: "medium"
40− visible: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"]
41− || artAndSummary)
42− property bool artAndSummary: components["art"]["field"] && components["summary"] || false
43− color: getColor(0) || "white"
44− gradientColor: getColor(1) || color
45− anchors.fill: parent
46− image: backgroundImage.source ? backgroundImage : null
39+ Loader {
40+ id: backgroundLoader
41+ objectName: "backgroundLoader"
4742
48− property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
43+ readonly property bool artAndSummary: components["art"]["field"] && components["summary"] || false
44+ active: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"] || artAndSummary)
45+ anchors.fill: parent
4946
50− property Image backgroundImage: Image {
51− objectName: "backgroundImage"
52− source: {
53− if (cardData && typeof cardData["background"] === "string") return cardData["background"]
54− else if (template && typeof template["card-background"] === "string") return template["card-background"]
55− else return ""
47+ sourceComponent: UbuntuShape {
48+ objectName: "background"
49+ radius: "medium"
50+ color: getColor(0) || "white"
51+ gradientColor: getColor(1) || color
52+ anchors.fill: parent
53+ image: backgroundImage.source ? backgroundImage : null
54+
55+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
56+
57+ property Image backgroundImage: Image {
58+ objectName: "backgroundImage"
59+ source: {
60+ if (cardData && typeof cardData["background"] === "string") return cardData["background"]
61+ else if (template && typeof template["card-background"] === "string") return template["card-background"]
62+ else return ""
63+ }
5664 }
57− }
5865
59− function getColor(index) {
60− if (cardData && typeof cardData["background"] === "object"
61− && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
62− return cardData["background"]["elements"][index];
63− } else if (template && typeof template["card-background"] === "object"
64− && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
65− return template["card-background"]["elements"][index];
66− } else return undefined;
66+ function getColor(index) {
67+ if (cardData && typeof cardData["background"] === "object"
68+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
69+ return cardData["background"]["elements"][index];
70+ } else if (template && typeof template["card-background"] === "object"
71+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
72+ return template["card-background"]["elements"][index];
73+ } else return undefined;
74+ }
6775 }
6876 }
6977
@@ -71,23 +79,27 @@ AbstractButton {
7179 id: artShape
7280 radius: "medium"
7381 objectName: "artShape"
74− width: {
75− if (!visible) return 0
76− return image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
77− }
78− height: {
79− if (!visible) return 0
80− return image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
81− }
8282 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
8383 anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
8484 visible: cardData && cardData["art"] || false
8585
86− property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
86+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
87+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect
88+
89+ Component.onCompleted: updateWidthHeightBindings();
90+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
91+
92+ function updateWidthHeightBindings() {
93+ if (aspectSmallerThanImageAspect) {
94+ width = Qt.binding(function() { return !visible ? 0 : image.width });
95+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
96+ } else {
97+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
98+ height = Qt.binding(function() { return !visible ? 0 : image.height });
99+ }
100+ }
87101
88102 image: Image {
89− width: template && template["card-layout"] === "horizontal" ? height * artShape.aspect : root.width
90− height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect
91103 objectName: "artImage"
92104 source: cardData && cardData["art"] || ""
93105 cache: true
@@ -96,57 +108,76 @@ AbstractButton {
96108 //sourceSize.height: height > width ? height : 0
97109 fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
98110
99− property real aspect: implicitWidth / implicitHeight
111+ readonly property real aspect: implicitWidth / implicitHeight
112+ readonly property bool isHorizontal: template && template["card-layout"] === "horizontal"
113+
114+ Component.onCompleted: updateWidthHeightBindings();
115+ onIsHorizontalChanged: updateWidthHeightBindings();
116+
117+ function updateWidthHeightBindings() {
118+ if (isHorizontal) {
119+ width = Qt.binding(function() { return height * artShape.aspect });
120+ height = Qt.binding(function() { return root.headerHeight });
121+ } else {
122+ width = Qt.binding(function() { return root.width });
123+ height = Qt.binding(function() { return width / artShape.aspect });
124+ }
125+ }
100126 }
101127 }
102128
103− ShaderEffect {
104− id: overlay
129+ Loader {
130+ id: overlayLoader
105131 anchors {
106132 left: artShape.left
107133 right: artShape.right
108134 bottom: artShape.bottom
109135 }
136+ active: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
110137
111− height: header.height
112− opacity: header.opacity * 0.6
113− visible: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
138+ sourceComponent: ShaderEffect {
139+ id: overlay
114140
115− property var source: ShaderEffectSource {
116− id: shaderSource
117− sourceItem: artShape
118− onVisibleChanged: if (visible) scheduleUpdate()
119− live: false
120− sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
121− }
141+ height: headerLoader.item ? headerLoader.item.height : 0
142+ opacity: headerLoader.item ? headerLoader.item.opacity * 0.6 : 0
122143
123− vertexShader: "
124− uniform highp mat4 qt_Matrix;
125− attribute highp vec4 qt_Vertex;
126− attribute highp vec2 qt_MultiTexCoord0;
127− varying highp vec2 coord;
128− void main() {
129− coord = qt_MultiTexCoord0;
130− gl_Position = qt_Matrix * qt_Vertex;
131− }"
132−
133− fragmentShader: "
134− varying highp vec2 coord;
135− uniform sampler2D source;
136− uniform lowp float qt_Opacity;
137− void main() {
138− lowp vec4 tex = texture2D(source, coord);
139− gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
140− }"
144+ property var source: ShaderEffectSource {
145+ id: shaderSource
146+ sourceItem: artShape
147+ onVisibleChanged: if (visible) scheduleUpdate()
148+ live: false
149+ sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
150+ }
151+
152+ vertexShader: "
153+ uniform highp mat4 qt_Matrix;
154+ attribute highp vec4 qt_Vertex;
155+ attribute highp vec2 qt_MultiTexCoord0;
156+ varying highp vec2 coord;
157+ void main() {
158+ coord = qt_MultiTexCoord0;
159+ gl_Position = qt_Matrix * qt_Vertex;
160+ }"
161+
162+ fragmentShader: "
163+ varying highp vec2 coord;
164+ uniform sampler2D source;
165+ uniform lowp float qt_Opacity;
166+ void main() {
167+ lowp vec4 tex = texture2D(source, coord);
168+ gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
169+ }"
170+ }
141171 }
142172
143− CardHeader {
144− id: header
145− objectName: "cardHeader"
173+ Loader {
174+ id: headerLoader
175+ objectName: "cardHeaderLoader"
176+
146177 anchors {
147178 top: {
148179 if (template) {
149− if (template["overlay"]) return overlay.top;
180+ if (template["overlay"]) return overlayLoader.top;
150181 if (template["card-layout"] === "horizontal") return artShape.top;
151182 }
152183 return artShape.bottom;
@@ -159,29 +190,38 @@ AbstractButton {
159190 }
160191 right: parent.right
161192 }
193+ active: cardData && cardData["title"] || cardData && cardData["mascot"] || false
194+
195+ sourceComponent: CardHeader {
196+ id: header
197+ objectName: "cardHeader"
162198
163− mascot: cardData && cardData["mascot"] || ""
164− title: cardData && cardData["title"] || ""
165− subtitle: cardData && cardData["subtitle"] || ""
199+ mascot: cardData && cardData["mascot"] || ""
200+ title: root.title
201+ subtitle: cardData && cardData["subtitle"] || ""
166202
167− titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
203+ titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
168204
169− opacity: showHeader ? 1 : 0
170− inOverlay: root.template && root.template["overlay"] === true
171− fontColor: inOverlay ? "white" : summary.color
172− useMascotShape: !background.visible && !inOverlay
205+ opacity: showHeader ? 1 : 0
206+ inOverlay: root.template && root.template["overlay"] === true
207+ fontColor: inOverlay ? "white" : summary.color
208+ useMascotShape: !backgroundLoader.active && !inOverlay
209+ headerAlignment: root.headerAlignment
210+ height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight
211+ fontScale: root.fontScale
173212
174− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
213+ Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
214+ }
175215 }
176216
177217 Label {
178218 id: summary
179219 objectName: "summaryLabel"
180220 anchors {
181− top: header.visible ? header.bottom : artShape.bottom
221+ top: headerLoader.active ? headerLoader.bottom : artShape.bottom
182222 left: parent.left
183223 right: parent.right
184− margins: background.visible ? units.gu(1) : 0
224+ margins: backgroundLoader.active ? units.gu(1) : 0
185225 topMargin: 0
186226 }
187227 wrapMode: Text.Wrap
@@ -191,6 +231,6 @@ AbstractButton {
191231 height: text ? implicitHeight : 0
192232 fontSize: "small"
193233 // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
194− color: background.visible && background.luminance < 0.7 ? "white" : "grey"
234+ color: backgroundLoader.active && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"
195235 }
196236}
qml/Dash/CardCarousel.qml+1−1
@@ -52,7 +52,7 @@ DashRenderer {
5252 itemComponent: Card {
5353 id: card
5454 objectName: "carouselDelegate" + index
55− headerHeight: carousel.headerHeight
55+ fixedHeaderHeight: carousel.headerHeight
5656 cardData: model
5757 template: cardTool.template
5858 components: cardTool.components
qml/Dash/CardFilterGrid.qml+5−6
@@ -21,12 +21,10 @@ DashRenderer {
2121 id: genericFilterGrid
2222
2323 expandable: filterGrid.expandable
24− collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
2524 collapsedHeight: filterGrid.collapsedHeight
26− columns: filterGrid.columns
27− rows: filter ? collapsedRowCount : uncollapsedRowCount
2825 margins: filterGrid.margins
2926 uncollapsedHeight: filterGrid.uncollapsedHeight
27+ originY: filterGrid.originY
3028 verticalSpacing: units.gu(1)
3129 currentItem: filterGrid.currentItem
3230 height: filterGrid.height
@@ -44,17 +42,18 @@ DashRenderer {
4442 verticalSpacing: genericFilterGrid.verticalSpacing
4543 model: genericFilterGrid.model
4644 filter: genericFilterGrid.filter
47− collapsedRowCount: genericFilterGrid.collapsedRowCount
45+ collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
4846 delegateCreationBegin: genericFilterGrid.delegateCreationBegin
4947 delegateCreationEnd: genericFilterGrid.delegateCreationEnd
50− delegate: Item {
48+ delegate: Loader {
49+ asynchronous: true
5150 width: filterGrid.cellWidth
5251 height: filterGrid.cellHeight
5352 Card {
5453 id: card
5554 width: cardTool.cardWidth
5655 height: cardTool.cardHeight
57− headerHeight: cardTool.headerHeight
56+ fixedHeaderHeight: cardTool.headerHeight
5857 anchors.horizontalCenter: parent.horizontalCenter
5958 objectName: "delegate" + index
6059 cardData: model
qml/Dash/CardHeader.qml+41−31
@@ -19,9 +19,9 @@ import Ubuntu.Components 0.1
1919
2020Item {
2121 id: root
22− property alias mascot: mascotImage.source
22+ property url mascot: ""
2323 property alias title: titleLabel.text
24− property alias subtitle: subtitleLabel.text
24+ property var subtitle
2525
2626 property alias titleWeight: titleLabel.font.weight
2727 property alias titleSize: titleLabel.fontSize
@@ -35,8 +35,8 @@ Item {
3535 property bool useMascotShape: true
3636 property color fontColor: Theme.palette.selected.backgroundText
3737
38− visible: mascotImage.status === Image.Ready || title
39− height: row.height > 0 ? row.height + row.margins * 2 : 0
38+ visible: mascot != "" || title
39+ implicitHeight: row.height > 0 ? row.height + row.margins * 2 : 0
4040
4141 Row {
4242 id: row
@@ -44,7 +44,7 @@ Item {
4444
4545 property real margins: units.gu(1)
4646
47− spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
47+ spacing: mascotShapeLoader.active || mascotImageLoader.active || inOverlay ? margins : 0
4848 anchors {
4949 top: parent.top; left: parent.left; right: parent.right
5050 margins: margins
@@ -52,33 +52,40 @@ Item {
5252 rightMargin: spacing
5353 }
5454
55− UbuntuShape {
56− id: mascotShape
57− objectName: "mascotShape"
55+ Loader {
56+ id: mascotShapeLoader
57+ objectName: "mascotShapeLoader"
5858
59+ active: useMascotShape && mascotImageLoader.item && mascotImageLoader.item.status === Image.Ready
60+ visible: active
61+ anchors.verticalCenter: parent.verticalCenter
5962 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
6063 width: units.gu(6)
6164 height: units.gu(5.625)
62− anchors.verticalCenter: parent.verticalCenter
63− visible: useMascotShape && image && image.status === Image.Ready
6465 readonly property int maxSize: Math.max(width, height) * 4
6566
66− image: useMascotShape ? mascotImage : null
67+ sourceComponent: UbuntuShape {
68+ image: mascotImageLoader.item
69+ }
6770 }
6871
69− Image {
70− id: mascotImage
71− objectName: "mascotImage"
72−
73− width: source ? mascotShape.width : 0
74− height: mascotShape.height
72+ Loader {
73+ id: mascotImageLoader
74+ active: root.mascot != ""
75+ visible: active && !useMascotShape && item.status === Image.Ready
7576 anchors.verticalCenter: parent.verticalCenter
76− visible: !useMascotShape && status === Image.Ready
77+ sourceComponent: Image {
78+ objectName: "mascotImage"
79+
80+ source: root.mascot
81+ width: source ? mascotShapeLoader.width : 0
82+ height: mascotShapeLoader.height
7783
78− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
79− fillMode: Image.PreserveAspectCrop
80− horizontalAlignment: Image.AlignHCenter
81− verticalAlignment: Image.AlignVCenter
84+ sourceSize { width: mascotShapeLoader.maxSize; height: mascotShapeLoader.maxSize }
85+ fillMode: Image.PreserveAspectCrop
86+ horizontalAlignment: Image.AlignHCenter
87+ verticalAlignment: Image.AlignVCenter
88+ }
8289 }
8390
8491 Column {
@@ -100,16 +107,19 @@ Item {
100107 color: fontColor
101108 }
102109
103− Label {
104− id: subtitleLabel
105− objectName: "subtitleLabel"
110+ Loader {
111+ active: titleLabel.text && root.subtitle
106112 anchors { left: parent.left; right: parent.right }
107− elide: Text.ElideRight
108− fontSize: "small"
109− font.weight: Font.Light
110− visible: titleLabel.text && text
111− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
112− color: fontColor
113+ sourceComponent: Label {
114+ id: subtitleLabel
115+ objectName: "subtitleLabel"
116+ elide: Text.ElideRight
117+ fontSize: "small"
118+ font.weight: Font.Light
119+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
120+ color: fontColor
121+ text: root.subtitle
122+ }
113123 }
114124 }
115125 }
qml/Dash/DashApps.qml+5−6
@@ -17,6 +17,7 @@
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Utils 0.1
20+import Unity.Application 0.1
2021import "../Components"
2122import "../Components/ListItems"
2223import "Apps"
@@ -25,17 +26,15 @@ GenericScopeView {
2526 id: scopeView
2627 objectName: "DashApps"
2728
28− // FIXME: a way to aggregate these models would be ideal
29− property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
30− property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
29+ property var runningApps: ApplicationManager
3130
3231 QtObject {
3332 id: countObject
34− property int count: scopeView.scope.searchQuery.length == 0 ? (mainStageApplicationsModel.count + sideStageApplicationModel.count) : 0
33+ property int count: scopeView.scope.searchQuery.length == 0 ? scopeView.runningApps.count : 0
3534 }
3635
3736 onScopeChanged: {
38− scopeView.scope.categories.addSpecialCategory("running.apps.category", "Recent", "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject);
39− enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0)
37+ scopeView.scope.categories.addSpecialCategory("running.apps.category", i18n.tr("Recent"), "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject);
38+ enableHeightBehaviorOnNextCreation = scopeView.runningApps.count === 0
4039 }
4140}
qml/Dash/DashContent.qml+5−10
@@ -27,13 +27,9 @@ Item {
2727 readonly property alias currentIndex: dashContentList.currentIndex
2828 property alias previewOpen: previewListView.open
2929
30− property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
3130 property ListModel searchHistory
3231
33− signal movementStarted()
34− signal movementEnded()
3532 signal scopeLoaded(string scopeId)
36− signal positionedAtBeginning()
3733 signal gotoScope(string scopeId)
3834 signal openScope(var scope)
3935
@@ -71,7 +67,7 @@ Item {
7167 dashContentList.currentIndex = index
7268
7369 if (reset) {
74− dashContent.positionedAtBeginning()
70+ dashContentList.currentItem.item.positionAtBeginning()
7571 }
7672 }
7773
@@ -114,8 +110,7 @@ Item {
114110 highlightRangeMode: ListView.StrictlyEnforceRange
115111 // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
116112 cacheBuffer: 1073741823
117− onMovementStarted: dashContent.movementStarted()
118− onMovementEnded: dashContent.movementEnded()
113+ onMovementStarted: currentItem.item.showHeader();
119114 clip: parent.x != 0
120115
121116 // If the number of items is less than the current index, then need to reset to another item.
@@ -135,7 +130,9 @@ Item {
135130 width: ListView.view.width
136131 height: ListView.view.height
137132 asynchronous: true
138− source: scopeMapper.map(scope.id)
133+ // TODO This if will eventually go away since we're killing DashApps.qml
134+ // once we move app closing to the spread
135+ source: (scope.id == "clickscope") ? "DashApps.qml" : "GenericScopeView.qml"
139136 objectName: scope.id + " loader"
140137
141138 readonly property bool moving: item ? item.moving : false
@@ -154,8 +151,6 @@ Item {
154151 item.scope = Qt.binding(function() { return scope })
155152 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
156153 item.tabBarHeight = dashPageHeader.implicitHeight;
157− dashContentList.movementStarted.connect(item.movementStarted)
158− dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
159154 dashContent.scopeLoaded(item.scope.id)
160155 }
161156 Connections {
qml/Dash/DashRenderer.qml+2−6
@@ -23,14 +23,8 @@ Item {
2323 // In case it can be expanded, should we filter it
2424 property bool filter: true
2525
26− property int collapsedRowCount: 1
27−
2826 property int collapsedHeight: height
2927
30− property int columns: 1
31−
32− property int rows: 1
33−
3428 property int margins: 0
3529
3630 property int uncollapsedHeight: height
@@ -39,6 +33,8 @@ Item {
3933
4034 property var delegateCreationEnd: undefined
4135
36+ property real originY: 0
37+
4238 property real verticalSpacing: 0
4339
4440 // The current item of the renderer
qml/Dash/GenericScopeView.qml+19−27
@@ -18,6 +18,7 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Utils 0.1
2020import Unity 0.2
21+import Unity.Application 0.1
2122import "../Components"
2223import "../Components/ListItems" as ListItems
2324
@@ -32,17 +33,11 @@ FocusScope {
3233 property PageHeader pageHeader: null
3334 property Item previewListView: null
3435
35− signal movementStarted
36− signal positionedAtBeginning
37−
3836 property bool enableHeightBehaviorOnNextCreation: false
3937 property var categoryView: categoryView
4038
41− // FIXME delay the search so that daemons have time to settle, note that
42− // removing this will break ScopeView::test_changeScope
4339 onScopeChanged: {
4440 if (scope) {
45− timer.restart();
4641 scope.activateApplication.connect(activateApp);
4742 }
4843 }
@@ -51,18 +46,20 @@ FocusScope {
5146 shell.activateApplication(appId);
5247 }
5348
49+ function positionAtBeginning() {
50+ categoryView.positionAtBeginning()
51+ }
52+
53+ function showHeader() {
54+ categoryView.showHeader()
55+ }
56+
5457 Binding {
5558 target: scope
5659 property: "isActive"
5760 value: isCurrent && !previewListView.open
5861 }
5962
60− Timer {
61− id: timer
62− interval: 2000
63− onTriggered: scope.searchQuery = ""
64− }
65−
6663 SortFilterProxyModel {
6764 id: categoryFilter
6865 model: scope ? scope.categories : null
@@ -77,10 +74,6 @@ FocusScope {
7774 previewListView.open = false;
7875 }
7976
80− onMovementStarted: categoryView.showHeader()
81−
82− onPositionedAtBeginning: categoryView.positionAtBeginning()
83−
8477 Binding {
8578 target: scopeView.scope
8679 property: "searchQuery"
@@ -167,8 +160,7 @@ FocusScope {
167160 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
168161 // TODO: this is still a kludge :D Ideally add some kind of hook so that we
169162 // can do this from DashApps.qml or think a better way that needs no special casing
170− item.firstModel = Qt.binding(function() { return mainStageApplicationsModel })
171− item.secondModel = Qt.binding(function() { return sideStageApplicationModel })
163+ item.model = Qt.binding(function() { return runningApps; })
172164 item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
173165 } else {
174166 item.model = Qt.binding(function() { return results })
@@ -250,22 +242,22 @@ FocusScope {
250242 // to the stable position and delete/create items without any reason
251243 if (categoryView.contentY < categoryView.originY) {
252244 return;
253− } else if (categoryView.contentY + categoryView.height > categoryView.contentHeight) {
245+ } else if (categoryView.contentHeight > categoryView.height && categoryView.contentY + categoryView.height > categoryView.contentHeight) {
254246 return;
255247 }
256248
257249 if (item && item.hasOwnProperty("delegateCreationBegin")) {
258250 if (baseItem.y + baseItem.height <= 0) {
259− // Not visible (item at top of the list)
260− item.delegateCreationBegin = baseItem.height
261− item.delegateCreationEnd = baseItem.height
251+ // Not visible (item at top of the list viewport)
252+ item.delegateCreationBegin = item.originY + baseItem.height
253+ item.delegateCreationEnd = item.originY + baseItem.height
262254 } else if (baseItem.y >= categoryView.height) {
263− // Not visible (item at bottom of the list)
264− item.delegateCreationBegin = 0
265− item.delegateCreationEnd = 0
255+ // Not visible (item at bottom of the list viewport)
256+ item.delegateCreationBegin = item.originY
257+ item.delegateCreationEnd = item.originY
266258 } else {
267− item.delegateCreationBegin = Math.max(-baseItem.y, 0)
268− item.delegateCreationEnd = Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
259+ item.delegateCreationBegin = item.originY + Math.max(-baseItem.y, 0)
260+ item.delegateCreationEnd = item.originY + Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
269261 }
270262 }
271263 }
qml/Dash/Previews/PreviewRatingDisplay.qml+4−2
@@ -71,7 +71,8 @@ PreviewWidget {
7171 id: authorLabel
7272 objectName: "authorLabel"
7373 anchors { left: parent.left; right: parent.right }
74− color: Theme.palette.selected.backgroundText
74+ // TODO cimi: Yet another fix requiring Palette update.
75+ color: "grey" //Theme.palette.selected.backgroundText
7576 opacity: .8
7677 text: modelData["author"] || ""
7778 visible: text !== ""
@@ -82,7 +83,8 @@ PreviewWidget {
8283 id: reviewLabel
8384 objectName: "reviewLabel"
8485 anchors { left: parent.left; right: parent.right }
85− color: Theme.palette.selected.backgroundText
86+ // TODO cimi: Yet another fix requiring Palette update.
87+ color: "grey" //Theme.palette.selected.backgroundText
8688 opacity: .8
8789 text: modelData["review"] || ""
8890 visible: text !== ""
qml/Dash/Previews/PreviewRatingInput.qml+4−2
@@ -76,7 +76,8 @@ PreviewWidget {
7676 verticalCenter: parent.verticalCenter
7777 left: parent.left
7878 }
79− color: Theme.palette.selected.backgroundText
79+ // TODO cimi: Yet another fix requiring Palette update.
80+ color: "grey" //Theme.palette.selected.backgroundText
8081 opacity: .8
8182 text: widgetData["rating-label"] || i18n.tr("Rate this")
8283 }
@@ -121,7 +122,8 @@ PreviewWidget {
121122 left: parent.left
122123 right: parent.right
123124 }
124− color: Theme.palette.selected.backgroundText
125+ // TODO cimi: Yet another fix requiring Palette update.
126+ color: "grey" //Theme.palette.selected.backgroundText
125127 opacity: .8
126128 text: widgetData["review-label"] || i18n.tr("Add a review")
127129 }
qml/Dash/Previews/PreviewVideoPlayback.qml+1
@@ -16,6 +16,7 @@
1616
1717import QtQuick 2.0
1818import Ubuntu.Components 0.1
19+import Ubuntu.Thumbnailer 0.1
1920import "../../Components"
2021
2122/*! \brief Preview widget for video.
qml/Dash/ScopeDelegateMapper.qmldeleted−30
@@ -1,30 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−QtObject {
20− property var scopeDelegateMapping: {"clickscope": "DashApps.qml"}
21− property string genericScope: "GenericScopeView.qml"
22−
23− function map(scopeId) {
24− var customScope = scopeDelegateMapping[scopeId]
25− if (customScope != undefined) {
26− return customScope
27− }
28− return genericScope
29− }
30−}
qml/Launcher/Launcher.qml+2−1
@@ -29,7 +29,8 @@ Item {
2929 property int dragAreaWidth: units.gu(1)
3030 property int minimizeDistance: units.gu(26)
3131 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
32− (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
32+ (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) :
33+ (dragArea.dragging ? 0.001 : 0)
3334
3435 readonly property bool shown: panel.x > -panel.width
3536
qml/Notifications/Notification.qml+61−4
@@ -39,20 +39,72 @@ Item {
3939
4040 fullscreen: false
4141 objectName: "background"
42− implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 4) : 0
42+ implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
4343
4444 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
4545 opacity: 0
4646
47+ state: {
48+ var result = "";
49+
50+ if (type == Notification.SnapDecision) {
51+ if (ListView.view.currentIndex == index) {
52+ result = "expanded";
53+ } else {
54+ if (ListView.view.count > 2) {
55+ if (ListView.view.currentIndex == -1 && index == 1) {
56+ result = "expanded";
57+ } else {
58+ result = "contracted";
59+ }
60+ } else {
61+ result = "expanded";
62+ }
63+ }
64+ }
65+
66+ return result;
67+ }
68+
69+ Behavior on height {
70+ id: normalHeightBehavior
71+
72+ //enabled: menuItemFactory.progress == 1
73+ enabled: true
74+ SequentialAnimation {
75+ PauseAnimation {
76+ duration: UbuntuAnimation.SnapDuration
77+ }
78+ UbuntuNumberAnimation {
79+ duration: UbuntuAnimation.SnapDuration
80+ }
81+ }
82+ }
83+
84+ states:[
85+ State {
86+ name: "contracted"
87+ PropertyChanges {target: notification; height: units.gu(8)}
88+ },
89+ State {
90+ name: "expanded"
91+ PropertyChanges {target: notification; height: implicitHeight}
92+ }
93+ ]
94+
4795 clip: fullscreen ? false : true
96+
4897 visible: type != Notification.PlaceHolder
4998
5099 UbuntuShape {
51100 id: shapedBack
52101
53102 visible: !fullscreen
54− anchors.fill: parent
55− anchors.margins: notification.margins
103+ anchors {
104+ fill: parent
105+ leftMargin: notification.margins
106+ rightMargin: notification.margins
107+ }
56108 color: parent.color
57109 opacity: parent.opacity
58110 radius: "medium"
@@ -104,17 +156,20 @@ Item {
104156 MouseArea {
105157 id: interactiveArea
106158
107− anchors.fill: contentColumn
159+ anchors.fill: parent
108160 objectName: "interactiveArea"
109161 onClicked: {
110162 if (notification.type == Notification.Interactive) {
111163 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
164+ } else {
165+ notificationList.currentIndex = index;
112166 }
113167 }
114168 }
115169
116170 Column {
117171 id: contentColumn
172+ objectName: "contentColumn"
118173
119174 anchors {
120175 left: parent.left
@@ -207,6 +262,8 @@ Item {
207262 model: unityMenuModel
208263
209264 NotificationMenuItemFactory {
265+ id: menuItemFactory
266+
210267 anchors.left: parent.left; anchors.right: parent.right
211268
212269 menuModel: unityMenuModel
qml/Notifications/NotificationMenuItemFactory.qml+2−1
@@ -66,7 +66,8 @@ Loader {
6666 TextField {
6767 id: textfield
6868
69− inputMethodHints: Qt.ImhNoAutoUppercase
69+ // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
70+ inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
7071 anchors.left: parent.left; anchors.right: parent.right
7172 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
7273 height: units.gu(5)
qml/Notifications/Notifications.qml+4
@@ -25,6 +25,9 @@ ListView {
2525 interactive: false
2626
2727 property real margin
28+ spacing: delegate.fullscreen ? 0 : units.gu(.5)
29+
30+ currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
2831
2932 delegate: Notification {
3033 objectName: "notification" + index
@@ -75,6 +78,7 @@ ListView {
7578 displaced: Transition {
7679 UbuntuNumberAnimation {
7780 properties: "x,y"
81+ duration: UbuntuAnimation.SnapDuration
7882 }
7983 }
8084}
qml/Panel/Panel.qml+1−1
@@ -62,7 +62,7 @@ Item {
6262 height: __panelMinusSeparatorLineHeight
6363 y: 0
6464
65− Behavior on y { StandardAnimation {} }
65+ Behavior on y { StandardAnimation { duration: UbuntuAnimation.FastDuration } }
6666 }
6767
6868 PanelSeparatorLine {
qml/Shell.qml+200−309
@@ -31,7 +31,6 @@ import "Panel"
3131import "Hud"
3232import "Components"
3333import "Bottombar"
34−import "SideStage"
3534import "Notifications"
3635import Unity.Notifications 1.0 as NotificationBackend
3736
@@ -49,20 +48,24 @@ FocusScope {
4948 readonly property real panelHeight: panel.panelHeight
5049
5150 property bool dashShown: dash.shown
52− property bool stageScreenshotsReady: {
53− if (sideStage.shown) {
54− if (mainStage.applications.count > 0) {
55− return mainStage.usingScreenshots && sideStage.usingScreenshots;
56− } else {
57− return sideStage.usingScreenshots;
51+
52+ property bool sideStageEnabled: shell.width >= units.gu(100)
53+ readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
54+
55+ function activateApplication(appId) {
56+ if (ApplicationManager.findApplication(appId)) {
57+ ApplicationManager.requestFocusApplication(appId);
58+ stages.show(true);
59+ if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
60+ applicationsDisplayLoader.item.select(appId);
5861 }
5962 } else {
60− return mainStage.usingScreenshots;
63+ var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
64+ ApplicationManager.startApplication(appId, execFlags);
65+ stages.show(false);
6166 }
6267 }
6368
64− property var applicationManager: ApplicationManagerWrapper {}
65−
6669 Binding {
6770 target: LauncherModel
6871 property: "applicationManager"
@@ -71,49 +74,6 @@ FocusScope {
7174
7275 Component.onCompleted: {
7376 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
74−
75− applicationManager.sideStageEnabled = Qt.binding(function() { return sideStage.enabled })
76−
77− // FIXME: if application focused before shell starts, shell draws on top of it only.
78− // We should detect already running applications on shell start and bring them to the front.
79− applicationManager.unfocusCurrentApplication();
80− }
81−
82− readonly property bool applicationFocused: !!applicationManager.mainStageFocusedApplication
83− || !!applicationManager.sideStageFocusedApplication
84− // Used for autopilot testing.
85− readonly property string currentFocusedAppId: ApplicationManager.focusedApplicationId
86−
87− readonly property bool fullscreenMode: {
88− if (greeter.shown || lockscreen.shown) {
89− return false;
90− } else if (mainStage.usingScreenshots) { // Window Manager animating so want to re-evaluate fullscreen mode
91− return mainStage.switchingFromFullscreenToFullscreen;
92− } else if (applicationManager.mainStageFocusedApplication) {
93− return applicationManager.mainStageFocusedApplication.fullscreen;
94− } else {
95− return false;
96− }
97− }
98−
99− function activateApplication(appId, argument) {
100− if (applicationManager) {
101− // For newly started applications, as it takes them time to draw their first frame
102− // we add a delay before we hide the animation screenshots to compensate.
103− var addDelay = !applicationManager.getApplicationFromDesktopFile(appId);
104−
105− var application;
106− application = applicationManager.activateApplication(appId, argument);
107− if (application == null) {
108− return;
109− }
110− if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
111− mainStage.activateApplication(appId, addDelay);
112− } else {
113− sideStage.activateApplication(appId, addDelay);
114− }
115− stages.show();
116− }
11777 }
11878
11979 GSettings {
@@ -133,244 +93,215 @@ FocusScope {
13393 Keys.onVolumeDownPressed: volumeControl.volumeDown()
13494
13595 Item {
136− id: underlay
137− objectName: "underlay"
96+ id: underlayClipper
13897 anchors.fill: parent
98+ anchors.rightMargin: stages.overlayWidth
99+ clip: stages.overlayMode && !stages.painting
139100
140− // Whether the underlay is fully covered by opaque UI elements.
141− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
101+ InputFilterArea {
102+ anchors.fill: parent
103+ blockInput: parent.clip
104+ }
142105
143− readonly property bool applicationRunning: ((mainStage.applications && mainStage.applications.count > 0)
144− || (sideStage.applications && sideStage.applications.count > 0))
106+ Item {
107+ id: underlay
108+ objectName: "underlay"
109+ anchors.fill: parent
110+ anchors.rightMargin: -parent.anchors.rightMargin
145111
146− // Whether the user should see the topmost application surface (if there's one at all).
147− readonly property bool applicationSurfaceShouldBeSeen: applicationRunning && !stages.fullyHidden
148− && !mainStage.usingScreenshots // but want sideStage animating over app surface
112+ // Whether the underlay is fully covered by opaque UI elements.
113+ property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
149114
115+ // Whether the user should see the topmost application surface (if there's one at all).
116+ readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
150117
118+ // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
119+ // through the translucent parts of the shell surface.
120+ visible: !fullyCovered && !applicationSurfaceShouldBeSeen
151121
152− // NB! Application surfaces are stacked behing the shell one. So they can only be seen by the user
153− // through the translucent parts of the shell surface.
154− visible: !fullyCovered && !applicationSurfaceShouldBeSeen
122+ CrossFadeImage {
123+ id: backgroundImage
124+ objectName: "backgroundImage"
155125
156− Rectangle {
157− anchors.fill: parent
158− color: "black"
159− opacity: dash.disappearingAnimationProgress
160− }
126+ anchors.fill: parent
127+ source: shell.background
128+ fillMode: Image.PreserveAspectCrop
129+ }
161130
162− Image {
163− anchors.fill: dash
164− source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
165− fillMode: Image.PreserveAspectCrop
166− horizontalAlignment: Image.AlignRight
167− verticalAlignment: Image.AlignTop
168− }
131+ Rectangle {
132+ anchors.fill: parent
133+ color: "black"
134+ opacity: dash.disappearingAnimationProgress
135+ }
169136
170− Dash {
171− id: dash
172− objectName: "dash"
173−
174− available: !greeter.shown && !lockscreen.shown
175− hides: [stages, launcher, panel.indicators]
176− shown: disappearingAnimationProgress !== 1.0
177− enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
178− // FIXME: unfocus all applications when going back to the dash
179− onEnabledChanged: {
180− if (enabled) {
181− shell.applicationManager.unfocusCurrentApplication()
182− }
137+ Image {
138+ anchors.fill: dash
139+ source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
140+ fillMode: Image.PreserveAspectCrop
141+ horizontalAlignment: Image.AlignRight
142+ verticalAlignment: Image.AlignTop
183143 }
184144
185− anchors {
186− fill: parent
187− topMargin: panel.panelHeight
145+ Dash {
146+ id: dash
147+ objectName: "dash"
148+
149+ available: !greeter.shown && !lockscreen.shown
150+ hides: [stages, launcher, panel.indicators]
151+ shown: disappearingAnimationProgress !== 1.0
152+ enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
153+
154+ anchors {
155+ fill: parent
156+ topMargin: panel.panelHeight
157+ }
158+
159+ contentScale: 1.0 - 0.2 * disappearingAnimationProgress
160+ opacity: 1.0 - disappearingAnimationProgress
161+ property real disappearingAnimationProgress: {
162+ if (greeter.shown) {
163+ return greeter.showProgress;
164+ } else {
165+ if (stages.overlayMode) {
166+ return 0;
167+ }
168+ return stages.showProgress
169+ }
170+ }
171+
172+ // FIXME: only necessary because stages.showProgress and
173+ // greeterRevealer.animatedProgress are not animated
174+ Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
188175 }
176+ }
177+ }
189178
190− contentScale: 1.0 - 0.2 * disappearingAnimationProgress
191− opacity: 1.0 - disappearingAnimationProgress
192− property real disappearingAnimationProgress: {
193− if (greeter.shown) {
194− return greeter.showProgress;
179+ EdgeDragArea {
180+ id: stagesDragHandle
181+ direction: Direction.Leftwards
182+
183+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
184+ width: shell.edgeSize
185+
186+ property real progress: stages.width
187+
188+ onTouchXChanged: {
189+ if (status == DirectionalDragArea.Recognized) {
190+ if (ApplicationManager.count == 0) {
191+ progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
195192 } else {
196− return stagesOuterContainer.showProgress;
193+ progress = stages.width - stagesDragHandle.width + touchX
197194 }
198195 }
196+ }
199197
200− // FIXME: only necessary because stagesOuterContainer.showProgress and
201− // greeterRevealer.animatedProgress are not animated
202− Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
198+ onDraggingChanged: {
199+ if (!dragging) {
200+ if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
201+ stages.show(true)
202+ }
203+ stagesDragHandle.progress = stages.width;
204+ }
203205 }
204206 }
205207
206208 Item {
207− id: stagesOuterContainer
208−
209+ id: stages
210+ objectName: "stages"
209211 width: parent.width
210212 height: parent.height
211− x: launcher.progress
212− Behavior on x {SmoothedAnimation{velocity: 600}}
213213
214− property real showProgress:
215− MathUtils.clamp(1 - (x + stages.x) / shell.width, 0, 1)
214+ x: {
215+ if (shown) {
216+ if (overlayMode || locked) {
217+ return 0;
218+ }
219+ return launcher.progress
220+ } else {
221+ return stagesDragHandle.progress
222+ }
223+ }
216224
217− Showable {
218− id: stages
219− objectName: "stages"
225+ Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
220226
221− x: width
227+ property bool shown: false
222228
223− property bool fullyShown: shown && x == 0 && parent.x == 0
224− property bool fullyHidden: !shown && x == width
225− available: !greeter.shown
226− hides: [panel.indicators]
227− shown: false
228− opacity: 1.0
229− showAnimation: StandardAnimation { property: "x"; duration: 350; to: 0; easing.type: Easing.OutCubic }
230− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: width; easing.type: Easing.OutCubic }
229+ property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
231230
232− width: parent.width
233− height: parent.height
231+ property bool fullyShown: x == 0
232+ property bool fullyHidden: x == width
234233
235− // close the stages when no focused application remains
236− Connections {
237− target: shell.applicationManager
238− onMainStageFocusedApplicationChanged: stages.closeIfNoApplications()
239− onSideStageFocusedApplicationChanged: stages.closeIfNoApplications()
240− ignoreUnknownSignals: true
241− }
234+ property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
235+ property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
236+ property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
237+ property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
238+ property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
242239
243− function closeIfNoApplications() {
244− if (!shell.applicationManager.mainStageFocusedApplication
245− && !shell.applicationManager.sideStageFocusedApplication
246− && shell.applicationManager.mainStageApplications.count == 0
247− && shell.applicationManager.sideStageApplications.count == 0) {
248− stages.hide();
249− }
240+ function show(focusApp) {
241+ shown = true;
242+ panel.indicators.hide();
243+ edgeDemo.stopDemo();
244+ greeter.hide();
245+ if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
246+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
250247 }
248+ }
251249
252− // show the stages when an application gets the focus
253− Connections {
254− target: shell.applicationManager
255− onMainStageFocusedApplicationChanged: {
256− if (shell.applicationManager.mainStageFocusedApplication) {
257− mainStage.show();
258− stages.show();
259− }
260− }
261− onSideStageFocusedApplicationChanged: {
262− if (shell.applicationManager.sideStageFocusedApplication) {
263− sideStage.show();
264− stages.show();
265− }
266− }
267− ignoreUnknownSignals: true
250+ function hide() {
251+ shown = false;
252+ if (ApplicationManager.focusedApplicationId) {
253+ ApplicationManager.unfocusCurrentApplication();
268254 }
255+ }
269256
270− Stage {
271− id: mainStage
257+ Connections {
258+ target: ApplicationManager
272259
273− anchors.fill: parent
274− fullyShown: stages.fullyShown
275− fullyHidden: stages.fullyHidden
276− shouldUseScreenshots: !fullyShown
277− rightEdgeEnabled: !sideStage.enabled
278−
279− applicationManager: shell.applicationManager
280− rightEdgeDraggingAreaWidth: shell.edgeSize
281− normalApplicationY: shell.panelHeight
282−
283− shown: true
284− function show() {
285− stages.show();
286− }
287− function hide() {
288− }
260+ onFocusRequested: {
261+ stages.show(true);
262+ }
289263
290− // FIXME: workaround the fact that focusing a main stage application
291− // raises its surface on top of all other surfaces including the ones
292− // that belong to side stage applications.
293− onFocusedApplicationChanged: {
294− if (focusedApplication && sideStage.focusedApplication && sideStage.fullyShown) {
295− shell.applicationManager.focusApplication(sideStage.focusedApplication);
264+ onFocusedApplicationIdChanged: {
265+ if (ApplicationManager.focusedApplicationId.length > 0) {
266+ stages.show(false);
267+ } else {
268+ if (!stages.overlayMode) {
269+ stages.hide();
296270 }
297271 }
298272 }
299273
300− SideStage {
301− id: sideStage
302−
303− applicationManager: shell.applicationManager
304− rightEdgeDraggingAreaWidth: shell.edgeSize
305− normalApplicationY: shell.panelHeight
274+ onApplicationAdded: {
275+ stages.show(false);
276+ }
306277
307− onShownChanged: {
308− if (!shown && mainStage.applications.count == 0) {
309− stages.hide();
310− }
311− }
312− // FIXME: when hiding the side stage, refocus the main stage
313− // application so that it goes in front of the side stage
314− // application and hides it
315− onFullyShownChanged: {
316− if (!fullyShown && stages.fullyShown && sideStage.focusedApplication != null) {
317− shell.applicationManager.focusApplication(mainStage.focusedApplication);
318− }
278+ onApplicationRemoved: {
279+ if (ApplicationManager.focusedApplicationId.length == 0) {
280+ stages.hide();
319281 }
282+ }
283+ }
320284
321− enabled: shell.width >= units.gu(100)
322− visible: enabled
323− fullyShown: stages.fullyShown && shown
324− && sideStage[sideStageRevealer.boundProperty] == sideStageRevealer.openedValue
325− shouldUseScreenshots: !fullyShown || mainStage.usingScreenshots || sideStageRevealer.pressed
326−
327− available: !greeter.shown && !lockscreen.shown && enabled
328− hides: [launcher, panel.indicators]
329− shown: false
330− showAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.openedValue; easing.type: Easing.OutQuint }
331− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.closedValue; easing.type: Easing.OutQuint }
332−
333− width: units.gu(40)
334− height: stages.height
335− handleExpanded: sideStageRevealer.pressed
336− }
337−
338− Revealer {
339− id: sideStageRevealer
340−
341− enabled: mainStage.applications.count > 0 && sideStage.applications.count > 0
342− && sideStage.available
343− direction: Qt.RightToLeft
344− openedValue: parent.width - sideStage.width
345− hintDisplacement: units.gu(3)
346− /* The size of the sidestage handle needs to be bigger than the
347− typical size used for edge detection otherwise it is really
348− hard to grab.
349− */
350− handleSize: sideStage.shown ? units.gu(4) : shell.edgeSize
351− closedValue: parent.width + sideStage.handleSizeCollapsed
352− target: sideStage
353− x: parent.width - width
354− width: sideStage.width + handleSize * 0.7
355− height: sideStage.height
356− orientation: Qt.Horizontal
357− }
358−
359− DragHandle {
360− id: stagesDragHandle
361−
362− anchors.top: parent.top
363− anchors.bottom: parent.bottom
364− anchors.right: parent.left
365−
366− width: shell.edgeSize
367− direction: Direction.Leftwards
368− enabled: greeter.showProgress == 0 && edgeDemo.dashEnabled
369− property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
370−
371− maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
372− // Make autocompletion impossible when !haveApps
373− edgeDragEvaluator.minDragDistance: haveApps ? maxTotalDragDistance * 0.1 : Number.MAX_VALUE
285+ Loader {
286+ id: applicationsDisplayLoader
287+ anchors.fill: parent
288+
289+ source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
290+
291+ Binding {
292+ target: applicationsDisplayLoader.item
293+ property: "moving"
294+ value: !stages.fullyShown
295+ }
296+ Binding {
297+ target: applicationsDisplayLoader.item
298+ property: "shown"
299+ value: stages.shown
300+ }
301+ Binding {
302+ target: applicationsDisplayLoader.item
303+ property: "dragAreaWidth"
304+ value: shell.edgeSize
374305 }
375306 }
376307 }
@@ -447,26 +378,6 @@ FocusScope {
447378
448379 dragHandleWidth: shell.edgeSize
449380
450− property var previousMainApp: null
451− property var previousSideApp: null
452−
453− function removeApplicationFocus() {
454− greeter.previousMainApp = applicationManager.mainStageFocusedApplication;
455− greeter.previousSideApp = applicationManager.sideStageFocusedApplication;
456− applicationManager.unfocusCurrentApplication();
457− }
458−
459− function restoreApplicationFocus() {
460− if (greeter.previousMainApp) {
461− applicationManager.focusApplication(greeter.previousMainApp);
462− greeter.previousMainApp = null;
463− }
464− if (greeter.previousSideApp) {
465− applicationManager.focusApplication(greeter.previousSideApp);
466− greeter.previousSideApp = null;
467− }
468− }
469−
470381 onShownChanged: {
471382 if (shown) {
472383 lockscreen.reset();
@@ -476,9 +387,6 @@ FocusScope {
476387 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
477388 }
478389 greeter.forceActiveFocus();
479− removeApplicationFocus();
480− } else {
481− restoreApplicationFocus();
482390 }
483391 }
484392
@@ -496,33 +404,16 @@ FocusScope {
496404 }
497405 }
498406
499− Connections {
500− target: applicationManager
501− ignoreUnknownSignals: true
502− // If any app is focused when greeter is open, it's due to a user action
503− // like a snap decision (say, an incoming call).
504− // TODO: these should be protected to only unlock for certain applications / certain usecases
505− // potentially only in connection with a notification.
506− onMainStageFocusedApplicationChanged: {
507− if (greeter.shown && applicationManager.mainStageFocusedApplication) {
508− greeter.previousMainApp = null // make way for new focused app
509− greeter.previousSideApp = null
510− greeter.hide()
511− }
512− }
513− onSideStageFocusedApplicationChanged: {
514− if (greeter.shown && applicationManager.sideStageFocusedApplication) {
515− greeter.previousMainApp = null // make way for new focused app
516− greeter.previousSideApp = null
517− greeter.hide()
518− }
519− }
407+ Binding {
408+ target: ApplicationManager
409+ property: "suspended"
410+ value: greeter.shown && greeter.showProgress == 1
520411 }
521412 }
522413
523414 InputFilterArea {
524415 anchors.fill: parent
525− blockInput: !applicationFocused || greeter.shown || lockscreen.shown || launcher.shown
416+ blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
526417 || panel.indicators.shown || hud.shown
527418 }
528419
@@ -571,7 +462,9 @@ FocusScope {
571462 available: edgeDemo.panelEnabled
572463 contentEnabled: edgeDemo.panelContentEnabled
573464 }
574− fullscreenMode: shell.fullscreenMode
465+ property string focusedAppId: ApplicationManager.focusedApplicationId
466+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
467+ fullscreenMode: focusedApplication && stages.fullscreen && !greeter.shown && !lockscreen.shown
575468 searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable
576469
577470 InputFilterArea {
@@ -597,9 +490,8 @@ FocusScope {
597490 hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
598491
599492 Connections {
600− target: shell.applicationManager
601− onMainStageFocusedApplicationChanged: hud.hide()
602− onSideStageFocusedApplicationChanged: hud.hide()
493+ target: ApplicationManager
494+ onFocusedApplicationIdChanged: hud.hide()
603495 }
604496 }
605497
@@ -624,7 +516,7 @@ FocusScope {
624516 theHud: hud
625517 anchors.fill: parent
626518 enabled: hud.available
627− applicationIsOnForeground: applicationFocused
519+ applicationIsOnForeground: ApplicationManager.focusedApplicationId
628520 }
629521
630522 InputFilterArea {
@@ -655,18 +547,17 @@ FocusScope {
655547 showHome()
656548 }
657549 onDash: {
658− if (stages.shown) {
659− stages.hide();
660− launcher.hide();
550+ if (stages.shown && !stages.overlayMode) {
551+ if (!stages.locked) {
552+ stages.hide();
553+ launcher.hide();
554+ }
661555 }
662556 }
663557 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
664− onLauncherApplicationSelected:{
665− if (edgeDemo.running)
666− return;
667−
668− greeter.hide()
669− shell.activateApplication(appId)
558+ onLauncherApplicationSelected: {
559+ if (!edgeDemo.running)
560+ shell.activateApplication(appId)
670561 }
671562 onShownChanged: {
672563 if (shown) {
@@ -750,14 +641,14 @@ FocusScope {
750641 anchors.bottom: parent.bottom
751642 anchors.left: parent.left
752643 anchors.right: parent.right
753− height: shell.applicationManager ? shell.applicationManager.keyboardHeight : 0
644+ height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
754645
755− enabled: shell.applicationManager && shell.applicationManager.keyboardVisible
646+ enabled: ApplicationManager.keyboardVisible
756647 }
757648
758649 Label {
759650 anchors.centerIn: parent
760− visible: applicationManager.fake
651+ visible: ApplicationManager.fake ? ApplicationManager.fake : false
761652 text: "EARLY ALPHA\nNOT READY FOR USE"
762653 color: "lightgrey"
763654 opacity: 0.2
qml/SideStage/SideStage.qmldeleted−73
@@ -1,73 +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 Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import "../Components"
21−
22−Stage {
23− id: stage
24−
25− type: ApplicationInfo.SideStage
26− property real handleSizeCollapsed: units.gu(2.5)
27− property real handleSizeExpanded: units.gu(4)
28− property bool handleExpanded
29−
30− /* FIXME: workaround so that when a main stage app goes fullscreen
31− the sidestage's top is not transparent. Proper fix would be to
32− resize the side stage app.
33− */
34− Rectangle {
35− id: backgroundBeneathPanel
36− anchors {
37− top: parent.top
38− left: parent.left
39− right: parent.right
40− }
41− height: shell.panelHeight
42− color: background.color
43− z: -1
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "#2c2924"
50− z: -1
51− visible: stage.usingScreenshots
52− }
53−
54− SidestageHandle {
55− id: handle
56− objectName: "sideStageHandle"
57−
58− anchors {
59− top: parent.top
60− bottom: parent.bottom
61− left: parent.left
62− leftMargin: -width
63− }
64− width: handleExpanded ? handleSizeExpanded : handleSizeCollapsed
65− Behavior on width { NumberAnimation { easing.type: Easing.OutQuart} }
66− z: -1
67− }
68−
69− InputFilterArea {
70− anchors.fill: handle
71− blockInput: visible
72− }
73−}
qml/Stages/PhoneStage.qmlnew file+499
@@ -0,0 +1,499 @@
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 Ubuntu.Gestures 0.1
20+import Unity.Application 0.1
21+import Utils 0.1
22+import "../Components"
23+
24+Item {
25+ id: root
26+
27+ // Controls to be set from outside
28+ property bool shown: false
29+ property bool moving: false
30+ property int dragAreaWidth
31+
32+ // State information propagated to the outside
33+ readonly property bool painting: mainScreenshotImage.visible || fadeInScreenshotImage.visible || appSplash.visible || spreadView.visible
34+ property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
35+ property bool locked: spreadView.visible
36+
37+ // Not used for PhoneStage, only useful for SideStage and similar
38+ property bool overlayMode: false
39+ property int overlayWidth: 0
40+
41+ function select(appId) {
42+ spreadView.snapTo(priv.indexOf(appId))
43+ }
44+
45+ onMovingChanged: {
46+ if (moving) {
47+ if (ApplicationManager.focusedApplicationId) {
48+ priv.requestNewScreenshot();
49+ } else {
50+ mainScreenshotImage.anchors.leftMargin = 0;
51+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
52+ mainScreenshotImage.visible = true;
53+ }
54+ } else {
55+ mainScreenshotImage.visible = false;
56+ }
57+ }
58+
59+ Connections {
60+ target: ApplicationManager
61+
62+ onFocusRequested: {
63+ if (spreadView.visible) {
64+ spreadView.snapTo(priv.indexOf(appId));
65+ } else {
66+ priv.switchToApp(appId);
67+ }
68+ }
69+
70+ onFocusedApplicationIdChanged: {
71+ if (ApplicationManager.focusedApplicationId.length > 0) {
72+ if (priv.secondApplicationStarting || priv.applicationStarting) {
73+ appSplashTimer.restart();
74+ } else {
75+ var application = priv.focusedApplication;
76+ root.fullscreen = application.fullscreen;
77+ mainScreenshotImage.source = application.screenshot;
78+ }
79+ } else {
80+ spreadView.selectedIndex = -1;
81+ spreadView.phase = 0;
82+ spreadView.contentX = -spreadView.shift;
83+ }
84+ }
85+
86+ onApplicationAdded: {
87+ if (!priv.focusedApplication) {
88+ mainScreenshotImage.source = "";
89+ mainScreenshotImage.visible = false;
90+ priv.applicationStarting = true;
91+ } else {
92+ mainScreenshotImage.source = "";
93+ priv.newFocusedAppId = appId;
94+ priv.secondApplicationStarting = true;
95+ priv.requestNewScreenshot();
96+ }
97+
98+ if (spreadView.visible) {
99+ spreadView.snapTo(0);
100+ }
101+ }
102+
103+ onApplicationRemoved: {
104+ if (ApplicationManager.count == 0) {
105+ mainScreenshotImage.source = ""
106+ mainScreenshotImage.visible = false;
107+ } else {
108+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
109+ }
110+ }
111+ }
112+
113+ QtObject {
114+ id: priv
115+
116+ property string focusedAppId: ApplicationManager.focusedApplicationId
117+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
118+ property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
119+
120+ property bool waitingForScreenshot: false
121+
122+ property bool applicationStarting: false
123+ property bool secondApplicationStarting: false
124+
125+ property string newFocusedAppId
126+
127+ onFocusedScreenshotChanged: {
128+ if (root.moving && priv.waitingForScreenshot) {
129+ mainScreenshotImage.anchors.leftMargin = 0;
130+ mainScreenshotImage.source = priv.focusedScreenshot
131+ mainScreenshotImage.visible = true;
132+ } else if (priv.secondApplicationStarting && priv.waitingForScreenshot) {
133+ applicationSwitchingAnimation.start();
134+ }
135+ waitingForScreenshot = false;
136+ }
137+
138+ function requestNewScreenshot() {
139+ waitingForScreenshot = true;
140+ ApplicationManager.updateScreenshot(focusedAppId);
141+ }
142+
143+ function switchToApp(appId) {
144+ if (priv.focusedAppId) {
145+ priv.newFocusedAppId = appId;
146+ root.fullscreen = ApplicationManager.findApplication(appId).fullscreen;
147+ applicationSwitchingAnimation.start();
148+ } else {
149+ ApplicationManager.focusApplication(appId);
150+ }
151+ }
152+
153+ function indexOf(appId) {
154+ for (var i = 0; i < ApplicationManager.count; i++) {
155+ if (ApplicationManager.get(i).appId == appId) {
156+ return i;
157+ }
158+ }
159+ return -1;
160+ }
161+
162+ }
163+
164+ // FIXME: the signal connections seems to get lost.
165+ Connections {
166+ target: priv.focusedApplication
167+ onScreenshotChanged: priv.focusedScreenshot = priv.focusedApplication.screenshot
168+ }
169+ Binding {
170+ target: root
171+ property: "fullscreen"
172+ value: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
173+ }
174+
175+ Timer {
176+ id: appSplashTimer
177+ // FIXME: We really need to show something meaningful in the app surface instead of guessing
178+ // when it might be ready
179+ interval: 500
180+ repeat: false
181+ onTriggered: {
182+ priv.applicationStarting = false;
183+ priv.secondApplicationStarting = false;
184+ }
185+ }
186+
187+ SequentialAnimation {
188+ id: applicationSwitchingAnimation
189+ // setup
190+ PropertyAction { target: mainScreenshotImage; property: "anchors.leftMargin"; value: 0 }
191+ PropertyAction { target: mainScreenshotImage; property: "source"; value: priv.focusedScreenshot }
192+ PropertyAction { targets: [mainScreenshotImage, fadeInScreenshotImage]; property: "visible"; value: true }
193+ PropertyAction { target: fadeInScreenshotImage; property: "source"; value: {
194+ var newFocusedApp = ApplicationManager.findApplication(priv.newFocusedAppId);
195+ return newFocusedApp ? newFocusedApp.screenshot : "" }
196+ }
197+ PropertyAction { target: fadeInScreenshotImage; property: "opacity"; value: 0 }
198+ PropertyAction { target: fadeInScreenshotImage; property: "scale"; value: .8 }
199+
200+
201+ // The actual animation
202+ ParallelAnimation {
203+ UbuntuNumberAnimation { target: mainScreenshotImage; property: "anchors.leftMargin"; to: root.width; duration: UbuntuAnimation.SlowDuration }
204+ UbuntuNumberAnimation { target: fadeInScreenshotImage; properties: "opacity,scale"; to: 1; duration: UbuntuAnimation.SlowDuration }
205+ }
206+
207+ // restore stuff
208+ ScriptAction { script: ApplicationManager.focusApplication(priv.newFocusedAppId); }
209+ PropertyAction { target: fadeInScreenshotImage; property: "visible"; value: false }
210+ PropertyAction { target: mainScreenshotImage; property: "visible"; value: false }
211+ }
212+
213+ // FIXME: Drop this and make the imageprovider show a splashscreen instead
214+ Rectangle {
215+ id: appSplash2
216+ anchors.fill: parent
217+ color: "white"
218+ visible: priv.secondApplicationStarting
219+ }
220+ Image {
221+ id: fadeInScreenshotImage
222+ anchors { left: parent.left; bottom: parent.bottom }
223+ width: parent.width
224+ scale: .7
225+ visible: false
226+ }
227+
228+ Rectangle {
229+ id: appSplash
230+ anchors.fill: parent
231+ color: "white"
232+ visible: priv.applicationStarting
233+ }
234+ Image {
235+ id: mainScreenshotImage
236+ anchors { left: parent.left; bottom: parent.bottom }
237+ width: parent.width
238+ visible: false
239+ }
240+
241+ EdgeDragArea {
242+ id: spreadDragArea
243+ direction: Direction.Leftwards
244+ enabled: ApplicationManager.count > 1 && spreadView.phase != 2
245+
246+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
247+ width: root.dragAreaWidth
248+
249+ // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
250+ // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
251+ // spreadView and make the spreadView snap to positionMarker4.
252+ property bool attachedToView: true
253+
254+ property var gesturePoints: new Array()
255+
256+ onTouchXChanged: {
257+ if (!dragging && !priv.waitingForScreenshot) {
258+ // Initial touch. Let's update the screenshot and reset the spreadView to the starting position.
259+ priv.requestNewScreenshot();
260+ spreadView.phase = 0;
261+ spreadView.contentX = -spreadView.shift;
262+ }
263+ if (dragging && attachedToView) {
264+ // Gesture recognized. Let's move the spreadView with the finger
265+ spreadView.contentX = -touchX - spreadView.shift;
266+ }
267+ if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
268+ // We passed positionMarker3. Detach from spreadView and snap it.
269+ attachedToView = false;
270+ spreadView.snap();
271+ }
272+ gesturePoints.push(touchX);
273+ }
274+
275+ onStatusChanged: {
276+ if (status == DirectionalDragArea.Recognized) {
277+ attachedToView = true;
278+ }
279+ }
280+
281+ onDraggingChanged: {
282+ if (dragging) {
283+ // Gesture recognized. Start recording this gesture
284+ gesturePoints = [];
285+ return;
286+ }
287+
288+ // Ok. The user released. Find out if it was a one-way movement.
289+ var oneWayFlick = true;
290+ var smallestX = spreadDragArea.width;
291+ for (var i = 0; i < gesturePoints.length; i++) {
292+ if (gesturePoints[i] >= smallestX) {
293+ oneWayFlick = false;
294+ break;
295+ }
296+ smallestX = gesturePoints[i];
297+ }
298+ gesturePoints = [];
299+
300+ if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
301+ spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
302+ // If it was a short one-way movement, do the Alt+Tab switch
303+ // no matter if we didn't cross positionMarker1 yet.
304+ spreadView.snapTo(1);
305+ } else if (!dragging && attachedToView) {
306+ // otherwise snap to the closest snap position we can find
307+ // (might be back to start, to app 1 or to spread)
308+ spreadView.snap();
309+ }
310+ }
311+ }
312+
313+ Rectangle {
314+ id: coverFlipBackground
315+ anchors.fill: parent
316+ color: "black"
317+ visible: spreadView.visible
318+ }
319+
320+ InputFilterArea {
321+ anchors.fill: root
322+ blockInput: spreadView.visible
323+ }
324+
325+ Flickable {
326+ id: spreadView
327+ objectName: "spreadView"
328+ anchors.fill: parent
329+ visible: spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1 || snapAnimation.running
330+ contentWidth: spreadRow.width - shift
331+ contentX: -shift
332+
333+ // The flickable needs to fill the screen in order to get touch events all over.
334+ // However, we don't want to the user to be able to scroll back all the way. For
335+ // that, the beginning of the gesture starts with a negative value for contentX
336+ // so the flickable wants to pull it into the view already. "shift" tunes the
337+ // distance where to "lock" the content.
338+ property real shift: width / 2
339+ property real shiftedContentX: contentX + shift
340+
341+ property int tileDistance: width / 4
342+
343+ // Those markers mark the various positions in the spread (ratio to screen width from right to left):
344+ // 0 - 1: following finger, snap back to the beginning on release
345+ property real positionMarker1: 0.3
346+ // 1 - 2: curved snapping movement, snap to app 1 on release
347+ property real positionMarker2: 0.45
348+ // 2 - 3: movement follows finger, snaps back to app 1 on release
349+ property real positionMarker3: 0.6
350+ // passing 3, we detach movement from the finger and snap to 4
351+ property real positionMarker4: 0.9
352+
353+ // This is where the first app snaps to when bringing it in from the right edge.
354+ property real snapPosition: 0.75
355+
356+ // Phase of the animation:
357+ // 0: Starting from right edge, a new app (index 1) comes in from the right
358+ // 1: The app has reached the first snap position.
359+ // 2: The list is dragged further and snaps into the spread view when entering phase 2
360+ property int phase: 0
361+
362+ property int selectedIndex: -1
363+
364+ onShiftedContentXChanged: {
365+ switch (phase) {
366+ case 0:
367+ if (shiftedContentX > width * positionMarker2) {
368+ phase = 1;
369+ }
370+ break;
371+ case 1:
372+ if (shiftedContentX < width * positionMarker2) {
373+ phase = 0;
374+ } else if (shiftedContentX >= width * positionMarker4) {
375+ phase = 2;
376+ }
377+ break;
378+ }
379+ }
380+
381+ function snap() {
382+ if (shiftedContentX < positionMarker1 * width) {
383+ snapAnimation.targetContentX = -shift;
384+ snapAnimation.start();
385+ } else if (shiftedContentX < positionMarker2 * width) {
386+ snapTo(1)
387+ } else if (shiftedContentX < positionMarker3 * width) {
388+ snapTo(1)
389+ } else if (phase < 2){
390+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
391+ snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
392+ snapAnimation.start();
393+ }
394+ }
395+ function snapTo(index) {
396+ spreadView.selectedIndex = index;
397+ root.fullscreen = ApplicationManager.get(index).fullscreen;
398+ snapAnimation.targetContentX = -shift;
399+ snapAnimation.start();
400+ }
401+
402+ SequentialAnimation {
403+ id: snapAnimation
404+ property int targetContentX: -spreadView.shift
405+
406+ UbuntuNumberAnimation {
407+ target: spreadView
408+ property: "contentX"
409+ to: snapAnimation.targetContentX
410+ duration: UbuntuAnimation.FastDuration
411+ }
412+
413+ ScriptAction {
414+ script: {
415+ if (spreadView.selectedIndex >= 0) {
416+ ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
417+ spreadView.selectedIndex = -1
418+ spreadView.phase = 0;
419+ spreadView.contentX = -spreadView.shift;
420+ }
421+ }
422+ }
423+ }
424+
425+ Item {
426+ id: spreadRow
427+ // This width controls how much the spread can be flicked left/right. It's composed of:
428+ // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
429+ // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
430+ width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
431+
432+ x: spreadView.contentX
433+
434+ Repeater {
435+ id: spreadRepeater
436+ model: ApplicationManager
437+ delegate: TransformedSpreadDelegate {
438+ id: appDelegate
439+ objectName: "appDelegate" + index
440+ startAngle: 45
441+ endAngle: 5
442+ startScale: 1.1
443+ endScale: 0.7
444+ startDistance: spreadView.tileDistance
445+ endDistance: units.gu(.5)
446+ width: spreadView.width
447+ height: spreadView.height
448+ selected: spreadView.selectedIndex == index
449+ otherSelected: spreadView.selectedIndex >= 0 && !selected
450+
451+ z: index
452+ x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
453+
454+ // Each tile has a different progress value running from 0 to 1.
455+ // A progress value of 0 means the tile is at the right edge. 1 means the tile has reched the left edge.
456+ progress: {
457+ var tileProgress = (spreadView.shiftedContentX - index * spreadView.tileDistance) / spreadView.width;
458+ // Tile 1 needs to move directly from the beginning...
459+ if (index == 1 && spreadView.phase < 2) {
460+ tileProgress += spreadView.tileDistance / spreadView.width;
461+ }
462+ return tileProgress;
463+ }
464+
465+ // This mostly is the same as progress, just adds the snapping to phase 1 for tiles 0 and 1
466+ animatedProgress: {
467+ if (spreadView.phase == 0 && index < 2) {
468+ if (progress < spreadView.positionMarker1) {
469+ return progress;
470+ } else if (progress < spreadView.positionMarker1 + snappingCurve.period){
471+ return spreadView.positionMarker1 + snappingCurve.value * 3;
472+ } else {
473+ return spreadView.positionMarker2;
474+ }
475+ }
476+ return progress;
477+ }
478+
479+ EasingCurve {
480+ id: snappingCurve
481+ type: EasingCurve.OutQuad
482+ period: 0.05
483+ progress: appDelegate.progress - spreadView.positionMarker1
484+ }
485+
486+ onClicked: {
487+ if (spreadView.phase == 2) {
488+ if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
489+ spreadView.snapTo(index);
490+ } else {
491+ ApplicationManager.requestFocusApplication(ApplicationManager.get(index).appId);
492+ }
493+ }
494+ }
495+ }
496+ }
497+ }
498+ }
499+}
qml/SideStage/SidestageHandle.qml → qml/Stages/SidestageHandle.qmlrenamed

The content is the same.

qml/Stages/SpreadDelegate.qmlnew file+55
@@ -0,0 +1,55 @@
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 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+
21+Item {
22+ id: root
23+
24+ signal clicked()
25+
26+ property real topMarginProgress
27+
28+ QtObject {
29+ id: priv
30+ property real heightDifference: root.height - appImage.implicitHeight
31+ }
32+
33+ Image {
34+ id: dropShadow
35+ anchors.fill: appImage
36+ anchors.margins: -units.gu(2)
37+ source: "graphics/dropshadow.png"
38+ opacity: .4
39+ }
40+ Image {
41+ id: appImage
42+ anchors {
43+ left: parent.left;
44+ bottom: parent.bottom;
45+ top: parent.top;
46+ topMargin: priv.heightDifference * Math.max(0, 1 - root.topMarginProgress)
47+ }
48+ source: model.screenshot
49+ antialiasing: true
50+ }
51+ MouseArea {
52+ anchors.fill: appImage
53+ onClicked: root.clicked()
54+ }
55+}
qml/Stages/StageWithSideStage.qmlnew file+407
@@ -0,0 +1,407 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+import Unity.Application 0.1
21+import Ubuntu.Gestures 0.1
22+
23+Item {
24+ id: root
25+ objectName: "stages"
26+ anchors.fill: parent
27+
28+ // Controls to be set from outside
29+ property bool shown: false
30+ property bool moving: false
31+ property int dragAreaWidth
32+
33+ // State information propagated to the outside
34+ readonly property bool painting: mainStageImage.visible || sideStageImage.visible || sideStageSnapAnimation.running
35+ property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
36+ property bool overlayMode: (sideStageImage.shown && priv.mainStageAppId.length == 0) || priv.overlayOverride
37+ || (priv.mainStageAppId.length == 0 && sideStageSnapAnimation.running)
38+
39+ readonly property int overlayWidth: priv.overlayOverride ? 0 : priv.sideStageWidth
40+
41+ onShownChanged: {
42+ if (!shown) {
43+ priv.mainStageAppId = "";
44+ }
45+ }
46+
47+ onMovingChanged: {
48+ if (moving) {
49+ if (!priv.mainStageAppId && !priv.sideStageAppId) {
50+ // Pulling in from the right, make the last used (topmost) app visible
51+ var application = ApplicationManager.get(0);
52+ if (application.stage == ApplicationInfoInterface.SideStage) {
53+ sideStageImage.application = application;
54+ sideStageImage.x = root.width - sideStageImage.width
55+ sideStageImage.visible = true;
56+ } else {
57+ mainStageImage.application = application;
58+ mainStageImage.visible = true;
59+ }
60+ } else {
61+ priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
62+ if (priv.focusedApplicationId == priv.sideStageAppId) {
63+ priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
64+ }
65+ }
66+ } else {
67+ mainStageImage.visible = false;
68+ sideStageImage.visible = false;
69+ }
70+ }
71+
72+ QtObject {
73+ id: priv
74+
75+ property int sideStageWidth: units.gu(40)
76+
77+
78+ property string sideStageAppId
79+ property string mainStageAppId
80+
81+
82+ property var sideStageApp: ApplicationManager.findApplication(sideStageAppId)
83+ property var mainStageApp: ApplicationManager.findApplication(mainStageAppId)
84+
85+ property string sideStageScreenshot: sideStageApp ? sideStageApp.screenshot : ""
86+ property string mainStageScreenshot: mainStageApp ? mainStageApp.screenshot : ""
87+
88+ property string focusedApplicationId: ApplicationManager.focusedApplicationId
89+ property var focusedApplication: ApplicationManager.findApplication(focusedApplicationId)
90+ property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
91+
92+ property bool waitingForMainScreenshot: false
93+ property bool waitingForSideScreenshot: false
94+ property bool waitingForScreenshots: waitingForMainScreenshot || waitingForSideScreenshot
95+
96+ property string startingAppId: ""
97+
98+ // Keep overlayMode even if there is no focused app (to allow pulling in the sidestage from the right)
99+ property bool overlayOverride: false
100+
101+ onFocusedApplicationChanged: {
102+ if (focusedApplication) {
103+ if (focusedApplication.stage == ApplicationInfoInterface.MainStage) {
104+ mainStageAppId = focusedApplicationId;
105+ priv.overlayOverride = false;
106+ if (priv.startingAppId == focusedApplicationId && sideStageImage.shown) {
107+ // There was already a sidestage app on top. bring it back!
108+ ApplicationManager.focusApplication(priv.sideStageAppId)
109+ priv.startingAppId = "";
110+ }
111+ } else if (focusedApplication.stage == ApplicationInfoInterface.SideStage) {
112+ sideStageAppId = focusedApplicationId;
113+ if (priv.startingAppId == focusedApplicationId && !sideStageImage.shown) {
114+ sideStageImage.snapToApp(focusedApplication);
115+ priv.startingAppId = "";
116+ }
117+ }
118+ } else if (root.overlayMode){
119+ sideStageImage.snapTo(root.width)
120+ }
121+ }
122+
123+ onMainStageScreenshotChanged: {
124+ waitingForMainScreenshot = false;
125+ }
126+
127+ onSideStageScreenshotChanged: {
128+ waitingForSideScreenshot = false;
129+ }
130+
131+ onFocusedScreenshotChanged: {
132+ waitingForSideScreenshot = false;
133+ }
134+
135+ onWaitingForScreenshotsChanged: {
136+ if (waitingForScreenshots) {
137+ return;
138+ }
139+
140+ if (root.moving) {
141+ if (mainStageAppId) {
142+ mainStageImage.application = mainStageApp
143+ mainStageImage.visible = true;
144+ }
145+ if (sideStageAppId && focusedApplicationId == sideStageAppId) {
146+ sideStageImage.application = sideStageApp;
147+ sideStageImage.x = root.width - sideStageImage.width
148+ sideStageImage.visible = true;
149+ }
150+ }
151+ if (sideStageHandleMouseArea.pressed) {
152+ if (sideStageAppId) {
153+ sideStageImage.application = sideStageApp;
154+ sideStageImage.x = root.width - sideStageImage.width
155+ sideStageImage.visible = true;
156+ }
157+ if (mainStageAppId) {
158+ mainStageImage.application = mainStageApp
159+ mainStageImage.visible = true;
160+ }
161+ }
162+ }
163+
164+ function requestNewScreenshot(stage) {
165+ if (stage == ApplicationInfoInterface.MainStage && mainStageAppId) {
166+ waitingForMainScreenshot = true;
167+ ApplicationManager.updateScreenshot(mainStageAppId);
168+ } else if (stage == ApplicationInfoInterface.SideStage && sideStageAppId) {
169+ waitingForSideScreenshot = true;
170+ ApplicationManager.updateScreenshot(sideStageAppId);
171+ }
172+ }
173+
174+ }
175+ // FIXME: the signal connection seems to get lost with the fake application manager.
176+ Connections {
177+ target: priv.sideStageApp
178+ onScreenshotChanged: priv.sideStageScreenshot = priv.sideStageApp.screenshot
179+ }
180+ Connections {
181+ target: priv.mainStageApp
182+ onScreenshotChanged: priv.mainStageScreenshot = priv.mainStageApp.screenshot
183+ }
184+
185+ Connections {
186+ target: ApplicationManager
187+
188+ onApplicationAdded: {
189+ priv.startingAppId = appId;
190+ splashScreenTimer.start();
191+ var application = ApplicationManager.findApplication(appId)
192+ if (application.stage == ApplicationInfoInterface.SideStage) {
193+ sideStageSplash.visible = true;
194+ } else if (application.stage == ApplicationInfoInterface.MainStage) {
195+ mainStageSplash.visible = true;
196+ }
197+ }
198+
199+ onFocusRequested: {
200+ var application = ApplicationManager.findApplication(appId)
201+ if (application.stage == ApplicationInfoInterface.SideStage) {
202+ if (!root.shown) {
203+ priv.mainStageAppId = "";
204+ mainStageImage.application = null
205+ }
206+ if (sideStageImage.shown) {
207+ sideStageImage.switchTo(application);
208+ if (priv.mainStageAppId) {
209+ mainStageImage.application = priv.mainStageApp;
210+ mainStageImage.visible = true;
211+ }
212+ } else {
213+ sideStageImage.application = application;
214+ sideStageImage.snapToApp(application);
215+ }
216+ } else if (application.stage == ApplicationInfoInterface.MainStage) {
217+ if (root.shown) {
218+ if (sideStageImage.shown) {
219+ sideStageImage.application = priv.sideStageApp;
220+ sideStageImage.visible = true;
221+ }
222+ priv.mainStageAppId = application.appId;
223+ mainStageImage.switchTo(application)
224+ ApplicationManager.focusApplication(appId)
225+ if (sideStageImage.shown) {
226+ // There was already a focused SS app. Bring it back
227+ ApplicationManager.focusApplication(priv.sideStageAppId)
228+ }
229+ } else {
230+ if (sideStageImage.shown) {
231+ sideStageImage.visible = false;
232+ sideStageImage.x = root.width;
233+ }
234+
235+ mainStageImage.application = application;
236+ ApplicationManager.focusApplication(appId)
237+ }
238+ }
239+ }
240+
241+ onApplicationRemoved: {
242+ if (priv.mainStageAppId == appId) {
243+ priv.mainStageAppId = "";
244+ }
245+ if (priv.sideStageAppId == appId) {
246+ priv.sideStageAppId = "";
247+ }
248+ if (priv.sideStageAppId.length == 0) {
249+ sideStageImage.shown = false;
250+ priv.overlayOverride = false;
251+ }
252+ }
253+
254+ }
255+
256+ Timer {
257+ id: splashScreenTimer
258+ // FIXME: apart from removing this completely in the future and make the app surface paint
259+ // meaningful stuff, also check for colin's stuff to land so we can shape 1.4 secs away from here
260+ // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-manifest/+merge/210520
261+ // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-pkgdir/+merge/209909
262+ interval: 1700
263+ repeat: false
264+ onTriggered: {
265+ mainStageSplash.visible = false;
266+ sideStageSplash.visible = false;
267+ }
268+ }
269+
270+ SwitchingApplicationImage {
271+ id: mainStageImage
272+ anchors.bottom: parent.bottom
273+ width: parent.width
274+ visible: false
275+
276+ onSwitched: {
277+ sideStageImage.visible = false;
278+ }
279+ }
280+
281+ Rectangle {
282+ id: mainStageSplash
283+ anchors.fill: root
284+ anchors.rightMargin: root.width - sideStageImage.x
285+ color: "white"
286+ }
287+
288+ SidestageHandle {
289+ id: sideStageHandle
290+ anchors { top: parent.top; right: sideStageImage.left; bottom: parent.bottom }
291+ width: root.dragAreaWidth
292+ visible: root.shown && priv.sideStageAppId && sideStageImage.x < root.width
293+
294+ }
295+ MouseArea {
296+ id: sideStageHandleMouseArea
297+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom; rightMargin: sideStageImage.shown ? sideStageImage.width : 0}
298+ width: root.dragAreaWidth
299+ visible: priv.sideStageAppId
300+
301+ property var dragPoints: new Array()
302+
303+ onPressed: {
304+ priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
305+ if (priv.mainStageAppId) {
306+ priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
307+ }
308+ }
309+
310+ onMouseXChanged: {
311+ dragPoints.push(mouseX)
312+
313+ var dragPoint = root.width + mouseX;
314+ if (sideStageImage.shown) {
315+ dragPoint -= sideStageImage.width
316+ }
317+ sideStageImage.x = Math.max(root.width - sideStageImage.width, dragPoint)
318+ }
319+
320+ onReleased: {
321+ var distance = 0;
322+ var lastX = dragPoints[0];
323+ var oneWayFlick = true;
324+ for (var i = 0; i < dragPoints.length; ++i) {
325+ if (dragPoints[i] < lastX) {
326+ oneWayFlick = false;
327+ }
328+ distance += dragPoints[i] - lastX;
329+ lastX = dragPoints[i];
330+ }
331+ dragPoints = [];
332+
333+ if (oneWayFlick || distance > sideStageImage.width / 2) {
334+ sideStageImage.snapTo(root.width)
335+ } else {
336+ sideStageImage.snapToApp(priv.sideStageApp)
337+ }
338+ }
339+ }
340+
341+ SwitchingApplicationImage {
342+ id: sideStageImage
343+ width: priv.sideStageWidth
344+ height: root.height
345+ x: root.width
346+ anchors.bottom: parent.bottom
347+ visible: true
348+ property bool shown: false
349+
350+ onSwitched: {
351+ mainStageImage.visible = false;
352+ ApplicationManager.focusApplication(application.appId)
353+ }
354+
355+ function snapTo(targetX) {
356+ sideStageSnapAnimation.targetX = targetX
357+ sideStageImage.visible = true;
358+ if (priv.mainStageAppId) {
359+ mainStageImage.application = priv.mainStageApp
360+ mainStageImage.visible = true;
361+ }
362+ sideStageSnapAnimation.start();
363+ }
364+
365+ function snapToApp(application) {
366+ sideStageImage.application = application
367+ sideStageSnapAnimation.snapToId = application.appId;
368+ snapTo(root.width - sideStageImage.width);
369+ }
370+
371+ SequentialAnimation {
372+ id: sideStageSnapAnimation
373+ property int targetX: root.width
374+ property string snapToId
375+
376+ UbuntuNumberAnimation { target: sideStageImage; property: "x"; to: sideStageSnapAnimation.targetX; duration: UbuntuAnimation.SlowDuration }
377+ ScriptAction {
378+ script: {
379+ if (sideStageSnapAnimation.targetX == root.width) {
380+ if (priv.mainStageAppId) {
381+ ApplicationManager.focusApplication(priv.mainStageAppId)
382+ } else {
383+ priv.overlayOverride = true;
384+ ApplicationManager.unfocusCurrentApplication();
385+ }
386+ sideStageImage.shown = false;
387+ }
388+ if (sideStageSnapAnimation.snapToId) {
389+ ApplicationManager.focusApplication(sideStageSnapAnimation.snapToId)
390+ sideStageSnapAnimation.snapToId = "";
391+ sideStageImage.shown = true;
392+ priv.overlayOverride = false;
393+ }
394+ sideStageImage.visible = false;
395+ mainStageImage.visible = false;
396+ }
397+ }
398+ }
399+ }
400+
401+ Rectangle {
402+ id: sideStageSplash
403+ anchors.fill: parent
404+ anchors.leftMargin: sideStageImage.x
405+ color: "white"
406+ }
407+}
qml/Stages/SwitchingApplicationImage.qmlnew file+81
@@ -0,0 +1,81 @@
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 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+import Ubuntu.Components 0.1
21+
22+Rectangle {
23+ id: root
24+ implicitHeight: image.implicitHeight
25+ implicitWidth: image.implicitWidth
26+ color: "black"
27+
28+ property var application
29+
30+ signal switched()
31+
32+ function switchTo(application) {
33+ if (root.application == application) {
34+ root.switched();
35+ return;
36+ }
37+
38+ priv.newApplication = application
39+ root.visible = true;
40+ switchToAnimation.start()
41+ }
42+
43+ QtObject {
44+ id: priv
45+ property var newApplication
46+ }
47+
48+ Image {
49+ id: newImage
50+ anchors.bottom: parent.bottom
51+ width: root.width
52+ source: priv.newApplication ? priv.newApplication.screenshot : ""
53+ }
54+
55+ Image {
56+ id: image
57+ visible: true
58+ source: root.application ? root.application.screenshot : ""
59+ width: root.width
60+ height: sourceSize.height
61+ anchors.bottom: parent.bottom
62+
63+ }
64+
65+ SequentialAnimation {
66+ id: switchToAnimation
67+ ParallelAnimation {
68+ UbuntuNumberAnimation { target: image; property: "x"; from: 0; to: root.width; duration: UbuntuAnimation.SlowDuration }
69+ UbuntuNumberAnimation { target: newImage; property: "scale"; from: 0.7; to: 1; duration: UbuntuAnimation.SlowDuration }
70+ }
71+ ScriptAction {
72+ script: {
73+ image.x = 0
74+ root.application = priv.newApplication
75+ root.visible = false;
76+ priv.newApplication = null
77+ root.switched();
78+ }
79+ }
80+ }
81+}
qml/Stages/TransformedSpreadDelegate.qmlnew file+327
@@ -0,0 +1,327 @@
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 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: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+import Utils 0.1
21+import Ubuntu.Components 0.1
22+
23+SpreadDelegate {
24+ id: root
25+
26+ property bool selected: false
27+ property bool otherSelected: false
28+
29+ // The progress animates the tiles. A value > 0 makes it appear from the right edge. At 1 it reaches the end position.
30+ property real progress: 0
31+ // This is required to snap tile 1 during phase 1 and 2.
32+ property real animatedProgress: 0
33+
34+ property real startAngle: 0
35+ property real endAngle: 0
36+
37+ property real startScale: 1
38+ property real endScale: 1
39+
40+ // Specific to just one tile
41+ property real tile1StartScale: startScale + .4
42+ property real tile0SnapAngle: 10
43+
44+ property real startDistance: units.gu(5)
45+ property real endDistance: units.gu(.5)
46+
47+ onSelectedChanged: {
48+ if (selected) {
49+ priv.snapshot();
50+ }
51+ priv.isSelected = selected;
52+ }
53+
54+ onOtherSelectedChanged: {
55+ if (otherSelected) {
56+ priv.snapshot();
57+ }
58+ priv.otherSelected = otherSelected;
59+ }
60+
61+ Connections {
62+ target: spreadView
63+ onPhaseChanged: {
64+ if (spreadView.phase == 1) {
65+ if (index == 0) {
66+ priv.phase2startTranslate = priv.easingAnimation(0, spreadView.positionMarker4, 0, -spreadView.width, spreadView.positionMarker4) + spreadView.width;
67+ priv.phase2startAngle = priv.easingAnimation(0, spreadView.positionMarker4, root.startAngle, root.endAngle, spreadView.positionMarker4);
68+ priv.phase2startScale = priv.easingAnimation(0, spreadView.positionMarker4, root.startScale, root.endScale, spreadView.positionMarker4);
69+ priv.phase2startTopMarginProgress = priv.easingAnimation(0, 1, 0, 1, spreadView.positionMarker4);
70+ } else if (index == 1) {
71+ // find where the main easing for Tile 1 would be when reaching phase 2
72+ var phase2Progress = spreadView.positionMarker4 - spreadView.tileDistance / spreadView.width;
73+ priv.phase2startTranslate = priv.easingAnimation(0, phase2Progress, 0, -spreadView.width + root.endDistance, phase2Progress);
74+ priv.phase2startAngle = priv.easingAnimation(0, phase2Progress, root.startAngle, root.endAngle, phase2Progress);
75+ priv.phase2startScale = priv.easingAnimation(0, phase2Progress, root.startScale, root.endScale, phase2Progress);
76+ priv.phase2startTopMarginProgress = priv.easingAnimation(0, 1, 0, spreadView.positionMarker4, phase2Progress);
77+ }
78+ }
79+ }
80+ }
81+
82+ QtObject {
83+ id: priv
84+ property bool isSelected: false
85+ property bool otherSelected: false
86+ property real selectedProgress
87+ property real selectedXTranslate
88+ property real selectedAngle
89+ property real selectedScale
90+ property real selectedOpacity
91+ property real selectedTopMarginProgress
92+
93+ // Those values are needed as target values for the end of phase 1.
94+ // As they are static values, lets calculate them once when entering phase 1 instead of calculating them in each animation pass.
95+ property real phase2startTranslate
96+ property real phase2startAngle
97+ property real phase2startScale
98+ property real phase2startTopMarginProgress
99+
100+ function snapshot() {
101+ selectedProgress = root.progress;
102+ selectedXTranslate = xTranslate;
103+ selectedAngle = angle;
104+ selectedScale = scale;
105+ selectedOpacity = opacity;
106+ selectedTopMarginProgress = topMarginProgress;
107+ }
108+
109+ // This calculates how much negative progress there can be if unwinding the spread completely
110+ // the progress for each tile starts at 0 when it crosses the right edge, so the later a tile comes in,
111+ // the bigger its negativeProgress can be.
112+ property real negativeProgress: {
113+ if (index == 1 && spreadView.phase < 2) {
114+ return 0;
115+ }
116+ return -index * spreadView.tileDistance / spreadView.width;
117+ }
118+
119+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
120+ // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
121+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
122+ }
123+
124+ function easingAnimation(startProgress, endProgress, startValue, endValue, progress) {
125+ helperEasingCurve.progress = progress - startProgress;
126+ helperEasingCurve.period = endProgress - startProgress;
127+ return helperEasingCurve.value * (endValue - startValue) + startValue;
128+ }
129+
130+ property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
131+
132+ // The following blocks handle the animation of the tile in the spread.
133+ // At the beginning, each tile is attached at the right edge, outside the screen.
134+ // The progress for each tile starts at 0 and it reaches its end position at a progress of 1.
135+ // The first phases are handled special for the first 2 tiles. as we do the alt-tab and snapping in there
136+ // Once we reached phase 3, the animation is the same for all tiles.
137+ // When a tile is selected, the animation state is snapshotted, and the spreadView is unwound (progress animates
138+ // back to negativeProgress). All tiles are kept in place and faded out to 0 opacity except
139+ // the selected tile, which is animated from the snapshotted position to be fullscreen.
140+
141+ property real xTranslate: {
142+ if (otherSelected) {
143+ if (spreadView.phase < 2 && index == 0) {
144+ return linearAnimation(selectedProgress, negativeProgress,
145+ selectedXTranslate, selectedXTranslate - spreadView.tileDistance, root.progress);
146+ }
147+
148+ return selectedXTranslate;
149+ }
150+
151+ switch (index) {
152+ case 0:
153+ if (spreadView.phase == 0) {
154+ return Math.min(0, linearAnimation(0, spreadView.positionMarker2,
155+ 0, -spreadView.width * .25, root.animatedProgress));
156+ } else if (spreadView.phase == 1){
157+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
158+ -spreadView.width * .25, priv.phase2startTranslate, root.progress);
159+ } else if (!priv.isSelected){ // phase 2
160+ // Apply the same animation as with the rest but add spreadView.width to align it with the others.
161+ return -easingCurve.value * spreadView.width + spreadView.width;
162+ } else if (priv.isSelected) {
163+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress);
164+ }
165+
166+ case 1:
167+ if (spreadView.phase == 0 && !priv.isSelected) {
168+ return linearAnimation(0, spreadView.positionMarker2,
169+ 0, -spreadView.width * spreadView.snapPosition, root.animatedProgress);
170+ } else if (spreadView.phase == 1 && !priv.isSelected) {
171+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
172+ -spreadView.width * spreadView.snapPosition, priv.phase2startTranslate,
173+ root.progress);
174+ }
175+ }
176+
177+ if (priv.isSelected) {
178+ // Distance to left edge
179+ var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance);
180+ return linearAnimation(selectedProgress, negativeProgress,
181+ selectedXTranslate, targetTranslate, root.progress);
182+ }
183+
184+ // Fix it at the right edge...
185+ var rightEdgeOffset = -((index - 1) * root.startDistance);
186+ // ...and use our easing to move them to the left. Stop a bit earlier for each tile
187+ return -easingCurve.value * spreadView.width + (index * animatedEndDistance) + rightEdgeOffset;
188+
189+ }
190+
191+ property real angle: {
192+ if (priv.otherSelected) {
193+ return priv.selectedAngle;
194+ }
195+ if (priv.isSelected) {
196+ return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
197+ }
198+ switch (index) {
199+ case 0:
200+ if (spreadView.phase == 0) {
201+ return Math.max(0, linearAnimation(0, spreadView.positionMarker2,
202+ 0, root.tile0SnapAngle, root.animatedProgress));
203+ } else if (spreadView.phase == 1) {
204+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
205+ root.tile0SnapAngle, phase2startAngle, root.progress);
206+ }
207+ case 1:
208+ if (spreadView.phase == 0) {
209+ return linearAnimation(0, spreadView.positionMarker2, root.startAngle,
210+ root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
211+ } else if (spreadView.phase == 1) {
212+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
213+ root.startAngle * (1-spreadView.snapPosition), priv.phase2startAngle,
214+ root.progress);
215+ }
216+ }
217+ return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
218+ }
219+
220+ property real scale: {
221+ if (priv.otherSelected) {
222+ return priv.selectedScale;
223+ }
224+ if (priv.isSelected) {
225+ return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
226+ }
227+
228+ switch (index) {
229+ case 0:
230+ if (spreadView.phase == 0) {
231+ return 1;
232+ } else if (spreadView.phase == 1) {
233+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
234+ 1, phase2startScale, root.progress);
235+ }
236+ case 1:
237+ if (spreadView.phase == 0) {
238+ var targetScale = tile1StartScale - ((tile1StartScale - 1) * spreadView.snapPosition);
239+ return linearAnimation(0, spreadView.positionMarker2,
240+ root.tile1StartScale, targetScale, root.animatedProgress);
241+ } else if (spreadView.phase == 1) {
242+ var startScale = tile1StartScale - ((tile1StartScale - 1) * spreadView.snapPosition);
243+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
244+ startScale, priv.phase2startScale, root.progress);
245+ }
246+ }
247+ return root.startScale - easingCurve.value * (root.startScale - root.endScale);
248+ }
249+
250+ property real opacity: {
251+ if (priv.otherSelected) {
252+ return linearAnimation (selectedProgress, Math.max(0, selectedProgress - .5),
253+ selectedOpacity, 0, root.progress);
254+ }
255+ if (index == 0) {
256+ switch (spreadView.phase) {
257+ case 0:
258+ return linearAnimation(0, spreadView.positionMarker2, 1, .3, root.animatedProgress);
259+ case 1:
260+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
261+ .3, 1, root.animatedProgress);
262+ }
263+ }
264+
265+ return 1;
266+ }
267+
268+ property real topMarginProgress: {
269+ if (priv.isSelected) {
270+ return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
271+ }
272+
273+ switch (index) {
274+ case 0:
275+ if (spreadView.phase == 0) {
276+ return 0;
277+ } else if (spreadView.phase == 1) {
278+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
279+ 0, priv.phase2startTopMarginProgress, root.progress);
280+ }
281+ break;
282+ case 1:
283+ if (spreadView.phase == 0) {
284+ return 0;
285+ } else if (spreadView.phase == 1) {
286+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
287+ 0, priv.phase2startTopMarginProgress, root.progress);
288+ }
289+ }
290+
291+ return easingCurve.value;
292+ }
293+ }
294+
295+ transform: [
296+ Rotation {
297+ origin { x: 0; y: spreadView.height / 2 }
298+ axis { x: 0; y: 1; z: 0 }
299+ angle: priv.angle
300+ },
301+ Scale {
302+ origin { x: 0; y: spreadView.height / 2 }
303+ xScale: priv.scale
304+ yScale: xScale
305+ },
306+ Translate {
307+ x: priv.xTranslate
308+ }
309+ ]
310+ opacity: priv.opacity
311+ topMarginProgress: priv.topMarginProgress
312+
313+ EasingCurve {
314+ id: easingCurve
315+ type: EasingCurve.OutSine
316+ period: 1 - spreadView.positionMarker2
317+ progress: root.animatedProgress
318+ }
319+
320+ // This is used as a calculation helper to figure values for progress other than the current one
321+ // Do not bind anything to this...
322+ EasingCurve {
323+ id: helperEasingCurve
324+ type: easingCurve.type
325+ period: easingCurve.period
326+ }
327+}
qml/Stages/graphics/dropshadow.pngnew file

Binary file not shown.

qml/SideStage/graphics/sidestage_handle@20.png → qml/Stages/graphics/sidestage_handle@20.pngrenamed

Binary file not shown.

qml/SideStage/graphics/sidestage_handle@20.sci → qml/Stages/graphics/sidestage_handle@20.scirenamed

The content is the same.

qml/graphics/phone_background.jpg

Binary file not shown.

qml/graphics/tablet_background.jpg

Binary file not shown.

run+15−1
@@ -62,8 +62,22 @@ if $MOUSE_TOUCH; then
6262 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
6363fi
6464
65+control_c()
66+{
67+ /sbin/initctl stop unity8
68+ exit $?
69+}
70+
71+trap control_c INT
72+
6573if $GDB; then
6674 gdb -ex run --args $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
6775else
68− $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
76+ status=`/sbin/initctl status unity8`
77+ if [ "$status" != "unity8 stop/waiting" ]; then
78+ echo "Unity8 is already running, please stop it first"
79+ exit 1
80+ fi
81+ /sbin/initctl start unity8 BINARY="`readlink -f $QML_PHONE_SHELL_PATH` $QML_PHONE_SHELL_ARGS $@"
82+ tailf -n 0 ~/.cache/upstart/unity8.log
6983fi
src/ApplicationArguments.h+2−2
@@ -29,8 +29,8 @@ class ApplicationArguments : public QObject
2929 Q_OBJECT
3030public:
3131 ApplicationArguments(const QStringList& args) {
32− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
33− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
32+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
33+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
3434 if (geometryArg.size() == 2) {
3535 m_size.rwidth() = geometryArg.at(0).toInt();
3636 m_size.rheight() = geometryArg.at(1).toInt();
src/Panel/Indicators/client/indicatorsclient.cpp+2−2
@@ -48,8 +48,8 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
4848
4949 m_view->setSource(QUrl("IndicatorsClient.qml"));
5050 m_view->setResizeMode(QQuickView::SizeRootObjectToView);
51− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
52− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
51+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
52+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
5353 if (geometryArg.size() == 2) {
5454 m_view->resize(geometryArg.at(0).toInt(), geometryArg.at(1).toInt());
5555 }
src/main.cpp+3−6
@@ -115,13 +115,10 @@ int startShell(int argc, const char** argv, void* server)
115115
116116 QUrl source(::qmlDirectory()+"Shell.qml");
117117 prependImportPaths(view->engine(), ::overrideImportPaths());
118− appendImportPaths(view->engine(), ::fallbackImportPaths());
119−
120− if (isUbuntuMirServer) {
121− QStringList importPaths = view->engine()->importPathList();
122− importPaths.replaceInStrings(QRegExp("qt5/imports$"), "qt5/imports/Unity-Mir");
123− view->engine()->setImportPathList(importPaths);
118+ if (!isUbuntuMirServer) {
119+ prependImportPaths(view->engine(), ::nonMirImportPaths());
124120 }
121+ appendImportPaths(view->engine(), ::fallbackImportPaths());
125122
126123 view->setSource(source);
127124 view->setColor("transparent");
tests/CMakeLists.txt+2−2
@@ -1,7 +1,7 @@
1−# QML tests that do not require graphical capabitlies.
1+# QML tests that do not require graphical capabilities.
22add_custom_target(qmlunittests)
33
4−# QML tests that require graphical capabitlies.
4+# QML tests that require graphical capabilities.
55add_custom_target(qmluitests)
66
77add_custom_target(qmltests)
tests/autopilot/unity8/application_lifecycle/tests/__init__.py+49
@@ -0,0 +1,49 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+from autopilot.matchers import Eventually
21+from testtools.matchers import Equals
22+from ubuntuuitoolkit import fixture_setup
23+
24+from unity8 import process_helpers
25+from unity8.shell import tests
26+
27+
28+class ApplicationLifeCycleTestCase(tests.UnityTestCase):
29+
30+ def setUp(self):
31+ super(ApplicationLifeCycleTestCase, self).setUp()
32+ self._qml_mock_enabled = False
33+ self._data_dirs_mock_enabled = False
34+ unity_proxy = self.launch_unity()
35+ process_helpers.unlock_unity(unity_proxy)
36+
37+ def create_test_application(self):
38+ desktop_file_dict = fixture_setup.DEFAULT_DESKTOP_FILE_DICT
39+ desktop_file_dict.update({'X-Ubuntu-Single-Instance': 'true'})
40+ fake_application = fixture_setup.FakeApplication(
41+ desktop_file_dict=desktop_file_dict)
42+ self.useFixture(fake_application)
43+ return (
44+ fake_application.qml_file_path, fake_application.desktop_file_path)
45+
46+ def assert_current_focused_application(self, application_name):
47+ self.assertThat(
48+ self.main_window.get_current_focused_app_id,
49+ Eventually(Equals(application_name)))
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+56−72
@@ -21,27 +21,26 @@
2121
2222from __future__ import absolute_import
2323
24−from unity8.process_helpers import unlock_unity
25−from unity8.shell import disable_qml_mocking
26−from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
24+import logging
25+import os
2726
2827from autopilot.matchers import Eventually
2928from autopilot.platform import model
30−from testtools.matchers import Equals, NotEquals
29+from testtools.matchers import Equals
3130
32−import logging
31+from unity8 import process_helpers
32+from unity8.application_lifecycle import tests
3333
34−logger = logging.getLogger(__name__)
3534
35+logger = logging.getLogger(__name__)
3636
37−class ApplicationLifecycleTests(UnityTestCase):
3837
39− scenarios = _get_device_emulation_scenarios()
38+class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
4039
4140 def setUp(self):
41+ if model() == 'Desktop':
42+ self.skipTest('Test cannot be run on the desktop.')
4243 super(ApplicationLifecycleTests, self).setUp()
43− if model() == "Desktop":
44− self.skipTest("Test cannot be run on the desktop.")
4544
4645 def swipe_screen_from_right(self):
4746 width = self.main_window.width
@@ -54,80 +53,65 @@ class ApplicationLifecycleTests(UnityTestCase):
5453 logger.info("Swiping screen from the right edge")
5554 self.touch.drag(start_x, start_y, end_x, end_y)
5655
57− def _launch_app(self, app_name):
58− """Launches the application *app_name*
59−
60− Assumes that the desktop file resides at:
61− /usr/share/applications/{app_name}.desktop
56+ def launch_fake_app(self):
57+ _, desktop_file_path = self.create_test_application()
58+ desktop_file_name = os.path.basename(desktop_file_path)
59+ application_name, _ = os.path.splitext(desktop_file_name)
60+ self.launch_upstart_application(application_name)
61+ return application_name
6262
63− """
64− desktop_file = "--desktop_file_hint="\
65− "/usr/share/applications/{app_name}.desktop".format(
66− app_name=app_name
67− )
68− return self.launch_test_application(
69− app_name,
70− desktop_file,
71− "--stage_hint=main_stage",
72− app_type='qt'
73− )
74−
75− @disable_qml_mocking
7663 def test_can_launch_application(self):
7764 """Must be able to launch an application."""
78− unity_proxy = self.launch_unity()
79− unlock_unity(unity_proxy)
80−
81− app = self._launch_app("messaging-app")
65+ application_name = self.launch_fake_app()
66+ self.assert_current_focused_application(application_name)
8267
83− self.assertThat(app, NotEquals(None))
84− self.assertThat(
85− self.main_window.get_current_focused_app_id(),
86− Eventually(Equals("messaging-app"))
87− )
88−
89− @disable_qml_mocking
9068 def test_can_launch_multiple_applications(self):
9169 """A second application launched must be focused."""
92− unity_proxy = self.launch_unity()
93− unlock_unity(unity_proxy)
94−
95− self._launch_app("messaging-app")
96− self.assertThat(
97− self.main_window.get_current_focused_app_id(),
98− Eventually(Equals("messaging-app"))
99− )
100−
101− self._launch_app("address-book-app")
102− self.assertThat(
103− self.main_window.get_current_focused_app_id(),
104− Eventually(Equals("address-book-app"))
105− )
106−
107− @disable_qml_mocking
70+ application1_name = self.launch_fake_app()
71+ self.assert_current_focused_application(application1_name)
72+
73+ application2_name = self.launch_fake_app()
74+ self.assertFalse(application1_name == application2_name)
75+ self.assert_current_focused_application(application2_name)
76+
10877 def test_app_moves_from_unfocused_to_focused(self):
10978 """An application that is in the unfocused state must be able to be
11079 brought back to the focused state.
11180
11281 """
113− unity_proxy = self.launch_unity()
114− unlock_unity(unity_proxy)
115−
116− self._launch_app("messaging-app")
117− self.assertThat(
118− self.main_window.get_current_focused_app_id(),
119− Eventually(Equals("messaging-app"))
120− )
82+ application1_name = self.launch_fake_app()
83+ self.assert_current_focused_application(application1_name)
12184
122− self._launch_app("address-book-app")
123− self.assertThat(
124− self.main_window.get_current_focused_app_id(),
125− Eventually(Equals("address-book-app"))
126− )
85+ application2_name = self.launch_fake_app()
86+ self.assertFalse(application1_name == application2_name)
87+ self.assert_current_focused_application(application2_name)
12788
12889 self.swipe_screen_from_right()
12990
130− self.assertThat(
131− self.main_window.get_current_focused_app_id(),
132− Eventually(Equals("messaging-app"))
133− )
91+ self.assert_current_focused_application(application1_name)
92+
93+ def test_greeter_hides_on_app_open(self):
94+ """Greeter should hide when an app is opened"""
95+ process_helpers.lock_unity()
96+ greeter = self.main_window.get_greeter()
97+ self.assertThat(greeter.created, Eventually(Equals(True)))
98+
99+ application_name = self.launch_fake_app()
100+ self.assertThat(greeter.created, Eventually(Equals(False)))
101+ self.assert_current_focused_application(application_name)
102+
103+ def test_greeter_hides_on_app_focus(self):
104+ """Greeter should hide when an app is re-focused"""
105+ application_name = self.launch_fake_app()
106+ self.assert_current_focused_application(application_name)
107+
108+ self.main_window.show_dash_swiping()
109+ self.assert_current_focused_application('')
110+
111+ process_helpers.lock_unity()
112+ greeter = self.main_window.get_greeter()
113+ self.assertThat(greeter.created, Eventually(Equals(True)))
114+
115+ self.launch_upstart_application(application_name)
116+ self.assertThat(greeter.created, Eventually(Equals(False)))
117+ self.assert_current_focused_application(application_name)
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+8−39
@@ -20,48 +20,19 @@
2020"""Test the integration with the URL dispatcher service."""
2121
2222import os
23+import subprocess
2324
2425from autopilot import platform
25−from autopilot.matchers import Eventually
26−from testtools.matchers import Equals
27−from ubuntuuitoolkit import fixture_setup
2826
29−from unity8 import process_helpers
30−from unity8.shell import tests
27+from unity8.application_lifecycle import tests
3128
3229
33−class URLDispatcherTestCase(tests.UnityTestCase):
34−
35− scenarios = tests._get_device_emulation_scenarios()
36−
37− test_qml = ("""
38−import QtQuick 2.0
39−import Ubuntu.Components 0.1
40−
41−MainView {
42− width: units.gu(48)
43− height: units.gu(60)
44−
45− Label {
46− text: 'Test application.'
47− }
48−}
49−""")
30+class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
5031
5132 def setUp(self):
5233 if platform.model() == 'Desktop':
5334 self.skipTest("URL dispatcher doesn't work on the desktop.")
5435 super(URLDispatcherTestCase, self).setUp()
55− self._qml_mock_enabled = False
56− self._data_dirs_mock_enabled = False
57− unity_proxy = self.launch_unity()
58− process_helpers.unlock_unity(unity_proxy)
59−
60− def create_test_application(self):
61− fake_application = fixture_setup.FakeApplication(self.test_qml)
62− self.useFixture(fake_application)
63− return (
64− fake_application.qml_file_path, fake_application.desktop_file_path)
6536
6637 def test_swipe_out_application_started_by_url_dispatcher(self):
6738 _, desktop_file_path = self.create_test_application()
@@ -70,12 +41,10 @@ MainView {
7041
7142 self.assertEqual('', self.main_window.get_current_focused_app_id())
7243 self.addCleanup(os.system, 'pkill qmlscene')
73− os.system('url-dispatcher application:///{}'.format(desktop_file_name))
74− self.assertThat(
75− self.main_window.get_current_focused_app_id,
76− Eventually(Equals(application_name)))
44+
45+ subprocess.check_call(
46+ ['url-dispatcher', 'application:///{}'.format(desktop_file_name)])
47+ self.assert_current_focused_application(application_name)
7748
7849 self.main_window.show_dash_swiping()
79− self.assertThat(
80− self.main_window.get_current_focused_app_id,
81− Eventually(Equals('')))
50+ self.assert_current_focused_application('')
tests/autopilot/unity8/indicators/tests/__init__.py+17
@@ -0,0 +1,17 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity - Indicators Autopilot Test Suite
4+# Copyright (C) 2013, 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
tests/autopilot/unity8/indicators/tests/test_indicators.py+69−13
@@ -1,7 +1,7 @@
11# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
22#
3−# Unity - Indicators Autopilot Test Suite
4−# Copyright (C) 2013 Canonical
3+# Unity Indicators Autopilot Test Suite
4+# Copyright (C) 2013, 2014 Canonical
55#
66# This program is free software: you can redistribute it and/or modify
77# it under the terms of the GNU General Public License as published by
@@ -15,20 +15,32 @@
1515#
1616# You should have received a copy of the GNU General Public License
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
1918
2019from __future__ import absolute_import
2120
21+from testscenarios import multiply_scenarios
22+
2223from autopilot import platform
23−from testtools import skipIf
2424
2525from unity8.process_helpers import unlock_unity
26−from unity8.shell.tests import UnityTestCase
26+from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2727
2828
2929class IndicatorTestCase(UnityTestCase):
3030
31− scenarios = [
31+ device_emulation_scenarios = _get_device_emulation_scenarios()
32+
33+ def setUp(self):
34+ if platform.model() == 'Desktop':
35+ self.skipTest('Test cannot be run on the desktop.')
36+ super(IndicatorTestCase, self).setUp()
37+ self.unity_proxy = self.launch_unity()
38+ unlock_unity(self.unity_proxy)
39+
40+
41+class IndicatorExistsTestCase(IndicatorTestCase):
42+
43+ indicator_scenarios = [
3244 ('Bluetooth', dict(indicator_name='indicator-bluetooth')),
3345 ('Datetime', dict(indicator_name='indicator-datetime')),
3446 ('Location', dict(indicator_name='indicator-location')),
@@ -37,14 +49,58 @@ class IndicatorTestCase(UnityTestCase):
3749 ('Power', dict(indicator_name='indicator-power')),
3850 ('Sound', dict(indicator_name='indicator-sound')),
3951 ]
52+ scenarios = multiply_scenarios(
53+ indicator_scenarios,
54+ IndicatorTestCase.device_emulation_scenarios
55+ )
4056
41− @skipIf(platform.image_codename() == 'Desktop',
42− "Unity8/phablet-only test!")
4357 def setUp(self):
44− super(IndicatorTestCase, self).setUp()
58+ super(IndicatorExistsTestCase, self).setUp()
59+ if (platform.model() == 'Nexus 10' and
60+ self.indicator_name == 'indicator-bluetooth'):
61+ self.skipTest('Nexus 10 does not have bluetooth at the moment.')
4562
4663 def test_indicator_exists(self):
47− unity_proxy = self.launch_unity()
48− unlock_unity(unity_proxy)
49− indicator = self.main_window.get_indicator(self.indicator_name)
50− self.assertIsNotNone(indicator)
64+ self.main_window._get_indicator_widget(
65+ self.indicator_name
66+ )
67+
68+
69+class IndicatorPageTitleMatchesWidgetTestCase(IndicatorTestCase):
70+
71+ indicator_scenarios = [
72+ ('Bluetooth', dict(indicator_name='indicator-bluetooth',
73+ title='Bluetooth')),
74+ ('Datetime', dict(indicator_name='indicator-datetime',
75+ title='Upcoming')),
76+ ('Location', dict(indicator_name='indicator-location',
77+ title='Location')),
78+ ('Messaging', dict(indicator_name='indicator-messages',
79+ title='Incoming')),
80+ ('Network', dict(indicator_name='indicator-network',
81+ title='Network')),
82+ ('Power', dict(indicator_name='indicator-power',
83+ title='Battery')),
84+ ('Sound', dict(indicator_name='indicator-sound',
85+ title='Sound')),
86+ ]
87+ scenarios = multiply_scenarios(
88+ indicator_scenarios,
89+ IndicatorTestCase.device_emulation_scenarios
90+ )
91+
92+ def setUp(self):
93+ super(IndicatorPageTitleMatchesWidgetTestCase, self).setUp()
94+ if (platform.model() == 'Nexus 10' and
95+ self.indicator_name == 'indicator-bluetooth'):
96+ self.skipTest('Nexus 10 does not have bluetooth at the moment.')
97+
98+ def test_indicator_page_title_matches_widget(self):
99+ """Swiping open an indicator must show its correct title.
100+
101+ See https://bugs.launchpad.net/ubuntu-ux/+bug/1253804 .
102+ """
103+ indicator_page = self.main_window.open_indicator_page(
104+ self.indicator_name)
105+ self.assertTrue(indicator_page.visible)
106+ self.assertEqual(indicator_page.title, self.title)
tests/autopilot/unity8/process_helpers.py+16
@@ -89,6 +89,22 @@ def unlock_unity(unity_proxy_obj=None):
8989 break
9090
9191
92+def lock_unity(unity_proxy_obj=None):
93+ """Helper function that attempts to lock the unity greeter."""
94+ import evdev, time
95+ uinput = evdev.UInput(name='unity8-autopilot-power-button',
96+ devnode='/dev/autopilot-uinput')
97+ # One press and release to turn screen off (locking unity)
98+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 1)
99+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 0)
100+ uinput.syn()
101+ time.sleep(1)
102+ # And another press and release to turn screen back on
103+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 1)
104+ uinput.write(evdev.ecodes.EV_KEY, evdev.ecodes.KEY_POWER, 0)
105+ uinput.syn()
106+
107+
92108def restart_unity_with_testability(*args):
93109 """Restarts (or starts) unity with testability enabled.
94110
tests/autopilot/unity8/shell/emulators/__init__.py+2−6
@@ -17,16 +17,12 @@
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
1919
20−from autopilot import input, introspection
20+from ubuntuuitoolkit import emulators as toolkit_emulators
2121
2222
23−class UnityEmulatorBase(introspection.CustomEmulatorBase):
23+class UnityEmulatorBase(toolkit_emulators.UbuntuUIToolkitEmulatorBase):
2424 """A base class for all unity emulators."""
2525
26− def __init__(self, *args):
27− super(UnityEmulatorBase, self).__init__(*args)
28− self.pointing_device = input.Pointer(device=input.Touch.create())
29−
3026
3127class UnityEmulatorException(Exception):
3228 """Exception raised when there is an error with the Unity emulators."""
tests/autopilot/unity8/shell/emulators/dash.py+35−10
@@ -23,6 +23,8 @@ from unity8.shell import emulators
2323
2424from autopilot import logging as autopilot_logging
2525from autopilot.introspection import dbus
26+from testtools.matchers import MatchesAny, Equals
27+from ubuntuuitoolkit import emulators as toolkit_emulators
2628
2729
2830logger = logging.getLogger(__name__)
@@ -80,10 +82,7 @@ class Dash(emulators.UnityEmulatorBase):
8082 'No scope found with id {0}'.format(scope_id))
8183
8284 def _get_scope_from_loader(self, loader):
83− if loader.scopeId == 'clickscope':
84− return loader.select_single(DashApps)
85− else:
86− return loader.select_single(GenericScopeView)
85+ return loader.get_children()[0]
8786
8887 def _open_scope_scrolling(self, scope_loader):
8988 scroll = self._get_scroll_direction(scope_loader)
@@ -135,6 +134,19 @@ class Dash(emulators.UnityEmulatorBase):
135134 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
136135 self.dash_content_list.currentIndex.wait_for(original_index + 1)
137136
137+ def enter_search_query(self, query):
138+ search_text_field = self._get_search_text_field()
139+ search_text_field.write(query)
140+ search_text_field.state.wait_for('idle')
141+
142+ def _get_search_text_field(self):
143+ page_header = self._get_page_header()
144+ search_container = page_header.select_single(
145+ 'QQuickItem', objectName='searchContainer')
146+ search_container.state.wait_for(
147+ MatchesAny(Equals('narrowActive'), Equals('active')))
148+ return search_container.select_single(toolkit_emulators.TextField)
149+
138150
139151class GenericScopeView(emulators.UnityEmulatorBase):
140152 """Autopilot emulator for generic scopes."""
@@ -145,6 +157,7 @@ class GenericScopeView(emulators.UnityEmulatorBase):
145157
146158 :parameter category: The name of the category where the application is.
147159 :app_name: The name of the application.
160+ :return: The opened preview.
148161
149162 """
150163 category_element = self._get_category_element(category)
@@ -153,8 +166,11 @@ class GenericScopeView(emulators.UnityEmulatorBase):
153166 # Some categories do not show previews, like recent apps.
154167 # --elopio - 2014-1-14
155168 self.pointing_device.click_object(icon)
156− return self.get_root_instance().wait_select_single(
169+ preview_list = self.get_root_instance().wait_select_single(
157170 'PreviewListView', objectName='dashContentPreviewList')
171+ preview_list.x.wait_for(0)
172+ return preview_list.select_single(
173+ Preview, objectName='preview{}'.format(preview_list.currentIndex))
158174
159175 def _get_category_element(self, category):
160176 try:
@@ -175,11 +191,20 @@ class DashApps(GenericScopeView):
175191
176192 """
177193 category_element = self._get_category_element(category)
178− application_tiles = category_element.select_many('Card')
179− # TODO return them on the same order they are displayed.
180− # --elopio - 2014-1-15
194+ application_cards = category_element.select_many('Card')
195+
196+ # sort by y, x
197+ application_cards = sorted(
198+ application_cards,
199+ key=lambda card: (card.globalRect.y, card.globalRect.x))
200+
181201 result = []
182− for card in application_tiles:
202+ for card in application_cards:
183203 if card.objectName != 'cardToolCard':
184− result.append(card)
204+ card_header = card.select_single('CardHeader')
205+ result.append(card_header.title)
185206 return result
207+
208+
209+class Preview(emulators.UnityEmulatorBase):
210+ """Autopilot custom proxy object for generic previews."""
tests/autopilot/unity8/shell/emulators/main_window.py+33−3
@@ -20,6 +20,7 @@
2020import logging
2121
2222from autopilot import logging as autopilot_logging
23+from autopilot import input
2324
2425from unity8.shell import emulators
2526from unity8.shell.emulators.greeter import Greeter
@@ -87,12 +88,32 @@ class QQuickView(emulators.UnityEmulatorBase):
8788 def get_pinentryField(self):
8889 return self.select_single(objectName="pinentryField")
8990
90− def get_indicator(self, indicator_name):
91− return self.wait_select_single(
91+ def _get_indicator_widget(self, indicator_name):
92+ return self.select_single(
9293 'DefaultIndicatorWidget',
9394 objectName=indicator_name+'-widget'
9495 )
9596
97+ def _get_indicator_page(self, indicator_name):
98+ return self.select_single(
99+ 'DefaultIndicatorPage',
100+ objectName=indicator_name+'-page'
101+ )
102+
103+ @autopilot_logging.log_action(logger.info)
104+ def open_indicator_page(self, indicator_name):
105+ """Swipe to open the indicator, wait until it's open.
106+
107+ :returns: The indicator page.
108+ """
109+ widget = self._get_indicator_widget(indicator_name)
110+ start_x, start_y = input.get_center_point(widget)
111+ end_x = start_x
112+ end_y = self.height
113+ self.pointing_device.drag(start_x, start_y, end_x, end_y)
114+ self.wait_select_single('Indicators', fullyOpened=True)
115+ return self._get_indicator_page(indicator_name)
116+
96117 def get_shell_background(self):
97118 return self.select_single(
98119 "CrossFadeImage", objectName="backgroundImage")
@@ -112,4 +133,13 @@ class QQuickView(emulators.UnityEmulatorBase):
112133
113134 def get_current_focused_app_id(self):
114135 """Return the id of the focused application."""
115− return self.select_single('Shell').currentFocusedAppId
136+ return self.select_single('Shell').focusedApplicationId
137+
138+ @autopilot_logging.log_action(logger.info)
139+ def search(self, query):
140+ search_indicator = self._get_search_indicator()
141+ self.pointing_device.click_object(search_indicator)
142+ self.get_dash().enter_search_query(query)
143+
144+ def _get_search_indicator(self):
145+ return self.select_single('SearchIndicator', objectName='search')
tests/autopilot/unity8/shell/tests/__init__.py+1−1
@@ -181,7 +181,7 @@ class UnityTestCase(AutopilotTestCase):
181181 )
182182 geo_string = "%dx%d" % (width, height)
183183 self.unity_geometry_args = [
184− '-geometry',
184+ '-windowgeometry',
185185 geo_string,
186186 '-frameless',
187187 '-mousetouch'
tests/autopilot/unity8/shell/tests/test_emulators.py+27−17
@@ -39,6 +39,22 @@ from unity8.shell import emulators, fixture_setup, tests
3939from unity8.shell.emulators import dash as dash_emulators
4040
4141
42+class MainWindowTestCase(tests.UnityTestCase):
43+
44+ scenarios = tests._get_device_emulation_scenarios()
45+
46+ def setUp(self):
47+ super(MainWindowTestCase, self).setUp()
48+ unity_proxy = self.launch_unity()
49+ process_helpers.unlock_unity(unity_proxy)
50+
51+ def test_search(self):
52+ self.main_window.search('Test')
53+ text_field = self.main_window.get_dash()._get_search_text_field()
54+ self.assertEqual(text_field.text, 'Test')
55+ self.assertEqual(text_field.state, 'idle')
56+
57+
4258class DashBaseTestCase(tests.UnityTestCase):
4359
4460 scenarios = tests._get_device_emulation_scenarios()
@@ -141,14 +157,16 @@ class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
141157
142158 def test_open_preview(self):
143159 preview = self.generic_scope.open_preview('0', 'Title.0.0')
144− preview.x.wait_for(0)
160+ self.assertIsInstance(preview, dash_emulators.Preview)
161+ self.assertTrue(preview.isCurrent)
162+
145163
146164class DashAppsEmulatorTestCase(DashBaseTestCase):
147165
148166 available_applications = [
149167 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
150168 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
151− 'Title.2.9', 'Title.2.10', 'Title.2.11']
169+ 'Title.2.10', 'Title.2.11', 'Title.2.12']
152170
153171 def setUp(self):
154172 # Set up the fake scopes before launching unity.
@@ -165,28 +183,20 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
165183 self.assertEqual(
166184 'No category found with name unexisting category', str(exception))
167185
168− def test_get_applications_should_return_list_with_names(self):
186+ def test_get_applications_should_return_correct_applications(self):
169187 category = '2'
170188 expected_apps_count = self._get_number_of_application_slots(category)
171189 expected_applications = self.available_applications[
172190 :expected_apps_count]
173−
174191 applications = self.applications_scope.get_applications(category)
175− applications_titles = []
176− for application in applications:
177− cardHeader = application.select_single('CardHeader')
178− applications_titles.append(cardHeader.title)
179−
180− self.assertThat(applications, HasLength(expected_apps_count))
181− for expected in expected_applications:
182− self.assertThat(applications_titles, Contains(expected))
192+ self.assertEqual(expected_applications, applications)
183193
184194 def _get_number_of_application_slots(self, category):
185195 category_element = self.applications_scope._get_category_element(
186196 category)
187197 grid = category_element.select_single('CardFilterGrid')
188− return grid.columns * grid.rows
189−
190− def test_open_preview(self):
191− preview = self.applications_scope.open_preview('2', 'Title.2.1')
192− preview.x.wait_for(0)
198+ filtergrid = grid.select_single('FilterGrid')
199+ if (grid.filter):
200+ return filtergrid.collapsedRowCount * filtergrid.columns
201+ else:
202+ return filtergrid.uncollapsedRowCount * filtergrid.columns
tests/autopilot/unity8/shell/tests/test_notifications.py+3−4
@@ -196,7 +196,7 @@ class InteractiveNotificationBase(NotificationsBase):
196196 get_notification = lambda: notify_list.wait_select_single(
197197 'Notification', objectName='notification1')
198198 notification = get_notification()
199− self._assert_notification(notification, None, None, True, True, 1.0)
199+ self._assert_notification(notification, summary, body, True, True, 1.0)
200200 initial_height = notification.height
201201 self.touch.tap_object(notification.select_single(objectName="button1"))
202202 self.assertThat(
@@ -403,7 +403,6 @@ class EphemeralNotificationsTests(NotificationsBase):
403403
404404 notification = lambda: notify_list.wait_select_single(
405405 'Notification', objectName='notification1')
406−
407406 self._assert_notification(
408407 notification(),
409408 summary,
@@ -579,7 +578,7 @@ class EphemeralNotificationsTests(NotificationsBase):
579578 icon_path = self._get_icon_path('avatars/amanda.png')
580579 notification.update(summary, body, icon_path)
581580 notification.show()
582− self._assert_notification(get_notification(), summary, body)
581+ self._assert_notification(get_notification(), summary, body, True, False, 1.0)
583582
584583 def test_update_notification_layout_change(self):
585584 """Notification must allow updating its contents and layout while
@@ -626,7 +625,7 @@ class EphemeralNotificationsTests(NotificationsBase):
626625 notification.show()
627626
628627 self.assertThat(get_notification, Eventually(NotEquals(None)))
629− self._assert_notification(get_notification(), summary, body, False)
628+ self._assert_notification(get_notification(), summary, body, False, False, 1.0)
630629
631630 def test_append_hint(self):
632631 """Notification has to accumulate body-text using append-hint."""
tests/autopilot/unity8/shell/tests/test_system_integration.py+3−2
@@ -22,6 +22,7 @@
2222import subprocess
2323import unittest
2424
25+from autopilot import platform
2526from unity8.shell.emulators import UnityEmulatorBase
2627from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2728
@@ -31,10 +32,10 @@ class SystemIntegrationTests(UnityTestCase):
3132
3233 scenarios = _get_device_emulation_scenarios()
3334
34− @unittest.skip("Disabled until we can investigate jenkins failure")
35+ @unittest.skipIf(platform.model() == "Desktop", "Test is broken on otto, see bug 1281634.")
3536 def test_networkmanager_integration(self):
3637 self.launch_unity()
3738
3839 # invoke policykit to check permissions
39− pid = subprocess.check_output("pidof -s unity8", shell=True)
40+ pid = subprocess.check_output(["pidof", "-s", "unity8"], universal_newlines=True)
4041 subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1 +1,2 @@
11add_subdirectory(DownloadDaemonListener)
2+add_subdirectory(Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txtnew file+7
@@ -0,0 +1,7 @@
1+# copy files into build directory for shadow builds
2+add_custom_target(UbuntuThumbnailerQmlDirFile ALL
3+ COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
4+ DEPENDS qmldir
5+)
6+
7+install(FILES qmldir DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Ubuntu.Thumbnailer
2+Dummy 0.1 Dummy.qml
tests/mocks/Unity/Application/ApplicationInfo.cpp+9
@@ -20,6 +20,7 @@
2020#include <QQuickItem>
2121#include <QQuickView>
2222#include <QQmlComponent>
23+#include <QTimer>
2324
2425ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
2526 : ApplicationInfoInterface(appId, parent)
@@ -32,6 +33,7 @@ ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
3233 ,m_windowComponent(0)
3334 ,m_parentItem(0)
3435{
36+ QTimer::singleShot(300, this, SLOT(setRunning()));
3537}
3638
3739ApplicationInfo::ApplicationInfo(QObject *parent)
@@ -44,6 +46,7 @@ ApplicationInfo::ApplicationInfo(QObject *parent)
4446 ,m_windowComponent(0)
4547 ,m_parentItem(0)
4648{
49+ QTimer::singleShot(300, this, SLOT(setRunning()));
4750}
4851
4952void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
@@ -52,6 +55,12 @@ void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status statu
5255 doCreateWindowItem();
5356}
5457
58+void ApplicationInfo::setRunning()
59+{
60+ m_state = Running;
61+ Q_EMIT stateChanged();
62+}
63+
5564void ApplicationInfo::createWindowComponent()
5665{
5766 // The assumptions I make here really should hold.
tests/mocks/Unity/Application/ApplicationInfo.h+2
@@ -74,6 +74,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
7474 IMPLEMENT_PROPERTY(fullscreen, Fullscreen, bool)
7575 IMPLEMENT_PROPERTY(imageQml, ImageQml, QString)
7676 IMPLEMENT_PROPERTY(windowQml, WindowQml, QString)
77+ IMPLEMENT_PROPERTY(screenshot, Screenshot, QUrl)
7778
7879 #undef IMPLEMENT_PROPERTY
7980
@@ -83,6 +84,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
8384
8485 private Q_SLOTS:
8586 void onWindowComponentStatusChanged(QQmlComponent::Status status);
87+ void setRunning();
8688
8789 private:
8890 void createWindowItem();
tests/mocks/Unity/Application/ApplicationManager.cpp+109−3
@@ -24,13 +24,17 @@
2424#include <QQuickItem>
2525#include <QQuickView>
2626#include <QQmlComponent>
27+#include <QTimer>
28+#include <QDateTime>
2729
2830ApplicationManager::ApplicationManager(QObject *parent)
2931 : ApplicationManagerInterface(parent)
32+ , m_suspended(false)
3033 , m_mainStageComponent(0)
3134 , m_mainStage(0)
3235 , m_sideStageComponent(0)
3336 , m_sideStage(0)
37+ , m_rightMargin(0)
3438{
3539 buildListOfAvailableApplications();
3640}
@@ -63,6 +67,8 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
6367 return app->state();
6468 case RoleFocused:
6569 return app->focused();
70+ case RoleScreenshot:
71+ return app->screenshot();
6672 default:
6773 return QVariant();
6874 }
@@ -84,13 +90,16 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
8490}
8591
8692void ApplicationManager::add(ApplicationInfo *application) {
87− if (!application)
93+ if (!application) {
8894 return;
95+ }
8996
9097 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
9198 m_runningApplications.append(application);
9299 endInsertRows();
100+ Q_EMIT applicationAdded(application->appId());
93101 Q_EMIT countChanged();
102+ Q_EMIT focusRequested(application->appId());
94103}
95104
96105void ApplicationManager::remove(ApplicationInfo *application) {
@@ -99,6 +108,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
99108 beginRemoveRows(QModelIndex(), i, i);
100109 m_runningApplications.removeAt(i);
101110 endRemoveRows();
111+ Q_EMIT applicationRemoved(application->appId());
102112 Q_EMIT countChanged();
103113 }
104114}
@@ -171,6 +181,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
171181 }
172182 add(application);
173183
184+ QMetaObject::invokeMethod(this, "focusApplication", Qt::QueuedConnection, Q_ARG(QString, appId));
185+
174186 return application;
175187}
176188
@@ -180,8 +192,32 @@ bool ApplicationManager::stopApplication(const QString &appId)
180192 if (application == nullptr)
181193 return false;
182194
195+ if (application->appId() == focusedApplicationId()) {
196+ unfocusCurrentApplication();
197+ }
183198 remove(application);
184− Q_EMIT focusedApplicationIdChanged();
199+ return true;
200+}
201+
202+bool ApplicationManager::updateScreenshot(const QString &appId)
203+{
204+ int idx = -1;
205+ ApplicationInfo *application = nullptr;
206+ for (int i = 0; i < m_availableApplications.count(); ++i) {
207+ application = m_availableApplications.at(i);
208+ if (application->appId() == appId) {
209+ idx = i;
210+ break;
211+ }
212+ }
213+
214+ if (idx == -1) {
215+ return false;
216+ }
217+
218+ application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
219+ QModelIndex appIndex = index(idx);
220+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
185221 return true;
186222}
187223
@@ -194,6 +230,25 @@ QString ApplicationManager::focusedApplicationId() const {
194230 return QString();
195231}
196232
233+bool ApplicationManager::suspended() const
234+{
235+ return m_suspended;
236+}
237+
238+void ApplicationManager::setSuspended(bool suspended)
239+{
240+ ApplicationInfo *focusedApp = findApplication(focusedApplicationId());
241+ if (focusedApp) {
242+ if (suspended) {
243+ focusedApp->setState(ApplicationInfo::Suspended);
244+ } else {
245+ focusedApp->setState(ApplicationInfo::Running);
246+ }
247+ }
248+ m_suspended = suspended;
249+ Q_EMIT suspendedChanged();
250+}
251+
197252bool ApplicationManager::focusApplication(const QString &appId)
198253{
199254 ApplicationInfo *application = findApplication(appId);
@@ -242,6 +297,15 @@ bool ApplicationManager::focusApplication(const QString &appId)
242297 return true;
243298}
244299
300+bool ApplicationManager::requestFocusApplication(const QString &appId)
301+{
302+ if (appId != focusedApplicationId()) {
303+ QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
304+ return true;
305+ }
306+ return false;
307+}
308+
245309void ApplicationManager::unfocusCurrentApplication()
246310{
247311 for (ApplicationInfo *app : m_runningApplications) {
@@ -270,10 +334,12 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
270334 "Image {\n"
271335 " anchors.fill: parent\n"
272336 " anchors.topMargin: %1\n"
273− " source: \"file://%2/Dash/graphics/phone/screenshots/%3.png\"\n"
337+ " anchors.rightMargin: %2\n"
338+ " source: \"file://%3/Dash/graphics/phone/screenshots/%4.png\"\n"
274339 " smooth: true\n"
275340 " fillMode: Image.PreserveAspectCrop\n"
276341 "}").arg(topMargin)
342+ .arg(m_rightMargin)
277343 .arg(qmlDirectory())
278344 .arg(application->icon().toString());
279345 application->setWindowQml(windowQml);
@@ -299,6 +365,7 @@ void ApplicationManager::buildListOfAvailableApplications()
299365 application->setName("Phone");
300366 application->setIcon(QUrl("phone"));
301367 application->setStage(ApplicationInfo::SideStage);
368+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
302369 generateQmlStrings(application);
303370 m_availableApplications.append(application);
304371
@@ -307,6 +374,7 @@ void ApplicationManager::buildListOfAvailableApplications()
307374 application->setName("Camera");
308375 application->setIcon(QUrl("camera"));
309376 application->setFullscreen(true);
377+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
310378 generateQmlStrings(application);
311379 m_availableApplications.append(application);
312380
@@ -314,6 +382,7 @@ void ApplicationManager::buildListOfAvailableApplications()
314382 application->setAppId("gallery-app");
315383 application->setName("Gallery");
316384 application->setIcon(QUrl("gallery"));
385+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
317386 generateQmlStrings(application);
318387 m_availableApplications.append(application);
319388
@@ -322,13 +391,16 @@ void ApplicationManager::buildListOfAvailableApplications()
322391 application->setName("Facebook");
323392 application->setIcon(QUrl("facebook"));
324393 application->setStage(ApplicationInfo::SideStage);
394+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
325395 generateQmlStrings(application);
326396 m_availableApplications.append(application);
327397
328398 application = new ApplicationInfo(this);
329399 application->setAppId("webbrowser-app");
400+ application->setFullscreen(true);
330401 application->setName("Browser");
331402 application->setIcon(QUrl("browser"));
403+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
332404 generateQmlStrings(application);
333405 m_availableApplications.append(application);
334406
@@ -337,6 +409,7 @@ void ApplicationManager::buildListOfAvailableApplications()
337409 application->setName("Twitter");
338410 application->setIcon(QUrl("twitter"));
339411 application->setStage(ApplicationInfo::SideStage);
412+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
340413 generateQmlStrings(application);
341414 m_availableApplications.append(application);
342415
@@ -344,6 +417,7 @@ void ApplicationManager::buildListOfAvailableApplications()
344417 application->setAppId("gmail-webapp");
345418 application->setName("GMail");
346419 application->setIcon(QUrl("gmail"));
420+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
347421 m_availableApplications.append(application);
348422
349423 application = new ApplicationInfo(this);
@@ -351,6 +425,7 @@ void ApplicationManager::buildListOfAvailableApplications()
351425 application->setName("Weather");
352426 application->setIcon(QUrl("weather"));
353427 application->setStage(ApplicationInfo::SideStage);
428+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
354429 generateQmlStrings(application);
355430 m_availableApplications.append(application);
356431
@@ -359,6 +434,7 @@ void ApplicationManager::buildListOfAvailableApplications()
359434 application->setName("Notepad");
360435 application->setIcon(QUrl("notepad"));
361436 application->setStage(ApplicationInfo::SideStage);
437+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
362438 m_availableApplications.append(application);
363439
364440 application = new ApplicationInfo(this);
@@ -366,6 +442,7 @@ void ApplicationManager::buildListOfAvailableApplications()
366442 application->setName("Calendar");
367443 application->setIcon(QUrl("calendar"));
368444 application->setStage(ApplicationInfo::SideStage);
445+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
369446 m_availableApplications.append(application);
370447
371448 application = new ApplicationInfo(this);
@@ -373,18 +450,21 @@ void ApplicationManager::buildListOfAvailableApplications()
373450 application->setName("Media Player");
374451 application->setIcon(QUrl("mediaplayer-app"));
375452 application->setFullscreen(true);
453+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
376454 m_availableApplications.append(application);
377455
378456 application = new ApplicationInfo(this);
379457 application->setAppId("evernote");
380458 application->setName("Evernote");
381459 application->setIcon(QUrl("evernote"));
460+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
382461 m_availableApplications.append(application);
383462
384463 application = new ApplicationInfo(this);
385464 application->setAppId("map");
386465 application->setName("Map");
387466 application->setIcon(QUrl("map"));
467+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
388468 generateQmlStrings(application);
389469 m_availableApplications.append(application);
390470
@@ -392,24 +472,28 @@ void ApplicationManager::buildListOfAvailableApplications()
392472 application->setAppId("pinterest");
393473 application->setName("Pinterest");
394474 application->setIcon(QUrl("pinterest"));
475+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
395476 m_availableApplications.append(application);
396477
397478 application = new ApplicationInfo(this);
398479 application->setAppId("soundcloud");
399480 application->setName("SoundCloud");
400481 application->setIcon(QUrl("soundcloud"));
482+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
401483 m_availableApplications.append(application);
402484
403485 application = new ApplicationInfo(this);
404486 application->setAppId("wikipedia");
405487 application->setName("Wikipedia");
406488 application->setIcon(QUrl("wikipedia"));
489+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
407490 m_availableApplications.append(application);
408491
409492 application = new ApplicationInfo(this);
410493 application->setAppId("youtube");
411494 application->setName("YouTube");
412495 application->setIcon(QUrl("youtube"));
496+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
413497 m_availableApplications.append(application);
414498}
415499
@@ -484,3 +568,25 @@ void ApplicationManager::createSideStage()
484568 m_sideStage->setParentItem(shell);
485569 m_sideStage->setFlag(QQuickItem::ItemHasContents, false);
486570}
571+
572+QStringList ApplicationManager::availableApplications()
573+{
574+ QStringList appIds;
575+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
576+ appIds << app->appId();
577+ }
578+ return appIds;
579+}
580+
581+int ApplicationManager::rightMargin() const
582+{
583+ return m_rightMargin;
584+}
585+
586+void ApplicationManager::setRightMargin(int rightMargin)
587+{
588+ m_rightMargin = rightMargin;
589+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
590+ generateQmlStrings(app);
591+ }
592+}
tests/mocks/Unity/Application/ApplicationManager.h+16
@@ -45,6 +45,10 @@ class ApplicationManager : public ApplicationManagerInterface {
4545
4646 Q_PROPERTY(bool fake READ fake CONSTANT)
4747
48+ // Only for testing
49+ // This can be used to place some controls to right, like make tryPhoneStage for example
50+ Q_PROPERTY(int rightMargin READ rightMargin WRITE setRightMargin)
51+
4852 public:
4953 ApplicationManager(QObject *parent = NULL);
5054 virtual ~ApplicationManager();
@@ -87,13 +91,22 @@ class ApplicationManager : public ApplicationManagerInterface {
8791 Q_INVOKABLE void move(int from, int to);
8892
8993 // Application control methods
94+ Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
9095 Q_INVOKABLE bool focusApplication(const QString &appId) override;
9196 Q_INVOKABLE void unfocusCurrentApplication() override;
9297 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
9398 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, ExecFlags flags, const QStringList &arguments = QStringList());
9499 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100+ Q_INVOKABLE bool updateScreenshot(const QString &appId) override;
95101
96102 QString focusedApplicationId() const override;
103+ bool suspended() const;
104+ void setSuspended(bool suspended);
105+
106+ // Only for testing
107+ Q_INVOKABLE QStringList availableApplications();
108+ int rightMargin() const;
109+ void setRightMargin(int rightMargin);
97110
98111 Q_SIGNALS:
99112 void keyboardHeightChanged();
@@ -113,12 +126,15 @@ class ApplicationManager : public ApplicationManagerInterface {
113126 void createSideStage();
114127 int m_keyboardHeight;
115128 bool m_keyboardVisible;
129+ bool m_suspended;
116130 QList<ApplicationInfo*> m_runningApplications;
117131 QList<ApplicationInfo*> m_availableApplications;
118132 QQmlComponent *m_mainStageComponent;
119133 QQuickItem *m_mainStage;
120134 QQmlComponent *m_sideStageComponent;
121135 QQuickItem *m_sideStage;
136+
137+ int m_rightMargin;
122138};
123139
124140Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ApplicationScreenshotProvider.h"
18+#include "ApplicationManager.h"
19+#include "ApplicationInfo.h"
20+
21+#include "paths.h"
22+
23+#include <QDebug>
24+#include <QGuiApplication>
25+#include <QWindow>
26+#include <QQuickWindow>
27+
28+ApplicationScreenshotProvider::ApplicationScreenshotProvider(ApplicationManager *appManager)
29+ : QQuickImageProvider(QQuickImageProvider::Image)
30+ , m_appManager(appManager)
31+{
32+}
33+
34+QImage ApplicationScreenshotProvider::requestImage(const QString &imageId, QSize * size,
35+ const QSize &requestedSize)
36+{
37+ // We ignore requestedSize here intentionally to avoid keeping scaled copies around
38+ Q_UNUSED(requestedSize)
39+
40+ QString appId = imageId.split('/').first();
41+
42+ ApplicationInfo* app = static_cast<ApplicationInfo*>(m_appManager->findApplication(appId));
43+ if (app == nullptr) {
44+ return QImage();
45+ }
46+
47+ QString filePath = QString("%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory()).arg(app->icon().toString());
48+
49+ QImage image;
50+ if (!image.load(filePath)) {
51+ qWarning() << "failed loading app image" << filePath;
52+ }
53+
54+
55+ if (app->stage() == ApplicationInfo::SideStage) {
56+ QByteArray gus = qgetenv("GRID_UNIT_PX");
57+ if (gus.isEmpty() || gus.toInt() == 0) {
58+ gus = "8";
59+ }
60+ image = image.scaledToWidth(gus.toInt() * 48);
61+ } else {
62+ // Lets scale main stage applications to be the size of the screen/window.
63+ QGuiApplication *unity = qobject_cast<QGuiApplication*>(qApp);
64+ Q_FOREACH (QWindow *win, unity->allWindows()) {
65+ QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
66+ if (quickWin) {
67+ image = image.scaledToWidth(quickWin->width() - m_appManager->rightMargin());
68+ break;
69+ }
70+ }
71+ }
72+
73+ size->setWidth(image.width());
74+ size->setHeight(image.height());
75+
76+ return image;
77+}
tests/mocks/Unity/Application/ApplicationScreenshotProvider.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 201 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef APPLICATIONSCREENSHOTPROVIDER_H
18+#define APPLICATIONSCREENSHOTPROVIDER_H
19+
20+#include <QQuickImageProvider>
21+
22+class ApplicationManager;
23+class ApplicationScreenshotProvider : public QQuickImageProvider
24+{
25+public:
26+ explicit ApplicationScreenshotProvider(ApplicationManager *appManager);
27+
28+ QImage requestImage(const QString &appId, QSize *size, const QSize &requestedSize) override;
29+
30+private:
31+ ApplicationManager* m_appManager;
32+};
33+
34+#endif // APPLICATIONSCREENSHOTPROVIDER_H
tests/mocks/Unity/Application/CMakeLists.txt+15
@@ -5,6 +5,7 @@ set(FakeUnityApplicationQml_SOURCES
55 ApplicationInfo.cpp
66 ApplicationImage.cpp
77 ApplicationManager.cpp
8+ ApplicationScreenshotProvider.cpp
89 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
910 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1011)
@@ -34,3 +35,17 @@ install(TARGETS FakeUnityApplicationQml
3435install(FILES qmldir InputFilterArea.qml OSKController.qml
3536 DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
3637 )
38+
39+# Duplicate the mock to nonmirplugins
40+# In shadow builds we just link it, in real installs we also install it to the other path
41+add_custom_target(OSKControllerQmlFile2 ALL
42+ COMMAND mkdir -p ${CMAKE_BINARY_DIR}/nonmirplugins/Unity && rm -f ${CMAKE_BINARY_DIR}/nonmirplugins/Unity/Application && ln -s ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/nonmirplugins/Unity
43+ DEPENDS qmldir
44+)
45+install(TARGETS FakeUnityApplicationQml
46+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
47+ )
48+
49+install(FILES qmldir InputFilterArea.qml OSKController.qml
50+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
51+ )
tests/mocks/Unity/Application/plugin.cpp+18−3
@@ -18,13 +18,20 @@
1818#include "ApplicationInfo.h"
1919#include "ApplicationImage.h"
2020#include "ApplicationManager.h"
21+#include "ApplicationScreenshotProvider.h"
2122
2223#include <qqml.h>
24+#include <QQmlEngine>
25+
26+ApplicationManager *s_appManager = 0;
2327
2428static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
25− Q_UNUSED(engine);
26− Q_UNUSED(scriptEngine);
27− return new ApplicationManager();
29+ Q_UNUSED(engine);
30+ Q_UNUSED(scriptEngine);
31+ if (!s_appManager) {
32+ s_appManager = new ApplicationManager();
33+ }
34+ return s_appManager;
2835}
2936
3037void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
@@ -37,3 +44,11 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
3744
3845 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
3946}
47+
48+void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
49+{
50+ QQmlExtensionPlugin::initializeEngine(engine, uri);
51+
52+ ApplicationManager* appManager = static_cast<ApplicationManager*>(applicationManagerSingleton(engine, NULL));
53+ engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(appManager));
54+}
tests/mocks/Unity/Application/plugin.h+1
@@ -25,6 +25,7 @@ class FakeUnityApplicationQmlPlugin : public QQmlExtensionPlugin
2525 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
2626public:
2727 void registerTypes(const char *uri);
28+ void initializeEngine(QQmlEngine *engine, const char *uri);
2829};
2930
3031#endif
tests/plugins/DashViews/listviewwithpageheadertest.cpp−1
@@ -1855,7 +1855,6 @@ private Q_SLOTS:
18551855 scrollToBottom();
18561856 lvwph->showHeader();
18571857 QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning());
1858− QTest::qWait(100); // Make sure stuff is stable
18591858 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100));
18601859 model->setProperty(3, "size", 10);
18611860 model->setProperty(4, "size", 10);
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+3−3
@@ -1680,12 +1680,11 @@ private Q_SLOTS:
16801680 verifyItem(18, 700, 50., false, QString(), true);
16811681 verifyItem(19, 750, 50., false, QString(), true);
16821682 verifyItem(20, 800, 50., false, QString(), true);
1683− QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - 1970 + 50);
1684− QCOMPARE(lvwph->m_clipItem->y(), 1970.);
1683+ QCOMPARE(lvwph->m_clipItem->y(), lvwph->contentY());
1684+ QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - lvwph->contentY() + 50);
16851685 QCOMPARE(lvwph->m_clipItem->clip(), false);
16861686 QCOMPARE(lvwph->m_headerItem->y(), 0.);
16871687 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1688− QCOMPARE(lvwph->contentY(), 1970.);
16891688 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
16901689 }
16911690
@@ -2108,6 +2107,7 @@ private Q_SLOTS:
21082107 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
21092108
21102109 QTest::qWait(1);
2110+ QCoreApplication::instance()->processEvents();
21112111
21122112 changeContentY(-15);
21132113
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−11
@@ -15,20 +15,11 @@ add_custom_target(UbuntuGesturesTestQmlFiles ALL
1515add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
1616
1717macro(add_gesture_ui_test CLASSNAME)
18− set(testCommand
19− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
20− ${CMAKE_CURRENT_BINARY_DIR}/${CLASSNAME}TestExec
21− -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
22− -o -,txt)
23−
24− add_custom_target(test${CLASSNAME} ${testCommand})
25− add_dependencies(qmluitests test${CLASSNAME})
26− add_dependencies(test${CLASSNAME} ${CLASSNAME}TestExec UbuntuGesturesTestQmlFiles)
27−
2818 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
2919 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
3020 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
31− add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
21+
22+ add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
3223endmacro(add_gesture_ui_test)
3324
3425macro(add_gesture_test CLASSNAME)
tests/plugins/Unity/Launcher/launchermodeltest.cpp+5
@@ -39,6 +39,7 @@ public:
3939 ApplicationInfoInterface::Stage stage() const { return ApplicationInfoInterface::MainStage; }
4040 ApplicationInfoInterface::State state() const { return ApplicationInfoInterface::Running; }
4141 bool focused() const { return m_focused; }
42+ QUrl screenshot() const { return QUrl(); }
4243
4344 // Methods used for mocking (not in the interface)
4445 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
@@ -92,6 +93,10 @@ public:
9293 m_list.takeAt(index)->deleteLater();
9394 endRemoveRows();
9495 }
96+ bool updateScreenshot(const QString &appId) { Q_UNUSED(appId); return true; }
97+ bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
98+ bool suspended() const { return false; }
99+ void setSuspended(bool) {}
95100
96101private:
97102 QList<MockApp*> m_list;
tests/qmltests/CMakeLists.txt+4−7
@@ -11,8 +11,6 @@ set(qmltest_DEFAULT_IMPORT_PATHS
1111set(qmltest_DEFAULT_TARGETS qmlunittests)
1212set(qmltest_DEFAULT_NO_ADD_TEST FALSE)
1313set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
14−add_qml_test(Components AnimationControllerWithSignals)
15−add_qml_test(Components Carousel)
1614add_qml_test(Panel IndicatorItem)
1715add_qml_test(utils/Unity/Test UnityTest)
1816
@@ -22,7 +20,7 @@ set(qmltest_DEFAULT_PROPERTIES "")
2220
2321add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
2422 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
25−add_manual_qml_test(Components DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
23+add_qml_test(Components Carousel)
2624add_qml_test(Components DraggingArea)
2725add_qml_test(Components EdgeDemoOverlay)
2826add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
@@ -33,13 +31,11 @@ add_qml_test(Components ResponsiveGridView)
3331add_qml_test(Components Revealer)
3432add_qml_test(Components SeeMore)
3533add_qml_test(Components Showable)
36−add_qml_test(Components Stage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
37− ${CMAKE_BINARY_DIR}/tests/mocks
38− ${CMAKE_BINARY_DIR}/plugins)
3934add_qml_test(Components PageHeaderLabel)
4035add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
4136add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
4237add_qml_test(Dash Card)
38+add_qml_benchmark(Dash CardBenchmark 1000)
4339add_qml_test(Dash CardHeader)
4440add_qml_test(Dash CardTool)
4541add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
@@ -72,6 +68,7 @@ add_qml_test(Hud Hud)
7268add_qml_test(Hud Result)
7369add_qml_test(Launcher Launcher IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
7470add_qml_test(Notifications Notifications IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
71+add_qml_test(Notifications VisualSnapDecisionsQueue IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
7572add_qml_test(Panel IndicatorRow)
7673add_qml_test(Panel Indicators IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
7774add_qml_test(Panel MenuContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
@@ -83,6 +80,6 @@ add_qml_test(Panel/Indicators DefaultIndicatorPage IMPORT_PATHS ${CMAKE_BINARY_D
8380 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
8481add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
8582add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
86−add_qml_test(SideStage SideStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
83+add_qml_test(Stages PhoneStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
8784 ${CMAKE_BINARY_DIR}/tests/mocks
8885 ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/CMakeLists.txt+2−10
@@ -6,19 +6,11 @@ include_directories(
66 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
77 )
88
9−set(testCommand
10− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
11− ${CMAKE_CURRENT_BINARY_DIR}/DragHandleTestExec
12− -o ${CMAKE_BINARY_DIR}/DragHandleTest.xml,xunitxml
13− -o -,txt)
14−
15−add_custom_target(testDragHandle ${testCommand})
16−add_dependencies(qmluitests testDragHandle)
17−add_dependencies(testDragHandle DragHandleTestExec)
18−
199add_executable(DragHandleTestExec tst_DragHandle.cpp)
2010qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
2111target_link_libraries(DragHandleTestExec UbuntuGestureQml)
2212
13+add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
14+
2315add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
2416add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
tests/qmltests/Components/tst_AnimationControllerWithSignals.qmldeleted−142
@@ -1,142 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Components"
20−
21−TestCase {
22− id: testCase
23− name: "AnimationControllerWithSignals"
24−
25− property real someNumber: 0.0
26−
27− NumberAnimation {
28− id: someNumberAnimation
29− target: testCase
30− properties: "someNumber"
31− from: 1.0
32− to: 100.0
33− }
34−
35− Component {
36− id: testSubjectComponent
37− AnimationControllerWithSignals {}
38− }
39−
40− Loader {
41− id: loader
42− asynchronous: false
43− }
44−
45− SignalSpy {
46− id: signalSpy
47− }
48−
49− function test_completeToEndWithSignal() {
50− loader.sourceComponent = testSubjectComponent;
51− var testSubject = loader.item;
52−
53− testSubject.animation = someNumberAnimation;
54− testSubject.progress = 0;
55−
56− signalSpy.signalName = "animationCompletedAtEnd";
57− signalSpy.target = testSubject;
58− signalSpy.clear();
59−
60− compare(testSubject.completing, false)
61− compare(testSubject.completed, true)
62−
63− testSubject.completeToEndWithSignal();
64− compare(testSubject.completing, true)
65− compare(testSubject.completed, true)
66− compare(signalSpy.count, 0);
67−
68− testSubject.progress = 0.5;
69− compare(testSubject.completing, true)
70− compare(testSubject.completed, false)
71− compare(signalSpy.count, 0);
72−
73− testSubject.progress = 1.0;
74− compare(testSubject.completing, false)
75− compare(testSubject.completed, true)
76− compare(signalSpy.count, 1);
77−
78− testSubject.animation = null
79− loader.sourceComponent = undefined;
80− }
81−
82− function test_completeToBeginningWithSignal() {
83− loader.sourceComponent = testSubjectComponent;
84− var testSubject = loader.item;
85−
86− testSubject.animation = someNumberAnimation;
87− testSubject.progress = 1;
88−
89− signalSpy.signalName = "animationCompletedAtBeginning";
90− signalSpy.target = testSubject;
91− signalSpy.clear();
92−
93− compare(testSubject.completing, false)
94− compare(testSubject.completed, true)
95−
96− testSubject.completeToBeginningWithSignal();
97− compare(testSubject.completing, true)
98− compare(testSubject.completed, true)
99− compare(signalSpy.count, 0);
100−
101− testSubject.progress = 0.5;
102− compare(testSubject.completing, true)
103− compare(testSubject.completed, false)
104− compare(signalSpy.count, 0);
105−
106− testSubject.progress = 0;
107− compare(testSubject.completing, false)
108− compare(testSubject.completed, true)
109− compare(signalSpy.count, 1);
110−
111− testSubject.animation = null
112− loader.sourceComponent = undefined;
113− }
114−
115− function test_settingProgressWithoutCallingCompleteWithSignal() {
116− loader.sourceComponent = testSubjectComponent;
117− var testSubject = loader.item;
118−
119− testSubject.animation = someNumberAnimation;
120− testSubject.progress = 0;
121−
122− signalSpy.signalName = "animationCompletedAtEnd";
123− signalSpy.target = testSubject;
124− signalSpy.clear();
125−
126− compare(testSubject.completing, false)
127− compare(testSubject.completed, true)
128−
129− testSubject.progress = 0.5;
130− compare(testSubject.completing, false)
131− compare(testSubject.completed, false)
132− compare(signalSpy.count, 0);
133−
134− testSubject.progress = 1;
135− compare(testSubject.completing, false)
136− compare(testSubject.completed, true)
137− compare(signalSpy.count, 0);
138−
139− testSubject.animation = null
140− loader.sourceComponent = undefined;
141− }
142−}
tests/qmltests/Components/tst_Carousel.qml+224−171
@@ -16,179 +16,232 @@
1616
1717import QtQuick 2.0
1818import QtTest 1.0
19+import "../../../qml/Components/"
1920import "../../../qml/Components/carousel.js" as Carousel
20−
21−TestCase {
22− id: root
23− name: "Carousel"
24−
25− property real carouselWidth
26− property int itemCount
27− property real tileWidth
28−
29− property real contentWidth: itemCount * tileWidth
30− // following variables are copied from Carousel.qml
31− // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
32− property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
33− property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
34− property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
35− property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
36− property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
37−
38− // test for the getContinuousIndex() function
39− function test_getContinuousIndex_data() {
40− // testing for 10 items of size 100 pixel
41− return [ {tag:"at start",
42− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
43− {tag:"in startup",
44− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
45− {tag:"in the middle",
46− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
47− {tag:"at end",
48− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
49− ]
21+import Unity.Test 0.1 as UT
22+
23+Item {
24+ width: 700
25+ height: 400
26+
27+ Carousel {
28+ anchors.fill: parent
29+ id: carousel
30+ model: 40
31+
32+ property int createdDelegates: 0
33+ property int destroyedDelegates: 0
34+
35+ itemComponent: BaseCarouselDelegate {
36+ Rectangle {
37+ anchors.fill: parent
38+ border.color: "black"
39+ color: "red"
40+ Component.onCompleted: carousel.createdDelegates++
41+ Component.onDestruction: carousel.destroyedDelegates++
42+ }
43+ }
5044 }
51−
52− function test_getContinuousIndex(data) {
53− root.carouselWidth = data.carouselWidth
54− root.tileWidth = data.tileWidth
55− root.itemCount = data.itemCount
56−
57− var index = Carousel.getContinuousIndex(data.x,
45+ UT.UnityTestCase {
46+ id: root
47+ name: "Carousel"
48+ when: windowShown
49+
50+ property real carouselWidth
51+ property int itemCount
52+ property real tileWidth
53+
54+ property real contentWidth: itemCount * tileWidth
55+ // following variables are copied from Carousel.qml
56+ // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
57+ property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
58+ property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
59+ property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
60+ property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
61+ property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
62+
63+ // This test needs to run first since it tests a corner case condition
64+ // to where the carousel is just being created
65+ // That is why it has a 1 in the name
66+ function test_1onlyNeededItemsCreated() {
67+ tryCompare(carousel, "createdDelegates", 10);
68+ compare(carousel.destroyedDelegates, 0);
69+ }
70+
71+ // test for the getContinuousIndex() function
72+ function test_getContinuousIndex_data() {
73+ // testing for 10 items of size 100 pixel
74+ return [ {tag:"at start",
75+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
76+ {tag:"in startup",
77+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
78+ {tag:"in the middle",
79+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
80+ {tag:"at end",
81+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
82+ ]
83+ }
84+
85+ function test_getContinuousIndex(data) {
86+ root.carouselWidth = data.carouselWidth
87+ root.tileWidth = data.tileWidth
88+ root.itemCount = data.itemCount
89+
90+ var index = Carousel.getContinuousIndex(data.x,
91+ data.tileWidth,
92+ gapToMiddlePhase,
93+ gapToEndPhase,
94+ kGapEnd,
95+ kMiddleIndex,
96+ kXBeginningEnd)
97+ compare(index, data.result)
98+ }
99+
100+ // test for the getXFromContinuousIndex() function
101+ function test_getXFromContinuousIndex_data() {
102+ return [ {tag:"at start",
103+ index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
104+ {tag:"in startup",
105+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
106+ {tag:"in startup with drawBuffer",
107+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
108+ {tag:"in the middle",
109+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
110+ {tag:"in the middle with drawBuffer",
111+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
112+ {tag:"at end",
113+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
114+ {tag:"at end with drawBuffer",
115+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
116+ ]
117+ }
118+
119+ function test_getXFromContinuousIndex(data) {
120+ root.carouselWidth = data.carouselWidth
121+ root.tileWidth = data.tileWidth
122+ root.itemCount = data.itemCount
123+
124+ var x = Carousel.getXFromContinuousIndex(data.index,
125+ data.carouselWidth,
126+ contentWidth,
127+ data.tileWidth,
128+ gapToMiddlePhase,
129+ gapToEndPhase,
130+ data.drawBuffer)
131+ compare(x, data.result)
132+ }
133+
134+ // test for the getViewTranslation() function
135+ function test_getViewTranslation_data() {
136+ return [ {tag:"at start - viewfactor 1",
137+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
138+ {tag:"at start - viewfactor 2",
139+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
140+ {tag:"in startup",
141+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
142+ {tag:"in the middle",
143+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
144+ {tag:"at end",
145+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
146+ ]
147+ }
148+
149+ function test_getViewTranslation(data) {
150+ root.carouselWidth = data.carouselWidth
151+ root.tileWidth = data.tileWidth
152+ root.itemCount = data.itemCount
153+
154+ var x = Carousel.getViewTranslation(data.x,
58155 data.tileWidth,
59− gapToMiddlePhase,
60− gapToEndPhase,
61− kGapEnd,
62− kMiddleIndex,
63− kXBeginningEnd)
64− compare(index, data.result)
65− }
66−
67− // test for the getXFromContinuousIndex() function
68− function test_getXFromContinuousIndex_data() {
69− return [ {tag:"at start",
70− index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
71− {tag:"in startup",
72− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
73− {tag:"in startup with drawBuffer",
74− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
75− {tag:"in the middle",
76− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
77− {tag:"in the middle with drawBuffer",
78− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
79− {tag:"at end",
80− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
81− {tag:"at end with drawBuffer",
82− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
83− ]
84− }
85−
86− function test_getXFromContinuousIndex(data) {
87− root.carouselWidth = data.carouselWidth
88− root.tileWidth = data.tileWidth
89− root.itemCount = data.itemCount
90−
91− var x = Carousel.getXFromContinuousIndex(data.index,
92− data.carouselWidth,
93− contentWidth,
94− data.tileWidth,
95− gapToMiddlePhase,
96− gapToEndPhase,
97− data.drawBuffer)
98− compare(x, data.result)
99− }
100−
101− // test for the getViewTranslation() function
102− function test_getViewTranslation_data() {
103− return [ {tag:"at start - viewfactor 1",
104− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
105− {tag:"at start - viewfactor 2",
106− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
107− {tag:"in startup",
108− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
109− {tag:"in the middle",
110− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
111− {tag:"at end",
112− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
113− ]
114− }
115−
116− function test_getViewTranslation(data) {
117− root.carouselWidth = data.carouselWidth
118− root.tileWidth = data.tileWidth
119− root.itemCount = data.itemCount
120−
121− var x = Carousel.getViewTranslation(data.x,
122− data.tileWidth,
123− root.gapToMiddlePhase,
124− root.gapToEndPhase,
125− data.translationXViewFactor)
126− compare(x, data.result)
127− }
128−
129− // test for the getItemScale() function
130− function test_getItemScale_data() {
131− return [ // tests for distance
132− {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
133− {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
134− {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
135− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
136− {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
137− // tests for continuousIndex
138− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
139− {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
140− // tests for numberOfItems
141− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
142− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
143− // tests for scaleFactor
144− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
145− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
146− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
147− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
148− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
149− ]
150− }
151−
152− function test_getItemScale(data) {
153− var scale = Carousel.getItemScale(data.distance,
154− data.continuousIndex,
155− data.numberOfItems,
156− data.scaleFactor)
157− compare(scale, data.result)
158− }
159−
160− // test for the getItemTranslation() function
161− function test_getItemTranslation_data() {
162− return [ // tests for index and selectedIndex
163− {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
164− // tests if distance only affects the sign
165− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
166− {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
167− {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
168− {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
169− // tests for the scale
170− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
171− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
172− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
173− // tests for maxScale
174− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
175− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
176− {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
177− // test for maxTranslation
178− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
179− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
180− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
181− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
182− ]
183− }
184−
185− function test_getItemTranslation(data) {
186− var scale = Carousel.getItemTranslation(data.index,
187− data.selectedIndex,
188− data.distance,
189− data.scale,
190− data.maxScale,
191− data.maxTranslation)
192− compare(scale, data.result)
156+ root.gapToMiddlePhase,
157+ root.gapToEndPhase,
158+ data.translationXViewFactor)
159+ compare(x, data.result)
160+ }
161+
162+ // test for the getItemScale() function
163+ function test_getItemScale_data() {
164+ return [ // tests for distance
165+ {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
166+ {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
167+ {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
168+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
169+ {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
170+ // tests for continuousIndex
171+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
172+ {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
173+ // tests for numberOfItems
174+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
175+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
176+ // tests for scaleFactor
177+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
178+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
179+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
180+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
181+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
182+ ]
183+ }
184+
185+ function test_getItemScale(data) {
186+ var scale = Carousel.getItemScale(data.distance,
187+ data.continuousIndex,
188+ data.numberOfItems,
189+ data.scaleFactor)
190+ compare(scale, data.result)
191+ }
192+
193+ // test for the getItemTranslation() function
194+ function test_getItemTranslation_data() {
195+ return [ // tests for index and selectedIndex
196+ {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
197+ // tests if distance only affects the sign
198+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
199+ {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
200+ {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
201+ {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
202+ // tests for the scale
203+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
204+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
205+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
206+ // tests for maxScale
207+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
208+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
209+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
210+ // test for maxTranslation
211+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
212+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
213+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
214+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
215+ ]
216+ }
217+
218+ function test_getItemTranslation(data) {
219+ var scale = Carousel.getItemTranslation(data.index,
220+ data.selectedIndex,
221+ data.distance,
222+ data.scale,
223+ data.maxScale,
224+ data.maxTranslation)
225+ compare(scale, data.result)
226+ }
227+
228+ function test_lastItemXPosition() {
229+ var carouselList = findChild(carousel, "listView");
230+ var stepAnimation = findInvisibleChild(carouselList, "stepAnimation");
231+ var stepDiff = 0;
232+ stepAnimation.onRunningChanged.connect(function() { if (stepAnimation.running) stepDiff = Math.abs(carouselList.contentX - stepAnimation.to); })
233+ var overshootOnce = false;
234+ while (!overshootOnce) {
235+ overshootOnce = carouselList.realContentX > carouselList.realContentWidth - carouselList.realWidth;
236+ mouseFlick(carousel, carousel.width - units.gu(1),
237+ carousel.height / 2,
238+ units.gu(2),
239+ carousel.height / 2);
240+ tryCompare(carouselList, "moving", false);
241+ }
242+ verify(stepDiff < 1);
243+ var x = carouselList.getXFromContinuousIndex(carousel.model - 1);
244+ verify(Math.abs(x - carouselList.contentX) < 1);
245+ }
193246 }
194247}
tests/qmltests/Components/tst_LazyImage.qml+7
@@ -152,6 +152,7 @@ Rectangle {
152152
153153 function test_lazyimage(data) {
154154 data.func();
155+ waitForRendering(baseRect);
155156
156157 if (data.transition) {
157158 // wait for the transition to complete
@@ -168,6 +169,12 @@ Rectangle {
168169 compare(data.image.initialHeight, data.initialHeight);
169170 compare(data.image.initialWidth, data.initialWidth);
170171
172+ // check the sourceSize
173+ var sourceHeight = (data.image.scaleTo === "height" || (data.image.scaleTo === "fit" && data.height <= data.width)) ? data.height : 0
174+ var sourceWidth = (data.image.scaleTo === "width" || (data.image.scaleTo === "fit" && data.width <= data.height)) ? data.width : 0
175+ compare(data.image.sourceSize.height, sourceHeight);
176+ compare(data.image.sourceSize.width, sourceWidth);
177+
171178 // check the shape dimensions
172179 var shape = findChild(data.image, "shape");
173180 compare(shape.width, data.imageWidth);
tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−2
@@ -82,8 +82,7 @@ Item {
8282 ResponsiveFlowView {
8383 id: flow
8484 anchors.fill: parent
85− firstModel: fakeModel
86− secondModel: fakeModel
85+ model: fakeModel
8786 minimumHorizontalSpacing:
8887 minHSpacingSelector.values[minHSpacingSelector.selectedIndex]
8988 verticalSpacing: units.gu(2)
tests/qmltests/Components/tst_Stage.qmldeleted−278
@@ -1,278 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import ".."
20−import "../../../qml/Components"
21−import Unity.Application 0.1
22−import Ubuntu.Components 0.1
23−import Unity.Test 0.1 as UT
24−import "tst_Stage"
25−
26−Rectangle {
27− width: units.gu(70)
28− height: stageRect.height
29−
30− // Even though we replace the ApplicationScreenshot instances in Stage
31− // with our own fake ones, ApplicationScreenshot.qml still gives out a warning
32− // if shell.importUbuntuApplicationAvailable is missing.
33− // For we have this here for the sake of keeping a clean log output.
34− Item {
35− id: shell
36− property bool importUbuntuApplicationAvailable: false
37− }
38−
39− // A fake ApplicationManager implementation to be passed to Stage
40− QtObject {
41− id: fakeAppManager
42− property ListModel mainStageApplications: ListModel {}
43− property ListModel sideStageApplications: ListModel {}
44− property var mainStageFocusedApplication
45−
46− property Component fakeAppWindowComponent: Component {
47− Rectangle {
48− width: stage.width
49− height: stage.height
50− property alias text : txt.text
51− Text {id:txt}
52− }
53− }
54−
55− function activateApplication(desktopFile, argument) {
56− var appWindow = fakeAppWindowComponent.createObject(fakeWindowContainer)
57− var application = {
58− 'icon': "foo",
59− 'handle': desktopFile,
60− 'name': "Foo",
61− 'fullscreen': false,
62− 'desktopFile': desktopFile,
63− 'stage': ApplicationInfo.MainStage,
64− 'argument': 0,
65− 'color': desktopFile,
66− 'window': appWindow
67− };
68− appWindow.color = application.color
69− appWindow.text = desktopFile + " actual";
70−
71− mainStageApplications.append(application)
72− updateZOrderOfWindows(mainStageApplications)
73−
74− return application
75− }
76−
77− function focusApplication(application) {
78− mainStageFocusedApplication = application
79− }
80−
81− function getApplicationFromDesktopFile(desktopFile, stageType) {
82− var sideStage = (stage == ApplicationInfo.SideStage);
83− var applications = sideStage ? sideStageApplications
84− : mainStageApplications;
85−
86− for (var i = 0; i < applications.count; i++ ) {
87− var application = applications.get(i);
88− if (application.desktopFile === desktopFile) {
89− return application;
90− }
91− }
92− return null;
93− }
94−
95− function moveRunningApplicationStackPosition(from, to, stage) {
96− var sideStage = (stage == ApplicationInfo.SideStage);
97− var applications = sideStage ? sideStageApplications
98− : mainStageApplications;
99−
100− if (from !== to && applications.count > 0 && from >= 0 && to >= 0) {
101− applications.move(from, to, 1);
102− }
103−
104− updateZOrderOfWindows(applications)
105− }
106−
107− function updateZOrderOfWindows(applications) {
108− var nextZ = 100
109− for (var i = 0; i < applications.count; i++ ) {
110− var application = applications.get(i);
111− application.window.z = nextZ--;
112− }
113− }
114−
115− function deacticateApplication(desktopFile) {
116− for (var i = 0; i < mainStageApplications.count; i++ ) {
117− var application = mainStageApplications.get(i)
118− if (application.desktopFile === desktopFile) {
119− focusApplication(null)
120− application.window.destroy();
121− mainStageApplications.remove(i)
122− updateZOrderOfWindows(mainStageApplications)
123− return;
124− }
125− }
126− }
127− }
128−
129− Rectangle {
130− id: stageRect
131− x:0
132− y:0
133− width: childrenRect.width
134− height: childrenRect.height
135−
136− color: "grey"
137−
138− // This is where the fake windows are held.
139− // They stay behind the stage, so that the stage's screenshots are shown
140− // on top of them
141− // On a real usage scenario, the current application's surface is composited behind
142− // the shell's surface (where Stage lives). fakeWindowContainer simulates this stacking
143− Item {
144− id: fakeWindowContainer
145− anchors.fill: parent
146− }
147−
148−
149− // A black rectangle behind the stage so that the window switch animations
150− // look good, just like in Stage's real usage.
151− Rectangle {
152− anchors.fill: parent
153− color: "black"
154− visible: stage.usingScreenshots
155− }
156−
157− Stage {
158− id: stage
159− y: 0
160− shouldUseScreenshots: false
161− applicationManager: fakeAppManager
162− rightEdgeDraggingAreaWidth: units.gu(2)
163− fullyShown: true
164− fullyHidden: false
165− newApplicationScreenshot: FakeApplicationScreenshot {
166− id: newAppScreenshot
167− parent: stage
168− width: stage.width
169− height: stage.height - stage.y}
170− oldApplicationScreenshot: FakeApplicationScreenshot {
171− id: oldAppScreenshot
172− parent: stage
173− width: stage.width
174− height: stage.height - stage.y}
175− }
176− }
177−
178− Rectangle {
179− id: controlsRect
180− anchors.top: parent.top
181− anchors.bottom: parent.bottom
182− anchors.left: stageRect.right
183− anchors.right: parent.right
184− color: "lightgrey"
185−
186− Column {
187− id: controls
188− spacing: units.gu(1)
189− AppControl {id: redControl; desktopFile:"red"}
190− AppControl {id: greenControl; desktopFile:"green"}
191− AppControl {id: blueControl; desktopFile:"blue"}
192− }
193− }
194−
195− UT.UnityTestCase {
196− name: "Stage"
197− when: windowShown
198−
199− function isCurrentAppFadingOut() {
200− // it should get a bit translucent and smaller
201− return oldAppScreenshot.opacity < 0.99
202− && oldAppScreenshot.opacity >= 0.1
203− && oldAppScreenshot.scale < 0.99
204− && oldAppScreenshot.scale >= 0.1
205− && oldAppScreenshot.visible
206− }
207−
208− function init() {
209− redControl.checked = false;
210− greenControl.checked = false;
211− blueControl.checked = false;
212− // give some room for animations to start
213− wait(50)
214− // wait until animations end, if any
215− tryCompare(stage, "usingScreenshots", false)
216− }
217−
218− /* If you flick from the right edge of the stage leftwards it should cause an
219− application switch. */
220− function test_dragFromRightEdgeToSwitchApplication() {
221− redControl.checked = true
222−
223− tryCompare(stage, "usingScreenshots", true) // wait for the animation to start
224− tryCompare(stage, "usingScreenshots", false) // and then for it to end
225− compare(fakeAppManager.mainStageFocusedApplication.desktopFile, "red")
226− compare(fakeAppManager.mainStageApplications.get(0).desktopFile, "red")
227−
228− greenControl.checked = true
229−
230− tryCompare(stage, "usingScreenshots", true) // wait for the animation to start
231− tryCompare(stage, "usingScreenshots", false) // and then for it to end
232− compare(fakeAppManager.mainStageFocusedApplication.desktopFile, "green")
233− compare(fakeAppManager.mainStageApplications.get(0).desktopFile, "green")
234−
235− var touchX = stage.width - (stage.rightEdgeDraggingAreaWidth / 2)
236− var touchY = stage.height / 2
237− touchFlick(stage, touchX, touchY, stage.width * 0.25, touchY)
238−
239− // wait until animations end, if any
240− tryCompare(stage, "usingScreenshots", false)
241−
242− // "red" should be the new topmost, focused, application
243− compare(fakeAppManager.mainStageFocusedApplication.desktopFile, "red")
244− compare(fakeAppManager.mainStageApplications.get(0).desktopFile, "red")
245− }
246−
247− /* When an application is launched, it needs a background before it's drawn on screen
248− so that the user does not see the previous running app while the new one is launching.
249− When switching between applications, backgrounds are unnecessary, 'cause the
250− applications are in front of them. */
251− function test_background() {
252− redControl.checked = true
253− tryCompare(stage, "usingScreenshots", true) // wait for the animation to start
254−
255− compare(newAppScreenshot.withBackground, true, "starting app screenshot does not have background enabled")
256−
257− tryCompare(stage, "usingScreenshots", false) // wait for the animation to finish
258−
259− greenControl.checked = true
260− tryCompare(stage, "usingScreenshots", true) // wait for the animation to start
261− tryCompare(stage, "usingScreenshots", false) // and finish
262−
263− var draggingAreaCenterX = stage.width - (stage.rightEdgeDraggingAreaWidth / 2)
264− var draggingAreaCenterY = stage.height / 2
265− var finalTouchX = draggingAreaCenterX - units.gu(5)
266− touchFlick(stage, draggingAreaCenterX, draggingAreaCenterY,
267− finalTouchX, draggingAreaCenterY,
268− true /* beginTouch */, false /* endTouch */)
269−
270− // wait for the animation to start
271− tryCompare(stage, "usingScreenshots", true)
272−
273− compare(newAppScreenshot.withBackground, false, "switched app does have background enabled")
274−
275− touchRelease(stage, finalTouchX, draggingAreaCenterY)
276− }
277− }
278−}
tests/qmltests/Components/tst_Stage/AppControl.qmldeleted−42
@@ -1,42 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−Row {
21− id: root
22− property string desktopFile
23− spacing: units.gu(1)
24−
25− property alias checked: checkbox.checked
26−
27− Label {text: root.desktopFile
28− anchors.verticalCenter: parent.verticalCenter
29− width:units.gu(5)}
30−
31− CheckBox {
32− id: checkbox
33− onCheckedChanged: {
34− if (checked) {
35− var app = fakeAppManager.activateApplication(root.desktopFile)
36− stage.activateApplication(root.desktopFile)
37− } else {
38− fakeAppManager.deacticateApplication(root.desktopFile)
39− }
40− }
41− }
42−}
tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qmldeleted−53
@@ -1,53 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−Item {
20− property var application
21− property bool withBackground: true
22− property bool ready: application != undefined
23−
24− function setApplication(app) {
25− application = app
26− }
27−
28− function clearApplication() {
29− setApplication(undefined)
30− }
31−
32− function scheduleUpdate() {}
33−
34− function updateFromCache() {}
35−
36− Rectangle {
37− id: rect
38− anchors.fill: parent
39− Text {id:text}
40− }
41−
42− onApplicationChanged: {
43− if (application) {
44− rect.color = application.color
45− text.text = application.desktopFile + " screenshot"
46− rect.visible = true
47− } else {
48− rect.color = "white"
49− text.text = "<NULL> screenshot"
50− rect.visible = false
51− }
52− }
53−}
tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+50−117
@@ -18,87 +18,20 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import "../../../../qml/Dash/Apps"
2020import Unity.Test 0.1 as UT
21+import Unity.Application 0.1
2122
22−Item {
23+// Using Rectangle to have an opaque surface because AppManager paints app surfaces behind it.
24+Rectangle {
2325 width: units.gu(50)
2426 height: units.gu(40)
2527
26− QtObject {
27− id: fakeApplicationManager
28−
29− property bool sideStageEnabled: false
30−
31− function stopApplication(appId) {
32− for (var i=0, len=fakeRunningAppsModel.count; i<len; i++) {
33− if (appId == fakeRunningAppsModel.get(i).appId) {
34− fakeRunningAppsModel.remove(i)
35− }
36− }
37− }
38− }
39−
40− QtObject {
41− id: shell
42− property bool dashShown: true
43− property bool stageScreenshotsReady: false
44− property var applicationManager: fakeApplicationManager
45−
46− function activateApplication(appId) {
47− }
48− }
49−
50− ListModel {
51− id: fakeRunningAppsModel
52−
53− function contains(appId) {
54− for (var i=0, len=fakeRunningAppsModel.count; i<len; i++) {
55− if (appId == fakeRunningAppsModel.get(i).appId) {
56− return true;
57− }
58− }
59− return false;
60− }
61−
62− function rePopulate() {
63− for (var i=0, len=availableAppsModel.count; i<len; i++) {
64− fakeRunningAppsModel.append(availableAppsModel.get(i));
65− }
66− }
67− }
68−
69− ListModel {
70− id: availableAppsModel
71− ListElement {
72− name: "Phone"
73− icon: "phone-app"
74− exec: "/usr/bin/phone-app"
75− appId: "phone"
76− imageQml: "import QtQuick 2.0\n \
77− Rectangle { \n \
78− anchors.fill:parent \n \
79− color:'darkgreen' \n \
80− Text { anchors.centerIn: parent; text: 'PHONE' } \n \
81− }"
28+ function resetRunningApplications() {
29+ while (ApplicationManager.count > 0) {
30+ ApplicationManager.stopApplication(ApplicationManager.get(0).appId)
8231 }
8332
84− ListElement {
85− name: "Calendar"
86− icon: "calendar-app"
87− exec: "/usr/bin/calendar-app"
88− appId: "calendar"
89− imageQml: "import QtQuick 2.0\n \
90− Rectangle { \n \
91− anchors.fill:parent \n \
92− color:'darkblue' \n \
93− Text { anchors.centerIn: parent; text: 'CALENDAR'\n \
94− color:'white'} \n \
95− }"
96− }
97− }
98−
99− function resetRunningApplications() {
100− fakeRunningAppsModel.clear()
101− fakeRunningAppsModel.rePopulate()
33+ ApplicationManager.startApplication("phone-app");
34+ ApplicationManager.startApplication("webbrowser-app");
10235 }
10336
10437 Component.onCompleted: {
@@ -109,7 +42,7 @@ Item {
10942 RunningApplicationsGrid {
11043 id: runningApplicationsGrid
11144 anchors.fill: parent
112− firstModel: fakeRunningAppsModel
45+ model: ApplicationManager
11346 }
11447
11548 UT.UnityTestCase {
@@ -121,11 +54,11 @@ Item {
12154 resetRunningApplications()
12255 }
12356
124− property var calendarTile
57+ property var browserTile
12558 property var phoneTile
12659
127− property var isCalendarLongPressed: false
128− function onCalendarLongPressed() {isCalendarLongPressed = true}
60+ property var isBrowserLongPressed: false
61+ function onBrowserLongPressed() {isBrowserLongPressed = true}
12962
13063 property var isPhoneLongPressed: false
13164 function onPhoneLongPressed() {isPhoneLongPressed = true}
@@ -133,25 +66,25 @@ Item {
13366 // Tiles should go to termination mode when any one of them is long-pressed.
13467 // Long-pressing when they're in termination mode brings them back to activation mode
13568 function test_enterTerminationMode() {
136− calendarTile = findChild(runningApplicationsGrid, "runningAppTile Calendar")
137− verify(calendarTile != undefined)
138− calendarTile.onPressAndHold.connect(onCalendarLongPressed)
69+ browserTile = findChild(runningApplicationsGrid, "runningAppTile Browser")
70+ verify(browserTile != undefined)
71+ browserTile.onPressAndHold.connect(onBrowserLongPressed)
13972
14073 phoneTile = findChild(runningApplicationsGrid, "runningAppTile Phone")
14174 verify(phoneTile != undefined)
14275 phoneTile.onPressAndHold.connect(onPhoneLongPressed)
14376
144− compare(calendarTile.terminationModeEnabled, false)
77+ compare(browserTile.terminationModeEnabled, false)
14578 compare(phoneTile.terminationModeEnabled, false)
14679 compare(runningApplicationsGrid.terminationModeEnabled, false)
14780
148− isCalendarLongPressed = false
149− mousePress(calendarTile, calendarTile.width/2, calendarTile.height/2)
81+ isBrowserLongPressed = false
82+ mousePress(browserTile, browserTile.width/2, browserTile.height/2)
15083 tryCompareFunction(checkSwitchToTerminationModeAfterLongPress, true)
15184
152− mouseRelease(calendarTile, calendarTile.width/2, calendarTile.height/2)
85+ mouseRelease(browserTile, browserTile.width/2, browserTile.height/2)
15386
154− compare(calendarTile.terminationModeEnabled, true)
87+ compare(browserTile.terminationModeEnabled, true)
15588 compare(phoneTile.terminationModeEnabled, true)
15689 compare(runningApplicationsGrid.terminationModeEnabled, true)
15790
@@ -161,23 +94,23 @@ Item {
16194
16295 mouseRelease(phoneTile, phoneTile.width/2, phoneTile.height/2)
16396
164− compare(calendarTile.terminationModeEnabled, false)
97+ compare(browserTile.terminationModeEnabled, false)
16598 compare(phoneTile.terminationModeEnabled, false)
16699 compare(runningApplicationsGrid.terminationModeEnabled, false)
167100
168− calendarTile.onPressAndHold.disconnect(onCalendarLongPressed)
101+ browserTile.onPressAndHold.disconnect(onBrowserLongPressed)
169102 phoneTile.onPressAndHold.disconnect(onPhoneLongPressed)
170103 }
171104
172105 // Checks that components swicth to termination mode after (and only after) a long
173− // press happens on Calendar tile.
106+ // press happens on Browser tile.
174107 function checkSwitchToTerminationModeAfterLongPress() {
175− compare(calendarTile.terminationModeEnabled, isCalendarLongPressed)
176− compare(phoneTile.terminationModeEnabled, isCalendarLongPressed)
177− compare(runningApplicationsGrid.terminationModeEnabled, isCalendarLongPressed)
108+ compare(browserTile.terminationModeEnabled, isBrowserLongPressed)
109+ compare(phoneTile.terminationModeEnabled, isBrowserLongPressed)
110+ compare(runningApplicationsGrid.terminationModeEnabled, isBrowserLongPressed)
178111
179− return isCalendarLongPressed &&
180− calendarTile.terminationModeEnabled &&
112+ return isBrowserLongPressed &&
113+ browserTile.terminationModeEnabled &&
181114 phoneTile.terminationModeEnabled &&
182115 runningApplicationsGrid.terminationModeEnabled
183116 }
@@ -185,12 +118,12 @@ Item {
185118 // Checks that components swicth to activation mode after (and only after) a long
186119 // press happens on Phone tile.
187120 function checkSwitchToActivationModeAfterLongPress() {
188− compare(calendarTile.terminationModeEnabled, !isPhoneLongPressed)
121+ compare(browserTile.terminationModeEnabled, !isPhoneLongPressed)
189122 compare(phoneTile.terminationModeEnabled, !isPhoneLongPressed)
190123 compare(runningApplicationsGrid.terminationModeEnabled, !isPhoneLongPressed)
191124
192125 return isPhoneLongPressed &&
193− !calendarTile.terminationModeEnabled &&
126+ !browserTile.terminationModeEnabled &&
194127 !phoneTile.terminationModeEnabled &&
195128 !runningApplicationsGrid.terminationModeEnabled
196129 }
@@ -200,17 +133,17 @@ Item {
200133 function test_clickTileNotClose() {
201134 runningApplicationsGrid.terminationModeEnabled = true
202135
203− var calendarTile = findChild(runningApplicationsGrid, "runningAppTile Calendar")
204− verify(calendarTile != undefined)
136+ var browserTile = findChild(runningApplicationsGrid, "runningAppTile Browser")
137+ verify(browserTile != undefined)
205138
206− verify(fakeRunningAppsModel.contains("calendar"))
139+ verify(ApplicationManager.findApplication("webbrowser-app") !== null)
207140
208− mouseClick(calendarTile, calendarTile.width/2, calendarTile.height/2)
141+ mouseClick(browserTile, browserTile.width/2, browserTile.height/2)
209142
210− verify(fakeRunningAppsModel.contains("calendar"))
143+ verify(ApplicationManager.findApplication("webbrowser-app") !== null)
211144
212− // The tile for the Calendar app should stay there
213− tryCompareFunction(checkCalendarTileExists, true)
145+ // The tile for the Browser app should stay there
146+ tryCompareFunction(checkBrowserTileExists, true)
214147 }
215148
216149 // While in termination mode, clicking on a running application tile's close icon
@@ -218,25 +151,25 @@ Item {
218151 function test_clickCloseIconToTerminateApp() {
219152 runningApplicationsGrid.terminationModeEnabled = true
220153
221− var calendarTile = findChild(runningApplicationsGrid, "runningAppTile Calendar")
222− var calendarTileCloseButton = findChild(runningApplicationsGrid, "closeIcon Calendar")
154+ var browserTile = findChild(runningApplicationsGrid, "runningAppTile Browser")
155+ var browserTileCloseButton = findChild(runningApplicationsGrid, "closeIcon Browser")
223156
224− verify(calendarTile != undefined)
225− verify(calendarTileCloseButton != undefined)
226− verify(fakeRunningAppsModel.contains("calendar"))
157+ verify(browserTile != undefined)
158+ verify(browserTileCloseButton != undefined)
159+ verify(ApplicationManager.findApplication("webbrowser-app") !== 0)
227160
228− mouseClick(calendarTileCloseButton, calendarTileCloseButton.width/2, calendarTileCloseButton.height/2)
161+ mouseClick(browserTileCloseButton, browserTileCloseButton.width/2, browserTileCloseButton.height/2)
229162 wait(0) // spin event loop to start any pending animation
230163
231− verify(!fakeRunningAppsModel.contains("calendar"))
164+ verify(ApplicationManager.findApplication("webbrowser-app") === null)
232165
233− // The tile for the Calendar app should eventually vanish since the
166+ // The tile for the Browser app should eventually vanish since the
234167 // application has been terminated.
235− tryCompareFunction(checkCalendarTileExists, false)
168+ tryCompareFunction(checkBrowserTileExists, false)
236169 }
237170
238− function checkCalendarTileExists() {
239− return findChild(runningApplicationsGrid, "runningAppTile Calendar")
171+ function checkBrowserTileExists() {
172+ return findChild(runningApplicationsGrid, "runningAppTile Browser")
240173 != undefined
241174 }
242175
@@ -245,8 +178,8 @@ Item {
245178 function test_clickOutsideTilesDisablesTerminationMode() {
246179 runningApplicationsGrid.terminationModeEnabled = true
247180
248− var calendarTile = findChild(runningApplicationsGrid, "runningAppTile Calendar")
249− verify(calendarTile != undefined)
181+ var browserTile = findChild(runningApplicationsGrid, "runningAppTile Browser")
182+ verify(browserTile != undefined)
250183
251184 verify(runningApplicationsGrid.terminationModeEnabled);
252185
tests/qmltests/Dash/qml/FakeScopeView.qmldeleted−45
@@ -1,45 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Unity 0.2
19−
20−import "../../../../qml/Dash"
21−
22−GenericScopeView {
23− id: fakeScopeView
24−
25− property alias backColor : back.color
26− property var categoryView: null
27−
28− onMovementStarted: {
29− if (shell != undefined && shell.scopeStatus != undefined) {
30− shell.scopeStatus[scope.id].movementStarted++;
31− }
32− }
33− onPositionedAtBeginning: {
34− if (shell != undefined && shell.scopeStatus != undefined) {
35− shell.scopeStatus[scope.id].positionedAtBeginning++;
36− }
37− }
38−
39− Rectangle {
40− id: back
41− anchors.fill: parent
42− color: "grey"
43− z: -1
44− }
45−}
tests/qmltests/Dash/qml/fake_generic_scopeView.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_generic_scopeView
21− objectName: "fake_generic_scopeView"
22−
23− backColor: "#D0D0D0"
24−}
tests/qmltests/Dash/qml/fake_scopeView1.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView1
21− objectName: "fake_scopeView1"
22−
23− backColor: "#90E090"
24−}
tests/qmltests/Dash/qml/fake_scopeView2.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView2
21− objectName: "fake_scopeView2"
22−
23− backColor: "#A0D0A0"
24−}
tests/qmltests/Dash/qml/fake_scopeView3.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView3
21− objectName: "fake_scopeView3"
22−
23− backColor: "#B0C0B0"
24−}
tests/qmltests/Dash/qml/fake_scopeView4.qmldeleted−24
@@ -1,24 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−FakeScopeView {
20− id: fake_scopeView4
21− objectName: "fake_scopeView4"
22−
23− backColor: "#C0C0C0"
24−}
tests/qmltests/Dash/tst_Card.qml+12−10
@@ -182,11 +182,13 @@ Rectangle {
182182 when: windowShown
183183
184184 property Item header: findChild(card, "cardHeader")
185+ property Item headerLoader: findChild(card, "cardHeaderLoader")
185186 property Item title: findChild(header, "titleLabel")
186187 property Item art: findChild(card, "artShape")
187188 property Item artImage: findChild(card, "artImage")
188189 property Item summary: findChild(card, "summaryLabel")
189190 property Item background: findChild(card, "background")
191+ property Item backgroundLoader: findChild(card, "backgroundLoader")
190192 property Item backgroundImage: findChild(card, "backgroundImage")
191193
192194 function initTestCase() {
@@ -244,8 +246,8 @@ Rectangle {
244246 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
245247 { tag: "Horizontal", width: units.gu(38), index: 5 },
246248 // Make sure card ends with header when there's no summary
247− { tag: "NoSummary", height: function() { return header.y + header.height }, index: 6 },
248− { tag: "HorizontalNoSummary", height: function() { return header.height }, card_layout: "horizontal", index: 6 },
249+ { tag: "NoSummary", height: function() { return headerLoader.y + headerLoader.height }, index: 6 },
250+ { tag: "HorizontalNoSummary", height: function() { return headerLoader.height }, card_layout: "horizontal", index: 6 },
249251 ]
250252 }
251253
@@ -288,7 +290,7 @@ Rectangle {
288290 { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
289291 { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
290292 { tag: "HorizontalHeight", height: function() { return header.height }, index: 5 },
291− { tag: "HorizontalWidth", width: function() { return header.x }, index: 5 },
293+ { tag: "HorizontalWidth", width: function() { return headerLoader.x }, index: 5 },
292294 ]
293295 }
294296
@@ -332,7 +334,7 @@ Rectangle {
332334 function test_art_layout(data) {
333335 selector.selectedIndex = data.index;
334336
335− tryCompare(testCase.header, "x", data.left());
337+ tryCompare(testCase.headerLoader, "x", data.left());
336338 }
337339
338340 function test_header_layout_data() {
@@ -349,13 +351,13 @@ Rectangle {
349351 function test_header_layout(data) {
350352 selector.selectedIndex = data.index;
351353
352− tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
353− tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
354+ tryCompareFunction(function() { return testCase.headerLoader.y === data.top() }, true);
355+ tryCompareFunction(function() { return testCase.headerLoader.x === data.left() }, true);
354356 }
355357
356358 function test_summary_layout_data() {
357359 return [
358− { tag: "With header", top: function() { return header.y + header.height }, index: 0 },
360+ { tag: "With header", top: function() { return headerLoader.y + headerLoader.height }, index: 0 },
359361 { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
360362 ]
361363 }
@@ -400,7 +402,7 @@ Rectangle {
400402
401403 waitForRendering(card);
402404
403− tryCompare(background, "visible", data.visible);
405+ tryCompare(backgroundLoader, "active", data.visible);
404406
405407 if (data.hasOwnProperty("color")) {
406408 tryCompare(background, "color", data.color);
@@ -467,13 +469,13 @@ Rectangle {
467469 function test_mascotShape(data) {
468470 selector.selectedIndex = data.index;
469471
470− var shape = findChild(card, "mascotShape");
472+ var shape = findChild(card, "mascotShapeLoader");
471473 var image = findChild(card, "mascotImage");
472474
473475 verify(shape, "Could not find shape.");
474476 verify(image, "Could not find image.");
475477
476− tryCompare(shape, "visible", data.shape);
478+ tryCompare(shape, "active", data.shape);
477479 tryCompare(image, "visible", !data.shape);
478480 }
479481 }
tests/qmltests/Dash/tst_CardBenchmark.qmlnew file+94
@@ -0,0 +1,94 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 0.1
20+import Unity.Test 0.1 as UT
21+import "../../../qml/Dash"
22+import "CardHelpers.js" as Helpers
23+
24+Rectangle {
25+ id: root
26+ width: units.gu(80)
27+ height: units.gu(72)
28+ color: "#88FFFFFF"
29+
30+ property string cardData: '
31+ {
32+ "art": "../../tests/qmltests/Dash/artwork/music-player-design.png",
33+ "mascot": "../../tests/qmltests/Dash/artwork/avatar.png",
34+ "title": "foo",
35+ "subtitle": "bar",
36+ "summary": "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
37+ }'
38+
39+ property string currentModel: '{}'
40+ property string cardTitleArtSubtitleMascotSummaryModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle", "mascot": "mascot", "summary": "summary" } }'
41+ property string cardTitleArtSubtitleMascotModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle", "mascot": "mascot" } }'
42+ property string cardTitleArtSubtitleModel: '{ "components": { "title": "title", "art": "art", "subtitle": "subtitle" } }'
43+ property string cardTitleArtModel: '{ "components": { "title": "title", "art": "art" } }'
44+ property string cardArtModel: '{ "components": { "art": "art" } }'
45+ property string cardTitleModel: '{ "components": { "title": "title" } }'
46+
47+ CardTool {
48+ id: cardTool
49+ template: Helpers.update(JSON.parse(Helpers.defaultLayout), JSON.parse(currentModel))['template'];
50+ components: Helpers.update(JSON.parse(Helpers.defaultLayout), JSON.parse(currentModel))['components'];
51+ viewWidth: units.gu(48)
52+ }
53+
54+ Repeater {
55+ id: cardRepeater
56+ model: 0
57+ Card {
58+ width: cardTool.cardWidth || implicitWidth
59+ height: cardTool.cardHeight || implicitHeight
60+
61+ template: cardTool.template
62+ components: cardTool.components
63+ cardData: Helpers.mapData(root.cardData, components)
64+ }
65+ }
66+
67+ UT.UnityTestCase {
68+ id: testCase
69+ name: "CardBenchmark"
70+
71+ when: windowShown
72+
73+ function init() {
74+ wait(1);
75+ }
76+
77+ function benchmark_time_data() {
78+ return [
79+ { tag: "cardTitleArtSubtitleMascotSummaryModel", model: cardTitleArtSubtitleMascotSummaryModel },
80+ { tag: "cardTitleArtSubtitleMascotModel", model: cardTitleArtSubtitleMascotModel },
81+ { tag: "cardTitleArtSubtitleModel", model: cardTitleArtSubtitleModel },
82+ { tag: "cardTitleArtModel", model: cardTitleArtModel },
83+ { tag: "cardArtModel", model: cardArtModel },
84+ { tag: "cardTitleModel", model: cardTitleModel },
85+ ];
86+ }
87+
88+ function benchmark_time(data) {
89+ currentModel = data.model;
90+ cardRepeater.model = 1;
91+ cardRepeater.model = 0;
92+ }
93+ }
94+}
tests/qmltests/Dash/tst_CardHeader.qml+1−1
@@ -43,7 +43,7 @@ Rectangle {
4343
4444 when: windowShown
4545
46− property Item mascot: findChild(cardHeader, "mascotShape")
46+ property Item mascot: findChild(cardHeader, "mascotShapeLoader")
4747 property Item titleLabel: findChild(cardHeader, "titleLabel")
4848 property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
4949 property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
tests/qmltests/Dash/tst_Dash.qml−11
@@ -41,16 +41,6 @@ Item {
4141 showScopeOnLoaded: "MockScope2"
4242 }
4343
44− ScopeDelegateMapper {
45− id: scopeDelegateMapper
46− scopeDelegateMapping: {
47− "MockScope1": Qt.resolvedUrl("qml/fake_scopeView1.qml"),
48− "MockScope2": Qt.resolvedUrl("qml/fake_scopeView2.qml"),
49− "clickscope": Qt.resolvedUrl("qml/fake_scopeView3.qml")
50− }
51− genericScope: Qt.resolvedUrl("qml/fake_generic_scopeView.qml")
52− }
53−
5444 UT.UnityTestCase {
5545 name: "Dash"
5646 when: windowShown
@@ -59,7 +49,6 @@ Item {
5949
6050 Component.onCompleted: {
6151 var dashContent = findChild(dash, "dashContent");
62− dashContent.scopeMapper = scopeDelegateMapper;
6352 scopes = dashContent.scopes;
6453 }
6554
tests/qmltests/Dash/tst_DashContent.qml+27−51
@@ -35,13 +35,6 @@ Item {
3535 property var panel: null
3636 // BEGIN To reduce warnings
3737
38− property var scopeStatus: {
39− 'MockScope1': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
40− 'MockScope2': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
41− 'clickscope': { 'movementStarted': 0, 'positionedAtBeginning': 0 },
42− 'MockScope5': { 'movementStarted': 0, 'positionedAtBeginning': 0 }
43− }
44−
4538 Scopes {
4639 id: scopesModel
4740 }
@@ -55,34 +48,9 @@ Item {
5548 }
5649 scopes : scopesModel
5750
58− scopeMapper : scopeDelegateMapper
5951 searchHistory: SearchHistoryModel {}
6052 }
6153
62− ScopeDelegateMapper {
63− id: scopeDelegateMapper
64− scopeDelegateMapping: {
65− "MockScope1": Qt.resolvedUrl("qml/fake_scopeView1.qml"),
66− "MockScope2": Qt.resolvedUrl("qml/fake_scopeView2.qml"),
67− "clickscope": Qt.resolvedUrl("qml/fake_scopeView3.qml"),
68− }
69− genericScope: Qt.resolvedUrl("qml/fake_generic_scopeView.qml")
70− }
71−
72− function clear_scope_status() {
73− scopeStatus["MockScope1"].movementStarted = 0;
74− scopeStatus["MockScope1"].positionedAtBeginning = 0;
75−
76− scopeStatus["MockScope2"].movementStarted = 0;
77− scopeStatus["MockScope2"].positionedAtBeginning = 0;
78−
79− scopeStatus["clickscope"].movementStarted = 0;
80− scopeStatus["clickscope"].positionedAtBeginning = 0;
81−
82− scopeStatus["MockScope5"].movementStarted = 0;
83− scopeStatus["MockScope5"].positionedAtBeginning = 0;
84− }
85−
8654 SignalSpy {
8755 id: scopeLoadedSpy
8856 target: dashContent
@@ -97,7 +65,7 @@ Item {
9765
9866 UT.UnityTestCase {
9967 name: "DashContent"
100− when: scopesModel.loaded
68+ when: scopesModel.loaded && windowShown
10169
10270 function init() {
10371 scopesModel.clear();
@@ -108,7 +76,6 @@ Item {
10876
10977 function cleanup() {
11078 movementStartedSpy.clear();
111− clear_scope_status();
11279 dashContent.visible = true;
11380
11481 var dashContentList = findChild(dashContent, "dashContentList");
@@ -149,29 +116,38 @@ Item {
149116 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
150117 }
151118
152− function test_movement_started_signal() {
153− dashContent.setCurrentScopeAtIndex(3, true, false);
154−
119+ function test_show_header_on_list_movement() {
155120 var dashContentList = findChild(dashContent, "dashContentList");
156− verify(dashContentList != undefined)
121+ verify(dashContentList != undefined);
122+ var categoryListView = findChild(dashContentList, "categoryListView");
123+ verify(categoryListView != undefined);
124+
125+ waitForRendering(categoryListView);
157126
158− dashContentList.movementStarted();
127+ categoryListView.contentY = units.gu(11);
128+ console.log("contentY", categoryListView.contentY);
159129
160− compare(movementStartedSpy.count, 1, "DashContent should have emitted movementStarted signal when content list did.");
161− compare(scopeStatus["MockScope1"].movementStarted, 1, "MockScope1 should have emitted movementStarted signal when content list did.");
162− compare(scopeStatus["MockScope2"].movementStarted, 1, "MockScope2 should have emitted movementStarted signal when content list did.");
163− compare(scopeStatus["clickscope"].movementStarted, 1, "clickscope should have emitted movementStarted signal when content list did.");
164− compare(scopeStatus["MockScope5"].movementStarted, 1, "MockScope5 should have emitted movementStarted signal when content list did.");
130+ var startX = dashContentList.width/2;
131+ var startY = dashContentList.height/2;
132+ touchFlick(dashContentList, startX - units.gu(2), startY, startX, startY);
133+ tryCompare(categoryListView, "contentY", units.gu(11) - categoryListView.pageHeader.height);
165134 }
166135
167− function test_positioned_at_beginning_signal() {
168− dashContent.setCurrentScopeAtIndex(3, true, false);
136+ function test_set_current_scope_reset() {
137+ var dashContentList = findChild(dashContent, "dashContentList");
138+ verify(dashContentList != undefined);
139+ var categoryListView = findChild(dashContentList, "categoryListView");
140+ verify(categoryListView != undefined);
141+
142+ categoryListView.contentY = units.gu(10);
143+
144+ compare(dashContentList.currentItem.item.objectName, "MockScope1")
145+ compare(categoryListView.contentY, units.gu(10));
146+
147+ dashContent.setCurrentScopeAtIndex(0, false, true);
169148
170− dashContent.positionedAtBeginning();
171− compare(scopeStatus["MockScope1"].positionedAtBeginning, 1, "MockScope1 should have emitted positionedAtBeginning signal when DashContent did.");
172− compare(scopeStatus["MockScope2"].positionedAtBeginning, 1, "MockScope2 should have emitted positionedAtBeginning signal when DashContent did.");
173− compare(scopeStatus["clickscope"].positionedAtBeginning, 1, "clickscope should have emitted positionedAtBeginning signal when DashContent did.");
174− compare(scopeStatus["MockScope5"].positionedAtBeginning, 1, "MockScope5 should have emitted positionedAtBeginning signal when DashContent did.");
149+ compare(dashContentList.currentItem.item.objectName, "MockScope1")
150+ compare(categoryListView.contentY, 0);
175151 }
176152
177153 // This tests that setting the current scope index will end up at the correct index even if
tests/qmltests/Dash/tst_GenericScopeView.qml+14−2
@@ -64,9 +64,10 @@ Item {
6464
6565 UT.UnityTestCase {
6666 name: "GenericScopeView"
67− when: scopes.loaded
67+ when: scopes.loaded && windowShown
6868
6969 function init() {
70+ genericScopeView.scope = scopes.get(2)
7071 shell.width = units.gu(120)
7172 genericScopeView.categoryView.positionAtBeginning();
7273 tryCompare(genericScopeView.categoryView, "contentY", 0)
@@ -105,11 +106,22 @@ Item {
105106 tryCompare(previewListView, "open", false);
106107 }
107108
109+ function test_searchQuery() {
110+ genericScopeView.scope = scopes.get(0);
111+ genericScopeView.scope.searchQuery = "test";
112+ genericScopeView.scope = scopes.get(1);
113+ genericScopeView.scope.searchQuery = "test2";
114+ genericScopeView.scope = scopes.get(0);
115+ tryCompare(genericScopeView.scope, "searchQuery", "test");
116+ genericScopeView.scope = scopes.get(1);
117+ tryCompare(genericScopeView.scope, "searchQuery", "test2");
118+ }
119+
108120 function test_changeScope() {
109121 genericScopeView.scope.searchQuery = "test"
110122 genericScopeView.scope = scopes.get(1)
111123 genericScopeView.scope = scopes.get(2)
112− tryCompare(genericScopeView.scope, "searchQuery", "")
124+ tryCompare(genericScopeView.scope, "searchQuery", "test")
113125 }
114126
115127 function test_filter_expand_collapse() {
tests/qmltests/Launcher/tst_Launcher.qml+1
@@ -66,6 +66,7 @@ Item {
6666
6767 UT.UnityTestCase {
6868 id: revealer
69+ when: windowShown
6970
7071 function dragLauncherIntoView() {
7172 var startX = launcher.dragAreaWidth/2;
tests/qmltests/Notifications/tst_Notifications.qml+27−13
@@ -43,6 +43,21 @@ Row {
4343 function getRaw(id) {
4444 return mockNotification.createObject(mockModel)
4545 }
46+
47+ // add the default/PlaceHolder notification to the model
48+ Component.onCompleted: {
49+ var n = {
50+ type: Notification.PlaceHolder,
51+ hints: {},
52+ summary: "",
53+ body: "",
54+ icon: "",
55+ secondaryIcon: "",
56+ actions: []
57+ }
58+
59+ append(n)
60+ }
4661 }
4762
4863 function addSnapDecisionNotification() {
@@ -376,6 +391,8 @@ Row {
376391 var notification = findChild(notifications, "notification" + (mockModel.count - 1))
377392 verify(notification !== undefined, "notification wasn't found");
378393
394+ waitForRendering(notification);
395+
379396 var icon = findChild(notification, "icon")
380397 var shapedIcon = findChild(notification, "shapedIcon")
381398 var nonShapedIcon = findChild(notification, "nonShapedIcon")
@@ -384,7 +401,6 @@ Row {
384401 var summaryLabel = findChild(notification, "summaryLabel")
385402 var bodyLabel = findChild(notification, "bodyLabel")
386403 var buttonRow = findChild(notification, "buttonRow")
387− waitForRendering(buttonRow)
388404
389405 compare(icon.visible, data.iconVisible, "avatar-icon visibility is incorrect")
390406 compare(shapedIcon.visible, data.shapedIcon, "shaped-icon visibility is incorrect")
@@ -407,12 +423,9 @@ Row {
407423 var buttonCancel = findChild(buttonRow, "button1")
408424 var buttonAccept = findChild(buttonRow, "button0")
409425
410− waitForRendering(notification)
411−
412426 // only test the left/cancel-button if two actions have been passed in
413427 if (data.actions.length == 2) {
414− mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2)
415− actionSpy.wait()
428+ tryCompareFunction(function() { mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2); return actionSpy.signalArguments.length > 0; }, true);
416429 compare(actionSpy.signalArguments[0][0], data.actions[1]["id"], "got wrong id for negative action")
417430 actionSpy.clear()
418431 }
@@ -421,38 +434,39 @@ Row {
421434 verify(buttonAccept.gradient === data.buttonTinted ? UbuntuColors.orangeGradient : UbuntuColors.greyGradient, "button has the wrong color-tint")
422435
423436 // click the positive/right button
424− mouseClick(buttonAccept, buttonAccept.width / 2, buttonAccept.height / 2)
425− actionSpy.wait()
437+ tryCompareFunction(function() { mouseClick(buttonAccept, buttonAccept.width / 2, buttonAccept.height / 2); return actionSpy.signalArguments.length > 0; }, true);
426438 compare(actionSpy.signalArguments[0][0], data.actions[0]["id"], "got wrong id positive action")
427439 actionSpy.clear()
440+ waitForRendering(notification)
428441
429442 // check if there's more than one negative choice
430443 if (data.actions.length > 2) {
431− var initialHeight = notification.height
444+ var initialHeight = notification.implicitHeight
432445
433446 // click to expand
434447 mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2)
435− waitForRendering(notification)
448+ var contentColumn = findChild(notification, "contentColumn")
449+ var collapsedContentColumnHeight = contentColumn.height;
450+ // Waiting for the inner column to change height because buttons appear
451+ tryCompareFunction(function() { return collapsedContentColumnHeight != contentColumn.height; }, true);
452+ // Waiting for notification to reach its target size
453+ tryCompare(notification, "height", contentColumn.height + contentColumn.spacing * 2)
436454 actionSpy.clear()
437455
438456 // test the additional buttons
439457 for (var i = 2; i < data.actions.length; i++) {
440− waitForRendering(notification)
441458 var buttonColumn = findChild(notification, "buttonColumn")
442459 var button = findChild(buttonColumn, "button" + i)
443460 mouseClick(button, button.width / 2, button.height / 2)
444− actionSpy.wait()
445461 compare(actionSpy.signalArguments[0][0], data.actions[i]["id"], "got wrong id for additional negative action")
446462 actionSpy.clear()
447463 }
448464
449465 // click to collapse
450466 mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2)
451− waitForRendering(notification)
452467 tryCompare(notification, "height", initialHeight)
453468 } else {
454469 mouseClick(buttonCancel, buttonCancel.width / 2, buttonCancel.height / 2)
455− actionSpy.wait()
456470 compare(actionSpy.signalArguments[0][0], data.actions[1]["id"], "got wrong id for negative action")
457471 }
458472 }
tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qmlnew file+238
@@ -0,0 +1,238 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import ".."
20+import "../../../qml/Notifications"
21+import Ubuntu.Components 0.1
22+import Unity.Test 0.1
23+import Unity.Notifications 1.0
24+
25+Row {
26+ id: rootRow
27+
28+ Component {
29+ id: mockNotification
30+
31+ QtObject {
32+ function invokeAction(actionId) {
33+ mockModel.actionInvoked(actionId)
34+ }
35+ }
36+ }
37+
38+ ListModel {
39+ id: mockModel
40+
41+ signal actionInvoked(string actionId)
42+
43+ function getRaw(id) {
44+ return mockNotification.createObject(mockModel)
45+ }
46+
47+ // add the default/PlaceHolder notification to the model
48+ Component.onCompleted: {
49+ var n = {
50+ type: Notification.PlaceHolder,
51+ hints: {},
52+ summary: "",
53+ body: "",
54+ icon: "",
55+ secondaryIcon: "",
56+ actions: []
57+ }
58+
59+ append(n)
60+ }
61+ }
62+
63+ function addSomeSnapDecisionNotifications() {
64+ var n = [{
65+ type: Notification.SnapDecision,
66+ hints: {"x-canonical-private-button-tint": "true"},
67+ summary: "Incoming call",
68+ body: "Frank Zappa\n+44 (0)7736 027340",
69+ icon: "../graphics/avatars/funky.png",
70+ secondaryIcon: "../graphics/applicationIcons/phone-app.png",
71+ actions: [{ id: "pickup_id", label: "Pick up"},
72+ { id: "decline_1_id", label: "Decline"},
73+ { id: "decline_2_id", label: "Can't talk now, what's up?"},
74+ { id: "decline_3_id", label: "I call you back."},
75+ { id: "decline_4_id", label: "Send custom message..."}]
76+ },
77+ {
78+ type: Notification.SnapDecision,
79+ hints: {"x-canonical-private-button-tint": "true",
80+ "x-canonical-non-shaped-icon": "true"},
81+ summary: "Incoming file",
82+ body: "Frank would like to send you the file: essay.pdf.",
83+ icon: "image://theme/search",
84+ actions: [{ id: "accept_id", label: "Accept"},
85+ { id: "reject_id", label: "Reject"}]
86+ },
87+ {
88+ type: Notification.SnapDecision,
89+ hints: {"x-canonical-private-button-tint": "true",
90+ "x-canonical-non-shaped-icon": "true"},
91+ summary: "Authentication error",
92+ body: "Please authorise Ubuntu to access your Google account.",
93+ icon: "image://theme/search",
94+ actions: [{ id: "settings_id", label: "Settings..."},
95+ { id: "cancel_id", label: "Cancel"}]
96+ },
97+ {
98+ type: Notification.SnapDecision,
99+ hints: {"x-canonical-private-button-tint": "true",
100+ "x-canonical-non-shaped-icon": "true"},
101+ summary: "Morning alarm",
102+ body: "It's 6:30... time to get up!",
103+ icon: "image://theme/search",
104+ actions: [{ id: "ok_reply", label: "Ok"},
105+ { id: "snooze_id", label: "Snooze"}]
106+ },
107+ {
108+ type: Notification.SnapDecision,
109+ hints: {"x-canonical-private-button-tint": "true"},
110+ summary: "Jenny Sample",
111+ body: "Hey there! Have you been watching the latest episode of that TV-show I told you about last week?",
112+ icon: "../graphics/avatars/amanda.png",
113+ secondaryIcon: "../graphics/applicationIcons/messages-app.png",
114+ actions: [{ id: "reply_id", label: "Reply"},
115+ { id: "ignore_id", label: "Ignore"}]
116+ }]
117+
118+ mockModel.append(n)
119+ }
120+
121+ function clearNotifications() {
122+ // remove all but the first (PlaceHolder) notification
123+ mockModel.remove(1, mockModel.count - 1)
124+ }
125+
126+ function removeTopMostNotification() {
127+ // leave real/first (PlaceHolder) notification untouched
128+ if (mockModel.count > 1)
129+ mockModel.remove(1)
130+ }
131+
132+ Rectangle {
133+ id: notificationsRect
134+
135+ width: units.gu(40)
136+ height: units.gu(71)
137+
138+ MouseArea{
139+ id: clickThroughCatcher
140+
141+ anchors.fill: parent
142+ }
143+
144+ Notifications {
145+ id: notifications
146+
147+ margin: units.gu(1)
148+
149+ anchors.fill: parent
150+ model: mockModel
151+ }
152+ }
153+
154+ Rectangle {
155+ id: interactiveControls
156+
157+ width: units.gu(30)
158+ height: units.gu(81)
159+ color: "grey"
160+
161+ Column {
162+ spacing: units.gu(1)
163+ anchors.fill: parent
164+ anchors.margins: units.gu(1)
165+
166+ Button {
167+ width: parent.width
168+ text: "add some snap-decisions"
169+ onClicked: addSomeSnapDecisionNotifications()
170+ }
171+
172+ Button {
173+ width: parent.width
174+ text: "remove top-most notification"
175+ onClicked: removeTopMostNotification()
176+ }
177+
178+ Button {
179+ width: parent.width
180+ text: "clear model"
181+ onClicked: clearNotifications()
182+ }
183+ }
184+ }
185+
186+ UnityTestCase {
187+ id: root
188+ name: "VisualQueueTest"
189+ when: windowShown
190+
191+ function test_VisualSnapDecisionsQueue() {
192+ // populate model with some mock notifications
193+ addSomeSnapDecisionNotifications();
194+
195+ // make sure the view is properly updated before going on
196+ notifications.forceLayout();
197+ waitForRendering(notifications);
198+
199+ var snap_decision = [findChild(notifications, "notification1"),
200+ findChild(notifications, "notification2"),
201+ findChild(notifications, "notification3"),
202+ findChild(notifications, "notification4"),
203+ findChild(notifications, "notification5")]
204+
205+ for (var index = 0; index < snap_decision.length; index++) {
206+ verify(snap_decision[index] !== undefined, index + ". snap-decision wasn't found");
207+ }
208+
209+ // check initial states once all five snap-decisions were appended to the model
210+ compare(snap_decision[0].state, "expanded", "state of first snap-decision is not expanded");
211+ for (var index = 1; index < snap_decision.length; index++) {
212+ compare(snap_decision[index].state, "contracted", "state of "+ index + ".snap-decision is not contracted");
213+ }
214+
215+ // click/tap on each snap-decision and verify only one is in expanded-state at any time
216+ for (var index = 0; index < snap_decision.length; index++) {
217+ mouseClick(snap_decision[index], snap_decision[index].width / 2, snap_decision[index].height / 2)
218+ for (var kindex = 0; kindex < snap_decision.length; kindex++) {
219+ if (kindex == index) {
220+ compare(snap_decision[kindex].state, "expanded", "state of "+ kindex + ".snap-decision is not expanded");
221+ } else {
222+ compare(snap_decision[kindex].state, "contracted", "state of "+ kindex + ".snap-decision is not contracted");
223+ }
224+ }
225+ }
226+
227+ // remove top-most and verify one of the remaining ones is still getting expanded
228+
229+ // make first snap-decision expand
230+ mouseClick(snap_decision[0], snap_decision[0].width / 2, snap_decision[0].height / 2);
231+
232+ for (var index = 1; index < snap_decision.length; index++) {
233+ removeTopMostNotification();
234+ compare(snap_decision[index].state, "expanded", "state of " + index + ". snap-decision is not expanded");
235+ }
236+ }
237+ }
238+}
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+1
@@ -44,6 +44,7 @@ Item {
4444
4545 UT.UnityTestCase {
4646 name: "MenuItemFactory"
47+ when: windowShown
4748
4849 property QtObject menuData: QtObject {
4950 property string label: "root"
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1
@@ -39,6 +39,7 @@ Item {
3939
4040 UT.UnityTestCase {
4141 name: "MessageMenuItemFactory"
42+ when: windowShown
4243
4344 property QtObject menuData: QtObject {
4445 property string label: "root"
tests/qmltests/SideStage/tst_SideStage.qmldeleted−52
@@ -1,52 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import Unity.Test 0.1 as UT
20−import ".."
21−import "../../../qml/SideStage"
22−import Ubuntu.Components 0.1
23−
24−UT.UnityTestCase {
25− name: "SideStage"
26−
27− SideStage {
28− id: sideStage
29− width: units.gu(30)
30− height: units.gu(30)
31− handleExpanded: sideStageRevealer.pressed
32− handleSizeCollapsed: units.gu(2)
33− handleSizeExpanded: units.gu(5)
34− }
35−
36− function test_handle_data() {
37− return [
38− {tag: "expanded", expanded: true},
39− {tag: "collapsed", expanded: false}
40− ]
41− }
42−
43− function test_handle(data) {
44− sideStage.handleExpanded = data.expanded
45−
46− if (data.expanded) {
47− tryCompare(findChild(sideStage, "sideStageHandle"), "width", sideStage.handleSizeExpanded);
48− } else {
49− tryCompare(findChild(sideStage, "sideStageHandle"), "width", sideStage.handleSizeCollapsed);
50− }
51− }
52−}
tests/qmltests/Stages/tst_PhoneStage.qmlnew file+288
@@ -0,0 +1,288 @@
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 ".."
21+import "../../../qml/Stages"
22+import Ubuntu.Components 0.1
23+import Unity.Application 0.1
24+
25+Item {
26+ width: units.gu(70)
27+ height: units.gu(70)
28+
29+ Rectangle {
30+
31+ }
32+
33+ PhoneStage {
34+ id: phoneStage
35+ anchors { fill: parent; rightMargin: units.gu(30) }
36+ shown: true
37+ dragAreaWidth: units.gu(2)
38+ }
39+
40+ Binding {
41+ target: ApplicationManager
42+ property: "rightMargin"
43+ value: phoneStage.anchors.rightMargin
44+ }
45+
46+ Rectangle {
47+ anchors { fill: parent; leftMargin: phoneStage.width }
48+// color: "blue"
49+
50+ Column {
51+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
52+ spacing: units.gu(1)
53+ Button {
54+ anchors { left: parent.left; right: parent.right }
55+ text: "Add App"
56+ onClicked: {
57+ testCase.addApps();
58+ }
59+ }
60+ Button {
61+ anchors { left: parent.left; right: parent.right }
62+ text: "Add App"
63+ }
64+ }
65+ }
66+
67+ UT.UnityTestCase {
68+ id: testCase
69+ name: "PhoneStage"
70+ when: windowShown
71+
72+ function addApps(count) {
73+ if (count == undefined) count = 1;
74+ for (var i = 0; i < count; i++) {
75+ var app = ApplicationManager.startApplication(ApplicationManager.availableApplications()[ApplicationManager.count])
76+ tryCompare(app, "state", ApplicationInfoInterface.Running)
77+ // Fixme: Right now there is a timeout in the PhoneStage that displays a white splash
78+ // screen rectangle when an app starts. This is because we don't yet have a way of
79+ // knowing when an app has finished launching. That workaround and this wait() should
80+ // go away at some point and the app's state only changing to Running when ready for real.
81+// wait(1000)
82+ waitForRendering(phoneStage)
83+ }
84+ }
85+
86+ function goToSpread() {
87+ var spreadView = findChild(phoneStage, "spreadView");
88+
89+ var startX = phoneStage.width;
90+ var startY = phoneStage.height / 2;
91+ var endY = startY;
92+ var endX = units.gu(2);
93+
94+ touchFlick(phoneStage, startX, startY, endX, endY,
95+ true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
96+ }
97+
98+ function test_shortFlick() {
99+ addApps(2)
100+ var startX = phoneStage.width - units.gu(1);
101+ var startY = phoneStage.height / 2;
102+ var endX = phoneStage.width / 2;
103+ var endY = startY;
104+
105+ var activeApp = ApplicationManager.get(0);
106+ var inactiveApp = ApplicationManager.get(1);
107+
108+ touchFlick(phoneStage, startX, startY, endX, endY,
109+ true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
110+
111+ tryCompare(ApplicationManager, "focusedApplicationId", inactiveApp.appId)
112+
113+ touchFlick(phoneStage, startX, startY, endX, endY,
114+ true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
115+
116+ tryCompare(ApplicationManager, "focusedApplicationId", activeApp.appId)
117+
118+ tryCompare(phoneStage, "painting", false);
119+ }
120+
121+ function test_enterSpread_data() {
122+ return [
123+ {tag: "<position1 (linear movement)", positionMarker: "positionMarker1", linear: true, offset: -1, endPhase: 0, targetPhase: 0, newFocusedIndex: 1 },
124+ {tag: "<position1 (non-linear movement)", positionMarker: "positionMarker1", linear: false, offset: -1, endPhase: 0, targetPhase: 0, newFocusedIndex: 0 },
125+ {tag: ">position1", positionMarker: "positionMarker1", linear: true, offset: +1, endPhase: 0, targetPhase: 0, newFocusedIndex: 1 },
126+ {tag: "<position2 (linear)", positionMarker: "positionMarker2", linear: true, offset: -1, endPhase: 0, targetPhase: 0, newFocusedIndex: 1 },
127+ {tag: "<position2 (non-linear)", positionMarker: "positionMarker2", linear: false, offset: -1, endPhase: 0, targetPhase: 0, newFocusedIndex: 1 },
128+ {tag: ">position2", positionMarker: "positionMarker2", linear: true, offset: +1, endPhase: 1, targetPhase: 0, newFocusedIndex: 1 },
129+ {tag: "<position3", positionMarker: "positionMarker3", linear: true, offset: -1, endPhase: 1, targetPhase: 0, newFocusedIndex: 1 },
130+ {tag: ">position3", positionMarker: "positionMarker3", linear: true, offset: +1, endPhase: 2, targetPhase: 2, newFocusedIndex: 2 },
131+ ];
132+ }
133+
134+ function test_enterSpread(data) {
135+ addApps(5)
136+
137+ var spreadView = findChild(phoneStage, "spreadView");
138+
139+ var startX = phoneStage.width;
140+ var startY = phoneStage.height / 2;
141+ var endY = startY;
142+ var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset - phoneStage.dragAreaWidth;
143+
144+ var oldFocusedApp = ApplicationManager.get(0);
145+ var newFocusedApp = ApplicationManager.get(data.newFocusedIndex);
146+
147+ touchFlick(phoneStage, startX, startY, endX, endY,
148+ true /* beginTouch */, false /* endTouch */, units.gu(10), 50);
149+
150+ tryCompare(spreadView, "phase", data.endPhase)
151+
152+ if (!data.linear) {
153+ touchFlick(phoneStage, endX, endY, endX + units.gu(.5), endY,
154+ false /* beginTouch */, false /* endTouch */, units.gu(10), 50);
155+ touchFlick(phoneStage, endY + units.gu(.5), endY, endX, endY,
156+ false /* beginTouch */, false /* endTouch */, units.gu(10), 50);
157+ }
158+
159+ touchRelease(phoneStage, endX, endY);
160+
161+ tryCompare(spreadView, "phase", data.targetPhase)
162+
163+ if (data.targetPhase == 2) {
164+ var app2 = findChild(spreadView, "appDelegate2");
165+ mouseClick(app2, units.gu(1), units.gu(1));
166+ }
167+
168+ tryCompare(phoneStage, "painting", false);
169+ tryCompare(ApplicationManager, "focusedApplicationId", newFocusedApp.appId);
170+ }
171+
172+ function test_selectAppFromSpread_data() {
173+ var appsToTest = 6;
174+ var apps = new Array();
175+ for (var i = 0; i < appsToTest; i++) {
176+ var item = new Object();
177+ item.tag = "App " + i;
178+ item.index = i;
179+ item.total = appsToTest;
180+ apps.push(item)
181+ }
182+ return apps;
183+ }
184+
185+ function test_selectAppFromSpread(data) {
186+ addApps(data.total)
187+
188+ var spreadView = findChild(phoneStage, "spreadView");
189+
190+ goToSpread();
191+
192+ tryCompare(spreadView, "phase", 2);
193+
194+ var tile = findChild(spreadView, "appDelegate" + data.index);
195+ var appId = ApplicationManager.get(data.index).appId;
196+
197+ if (tile.mapToItem(spreadView).x > spreadView.width) {
198+ // Item is not visible... Need to flick the spread
199+ var startX = phoneStage.width - units.gu(1);
200+ var startY = phoneStage.height / 2;
201+ var endY = startY;
202+ var endX = units.gu(2);
203+ touchFlick(phoneStage, startX, startY, endX, endY, true, true, units.gu(10), 50)
204+ tryCompare(spreadView, "flicking", false);
205+ tryCompare(spreadView, "moving", false);
206+// waitForRendering(phoneStage);
207+ }
208+
209+ console.log("clicking app", data.index, "(", appId, ")")
210+ mouseClick(spreadView, tile.mapToItem(spreadView).x + units.gu(1), spreadView.height / 2)
211+ tryCompare(ApplicationManager, "focusedApplicationId", appId);
212+ tryCompare(spreadView, "phase", 0);
213+ }
214+
215+ function test_animateAppStartup() {
216+ compare(phoneStage.painting, false);
217+ addApps(2);
218+ tryCompare(phoneStage, "painting", true);
219+ tryCompare(phoneStage, "painting", false);
220+ addApps(1);
221+ tryCompare(phoneStage, "painting", true);
222+ tryCompare(phoneStage, "painting", false);
223+ }
224+
225+ function test_select_data() {
226+ return [
227+ { tag: "0", index: 0 },
228+ { tag: "2", index: 2 },
229+ { tag: "4", index: 4 },
230+ ]
231+ }
232+
233+ function test_select(data) {
234+ addApps(5);
235+
236+ var spreadView = findChild(phoneStage, "spreadView");
237+ var selectedApp = ApplicationManager.get(data.index);
238+
239+ goToSpread();
240+
241+ phoneStage.select(selectedApp.appId);
242+
243+ tryCompare(phoneStage, "painting", false);
244+ compare(ApplicationManager.focusedApplicationId, selectedApp.appId);
245+ }
246+
247+ function test_fullscreenMode() {
248+ var fullscreenApp = null;
249+ var normalApp = null;
250+
251+ for (var i = 0; i < 5; i++) {
252+ addApps(1);
253+ var newApp = ApplicationManager.get(0);
254+ tryCompare(phoneStage, "fullscreen", newApp.fullscreen);
255+ if (newApp.fullscreen && fullscreenApp == null) {
256+ fullscreenApp = newApp;
257+ } else if (!newApp.fullscreen && normalApp == null){
258+ normalApp = newApp;
259+ }
260+ }
261+ verify(fullscreenApp != null); // Can't continue the test without having a fullscreen app
262+ verify(normalApp != null); // Can't continue the test without having a non-fullscreen app
263+
264+ // Select a normal app
265+ goToSpread();
266+ phoneStage.select(normalApp.appId);
267+ tryCompare(phoneStage, "fullscreen", false);
268+
269+ // Select a fullscreen app
270+ goToSpread();
271+ phoneStage.select(fullscreenApp.appId);
272+ tryCompare(phoneStage, "fullscreen", true);
273+
274+ // Select a normal app
275+ goToSpread();
276+ phoneStage.select(normalApp.appId);
277+ tryCompare(phoneStage, "fullscreen", false);
278+ }
279+
280+ function cleanup() {
281+ while (ApplicationManager.count > 0) {
282+ var oldCount = ApplicationManager.count;
283+ ApplicationManager.stopApplication(ApplicationManager.get(0).appId)
284+ tryCompare(ApplicationManager, "count", oldCount - 1)
285+ }
286+ }
287+ }
288+}
tests/qmltests/tst_Shell.qml+27−8
@@ -117,6 +117,7 @@ Item {
117117 while (apps.count > 0) {
118118 ApplicationManager.stopApplication(apps.get(0).appId);
119119 }
120+ compare(ApplicationManager.count, 0)
120121 }
121122
122123 /*
@@ -187,26 +188,34 @@ Item {
187188 tapOnAppIconInLauncher();
188189 waitUntilApplicationWindowIsFullyVisible();
189190
190− var mainApp = ApplicationManager.focusedApplicationId;
191− verify(mainApp != "");
191+ var mainAppId = ApplicationManager.focusedApplicationId;
192+ verify(mainAppId != "");
193+ var mainApp = ApplicationManager.findApplication(mainAppId);
194+ verify(mainApp);
195+ tryCompare(mainApp, "state", ApplicationInfo.Running);
192196
193197 // Try to suspend while proximity is engaged...
194198 Powerd.displayPowerStateChange(Powerd.Off, Powerd.UseProximity);
195199 tryCompare(greeter, "showProgress", 0);
196200
197201 // Now really suspend
202+ print("suspending")
198203 Powerd.displayPowerStateChange(Powerd.Off, 0);
204+ print("done suspending")
199205 tryCompare(greeter, "showProgress", 1);
200− tryCompare(ApplicationManager, "focusedApplicationId", "");
206+
207+ tryCompare(ApplicationManager, "suspended", true);
208+ compare(mainApp.state, ApplicationInfo.Suspended);
201209
202210 // And wake up
203211 Powerd.displayPowerStateChange(Powerd.On, 0);
204− tryCompare(ApplicationManager, "focusedApplicationId", "");
205212 tryCompare(greeter, "showProgress", 1);
206213
207214 // Swipe away greeter to focus app
208215 swipeAwayGreeter();
209− tryCompare(ApplicationManager, "focusedApplicationId", mainApp);
216+ tryCompare(ApplicationManager, "suspended", false);
217+ compare(mainApp.state, ApplicationInfo.Running);
218+ tryCompare(ApplicationManager, "focusedApplicationId", mainAppId);
210219 }
211220
212221 function swipeAwayGreeter() {
@@ -239,7 +248,7 @@ Item {
239248 tryCompare(dash, "opacity", 1.0);
240249
241250 touchFlick(shell, touchX, touchY, shell.width * 0.1, touchY,
242− true /* beginTouch */, false /* endTouch */);
251+ true /* beginTouch */, false /* endTouch */, units.gu(10), 50);
243252
244253 // check that Dash has been scaled down and had its opacity reduced
245254 tryCompareFunction(function() { return dash.contentScale <= 0.9; }, true);
@@ -270,7 +279,7 @@ Item {
270279 tryCompare(dash, "opacity", 1.0);
271280
272281 touchFlick(shell, touchX, touchY, shell.width * 0.1, touchY,
273− true /* beginTouch */, false /* endTouch */);
282+ true /* beginTouch */, false /* endTouch */, units.gu(10), 50);
274283
275284 // check that Dash has been scaled down and had its opacity reduced
276285 tryCompareFunction(function() { return dash.contentScale <= 0.9; }, true);
@@ -486,7 +495,6 @@ Item {
486495 }
487496
488497 function test_DashShown(data) {
489−
490498 if (data.greeter) {
491499 // Swipe the greeter in
492500 var greeter = findChild(shell, "greeter");
@@ -546,5 +554,16 @@ Item {
546554
547555 tryCompare(searchIndicator, "opacity", 0);
548556 }
557+
558+ function test_focusRequestedHidesGreeter() {
559+ var greeter = findChild(shell, "greeter")
560+
561+ greeter.show()
562+ tryCompare(greeter, "showProgress", 1)
563+
564+ ApplicationManager.focusRequested("notes-app")
565+ tryCompare(greeter, "showProgress", 0)
566+ waitUntilApplicationWindowIsFullyVisible()
567+ }
549568 }
550569}
tests/uqmlscene/main.cpp+13
@@ -341,6 +341,16 @@ static void loadDummyDataFiles(QQmlEngine &engine, const QString& directory)
341341 }
342342}
343343
344+static QObject *s_testRootObject = nullptr;
345+static QObject *testRootObject(QQmlEngine *engine, QJSEngine *jsEngine)
346+{
347+ Q_UNUSED(jsEngine);
348+ if (!s_testRootObject) {
349+ s_testRootObject = new QObject(engine);
350+ }
351+ return s_testRootObject;
352+}
353+
344354static void usage()
345355{
346356 qWarning("Usage: uqmlscene [options] <filename>");
@@ -470,6 +480,9 @@ int main(int argc, char ** argv)
470480 loadDummyDataFiles(engine, fi.path());
471481 }
472482 QObject::connect(&engine, SIGNAL(quit()), QCoreApplication::instance(), SLOT(quit()));
483+
484+ qmlRegisterSingletonType<QObject>("Qt.test.qtestroot", 1, 0, "QTestRootObject", testRootObject);
485+
473486 component->loadUrl(options.file);
474487 if ( !component->isReady() ) {
475488 qWarning("%s", qPrintable(component->errorString()));
tools/CMakeLists.txt+2
@@ -9,3 +9,5 @@ qt5_use_modules(${SCOPE_TOOL} Qml Quick)
99install(TARGETS ${SCOPE_TOOL}
1010 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
1111 )
12+
13+install(FILES unlock-device DESTINATION ${SHELL_APP_DIR})
tools/scopetool.cpp+1
@@ -86,6 +86,7 @@ int main(int argc, char *argv[])
8686
8787 QUrl source(::qmlDirectory() + "ScopeTool.qml");
8888 prependImportPaths(view->engine(), ::overrideImportPaths());
89+ prependImportPaths(view->engine(), ::nonMirImportPaths());
8990 appendImportPaths(view->engine(), ::fallbackImportPaths());
9091
9192 view->setSource(source);
tools/unlock-devicenew file+42
@@ -0,0 +1,42 @@
1+#!/bin/bash
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+
4+# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
5+# This will include a reboot.
6+
7+WAIT_COMMAND="sleep 20"
8+
9+while getopts s:w: opt; do
10+ case $opt in
11+ s)
12+ export ANDROID_SERIAL=$OPTARG
13+ ;;
14+ w)
15+ WAIT_COMMAND=$OPTARG
16+ ;;
17+ esac
18+done
19+
20+UNLOCK_SCRIPT='
21+import dbus, logging;
22+from unity8 import process_helpers as helpers;
23+logging.basicConfig(level=logging.INFO);
24+bus = dbus.SystemBus().get_object("com.canonical.powerd", "/com/canonical/powerd");
25+cookie = bus.requestSysState("unlock-device-hold", 1, dbus_interface="com.canonical.powerd");
26+helpers.restart_unity_with_testability();
27+bus.clearSysState(cookie, dbus_interface="com.canonical.powerd");
28+helpers.unlock_unity()
29+'
30+
31+adb reboot
32+sleep 5
33+adb "wait-for-device"
34+eval "$WAIT_COMMAND"
35+UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
36+if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
37+ echo "I: Unlock passed"
38+ exit 0
39+else
40+ echo "I: Unlock failed, script output: '$UNLOCK_OUTPUT'"
41+ exit 1
42+fi