on xenial help sign in
merge
2a02f6dMichael Zanetti
CMakeLists.txt+5−5
@@ -48,11 +48,11 @@ add_custom_target(cppcheck COMMAND cppcheck --enable=all -q --error-exitcode=2
48 ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests)
48 ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/tests)
49
49
50include(FindPkgConfig)
50include(FindPkgConfig)
51−find_package(Qt5Core)
51+find_package(Qt5Core 5.2 REQUIRED)
52−find_package(Qt5Qml)
52+find_package(Qt5Qml 5.2 REQUIRED)
53−find_package(Qt5Quick)
53+find_package(Qt5Quick 5.2 REQUIRED)
54−find_package(Qt5Gui)
54+find_package(Qt5Gui 5.2 REQUIRED)
55−find_package(Qt5DBus)
55+find_package(Qt5DBus 5.2 REQUIRED)
56
56
57# Standard install paths
57# Standard install paths
58include(GNUInstallDirs)
58include(GNUInstallDirs)
CODING+11−15
@@ -20,7 +20,7 @@ install dependencies
20If its your first time, install build dependencies
20If its your first time, install build dependencies
21
21
22$ cd ~/unity8/trunk
22$ cd ~/unity8/trunk
23−$ ./build --setup
23+$ ./build.sh --setup
24
24
25 this will:
25 this will:
26 - install the required dependencies to build, as well as run on the desktop
26 - install the required dependencies to build, as well as run on the desktop
@@ -31,7 +31,7 @@ build Unity 8
31-------------
31-------------
32
32
33$ cd ~/unity8/trunk
33$ cd ~/unity8/trunk
34−$ ./build
34+$ ./build.sh
35
35
36You may also rebuild with the -c for clean, which just deletes the build
36You may also rebuild with the -c for clean, which just deletes the build
37directory.
37directory.
@@ -43,10 +43,10 @@ Running Unity 8 on your desktop
43run the Unity 8 shell
43run the Unity 8 shell
44---------------------
44---------------------
45$ cd ~/unity8/trunk
45$ cd ~/unity8/trunk
46−$ ./run
46+$ ./run.sh
47
47
48Options can be passed to test the lock screen
48Options can be passed to test the lock screen
49−$ ./run -p OR -k
49+$ ./run.sh -p OR -k
50
50
51-p is for pin lock, for which the default prompt answer is "1234"
51-p is for pin lock, for which the default prompt answer is "1234"
52-k is for keylock passphrase, for which the default prompt answer is "password"
52-k is for keylock passphrase, for which the default prompt answer is "password"
@@ -78,19 +78,19 @@ Running Unity 8 on devices
78 on the device yourself)
78 on the device yourself)
79
79
80$ cd ~/unity/trunk
80$ cd ~/unity/trunk
81−$ ./run_on_device --setup
81+$ ./run_on_device.sh --setup
82 this will:
82 this will:
83 - install your public SSH key on the device
83 - install your public SSH key on the device
84 - install the needed dependencies
84 - install the needed dependencies
85
85
86−$ ./run_on_device
86+$ ./run_on_device.sh
87 this will:
87 this will:
88 - rsync the code to the device
88 - rsync the code to the device
89 - build on the device
89 - build on the device
90 - replace the running shell
90 - replace the running shell
91
91
92Options can be passed to test the lock screen
92Options can be passed to test the lock screen
93−$ ./run_on_device -p OR -k
93+$ ./run_on_device.sh -p OR -k
94
94
95-p is for pin lock, for which the default prompt answer is "1234"
95-p is for pin lock, for which the default prompt answer is "1234"
96-k is for keylock passphrase, for which the default prompt answer is "password"
96-k is for keylock passphrase, for which the default prompt answer is "password"
@@ -107,9 +107,9 @@ Notes
107- exporting ANDROID_SERIAL=$your_device_serial or
107- exporting ANDROID_SERIAL=$your_device_serial or
108 ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
108 ANDROID_SERIAL=$your_device_ip:5555 will make adb not complain about
109 multiple devices
109 multiple devices
110−- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device
110+- you can export TARGET_IP=$your_device_ip TARGET_SSH_PORT=22 for run_on_device.sh
111 to not use adb forwarding - useful if you use multiple devices
111 to not use adb forwarding - useful if you use multiple devices
112−- using Ninja (package ninja-build - run_on_device -s installs this now)
112+- using Ninja (package ninja-build - run_on_device.sh -s installs this now)
113 will improve build times (especially in the nothing-to-build case)
113 will improve build times (especially in the nothing-to-build case)
114
114
115
115
@@ -131,7 +131,7 @@ Running tests
131=============
131=============
132
132
133Tests are run from the build directory (which will be ./builddir if you used
133Tests are run from the build directory (which will be ./builddir if you used
134−the ./build script).
134+the ./build.sh script).
135
135
136To run the tests that do not require any graphical capability and therefore
136To run the tests that do not require any graphical capability and therefore
137are pretty fast run:
137are pretty fast run:
@@ -167,15 +167,11 @@ NB: Manual test or interation doesn't make sense for all components or classes,
167particularly the non-graphical ones. In such cases no "tryFoo" make target is
167particularly the non-graphical ones. In such cases no "tryFoo" make target is
168provided.
168provided.
169
169
170−NB: The tests expect the locale to be the C locale, they may fail if run
171−under a different locale, if you get failures others can not reproduce
172−prepend 'LC_ALL=C' to the 'make test' command
173−
174Running autopilot tests
170Running autopilot tests
175=======================
171=======================
176
172
177Autopilot tests are run from the build directory (which will be ./builddir if you used
173Autopilot tests are run from the build directory (which will be ./builddir if you used
178−the ./build script).
174+the ./build.sh script).
179
175
180$ make autopilot
176$ make autopilot
181
177
build → build.shrenamed+1−2
@@ -43,13 +43,12 @@ install_dependencies() {
43 gsettings-desktop-schemas \
43 gsettings-desktop-schemas \
44 gsettings-ubuntu-schemas \
44 gsettings-ubuntu-schemas \
45 qmenumodel-qml \
45 qmenumodel-qml \
46− qtdeclarative5-dee-plugin \
46+ qml-module-qtquick-xmllistmodel \
47 qtdeclarative5-gsettings1.0 \
47 qtdeclarative5-gsettings1.0 \
48 qtdeclarative5-ubuntu-ui-toolkit-plugin \
48 qtdeclarative5-ubuntu-ui-toolkit-plugin \
49 qtdeclarative5-ubuntu-settings-components \
49 qtdeclarative5-ubuntu-settings-components \
50 qtdeclarative5-ubuntu-thumbnailer0.1 \
50 qtdeclarative5-ubuntu-thumbnailer0.1 \
51 unity-notifications-impl \
51 unity-notifications-impl \
52− qtdeclarative5-xmllistmodel-plugin \
53 ubuntu-mobile-icons \
52 ubuntu-mobile-icons \
54 unity-scope-home \
53 unity-scope-home \
55 unity-lens-applications \
54 unity-lens-applications \
cmake/modules/QmlTest.cmake+16−3
@@ -58,7 +58,15 @@ macro(add_manual_qml_test SUBPATH COMPONENT_NAME)
58
58
59endmacro(add_manual_qml_test)
59endmacro(add_manual_qml_test)
60
60
61+macro(add_qml_benchmark SUBPATH COMPONENT_NAME ITERATIONS)
62+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} ${ITERATIONS} ${ARGN})
63+endmacro(add_qml_benchmark)
64+
61macro(add_qml_test SUBPATH COMPONENT_NAME)
65macro(add_qml_test SUBPATH COMPONENT_NAME)
66+ add_qml_test_internal(${SUBPATH} ${COMPONENT_NAME} 0 ${ARGN})
67+endmacro(add_qml_test)
68+
69+macro(add_qml_test_internal SUBPATH COMPONENT_NAME ITERATIONS)
62 set(options NO_ADD_TEST NO_TARGETS)
70 set(options NO_ADD_TEST NO_TARGETS)
63 set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
71 set(multi_value_keywords IMPORT_PATHS TARGETS PROPERTIES ENVIRONMENT)
64
72
@@ -88,10 +96,17 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
88 set(function_ARGS "")
96 set(function_ARGS "")
89 endif()
97 endif()
90
98
99+ if (${ITERATIONS} GREATER 0)
100+ set(ITERATIONS_STRING "-iterations" ${ITERATIONS})
101+ else()
102+ set(ITERATIONS_STRING "")
103+ endif()
104+
91 set(qmltest_command
105 set(qmltest_command
92 env ${qmltest_ENVIRONMENT}
106 env ${qmltest_ENVIRONMENT}
93 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
107 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
94 ${qmltestrunner_imports}
108 ${qmltestrunner_imports}
109+ ${ITERATIONS_STRING}
95 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
110 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
96 -o -,txt
111 -o -,txt
97 ${function_ARGS}
112 ${function_ARGS}
@@ -114,7 +129,7 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
114 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
129 add_qmltest_target(${qmltest_TARGET} "${qmltest_command}" TRUE ${qmltest_NO_ADD_TEST})
115 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
130 add_qmltest_target(${qmltest_xvfb_TARGET} "${qmltest_xvfb_command}" ${qmltest_NO_TARGETS} TRUE)
116 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
131 add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
117−endmacro(add_qml_test)
132+endmacro(add_qml_test_internal)
118
133
119macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
134macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
120 set(testCommand
135 set(testCommand
@@ -141,8 +156,6 @@ macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
141
156
142 add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
157 add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
143 add_dependencies(qmluitests xvfbtest${CLASS_NAME})
158 add_dependencies(qmluitests xvfbtest${CLASS_NAME})
144−
145− add_manual_qml_test(. ${CLASS_NAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
146endmacro(add_binary_qml_test)
159endmacro(add_binary_qml_test)
147
160
148macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
161macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
data/CMakeLists.txt+1−2
@@ -1,8 +1,7 @@
1# generate desktop file
1# generate desktop file
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3−configure_file(${SCOPE_TOOL}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop @ONLY)
4
3
5# install desktop files
4# install desktop files
6−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop ${CMAKE_CURRENT_BINARY_DIR}/${SCOPE_TOOL}.desktop
5+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
7 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
6 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
8 )
7 )
data/unity-scope-tool.desktop.indeleted−8
@@ -1,8 +0,0 @@
1−[Desktop Entry]
2−Type=Application
3−Name=Unity Scope Tool
4−Comment=Developer tool for Unity scopes.
5−Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity-scope-tool
6−Terminal=false
7−Icon=unity-scope-tool
8−X-Ubuntu-Touch=true
data/unity8.conf+10−1
@@ -1,7 +1,7 @@
1description "Unity Shell v8"
1description "Unity Shell v8"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
3
3
4−emits scope-ui-starting
4+emits scope-ui-starting indicator-services-start
5
5
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
7stop on desktop-end
7stop on desktop-end
@@ -12,6 +12,9 @@ respawn
12expect stop
12expect stop
13
13
14pre-start script
14pre-start script
15+ # Tell unity-mir to raise SIGSTOP after we start
16+ initctl set-env UNITY_MIR_EMITS_SIGSTOP=1
17+
15 if [ -n "$MIR_SOCKET" ]; then
18 if [ -n "$MIR_SOCKET" ]; then
16 if [ -z "$UNITY_MIR_SOCKET" ]; then
19 if [ -z "$UNITY_MIR_SOCKET" ]; then
17 # Save original value of MIR_SOCKET in case we are restarted,
20 # Save original value of MIR_SOCKET in case we are restarted,
@@ -42,6 +45,12 @@ pre-start script
42 fi
45 fi
43
46
44 initctl emit scope-ui-starting
47 initctl emit scope-ui-starting
48+ initctl emit --no-wait indicator-services-start
45end script
49end script
46
50
47exec ${BINARY:-unity8} $ARGS
51exec ${BINARY:-unity8} $ARGS
52+
53+post-stop script
54+ initctl set-env --global MIR_SOCKET=$UNITY_MIR_SOCKET
55+ initctl unset-env --global UNITY_MIR_SOCKET
56+end script
debian/changelog+209−3
@@ -1,8 +1,214 @@
1−unity8 (7.86) trusty; urgency=medium
1+unity8 (7.86+14.10.20140507.3-0ubuntu1) utopic; urgency=low
2
2
3− * humppaaa
3+ [ Michał Sawicz ]
4+ * Remove HUD from the bottom edge. Again.
5+
6+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 07 May 2014 11:14:30 +0000
7+
8+unity8 (7.86+14.10.20140505-0ubuntu1) utopic; urgency=low
9+
10+ [ Ted Gould ]
11+ * Provide a dbus interface for setting the count and countVisible
12+ properties. (LP: #1301400)
13+
14+ [ Michał Sawicz ]
15+ * Pass env variables to initctl start.
16+ * Suffix .sh to our scripts and clean up debian/rules.
17+ * Adapt to Debian Qt package renames and drop unneeded Dee plugin
18+ dependency.
19+
20+ [ Ying-Chun Liu ]
21+ * Add Zoomable Image for Preview widgets.
22+
23+ [ Albert Astals ]
24+ * Remove support for Qt <= 5.2.1
25+
26+ [ Mirco Müller ]
27+ * Implemented feature-request from Design for modal snap-decision
28+ notifications on the phone. See LP #1285712 (LP: #1285712)
29+
30+ [ Andrea Cimitan ]
31+ * Make progressbas in preview widget big as the button
32+
33+ [ CI bot ]
34+ * Resync trunk
35+
36+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 05 May 2014 12:09:43 +0000
37+
38+unity8 (7.86+14.10.20140502.6-0ubuntu1) utopic; urgency=low
39+
40+ [ tpeeters ]
41+ * Adapt to new TabBar
42+
43+ [ Tim Peeters ]
44+ * Adapt to new TabBar
45+
46+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 02 May 2014 16:44:52 +0000
47+
48+unity8 (7.86+14.10.20140429.2-0ubuntu1) utopic; urgency=medium
49+
50+ [ Andrea Cimitan ]
51+ * Update upstart job to reflect latest unity-mir changes
52+ * Fix locale in qml tests and fixtimeformattertest (LP: #1301038)
53+ * Fix 1309135 (LP: #1309135)
54+
55+ [ Michał Sawicz ]
56+ * Split out unity8-common package
57+ * Don't wait for indicator services to start, and drop Scope Tool's
58+ .desktop file. (LP: #1310172)
59+
60+ [ Michael Terry ]
61+ * Stop clock from hiding when the 'show dash' button is pressed in
62+ greeter. (LP: #1308139)
63+ * Make swipe teases in the greeter more helpful and obvious (LP:
64+ #1267623)
65+
66+ [ Nick Dedekind ]
67+ * Fixed datetime indicator appointment colour (LP: #1307048)
68+
69+ [ Albert Astals ]
70+ * Improve Card creation time by adding loaders that make sure only
71+ what's needed is loaded (LP: #1297197)
72+ * CategoryDelegateRange: Fix condition for detecting overshooting
73+ * Make xvfbtests work in the DashView plugins
74+ * Fix binding loop in FilterGrid height
75+
76+ [ Victor R. Ruiz ]
77+ * Move autopilot notification code to a helper method.
78+
79+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Apr 2014 15:21:33 +0000
80+
81+unity8 (7.85+14.04.20140416-0ubuntu1) trusty; urgency=low
82+
83+ [ Albert Astals ]
84+ * Fix last item X position Fixes clicking on the last item sometimes
85+ not working (LP: #1301871)
86+ * Use upstart in ./run Makes it so that you can use the lock button on
87+ the device without getting that nasty hwc crash
88+ * Remove AnimationControllerWithSignals.
89+ * Use the correct delegate base item for the Carousel test
90+ * Some simplification in DashContent Kill the ScopeDelegateMapper in
91+ favour of a simple if (that will eventually go away). Removal of all
92+ the fake scopes in the tests that added nothing of value to the
93+ tests. Removal of movementEnded signal that was unused. Removal of
94+ movementStarted and positionedAtBeginning signals that were being
95+ used as function calls. Rework DashContent tests so they what the
96+ function does what it is supposed to do instead of just making sure
97+ QML signals work .
98+ * Improve Card creation time by adding loaders that make sure only
99+ what's needed is loaded In my computer it goes from RESULT :
100+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
101+ l": 3.217 msecs per iteration (total: 3,218, iterations: 1000)
102+ RESULT :
103+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
104+ 1.647 msecs per iteration (total: 1,648, iterations: 1000) RESULT :
105+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.514
106+ msecs per iteration (total: 1,515, iterations: 1000) RESULT :
107+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.471 msecs per
108+ iteration (total: 1,471, iterations: 1000) RESULT :
109+ qmltestrunner::benchmark_time:"cardArtModel": 1.447 msecs per
110+ iteration (total: 1,448, iterations: 1000) RESULT :
111+ qmltestrunner::benchmark_time:"cardTitleModel": 1.276 msecs per
112+ iteration (total: 1,276, iterations: 1000) to RESULT :
113+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotSummaryMode
114+ l": 2.916 msecs per iteration (total: 2,917, iterations: 1000)
115+ RESULT :
116+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleMascotModel":
117+ 1.504 msecs per iteration (total: 1,504, iterations: 1000) RESULT :
118+ qmltestrunner::benchmark_time:"cardTitleArtSubtitleModel": 1.060
119+ msecs per iteration (total: 1,061, iterations: 1000) RESULT :
120+ qmltestrunner::benchmark_time:"cardTitleArtModel": 1.052 msecs per
121+ iteration (total: 1,053, iterations: 1000) RESULT :
122+ qmltestrunner::benchmark_time:"cardArtModel": 0.727 msecs per
123+ iteration (total: 728, iterations: 1000) RESULT :
124+ qmltestrunner::benchmark_time:"cardTitleModel": 0.817 msecs per
125+ iteration (total: 818, iterations: 1000) (LP: #1297197)
126+
127+ [ Allan LeSage ]
128+ * DashApps emulator get_applications should return a list ordered by
129+ visible y, x.
130+
131+ [ Andrea Cimitan ]
132+ * Workaround for lp1301309 until fixes for palette in ui toolkit (LP:
133+ #1301309)
134+
135+ [ Leo Arias ]
136+ * Reverted the change that returns application cards instead of
137+ titles.
138+
139+ [ Nick Dedekind ]
140+ * Indicator services started by unity8 upstart configuration rather
141+ than manual emmision from indicator manager.
142+
143+ [ Mirco Müller ]
144+ * Fix notification ap-test assertions.
145+
146+ [ Michael Terry ]
147+ * Use new tablet and phone backgrounds from Design.
148+
149+ [ Michael Zanetti ]
150+ * workaround the QTestLogger assertion issue with make tryXyz and our
151+ custom uqmlscene
152+
153+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 16 Apr 2014 13:45:01 +0000
154+
155+unity8 (7.85+14.04.20140415.2-0ubuntu1) trusty; urgency=low
156+
157+ [ Michael Terry ]
158+ * When an application requests focus, handle it in Shell.qml by hiding
159+ the greeter and stopping any edge demo. (LP: #1227753)
160+
161+ [ Leo Arias ]
162+ * Use subprocess.check_call when caling url-dispatcher, so an error
163+ will be raised if it fails.
164+ * Test application life cycle with fake apps, instead of messaging and
165+ address book.
166+
167+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 15 Apr 2014 12:47:11 +0000
168+
169+unity8 (7.85+14.04.20140410.1-0ubuntu1) trusty; urgency=medium
170+
171+ [ Didier Roche ]
172+ * Resync trunk with previous revert upload
173+
174+ [ Michał Sawicz ]
175+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
176+ lp:1291575 (LP: #1291575)
177+
178+ [ Albert Astals ]
179+ * Take into account the originY when specifying the delegate ranges
180+ Fixes bug #1300302 (LP: #1300302)
181+
182+ [ CI bot ]
183+ * Resync trunk
184+
185+ [ Allan LeSage ]
186+ * Swiping open an indicator must show its correct title--protect
187+ against lp:1253804 . (LP: #1253804)
188+
189+ [ Alexander Sack ]
190+ * Fix TypeError: issue seen in system_integration autopilot test on
191+ image 279. (LP: #1303685)
192+
193+ [ Bill Filler ]
194+ * Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
195+ lp:1291575 (LP: #1291575)
196+
197+ [ Leo Arias ]
198+ * Added a search autopilot helper.
199+
200+ [ Michael Terry ]
201+ * Provide a all-in-one script for getting a device to an unlocked
202+ state.
203+
204+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 10 Apr 2014 10:03:31 +0000
205+
206+unity8 (7.85+14.04.20140404.is.7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=medium
207+
208+ * Revert to previous version as it's linked to latest sdk change which
209+ is making gallery-app AP tests failing on the CI dashboard
4
210
5− -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 10 Apr 2014 15:19:28 +0200
211+ -- Didier Roche <didrocks@ubuntu.com> Tue, 08 Apr 2014 13:53:47 +0200
6
212
7unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
213unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
8
214
debian/control+41−33
@@ -11,37 +11,34 @@ Build-Depends: cmake,
11 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
11 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
12 libgl1-mesa-dri,
12 libgl1-mesa-dri,
13 libgles2-mesa-dev[armhf],
13 libgles2-mesa-dev[armhf],
14+ libglib2.0-dev,
14 libgsettings-qt-dev,
15 libgsettings-qt-dev,
15 libhud-client2-dev,
16 libhud-client2-dev,
16− libnih-dbus-dev,
17− libnih-dev,
18 libpulse-dev,
17 libpulse-dev,
19 libqmenumodel-dev (>= 0.2.7),
18 libqmenumodel-dev (>= 0.2.7),
19+ libqt5xmlpatterns5-dev,
20 libunity-api-dev (>= 7.80.6),
20 libunity-api-dev (>= 7.80.6),
21 libunity-mir-dev,
21 libunity-mir-dev,
22− libupstart-dev,
23 libusermetricsoutput1-dev,
22 libusermetricsoutput1-dev,
24 libxcb1-dev,
23 libxcb1-dev,
25− libglib2.0-dev,
26 pkg-config,
24 pkg-config,
27− python:any (>= 2.7),
28 python-setuptools,
25 python-setuptools,
29 python3-all:any,
26 python3-all:any,
30 python3-setuptools,
27 python3-setuptools,
28+ python:any (>= 2.7),
29+ qml-module-qtquick-xmllistmodel,
30+ qml-module-qtquick2,
31+ qml-module-qttest,
31 qt5-default,
32 qt5-default,
32− qtbase5-dev,
33+ qtbase5-dev (>= 5.2.1),
33 qtbase5-dev-tools,
34 qtbase5-dev-tools,
34− qtbase5-private-dev,
35+ qtbase5-private-dev (>= 5.2.1),
35− qtdeclarative5-dev,
36+ qtdeclarative5-dev (>= 5.2.1),
36 qtdeclarative5-dev-tools,
37 qtdeclarative5-dev-tools,
38+ qtdeclarative5-private-dev (>= 5.2.1),
37 qtdeclarative5-qtmultimedia-plugin,
39 qtdeclarative5-qtmultimedia-plugin,
38− qtdeclarative5-private-dev,
39− qtdeclarative5-qtquick2-plugin,
40− qtdeclarative5-test-plugin,
41 qtdeclarative5-ubuntu-settings-components,
40 qtdeclarative5-ubuntu-settings-components,
42 qtdeclarative5-ubuntu-ui-toolkit-plugin,
41 qtdeclarative5-ubuntu-ui-toolkit-plugin,
43− qtdeclarative5-xmllistmodel-plugin,
44− libqt5xmlpatterns5-dev,
45 ttf-ubuntu-font-family,
42 ttf-ubuntu-font-family,
46Standards-Version: 3.9.4
43Standards-Version: 3.9.4
47Homepage: http://launchpad.net/unity
44Homepage: http://launchpad.net/unity
@@ -63,7 +60,8 @@ Description: Indicators client test application
63
60
64Package: unity-scope-tool
61Package: unity-scope-tool
65Architecture: any
62Architecture: any
63+Depends: unity8-common (= ${source:Version}),
66−Depends: unity8 (= ${binary:Version}),
64+ unity8-private (= ${binary:Version}),
67 ${misc:Depends},
65 ${misc:Depends},
68 ${shlibs:Depends},
66 ${shlibs:Depends},
69Description: Development tool for Unity scopes
67Description: Development tool for Unity scopes
@@ -74,27 +72,17 @@ Package: unity8
74Architecture: any
72Architecture: any
75Provides: indicator-renderer,
73Provides: indicator-renderer,
76Depends: gsettings-desktop-schemas,
74Depends: gsettings-desktop-schemas,
75+ libcap2-bin,
77 libglib2.0-bin,
76 libglib2.0-bin,
78− libunity-mir1,
77+ libunity-mir1 (>= 0.4),
79 qmenumodel-qml (>= 0.2.7),
78 qmenumodel-qml (>= 0.2.7),
80− qtdeclarative5-dee-plugin,
79+ qml-module-qtquick-xmllistmodel,
81 qtdeclarative5-gsettings1.0,
80 qtdeclarative5-gsettings1.0,
82 qtdeclarative5-ubuntu-settings-components,
81 qtdeclarative5-ubuntu-settings-components,
83− qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
84− ubuntu-thumbnailer-impl-0,
85− qtdeclarative5-ubuntu-ui-toolkit-plugin,
86− qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
87− qtdeclarative5-xmllistmodel-plugin,
88− unity-application-impl-2,
89 unity-launcher-impl-3,
82 unity-launcher-impl-3,
90− unity-notifications-impl-2,
83+ unity8-common (= ${source:Version}),
91− unity8-fake-env | unity-application-impl,
92 unity8-private (= ${binary:Version}),
84 unity8-private (= ${binary:Version}),
93 unity8-private | unity-launcher-impl,
85 unity8-private | unity-launcher-impl,
94− unity-plugin-scopes | unity-scopes-impl,
95− unity-scopes-impl-0,
96−# for setcap:
97− libcap2-bin,
98 ${misc:Depends},
86 ${misc:Depends},
99 ${shlibs:Depends},
87 ${shlibs:Depends},
100Recommends: unity-scope-click,
88Recommends: unity-scope-click,
@@ -102,10 +90,30 @@ Recommends: unity-scope-click,
102 unity-scope-scopes,
90 unity-scope-scopes,
103Breaks: indicator-network (<< 0.5.1),
91Breaks: indicator-network (<< 0.5.1),
104 ubuntu-touch-session (<< 0.107),
92 ubuntu-touch-session (<< 0.107),
105−Replaces: ubuntu-touch-session (<< 0.82~)
93+Replaces: ubuntu-touch-session (<< 0.82~),
106Description: Unity 8 shell
94Description: Unity 8 shell
107 The Unity 8 shell is the primary user interface for Ubuntu devices.
95 The Unity 8 shell is the primary user interface for Ubuntu devices.
108
96
97+Package: unity8-common
98+Architecture: all
99+Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
100+ qtdeclarative5-ubuntu-ui-toolkit-plugin,
101+ qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
102+ ubuntu-thumbnailer-impl-0,
103+ unity-application-impl-2,
104+ unity-notifications-impl-3,
105+ unity-plugin-scopes | unity-scopes-impl,
106+ unity-scopes-impl-0,
107+ unity8-fake-env | unity-application-impl,
108+ ${misc:Depends},
109+Breaks: unity8 (<< 7.86),
110+Replaces: unity8 (<< 7.86),
111+Description: Unity 8 shell (common files)
112+ The Unity 8 shell is the primary user interface for Ubuntu devices.
113+ .
114+ This package contains the QML, graphics and locale files shared between
115+ unity8 and unity-scope-tool.
116+
109Package: unity8-autopilot
117Package: unity8-autopilot
110Architecture: all
118Architecture: all
111Depends: gir1.2-glib-2.0,
119Depends: gir1.2-glib-2.0,
@@ -122,12 +130,12 @@ Depends: gir1.2-glib-2.0,
122 python3-fixtures,
130 python3-fixtures,
123 python3-gi,
131 python3-gi,
124 ubuntu-ui-toolkit-autopilot,
132 ubuntu-ui-toolkit-autopilot,
125− unity8 (>= ${source:Version}),
133+ unity8 (= ${source:Version}),
126− unity8-fake-env (>= ${source:Version}),
134+ unity8-fake-env (= ${source:Version}),
127 url-dispatcher-tools,
135 url-dispatcher-tools,
128 ${misc:Depends},
136 ${misc:Depends},
129− ${python:Depends},
130 ${python3:Depends},
137 ${python3:Depends},
138+ ${python:Depends},
131 ${shlibs:Depends},
139 ${shlibs:Depends},
132Description: Test package for Unity 8 shell
140Description: Test package for Unity 8 shell
133 Autopilot tests for the unity8 package
141 Autopilot tests for the unity8 package
@@ -149,9 +157,9 @@ Architecture: any
149Multi-Arch: same
157Multi-Arch: same
150Pre-Depends: ${misc:Pre-Depends},
158Pre-Depends: ${misc:Pre-Depends},
151Depends: gsettings-ubuntu-schemas,
159Depends: gsettings-ubuntu-schemas,
160+ libunity-core-6.0-9,
152 ${misc:Depends},
161 ${misc:Depends},
153 ${shlibs:Depends},
162 ${shlibs:Depends},
154− libunity-core-6.0-9,
155Provides: unity-launcher-impl,
163Provides: unity-launcher-impl,
156 unity-launcher-impl-3,
164 unity-launcher-impl-3,
157Description: Unity 8 private libs
165Description: Unity 8 private libs
debian/rules+1−2
@@ -6,8 +6,7 @@
6export DPKG_GENSYMBOLS_CHECK_LEVEL=4
6export DPKG_GENSYMBOLS_CHECK_LEVEL=4
7export NO_PNG_PKG_MANGLE=1
7export NO_PNG_PKG_MANGLE=1
8
8
9−.PHONY: build
10−build %:
9+%:
11 dh $@ --parallel --fail-missing --with python2,python3
10 dh $@ --parallel --fail-missing --with python2,python3
12
11
13override_dh_auto_clean:
12override_dh_auto_clean:
debian/unity-scope-tool.install−1
@@ -1,3 +1,2 @@
1usr/bin/unity-scope-tool
1usr/bin/unity-scope-tool
2−usr/share/applications/unity-scope-tool.desktop
3usr/share/unity8/ScopeTool.qml
2usr/share/unity8/ScopeTool.qml
debian/unity8-autopilot.install+1
@@ -1 +1,2 @@
1usr/lib/python*/*/unity*
1usr/lib/python*/*/unity*
2+usr/share/unity8/unlock-device
debian/unity8-common.installnew file+5
@@ -0,0 +1,5 @@
1+usr/share/locale
2+usr/share/unity8/Components
3+usr/share/unity8/Dash
4+usr/share/unity8/Notifications
5+usr/share/unity8/graphics
debian/unity8-fake-env.install+1−1
@@ -1,4 +1,4 @@
1−usr/lib/*/unity8/qml/nonmirplugins
2usr/lib/*/unity8/qml/mocks
1usr/lib/*/unity8/qml/mocks
2+usr/lib/*/unity8/qml/nonmirplugins
3usr/lib/*/unity8/qml/scopefakes
3usr/lib/*/unity8/qml/scopefakes
4usr/share/unity8/mocks
4usr/share/unity8/mocks
debian/unity8-private.install+1−1
@@ -1,7 +1,7 @@
1usr/lib/*/unity8/qml/AccountsService
1usr/lib/*/unity8/qml/AccountsService
2+usr/lib/*/unity8/qml/DashViews
2usr/lib/*/unity8/qml/HudClient
3usr/lib/*/unity8/qml/HudClient
3usr/lib/*/unity8/qml/LightDM
4usr/lib/*/unity8/qml/LightDM
4−usr/lib/*/unity8/qml/DashViews
5usr/lib/*/unity8/qml/Powerd
5usr/lib/*/unity8/qml/Powerd
6usr/lib/*/unity8/qml/SessionBroadcast
6usr/lib/*/unity8/qml/SessionBroadcast
7usr/lib/*/unity8/qml/Ubuntu
7usr/lib/*/unity8/qml/Ubuntu
debian/unity8.install+1−7
@@ -1,15 +1,9 @@
1+data/unity8.conf usr/share/upstart/sessions/
1usr/bin/unity8
2usr/bin/unity8
2usr/share/applications/unity8.desktop
3usr/share/applications/unity8.desktop
3−usr/share/locale
4−usr/share/unity8/Bottombar
5−usr/share/unity8/Components
6−usr/share/unity8/Dash
7usr/share/unity8/Greeter
4usr/share/unity8/Greeter
8usr/share/unity8/Hud
5usr/share/unity8/Hud
9usr/share/unity8/Launcher
6usr/share/unity8/Launcher
10−usr/share/unity8/Notifications
11usr/share/unity8/Panel
7usr/share/unity8/Panel
12usr/share/unity8/Shell.qml
8usr/share/unity8/Shell.qml
13usr/share/unity8/Stages
9usr/share/unity8/Stages
14−usr/share/unity8/graphics
15−data/unity8.conf usr/share/upstart/sessions/
plugins/DashViews/abstractdashview.cpp−34
@@ -46,17 +46,10 @@ void AbstractDashView::setModel(QAbstractItemModel *model)
46 if (!m_delegateModel) {
46 if (!m_delegateModel) {
47 createDelegateModel();
47 createDelegateModel();
48 } else {
48 } else {
49−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
50− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
51− }
52− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
53− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
54−#else
55 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
49 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
56 }
50 }
57 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
51 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
58 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
52 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
59−#endif
60
53
61 cleanupExistingItems();
54 cleanupExistingItems();
62
55
@@ -181,13 +174,8 @@ void AbstractDashView::resetDelegateCreationEnd()
181
174
182void AbstractDashView::createDelegateModel()
175void AbstractDashView::createDelegateModel()
183{
176{
184−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
185− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
186− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
187−#else
188 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
177 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
189 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
178 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
190−#endif
191 if (isComponentComplete())
179 if (isComponentComplete())
192 m_delegateModel->componentComplete();
180 m_delegateModel->componentComplete();
193}
181}
@@ -253,16 +241,9 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
253 return nullptr;
241 return nullptr;
254
242
255 m_asyncRequestedIndex = -1;
243 m_asyncRequestedIndex = -1;
256−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
257− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
258−#else
259 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
244 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
260 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
245 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
261−#endif
262 if (!item) {
246 if (!item) {
263−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
264− m_asyncRequestedIndex = modelIndex;
265−#else
266 if (object) {
247 if (object) {
267 m_delegateModel->release(object);
248 m_delegateModel->release(object);
268 if (!m_delegateValidated) {
249 if (!m_delegateValidated) {
@@ -273,7 +254,6 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
273 } else {
254 } else {
274 m_asyncRequestedIndex = modelIndex;
255 m_asyncRequestedIndex = modelIndex;
275 }
256 }
276−#endif
277 return nullptr;
257 return nullptr;
278 } else {
258 } else {
279 addItemToView(modelIndex, item);
259 addItemToView(modelIndex, item);
@@ -283,13 +263,8 @@ QQuickItem *AbstractDashView::createItem(int modelIndex, bool asynchronous)
283
263
284void AbstractDashView::releaseItem(QQuickItem *item)
264void AbstractDashView::releaseItem(QQuickItem *item)
285{
265{
286−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
287− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
288− if (flags & QQuickVisualModel::Destroyed) {
289−#else
290 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
266 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
291 if (flags & QQmlDelegateModel::Destroyed) {
267 if (flags & QQmlDelegateModel::Destroyed) {
292−#endif
293 item->setParentItem(nullptr);
268 item->setParentItem(nullptr);
294 }
269 }
295}
270}
@@ -299,10 +274,6 @@ void AbstractDashView::setImplicitHeightDirty()
299 m_implicitHeightDirty = true;
274 m_implicitHeightDirty = true;
300}
275}
301
276
302−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
303−void AbstractDashView::itemCreated(int modelIndex, QQuickItem *item)
304−{
305−#else
306void AbstractDashView::itemCreated(int modelIndex, QObject *object)
277void AbstractDashView::itemCreated(int modelIndex, QObject *object)
307{
278{
308 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
279 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -310,7 +281,6 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
310 qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
281 qWarning() << "AbstractDashView::itemCreated got a non item for index" << modelIndex;
311 return;
282 return;
312 }
283 }
313−#endif
314 item->setParentItem(this);
284 item->setParentItem(this);
315
285
316 // We only need to call createItem if we are here because of an asynchronous generation
286 // We only need to call createItem if we are here because of an asynchronous generation
@@ -325,11 +295,7 @@ void AbstractDashView::itemCreated(int modelIndex, QObject *object)
325 }
295 }
326}
296}
327
297
328−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
329−void AbstractDashView::onModelUpdated(const QQuickChangeSet &changeSet, bool reset)
330−#else
331void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
298void AbstractDashView::onModelUpdated(const QQmlChangeSet &changeSet, bool reset)
332−#endif
333{
299{
334 if (reset) {
300 if (reset) {
335 cleanupExistingItems();
301 cleanupExistingItems();
plugins/DashViews/abstractdashview.h−17
@@ -23,12 +23,8 @@ class QAbstractItemModel;
23class QQmlComponent;
23class QQmlComponent;
24#pragma GCC diagnostic push
24#pragma GCC diagnostic push
25#pragma GCC diagnostic ignored "-pedantic"
25#pragma GCC diagnostic ignored "-pedantic"
26−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27−#include <private/qquickvisualdatamodel_p.h>
28−#else
29#include <private/qqmldelegatemodel_p.h>
26#include <private/qqmldelegatemodel_p.h>
30#include <qqmlinfo.h>
27#include <qqmlinfo.h>
31−#endif
32#pragma GCC diagnostic pop
28#pragma GCC diagnostic pop
33
29
34class AbstractDashView : public QQuickItem
30class AbstractDashView : public QQuickItem
@@ -94,13 +90,8 @@ protected:
94 void setImplicitHeightDirty();
90 void setImplicitHeightDirty();
95
91
96private Q_SLOTS:
92private Q_SLOTS:
97−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
98− void itemCreated(int modelIndex, QQuickItem *item);
99− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
100−#else
101 void itemCreated(int modelIndex, QObject *object);
93 void itemCreated(int modelIndex, QObject *object);
102 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
94 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
103−#endif
104 void onHeightChanged();
95 void onHeightChanged();
105
96
106private:
97private:
@@ -117,17 +108,9 @@ private:
117 virtual void doRelayout() = 0;
108 virtual void doRelayout() = 0;
118 virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
109 virtual void updateItemCulling(qreal visibleFromY, qreal visibleToY) = 0;
119 virtual void calculateImplicitHeight() = 0;
110 virtual void calculateImplicitHeight() = 0;
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− virtual void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) = 0;
122−#else
123 virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
111 virtual void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) = 0;
124−#endif
125
112
126−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
127− QQuickVisualDataModel *m_delegateModel;
128−#else
129 QQmlDelegateModel *m_delegateModel;
113 QQmlDelegateModel *m_delegateModel;
130−#endif
131
114
132 // Index we are waiting because we requested it asynchronously
115 // Index we are waiting because we requested it asynchronously
133 int m_asyncRequestedIndex;
116 int m_asyncRequestedIndex;
plugins/DashViews/horizontaljournal.cpp−12
@@ -28,12 +28,8 @@
28#include <qqmlengine.h>
28#include <qqmlengine.h>
29#pragma GCC diagnostic push
29#pragma GCC diagnostic push
30#pragma GCC diagnostic ignored "-pedantic"
30#pragma GCC diagnostic ignored "-pedantic"
31−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
32−#include <private/qquickvisualdatamodel_p.h>
33−#else
34#include <private/qqmldelegatemodel_p.h>
31#include <private/qqmldelegatemodel_p.h>
35#include <qqmlinfo.h>
32#include <qqmlinfo.h>
36−#endif
37#include <private/qquickitem_p.h>
33#include <private/qquickitem_p.h>
38#pragma GCC diagnostic pop
34#pragma GCC diagnostic pop
39
35
@@ -188,17 +184,9 @@ void HorizontalJournal::calculateImplicitHeight()
188 }
184 }
189}
185}
190
186
191−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
192−void HorizontalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
193−#else
194void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
187void HorizontalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
195−#endif
196{
188{
197−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
198− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
199−#else
200 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
189 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
201−#endif
202 for (int i = remove.count - 1; i >= 0; --i) {
190 for (int i = remove.count - 1; i >= 0; --i) {
203 const int indexToRemove = remove.index + i;
191 const int indexToRemove = remove.index + i;
204 // We only support removing from the end so
192 // We only support removing from the end so
plugins/DashViews/horizontaljournal.h−4
@@ -52,11 +52,7 @@ private:
52 void calculateImplicitHeight() override;
52 void calculateImplicitHeight() override;
53 void doRelayout() override;
53 void doRelayout() override;
54 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
54 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
55−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
56− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
57−#else
58 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
55 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
59−#endif
60
56
61 int m_firstVisibleIndex;
57 int m_firstVisibleIndex;
62 QList<QQuickItem*> m_visibleItems;
58 QList<QQuickItem*> m_visibleItems;
plugins/DashViews/listviewwithpageheader.cpp−50
@@ -97,11 +97,7 @@
97#include <qqmlengine.h>
97#include <qqmlengine.h>
98#pragma GCC diagnostic push
98#pragma GCC diagnostic push
99#pragma GCC diagnostic ignored "-pedantic"
99#pragma GCC diagnostic ignored "-pedantic"
100−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
101−#include <private/qquickvisualdatamodel_p.h>
102−#else
103#include <private/qqmldelegatemodel_p.h>
100#include <private/qqmldelegatemodel_p.h>
104−#endif
105#include <private/qqmlglobal_p.h>
101#include <private/qqmlglobal_p.h>
106#include <private/qquickitem_p.h>
102#include <private/qquickitem_p.h>
107#include <private/qquickanimation_p.h>
103#include <private/qquickanimation_p.h>
@@ -191,17 +187,10 @@ void ListViewWithPageHeader::setModel(QAbstractItemModel *model)
191 if (!m_delegateModel) {
187 if (!m_delegateModel) {
192 createDelegateModel();
188 createDelegateModel();
193 } else {
189 } else {
194−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
195− disconnect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
196− }
197− m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
198− connect(m_delegateModel, SIGNAL(modelUpdated(QQuickChangeSet,bool)), this, SLOT(onModelUpdated(QQuickChangeSet,bool)));
199−#else
200 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
190 disconnect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
201 }
191 }
202 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
192 m_delegateModel->setModel(QVariant::fromValue<QAbstractItemModel *>(model));
203 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
193 connect(m_delegateModel, SIGNAL(modelUpdated(QQmlChangeSet,bool)), this, SLOT(onModelUpdated(QQmlChangeSet,bool)));
204−#endif
205 Q_EMIT modelChanged();
194 Q_EMIT modelChanged();
206 polish();
195 polish();
207 // TODO?
196 // TODO?
@@ -570,13 +559,8 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
570
559
571void ListViewWithPageHeader::createDelegateModel()
560void ListViewWithPageHeader::createDelegateModel()
572{
561{
573−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
574− m_delegateModel = new QQuickVisualDataModel(qmlContext(this), this);
575− connect(m_delegateModel, SIGNAL(createdItem(int,QQuickItem*)), this, SLOT(itemCreated(int,QQuickItem*)));
576−#else
577 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
562 m_delegateModel = new QQmlDelegateModel(qmlContext(this), this);
578 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
563 connect(m_delegateModel, SIGNAL(createdItem(int,QObject*)), this, SLOT(itemCreated(int,QObject*)));
579−#endif
580 if (isComponentComplete())
564 if (isComponentComplete())
581 m_delegateModel->componentComplete();
565 m_delegateModel->componentComplete();
582 updateWatchedRoles();
566 updateWatchedRoles();
@@ -657,13 +641,8 @@ bool ListViewWithPageHeader::addVisibleItems(qreal fillFrom, qreal fillTo, bool
657void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
641void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
658{
642{
659 QQuickItem *item = listItem->m_item;
643 QQuickItem *item = listItem->m_item;
660−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
661− QQuickVisualModel::ReleaseFlags flags = m_delegateModel->release(item);
662− if (flags & QQuickVisualModel::Destroyed) {
663−#else
664 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
644 QQmlDelegateModel::ReleaseFlags flags = m_delegateModel->release(item);
665 if (flags & QQmlDelegateModel::Destroyed) {
645 if (flags & QQmlDelegateModel::Destroyed) {
666−#endif
667 item->setParentItem(nullptr);
646 item->setParentItem(nullptr);
668 }
647 }
669 delete listItem->m_sectionItem;
648 delete listItem->m_sectionItem;
@@ -796,16 +775,9 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
796 return nullptr;
775 return nullptr;
797
776
798 m_asyncRequestedIndex = -1;
777 m_asyncRequestedIndex = -1;
799−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
800− QQuickItem *item = m_delegateModel->item(modelIndex, asynchronous);
801−#else
802 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
778 QObject* object = m_delegateModel->object(modelIndex, asynchronous);
803 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
779 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
804−#endif
805 if (!item) {
780 if (!item) {
806−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
807− m_asyncRequestedIndex = modelIndex;
808−#else
809 if (object) {
781 if (object) {
810 m_delegateModel->release(object);
782 m_delegateModel->release(object);
811 if (!m_delegateValidated) {
783 if (!m_delegateValidated) {
@@ -816,7 +788,6 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
816 } else {
788 } else {
817 m_asyncRequestedIndex = modelIndex;
789 m_asyncRequestedIndex = modelIndex;
818 }
790 }
819−#endif
820 return 0;
791 return 0;
821 } else {
792 } else {
822// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
793// qDebug() << "ListViewWithPageHeader::createItem::We have the item" << modelIndex << item;
@@ -872,10 +843,6 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
872 }
843 }
873}
844}
874
845
875−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
876−void ListViewWithPageHeader::itemCreated(int modelIndex, QQuickItem *item)
877−{
878−#else
879void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
846void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
880{
847{
881 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
848 QQuickItem *item = qmlobject_cast<QQuickItem*>(object);
@@ -883,7 +850,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
883 qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
850 qWarning() << "ListViewWithPageHeader::itemCreated got a non item for index" << modelIndex;
884 return;
851 return;
885 }
852 }
886−#endif
887// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
853// qDebug() << "ListViewWithPageHeader::itemCreated" << modelIndex << item;
888 // Check we are not being taken down and don't paint anything
854 // Check we are not being taken down and don't paint anything
889 // TODO Check if we still need this in 5.2
855 // TODO Check if we still need this in 5.2
@@ -924,21 +890,13 @@ void ListViewWithPageHeader::onHeightChanged()
924}
890}
925
891
926
892
927−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
928−void ListViewWithPageHeader::onModelUpdated(const QQuickChangeSet &changeSet, bool /*reset*/)
929−#else
930void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
893void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool /*reset*/)
931−#endif
932{
894{
933 // TODO Do something with reset
895 // TODO Do something with reset
934// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
896// qDebug() << "ListViewWithPageHeader::onModelUpdated" << changeSet << reset;
935 const auto oldFirstVisibleIndex = m_firstVisibleIndex;
897 const auto oldFirstVisibleIndex = m_firstVisibleIndex;
936
898
937−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
938− Q_FOREACH(const QQuickChangeSet::Remove &remove, changeSet.removes()) {
939−#else
940 Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
899 Q_FOREACH(const QQmlChangeSet::Remove &remove, changeSet.removes()) {
941−#endif
942// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
900// qDebug() << "ListViewWithPageHeader::onModelUpdated Remove" << remove.index << remove.count;
943 if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
901 if (remove.index + remove.count > m_firstVisibleIndex && remove.index < m_firstVisibleIndex + m_visibleItems.count()) {
944 const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
902 const qreal oldFirstValidIndexPos = m_visibleItems.first()->y();
@@ -992,11 +950,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
992 }
950 }
993 }
951 }
994
952
995−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
996− Q_FOREACH(const QQuickChangeSet::Insert &insert, changeSet.inserts()) {
997−#else
998 Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
953 Q_FOREACH(const QQmlChangeSet::Insert &insert, changeSet.inserts()) {
999−#endif
1000// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
954// qDebug() << "ListViewWithPageHeader::onModelUpdated Insert" << insert.index << insert.count;
1001 const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
955 const bool insertingInValidIndexes = insert.index > m_firstVisibleIndex && insert.index < m_firstVisibleIndex + m_visibleItems.count();
1002 const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
956 const bool firstItemWithViewOnTop = insert.index == 0 && m_firstVisibleIndex == 0 && m_visibleItems.first()->y() + m_clipItem->y() > contentY();
@@ -1054,11 +1008,7 @@ void ListViewWithPageHeader::onModelUpdated(const QQmlChangeSet &changeSet, bool
1054 }
1008 }
1055 }
1009 }
1056
1010
1057−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1058− Q_FOREACH(const QQuickChangeSet::Change &change, changeSet.changes()) {
1059−#else
1060 Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1011 Q_FOREACH(const QQmlChangeSet::Change &change, changeSet.changes()) {
1061−#endif
1062// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
1012// qDebug() << "ListViewWithPageHeader::onModelUpdated Change" << change.index << change.count;
1063 for (int i = change.index; i < change.count; ++i) {
1013 for (int i = change.index; i < change.count; ++i) {
1064 ListItem *item = itemAtIndex(i);
1014 ListItem *item = itemAtIndex(i);
plugins/DashViews/listviewwithpageheader.h−20
@@ -17,21 +17,13 @@
17#ifndef LISTVIEWWITHPAGEHEADER_H
17#ifndef LISTVIEWWITHPAGEHEADER_H
18#define LISTVIEWWITHPAGEHEADER_H
18#define LISTVIEWWITHPAGEHEADER_H
19
19
20−#pragma GCC diagnostic push
21−#pragma GCC diagnostic ignored "-pedantic"
22#include <private/qquickitemchangelistener_p.h>
20#include <private/qquickitemchangelistener_p.h>
23#include <private/qquickflickable_p.h>
21#include <private/qquickflickable_p.h>
24−#pragma GCC diagnostic pop
25
22
26class QAbstractItemModel;
23class QAbstractItemModel;
27class QQuickNumberAnimation;
24class QQuickNumberAnimation;
28−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
29−class QQuickChangeSet;
30−class QQuickVisualDataModel;
31−#else
32class QQmlChangeSet;
25class QQmlChangeSet;
33class QQmlDelegateModel;
26class QQmlDelegateModel;
34−#endif
35
27
36
28
37/**
29/**
@@ -117,19 +109,11 @@ protected:
117 void updatePolish();
109 void updatePolish();
118
110
119private Q_SLOTS:
111private Q_SLOTS:
120−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
121− void itemCreated(int modelIndex, QQuickItem *item);
122−#else
123 void itemCreated(int modelIndex, QObject *object);
112 void itemCreated(int modelIndex, QObject *object);
124−#endif
125 void onContentHeightChanged();
113 void onContentHeightChanged();
126 void onContentWidthChanged();
114 void onContentWidthChanged();
127 void onHeightChanged();
115 void onHeightChanged();
128−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
129− void onModelUpdated(const QQuickChangeSet &changeSet, bool reset);
130−#else
131 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
116 void onModelUpdated(const QQmlChangeSet &changeSet, bool reset);
132−#endif
133 void onShowHeaderAnimationFinished();
117 void onShowHeaderAnimationFinished();
134
118
135private:
119private:
@@ -168,11 +152,7 @@ private:
168 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
152 QQuickItem *getSectionItem(int modelIndex, bool alreadyInserted);
169 QQuickItem *getSectionItem(const QString &sectionText);
153 QQuickItem *getSectionItem(const QString &sectionText);
170
154
171−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
172− QQuickVisualDataModel *m_delegateModel;
173−#else
174 QQmlDelegateModel *m_delegateModel;
155 QQmlDelegateModel *m_delegateModel;
175−#endif
176
156
177 // Index we are waiting because we requested it asynchronously
157 // Index we are waiting because we requested it asynchronously
178 int m_asyncRequestedIndex;
158 int m_asyncRequestedIndex;
plugins/DashViews/organicgrid.cpp−8
@@ -237,17 +237,9 @@ void OrganicGrid::calculateImplicitHeight()
237 }
237 }
238}
238}
239
239
240−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
241−void OrganicGrid::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
242−#else
243void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
240void OrganicGrid::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
244−#endif
245{
241{
246−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
247− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
248−#else
249 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
242 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
250−#endif
251 for (int i = remove.count - 1; i >= 0; --i) {
243 for (int i = remove.count - 1; i >= 0; --i) {
252 const int indexToRemove = remove.index + i;
244 const int indexToRemove = remove.index + i;
253 // We only support removing from the end
245 // We only support removing from the end
plugins/DashViews/organicgrid.h−4
@@ -79,11 +79,7 @@ private:
79 void doRelayout() override;
79 void doRelayout() override;
80 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
80 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
81 void calculateImplicitHeight() override;
81 void calculateImplicitHeight() override;
82−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
83− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
84−#else
85 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
82 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
86−#endif
87
83
88 QSizeF m_smallDelegateSize;
84 QSizeF m_smallDelegateSize;
89 QSizeF m_bigDelegateSize;
85 QSizeF m_bigDelegateSize;
plugins/DashViews/verticaljournal.cpp−8
@@ -239,17 +239,9 @@ void VerticalJournal::updateItemCulling(qreal visibleFromY, qreal visibleToY)
239 }
239 }
240}
240}
241
241
242−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
243−void VerticalJournal::processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes)
244−#else
245void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
242void VerticalJournal::processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes)
246−#endif
247{
243{
248−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
249− Q_FOREACH(const QQuickChangeSet::Remove &remove, removes) {
250−#else
251 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
244 Q_FOREACH(const QQmlChangeSet::Remove &remove, removes) {
252−#endif
253 for (int i = remove.count - 1; i >= 0; --i) {
245 for (int i = remove.count - 1; i >= 0; --i) {
254 const int indexToRemove = remove.index + i;
246 const int indexToRemove = remove.index + i;
255 // Since we only support removing from the end, indexToRemove
247 // Since we only support removing from the end, indexToRemove
plugins/DashViews/verticaljournal.h−4
@@ -90,11 +90,7 @@ private:
90 void calculateImplicitHeight() override;
90 void calculateImplicitHeight() override;
91 void doRelayout() override;
91 void doRelayout() override;
92 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
92 void updateItemCulling(qreal visibleFromY, qreal visibleToY) override;
93−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
94− void processModelRemoves(const QVector<QQuickChangeSet::Remove> &removes) override;
95−#else
96 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
93 void processModelRemoves(const QVector<QQmlChangeSet::Remove> &removes) override;
97−#endif
98
94
99 QVector<QList<ViewItem>> m_columnVisibleItems;
95 QVector<QList<ViewItem>> m_columnVisibleItems;
100 QHash<int, int> m_indexColumnMap;
96 QHash<int, int> m_indexColumnMap;
plugins/Unity/Indicators/CMakeLists.txt−3
@@ -6,7 +6,6 @@ project(IndicatorsQml)
6pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
6pkg_check_modules(GLIB REQUIRED glib-2.0>=2.32)
7pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
7pkg_check_modules(GIO REQUIRED gio-2.0>=2.32)
8pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
8pkg_check_modules(QMENUMODEL REQUIRED qmenumodel)
9−pkg_check_modules(LIBUPSTART REQUIRED libupstart libnih libnih-dbus dbus-1)
10
9
11find_package(Qt5Core REQUIRED)
10find_package(Qt5Core REQUIRED)
12find_package(Qt5Quick REQUIRED)
11find_package(Qt5Quick REQUIRED)
@@ -19,7 +18,6 @@ include_directories(
19 ${GLIB_INCLUDE_DIRS}
18 ${GLIB_INCLUDE_DIRS}
20 ${GIO_INCLUDE_DIRS}
19 ${GIO_INCLUDE_DIRS}
21 ${QMENUMODEL_INCLUDE_DIRS}
20 ${QMENUMODEL_INCLUDE_DIRS}
22− ${LIBUPSTART_INCLUDE_DIRS}
23)
21)
24
22
25set(IndicatorsQML_SOURCES
23set(IndicatorsQML_SOURCES
@@ -54,7 +52,6 @@ target_link_libraries(IndicatorsQml
54 ${GLIB_LIBRARIES}
52 ${GLIB_LIBRARIES}
55 ${GIO_LIBRARIES}
53 ${GIO_LIBRARIES}
56 ${QMENUMODEL_LDFLAGS}
54 ${QMENUMODEL_LDFLAGS}
57− ${LIBUPSTART_LIBRARIES}
58)
55)
59
56
60qt5_use_modules(IndicatorsQml Core Qml Quick)
57qt5_use_modules(IndicatorsQml Core Qml Quick)
plugins/Unity/Indicators/indicatorsmanager.cpp−33
@@ -21,9 +21,6 @@
21#include <QSettings>
21#include <QSettings>
22#include <QDebug>
22#include <QDebug>
23
23
24−#include <upstart.h>
25−#include <nih/alloc.h>
26−
27#include <paths.h>
24#include <paths.h>
28
25
29
26
@@ -216,36 +213,6 @@ void IndicatorsManager::setLoaded(bool loaded)
216 {
213 {
217 m_loaded = loaded;
214 m_loaded = loaded;
218 Q_EMIT loadedChanged(m_loaded);
215 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− }
249 }
216 }
250}
217}
251
218
plugins/Unity/Indicators/indicatorsmanager.h−2
@@ -28,8 +28,6 @@
28#include <QHash>
28#include <QHash>
29#include <QSharedPointer>
29#include <QSharedPointer>
30
30
31−typedef struct nih_dbus_proxy NihDBusProxy;
32−
33class UNITYINDICATORS_EXPORT IndicatorsManager : public QObject
31class UNITYINDICATORS_EXPORT IndicatorsManager : public QObject
34{
32{
35 Q_OBJECT
33 Q_OBJECT
plugins/Unity/Indicators/qml/MenuItemFactory.qml+1−1
@@ -273,7 +273,7 @@ Item {
273 text: menuData && menuData.label || ""
273 text: menuData && menuData.label || ""
274 iconSource: menuData && menuData.icon || "image://theme/calendar"
274 iconSource: menuData && menuData.icon || "image://theme/calendar"
275 time: timeFormatter.timeString
275 time: timeFormatter.timeString
276− eventColor: menu && menu.ext.hasOwnProperty("xCanonicalColor") ? menu.ext.xCanonicalColor : Qt.rgba(0.0, 0.0, 0.0, 0.0)
276+ eventColor: getExtendedProperty(extendedData, "xCanonicalColor", Qt.rgba(0.0, 0.0, 0.0, 0.0))
277 enabled: menuData && menuData.sensitive || false
277 enabled: menuData && menuData.sensitive || false
278
278
279 onMenuModelChanged: {
279 onMenuModelChanged: {
plugins/Unity/Launcher/backend/launcherbackend.cpp+265−15
@@ -33,10 +33,12 @@ class LauncherBackendItem
33public:
33public:
34 QString displayName;
34 QString displayName;
35 QString icon;
35 QString icon;
36+ int count;
37+ bool countVisible;
36};
38};
37
39
38LauncherBackend::LauncherBackend(QObject *parent):
40LauncherBackend::LauncherBackend(QObject *parent):
39− QObject(parent),
41+ QDBusVirtualObject(parent),
40 m_accounts(nullptr)
42 m_accounts(nullptr)
41{
43{
42#ifndef LAUNCHER_TESTING
44#ifndef LAUNCHER_TESTING
@@ -44,10 +46,25 @@ LauncherBackend::LauncherBackend(QObject *parent):
44#endif
46#endif
45 m_user = qgetenv("USER");
47 m_user = qgetenv("USER");
46 syncFromAccounts();
48 syncFromAccounts();
49+
50+ /* Set up ourselves on DBus */
51+ QDBusConnection con = QDBusConnection::sessionBus();
52+ if (!con.registerService("com.canonical.Unity.Launcher")) {
53+ qDebug() << "Unable to register launcher name";
54+ }
55+ if (!con.registerVirtualObject("/com/canonical/Unity/Launcher", this, QDBusConnection::VirtualObjectRegisterOption::SubPath)) {
56+ qDebug() << "Unable to register launcher object";
57+ }
47}
58}
48
59
49LauncherBackend::~LauncherBackend()
60LauncherBackend::~LauncherBackend()
50{
61{
62+ /* Remove oursevles from DBus */
63+ QDBusConnection con = QDBusConnection::sessionBus();
64+ con.unregisterService("com.canonical.Unity.Launcher");
65+ con.unregisterObject("/com/canonical/Unity/Launcher");
66+
67+ /* Clear data */
51 m_storedApps.clear();
68 m_storedApps.clear();
52
69
53 Q_FOREACH(LauncherBackendItem *item, m_itemCache) {
70 Q_FOREACH(LauncherBackendItem *item, m_itemCache) {
@@ -94,7 +111,7 @@ QString LauncherBackend::desktopFile(const QString &appId) const
94
111
95QString LauncherBackend::displayName(const QString &appId) const
112QString LauncherBackend::displayName(const QString &appId) const
96{
113{
97− LauncherBackendItem *item = m_itemCache.value(appId);
114+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
98 if (item) {
115 if (item) {
99 return item->displayName;
116 return item->displayName;
100 }
117 }
@@ -112,16 +129,9 @@ QString LauncherBackend::displayName(const QString &appId) const
112QString LauncherBackend::icon(const QString &appId) const
129QString LauncherBackend::icon(const QString &appId) const
113{
130{
114 QString iconName;
131 QString iconName;
115− LauncherBackendItem *item = m_itemCache.value(appId);
132+ LauncherBackendItem *item = getItem(appId);
116 if (item) {
133 if (item) {
117 iconName = item->icon;
134 iconName = item->icon;
118− } else {
119− QString df = findDesktopFile(appId);
120− if (!df.isEmpty()) {
121− LauncherBackendItem *item = parseDesktopFile(df);
122− m_itemCache.insert(appId, item);
123− iconName = item->icon;
124− }
125 }
135 }
126
136
127 return iconName;
137 return iconName;
@@ -147,10 +157,70 @@ int LauncherBackend::progress(const QString &appId) const
147
157
148int LauncherBackend::count(const QString &appId) const
158int LauncherBackend::count(const QString &appId) const
149{
159{
150− // TODO: Return value for count emblem.
160+ int count = -1;
151− // TODO: emit countChanged() when this value changes.
161+ LauncherBackendItem *item = getItem(appId);
152− Q_UNUSED(appId)
162+
163+ if (item) {
164+ if (item->countVisible) {
165+ count = item->count;
166+ }
167+ }
168+
169+ return count;
170+}
171+
172+void LauncherBackend::setCount(const QString &appId, int count) const
173+{
174+ LauncherBackendItem *item = getItem(appId);
175+
176+ bool emitchange = false;
177+ if (item) {
178+ emitchange = (item->count != count);
179+ item->count = count;
180+ }
181+
182+ if (emitchange) {
183+ /* TODO: This needs to use the accessor to handle the visibility
184+ correctly, but when we have the two properties we can just use
185+ the local value */
186+ Q_EMIT countChanged(appId, this->count(appId));
187+ QVariant vcount(item->count);
188+ emitPropChangedDbus(appId, "count", vcount);
189+ }
190+}
191+
192+bool LauncherBackend::countVisible(const QString &appId) const
193+{
194+ bool visible = false;
195+ LauncherBackendItem *item = getItem(appId);
196+
197+ if (item) {
198+ visible = item->countVisible;
199+ }
200+
153− return 0;
201+ return visible;
202+}
203+
204+void LauncherBackend::setCountVisible(const QString &appId, bool visible) const
205+{
206+ LauncherBackendItem *item = getItem(appId);
207+
208+ bool emitchange = false;
209+ if (item) {
210+ emitchange = (item->countVisible != visible);
211+ item->countVisible = visible;
212+ } else {
213+ qDebug() << "Unable to find:" << appId;
214+ }
215+
216+ if (emitchange) {
217+ /* TODO: Because we're using visible in determining the
218+ count we need to emit a count changed as well */
219+ Q_EMIT countChanged(appId, this->count(appId));
220+ Q_EMIT countVisibleChanged(appId, item->countVisible);
221+ QVariant vCountVisible(item->countVisible);
222+ emitPropChangedDbus(appId, "countVisible", vCountVisible);
223+ }
154}
224}
155
225
156void LauncherBackend::setUser(const QString &username)
226void LauncherBackend::setUser(const QString &username)
@@ -294,6 +364,35 @@ LauncherBackendItem* LauncherBackend::parseDesktopFile(const QString &desktopFil
294 } else {
364 } else {
295 item->icon = "image://theme/" + iconString;
365 item->icon = "image://theme/" + iconString;
296 }
366 }
367+
368+ /* TODO: These should be looked up in a cache somewhere */
369+ item->count = 0;
370+ item->countVisible = false;
371+
372+ return item;
373+}
374+
375+/* Gets an item, and tries to create a new one if we need it to */
376+LauncherBackendItem* LauncherBackend::getItem(const QString &appId) const
377+{
378+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
379+ if (!item) {
380+ QString df = findDesktopFile(appId);
381+ if (!df.isEmpty()) {
382+ item = parseDesktopFile(df);
383+ if (item) {
384+ m_itemCache[appId] = item;
385+ } else {
386+ qWarning() << "Unable to parse desktop file for" << appId << "path" << df;
387+ }
388+ } else {
389+ qDebug() << "Unable to find desktop file for:" << appId;
390+ }
391+ }
392+
393+ if (!item)
394+ qWarning() << "Unable to find item for: " << appId;
395+
297 return item;
396 return item;
298}
397}
299
398
@@ -304,7 +403,7 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
304 }
403 }
305 QString appId = details.value("id").toString();
404 QString appId = details.value("id").toString();
306
405
307− LauncherBackendItem *item = m_itemCache.value(appId);
406+ LauncherBackendItem *item = m_itemCache.value(appId, nullptr);
308 if (item) {
407 if (item) {
309 delete item;
408 delete item;
310 }
409 }
@@ -313,6 +412,8 @@ void LauncherBackend::loadFromVariant(const QVariantMap &details)
313
412
314 item->displayName = details.value("name").toString();
413 item->displayName = details.value("name").toString();
315 item->icon = details.value("icon").toString();
414 item->icon = details.value("icon").toString();
415+ item->count = details.value("count").toInt();
416+ item->countVisible = details.value("countVisible").toBool();
316
417
317 m_itemCache.insert(appId, item);
418 m_itemCache.insert(appId, item);
318 m_storedApps.append(appId);
419 m_storedApps.append(appId);
@@ -325,6 +426,8 @@ QVariantMap LauncherBackend::itemToVariant(const QString &appId) const
325 details.insert("id", appId);
426 details.insert("id", appId);
326 details.insert("name", item->displayName);
427 details.insert("name", item->displayName);
327 details.insert("icon", item->icon);
428 details.insert("icon", item->icon);
429+ details.insert("count", item->count);
430+ details.insert("countVisible", item->countVisible);
328 return details;
431 return details;
329}
432}
330
433
@@ -335,3 +438,150 @@ bool LauncherBackend::isDefaultsItem(const QList<QVariantMap> &apps) const
335 // list of one item with the 'defaults' field set to true.
438 // list of one item with the 'defaults' field set to true.
336 return (apps.size() == 1 && apps[0].value("defaults").toBool());
439 return (apps.size() == 1 && apps[0].value("defaults").toBool());
337}
440}
441+
442+bool LauncherBackend::handleMessage(const QDBusMessage& message, const QDBusConnection& connection)
443+{
444+ /* Check to make sure we're getting properties on our interface */
445+ if (message.type() != QDBusMessage::MessageType::MethodCallMessage) {
446+ return false;
447+ }
448+ if (message.interface() != "org.freedesktop.DBus.Properties") {
449+ return false;
450+ }
451+ if (message.arguments()[0].toString() != "com.canonical.Unity.Launcher.Item") {
452+ return false;
453+ }
454+
455+ /* Break down the path to just the app id */
456+ QString pathtemp = message.path();
457+ if (!pathtemp.startsWith("/com/canonical/Unity/Launcher/")) {
458+ return false;
459+ }
460+ pathtemp.remove("/com/canonical/Unity/Launcher/");
461+ if (pathtemp.indexOf('/') >= 0) {
462+ return false;
463+ }
464+
465+ /* Find ourselves an appid */
466+ QString appid = decodeAppId(pathtemp);
467+ QVariantList retval;
468+
469+ if (message.member() == "Get") {
470+ if (message.arguments()[1].toString() == "count") {
471+ retval.append(QVariant::fromValue(QDBusVariant(this->count(appid))));
472+ } else if (message.arguments()[1].toString() == "countVisible") {
473+ retval.append(QVariant::fromValue(QDBusVariant(this->countVisible(appid))));
474+ }
475+ } else if (message.member() == "Set") {
476+ if (message.arguments()[1].toString() == "count") {
477+ this->setCount(appid, message.arguments()[2].value<QDBusVariant>().variant().toInt());
478+ } else if (message.arguments()[1].toString() == "countVisible") {
479+ this->setCountVisible(appid, message.arguments()[2].value<QDBusVariant>().variant().toBool());
480+ }
481+ } else if (message.member() == "GetAll") {
482+ retval.append(this->itemToVariant(appid));
483+ } else {
484+ return false;
485+ }
486+
487+ QDBusMessage reply = message.createReply(retval);
488+ return connection.send(reply);
489+}
490+
491+QString LauncherBackend::introspect(const QString &path) const
492+{
493+ /* This case we should just list the nodes */
494+ if (path == "/com/canonical/Unity/Launcher/" || path == "/com/canonical/Unity/Launcher") {
495+ QString nodes;
496+
497+ Q_FOREACH(const QString &appId, m_itemCache.keys()) {
498+ nodes.append("<node name=\"");
499+ nodes.append(encodeAppId(appId));
500+ nodes.append("\"/>\n");
501+ }
502+
503+ return nodes;
504+ }
505+
506+ /* Should not happen, but let's handle it */
507+ if (!path.startsWith("/com/canonical/Unity/Launcher")) {
508+ return "";
509+ }
510+
511+ /* Now we should be looking at a node */
512+ QString nodeiface =
513+ "<interface name=\"com.canonical.Unity.Launcher.Item\">"
514+ "<property name=\"count\" type=\"i\" access=\"readwrite\" />"
515+ "<property name=\"countVisible\" type=\"b\" access=\"readwrite\" />"
516+ "</interface>";
517+ return nodeiface;
518+}
519+
520+QString LauncherBackend::decodeAppId(const QString& path)
521+{
522+ QByteArray bytes = path.toUtf8();
523+ QByteArray decoded;
524+
525+ for (int i = 0; i < bytes.size(); ++i) {
526+ char chr = bytes.at(i);
527+
528+ if (chr == '_') {
529+ QString number;
530+ number.append(bytes.at(i+1));
531+ number.append(bytes.at(i+2));
532+
533+ bool okay;
534+ char newchar = number.toUInt(&okay, 16);
535+ if (okay)
536+ decoded.append(newchar);
537+
538+ i += 2;
539+ } else {
540+ decoded.append(chr);
541+ }
542+ }
543+
544+ return QString::fromUtf8(decoded);
545+}
546+
547+QString LauncherBackend::encodeAppId(const QString& appId)
548+{
549+ QByteArray bytes = appId.toUtf8();
550+ QString encoded;
551+
552+ for (int i = 0; i < bytes.size(); ++i) {
553+ uchar chr = bytes.at(i);
554+
555+ if ((chr >= 'a' && chr <= 'z') ||
556+ (chr >= 'A' && chr <= 'Z') ||
557+ (chr >= '0' && chr <= '9'&& i != 0)) {
558+ encoded.append(chr);
559+ } else {
560+ QString hexval = QString("_%1").arg(chr, 2, 16, QChar('0'));
561+ encoded.append(hexval.toUpper());
562+ }
563+ }
564+
565+ return encoded;
566+}
567+
568+void LauncherBackend::emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const
569+{
570+ QString path("/com/canonical/Unity/Launcher/");
571+ path.append(encodeAppId(appId));
572+
573+ QDBusMessage message = QDBusMessage::createSignal(path, "org.freedesktop.DBus.Properties", "PropertiesChanged");
574+
575+ QList<QVariant> arguments;
576+ QVariantHash changedprops;
577+ changedprops[property] = QVariant::fromValue(QDBusVariant(value));
578+ QVariantList deletedprops;
579+
580+ arguments.append(changedprops);
581+ arguments.append(deletedprops);
582+
583+ message.setArguments(arguments);
584+
585+ QDBusConnection con = QDBusConnection::sessionBus();
586+ con.send(message);
587+}
plugins/Unity/Launcher/backend/launcherbackend.h+52−4
@@ -24,6 +24,7 @@
24#include <QObject>
24#include <QObject>
25#include <QSettings>
25#include <QSettings>
26#include <QStringList>
26#include <QStringList>
27+#include <QDBusVirtualObject>
27
28
28class AccountsServiceDBusAdaptor;
29class AccountsServiceDBusAdaptor;
29
30
@@ -32,11 +33,13 @@ class AccountsServiceDBusAdaptor;
32 */
33 */
33
34
34class LauncherBackendItem;
35class LauncherBackendItem;
36+class LauncherBackendTest;
35
37
36−class LauncherBackend : public QObject
38+class LauncherBackend : public QDBusVirtualObject
37{
39{
38 Q_OBJECT
40 Q_OBJECT
39
41
42+ friend LauncherBackendTest;
40
43
41public:
44public:
42 LauncherBackend(QObject *parent = 0);
45 LauncherBackend(QObject *parent = 0);
@@ -116,16 +119,53 @@ public:
116 */
119 */
117 int count(const QString &appId) const;
120 int count(const QString &appId) const;
118
121
122+ /**
123+ * @brief Set the count on an item
124+ * @param appId The ID of the application
125+ * @param count Count to show on the application
126+ */
127+ void setCount(const QString &appId, int count) const;
128+
129+ /**
130+ * @brief Get whether the count should be visible
131+ * @param appId The ID of the application.
132+ * @returns Whether to show a count on the launcher
133+ */
134+ bool countVisible(const QString &appId) const;
135+
136+ /**
137+ * @brief Set the visibility of the count item
138+ * @param appId The ID of the application
139+ * @param visible Whether the count should be visible
140+ */
141+ void setCountVisible(const QString &appId, bool visible) const;
142+
119 /**
143 /**
120 * @brief Sets the username for which to look up launcher items.
144 * @brief Sets the username for which to look up launcher items.
121 * @param username The username to use.
145 * @param username The username to use.
122 */
146 */
123 void setUser(const QString &username);
147 void setUser(const QString &username);
124
148
149+ /**
150+ * @brief Handle a message to an application node
151+ * @param message DBus message to handle
152+ * @param connection DBus connection that we're using
153+ * @returns whether the message was handled
154+ */
155+ virtual bool handleMessage(const QDBusMessage& message, const QDBusConnection& connection);
156+
157+ /**
158+ * @brief Get introspection information on the objects we're exporting
159+ * @param path the dbus path containing the appid
160+ * @returns Introspection information for that node in the tree
161+ */
162+ virtual QString introspect (const QString &path) const;
163+
125Q_SIGNALS:
164Q_SIGNALS:
126− void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList);
165+ void quickListChanged(const QString &appId, const QList<QuickListEntry> &quickList) const;
127− void progressChanged(const QString &appId, int progress);
166+ void progressChanged(const QString &appId, int progress) const;
128− void countChanged(const QString &appId, int count);
167+ void countChanged(const QString &appId, int count) const;
168+ void countVisibleChanged(const QString &appId, bool visible) const;
129
169
130private:
170private:
131 QString findDesktopFile(const QString &appId) const;
171 QString findDesktopFile(const QString &appId) const;
@@ -143,6 +183,14 @@ private:
143
183
144 AccountsServiceDBusAdaptor *m_accounts;
184 AccountsServiceDBusAdaptor *m_accounts;
145 QString m_user;
185 QString m_user;
186+
187+ void emitPropChangedDbus(const QString& appId, const QString& property, QVariant &value) const;
188+
189+protected: /* Protected to allow testing */
190+ LauncherBackendItem* getItem(const QString& appId) const;
191+
192+ static QString decodeAppId(const QString& path);
193+ static QString encodeAppId(const QString& appId);
146};
194};
147
195
148#endif // LAUNCHERBACKEND_H
196#endif // LAUNCHERBACKEND_H
plugins/Utils/CMakeLists.txt−1
@@ -11,7 +11,6 @@ include_directories(
11)
11)
12
12
13set(QMLPLUGIN_SRC
13set(QMLPLUGIN_SRC
14− bottombarvisibilitycommunicatorshell.cpp
15 qlimitproxymodelqml.cpp
14 qlimitproxymodelqml.cpp
16 qsortfilterproxymodelqml.cpp
15 qsortfilterproxymodelqml.cpp
17 timeformatter.cpp
16 timeformatter.cpp
plugins/Utils/bottombarvisibilitycommunicatorshell.cppdeleted−49
@@ -1,49 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "bottombarvisibilitycommunicatorshell.h"
18−
19−BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
20− : m_forceHidden(false),
21− m_position(0)
22−{
23−}
24−
25−bool BottomBarVisibilityCommunicatorShell::forceHidden() const
26−{
27− return m_forceHidden;
28−}
29−
30−double BottomBarVisibilityCommunicatorShell::position() const
31−{
32− return m_position;
33−}
34−
35−void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
36−{
37− if (forceHidden != m_forceHidden) {
38− m_forceHidden = forceHidden;
39− Q_EMIT forceHiddenChanged(forceHidden);
40− }
41−}
42−
43−void BottomBarVisibilityCommunicatorShell::setPosition(double position)
44−{
45− if (position != m_position) {
46− m_position = position;
47− Q_EMIT positionChanged(position);
48− }
49−}
plugins/Utils/bottombarvisibilitycommunicatorshell.hdeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
18−#define BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
19−
20−#include <QObject>
21−
22−class QDBusInterface;
23−
24−/** This is an internal class used to talk with the bottom bar used by either
25− * applications or the SDK.
26− * There is a method to force the bottom bar to be hidden or otherwise behave as usual
27− */
28−
29−class BottomBarVisibilityCommunicatorShell : public QObject
30−{
31− Q_OBJECT
32− Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
33− Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
34−
35− Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
36−public:
37− static BottomBarVisibilityCommunicatorShell& instance() {
38− static BottomBarVisibilityCommunicatorShell instance;
39− return instance;
40− }
41−
42− bool forceHidden() const;
43− void setForceHidden(bool forceHidden);
44−
45− double position() const;
46− void setPosition(double position);
47−
48−Q_SIGNALS:
49− void forceHiddenChanged(bool forceHidden);
50− void positionChanged(double position);
51−
52−private:
53− BottomBarVisibilityCommunicatorShell();
54−
55− bool m_forceHidden;
56− double m_position;
57−};
58−
59−#endif
plugins/Utils/plugin.cpp−10
@@ -26,16 +26,12 @@
26#include "plugin.h"
26#include "plugin.h"
27
27
28// local
28// local
29−#include "bottombarvisibilitycommunicatorshell.h"
30#include "qlimitproxymodelqml.h"
29#include "qlimitproxymodelqml.h"
31#include "qsortfilterproxymodelqml.h"
30#include "qsortfilterproxymodelqml.h"
32#include "timeformatter.h"
31#include "timeformatter.h"
33#include "unitymenumodelpaths.h"
32#include "unitymenumodelpaths.h"
34#include "easingcurve.h"
33#include "easingcurve.h"
35
34
36−static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
37−static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
38−
39void UtilsPlugin::registerTypes(const char *uri)
35void UtilsPlugin::registerTypes(const char *uri)
40{
36{
41 Q_ASSERT(uri == QLatin1String("Utils"));
37 Q_ASSERT(uri == QLatin1String("Utils"));
@@ -45,16 +41,10 @@ void UtilsPlugin::registerTypes(const char *uri)
45 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
41 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
46 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
42 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
47 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
43 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
48− qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
49 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
44 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
50}
45}
51
46
52void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
47void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
53{
48{
54 QQmlExtensionPlugin::initializeEngine(engine, uri);
49 QQmlExtensionPlugin::initializeEngine(engine, uri);
55−
56− QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
57− BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
58− QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
59− engine->rootContext()->setContextProperty("bottomBarVisibilityCommunicatorShell", bottomBarVisibilityCommunicator);
60}
50}
po/am.po+9−13
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-18 19:28+0000\n"
11"PO-Revision-Date: 2014-01-18 19:28+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr "መላኪያ"
114msgstr "መላኪያ"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "መፈለጊያ"
163msgstr "መፈለጊያ"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "እባክዎን ያስገቡ %1"
168msgstr "እባክዎን ያስገቡ %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "አስተያየቶች:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
po/ar.po+9−27
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-02-21 11:19+0000\n"
11"PO-Revision-Date: 2014-02-21 11:19+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
18−"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr "شاهد المزيد"
89msgid "See less"
87msgid "See less"
90msgstr "شاهد أقل"
88msgstr "شاهد أقل"
91
89
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
91msgid "Recent"
94msgstr ""
92msgstr ""
95
93
@@ -118,6 +116,10 @@ msgstr "أضف تعليق"
118msgid "Send"
116msgid "Send"
119msgstr "أرسل"
117msgstr "أرسل"
120
118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
124msgid "Emergency Call"
123msgstr "مكالمة طوارئ"
125msgstr "مكالمة طوارئ"
@@ -163,27 +165,7 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
163msgid "Search"
165msgid "Search"
164msgstr "ابحث"
166msgstr "ابحث"
165
167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167#, qt-format
169#, qt-format
168msgid "Please enter %1"
170msgid "Please enter %1"
169msgstr "من فضلك أدخِل %1"
171msgstr "من فضلك أدخِل %1"
170−
171−#~ msgid "Review"
172−#~ msgstr "التعليق"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "التعليقات:"
180−
181−#, qt-format
182−#~ msgid "%1 review"
183−#~ msgid_plural "%1 reviews"
184−#~ msgstr[0] "لا تعليقات (%1)"
185−#~ msgstr[1] "تعليق واحد (%1)"
186−#~ msgstr[2] "تعليقان (%1)"
187−#~ msgstr[3] "%1 تعليقات"
188−#~ msgstr[4] "%1 تعليقا"
189−#~ msgstr[5] "%1 تعليق"
po/ast.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-04-04 02:16+0000\n"
11"PO-Revision-Date: 2014-04-04 02:16+0000\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
12"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +88,7 @@ msgstr "Ver más"
88msgid "See less"
88msgid "See less"
89msgstr "Ver menos"
89msgstr "Ver menos"
90
90
91−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
92msgid "Recent"
92msgid "Recent"
93msgstr "Reciente"
93msgstr "Reciente"
94
94
@@ -117,6 +117,10 @@ msgstr "Amestar una reseña"
117msgid "Send"
117msgid "Send"
118msgstr "Unviar"
118msgstr "Unviar"
119
119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
120#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
121msgid "Emergency Call"
125msgid "Emergency Call"
122msgstr "Llamada d'emerxencia"
126msgstr "Llamada d'emerxencia"
@@ -162,7 +166,7 @@ msgstr "Escriba'l PIN de la SIM"
162msgid "Search"
166msgid "Search"
163msgstr "Guetar"
167msgstr "Guetar"
164
168
165−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
166#, qt-format
170#, qt-format
167msgid "Please enter %1"
171msgid "Please enter %1"
168msgstr "Introduz %1"
172msgstr "Introduz %1"
po/az.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 09:50+0000\n"
11"PO-Revision-Date: 2014-01-15 09:50+0000\n"
12"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
12"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
86msgid "See less"
85msgid "See less"
87msgstr ""
86msgstr ""
88
87
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
89msgid "Recent"
91msgstr ""
90msgstr ""
92
91
@@ -115,6 +114,10 @@ msgstr "Rəy yaz"
115msgid "Send"
114msgid "Send"
116msgstr "Göndər"
115msgstr "Göndər"
117
116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
122msgid "Emergency Call"
120msgstr "Zərurət zəngi"
123msgstr "Zərurət zəngi"
@@ -160,23 +163,7 @@ msgstr ""
160msgid "Search"
163msgid "Search"
161msgstr "Axtar"
164msgstr "Axtar"
162
165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164#, qt-format
167#, qt-format
165msgid "Please enter %1"
168msgid "Please enter %1"
166msgstr "Xahiş edirik daxil edin: %1"
169msgstr "Xahiş edirik daxil edin: %1"
167−
168−#~ msgid "Comments:"
169−#~ msgstr "Şərhlər:"
170−
171−#~ msgid "Review"
172−#~ msgstr "Rəy"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 rəy"
178−#~ msgstr[1] "%1 rəy"
179−
180−#, qt-format
181−#~ msgid "(%1)"
182−#~ msgstr "(%1)"
po/bg.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +91,7 @@ msgstr ""
91msgid "See less"
91msgid "See less"
92msgstr ""
92msgstr ""
93
93
94−#: qml/Dash/DashApps.qml:38
94+#: qml/Dash/DashApps.qml:37
95msgid "Recent"
95msgid "Recent"
96msgstr "Последни"
96msgstr "Последни"
97
97
@@ -120,6 +120,10 @@ msgstr "Добави отзив"
120msgid "Send"
120msgid "Send"
121msgstr "Изпрати"
121msgstr "Изпрати"
122
122
123+#: qml/Greeter/Greeter.qml:151
124+msgid "Swipe to unlock"
125+msgstr ""
126+
123#: qml/Greeter/Lockscreen.qml:149
127#: qml/Greeter/Lockscreen.qml:149
124msgid "Emergency Call"
128msgid "Emergency Call"
125msgstr "Спешно повикване"
129msgstr "Спешно повикване"
@@ -165,7 +169,7 @@ msgstr ""
165msgid "Search"
169msgid "Search"
166msgstr "Търсене"
170msgstr "Търсене"
167
171
168−#: qml/Shell.qml:417
172+#: qml/Shell.qml:348
169#, qt-format
173#, qt-format
170msgid "Please enter %1"
174msgid "Please enter %1"
171msgstr "Моля, въведете %1"
175msgstr "Моля, въведете %1"
po/br.ponew file+168
@@ -0,0 +1,168 @@
1+# Breton translation for unity8
2+# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3+# This file is distributed under the same license as the unity8 package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
5+#
6+msgid ""
7+msgstr ""
8+"Project-Id-Version: unity8\n"
9+"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11+"PO-Revision-Date: 2014-04-15 18:15+0000\n"
12+"Last-Translator: Rouxel <vincent.rouxel@mailoo.org>\n"
13+"Language-Team: Breton <br@li.org>\n"
14+"MIME-Version: 1.0\n"
15+"Content-Type: text/plain; charset=UTF-8\n"
16+"Content-Transfer-Encoding: 8bit\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18+"X-Generator: Launchpad (build 16985)\n"
19+
20+#: plugins/Unity/Launcher/launcheritem.cpp:43
21+#: plugins/Unity/Launcher/launcheritem.cpp:73
22+msgid "Lock to Launcher"
23+msgstr ""
24+
25+#: plugins/Unity/Launcher/launcheritem.cpp:73
26+msgid "Unlock from Launcher"
27+msgstr ""
28+
29+#: qml/Components/EdgeDemoOverlay.qml:151
30+msgid "Skip intro"
31+msgstr ""
32+
33+#: qml/Components/EdgeDemo.qml:113
34+msgid "Right edge"
35+msgstr ""
36+
37+#: qml/Components/EdgeDemo.qml:114
38+msgid "Try swiping from the right edge to unlock the phone"
39+msgstr ""
40+
41+#: qml/Components/EdgeDemo.qml:145
42+msgid "Top edge"
43+msgstr ""
44+
45+#: qml/Components/EdgeDemo.qml:146
46+msgid "Try swiping from the top edge to access the indicators"
47+msgstr ""
48+
49+#: qml/Components/EdgeDemo.qml:171
50+msgid "Close"
51+msgstr "Serriñ"
52+
53+#: qml/Components/EdgeDemo.qml:172
54+msgid "Swipe up again to close the settings screen"
55+msgstr ""
56+
57+#: qml/Components/EdgeDemo.qml:199
58+msgid "Left edge"
59+msgstr ""
60+
61+#: qml/Components/EdgeDemo.qml:200
62+msgid "Swipe from the left to reveal the launcher for quick access to apps"
63+msgstr ""
64+
65+#: qml/Components/EdgeDemo.qml:227
66+msgid "Well done"
67+msgstr ""
68+
69+#: qml/Components/EdgeDemo.qml:228
70+msgid ""
71+"You have now mastered the edge gestures and can start using the "
72+"phone<br><br>Tap on the screen to start"
73+msgstr ""
74+
75+#: qml/Components/PageHeader.qml:365
76+msgid "Recent searches"
77+msgstr ""
78+
79+#: qml/Components/SeeMore.qml:35
80+msgid "See more"
81+msgstr ""
82+
83+#: qml/Components/SeeMore.qml:58
84+msgid "See less"
85+msgstr ""
86+
87+#: qml/Dash/DashApps.qml:37
88+msgid "Recent"
89+msgstr ""
90+
91+#: qml/Dash/PreviewListView.qml:52
92+#, qt-format
93+msgid "%1 Preview"
94+msgstr ""
95+
96+#: qml/Dash/Previews/PreviewActionCombo.qml:34
97+msgid "More..."
98+msgstr ""
99+
100+#: qml/Dash/Previews/PreviewActionCombo.qml:34
101+msgid "Less..."
102+msgstr ""
103+
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
105+msgid "Rate this"
106+msgstr ""
107+
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
109+msgid "Add a review"
110+msgstr ""
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
113+msgid "Send"
114+msgstr ""
115+
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
120+#: qml/Greeter/Lockscreen.qml:149
121+msgid "Emergency Call"
122+msgstr ""
123+
124+#: qml/Greeter/PassphraseLockscreen.qml:59
125+#, qt-format
126+msgid "Hello %1"
127+msgstr ""
128+
129+#: qml/Greeter/PassphraseLockscreen.qml:59
130+msgid "Hello"
131+msgstr ""
132+
133+#: qml/Hud/HudParametrizedActionsPage.qml:132
134+msgid "Confirm"
135+msgstr ""
136+
137+#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
138+msgid "Type or say a command"
139+msgstr ""
140+
141+#: qml/Hud/Hud.qml:84
142+msgid "Loading. Please Wait..."
143+msgstr ""
144+
145+#: qml/Hud/Hud.qml:89
146+msgid "Speak Now..."
147+msgstr ""
148+
149+#: qml/Hud/Hud.qml:94
150+msgid "Speaking..."
151+msgstr ""
152+
153+#: qml/Notifications/NotificationMenuItemFactory.qml:91
154+msgid "Show password"
155+msgstr ""
156+
157+#: qml/Notifications/NotificationMenuItemFactory.qml:103
158+msgid "Please enter SIM PIN"
159+msgstr ""
160+
161+#: qml/Panel/SearchIndicator.qml:27
162+msgid "Search"
163+msgstr ""
164+
165+#: qml/Shell.qml:348
166+#, qt-format
167+msgid "Please enter %1"
168+msgstr ""
po/bs.po+9−7
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
86msgid "See less"
84msgid "See less"
87msgstr ""
85msgstr ""
88
86
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
88msgid "Recent"
91msgstr ""
89msgstr ""
92
90
@@ -115,6 +113,10 @@ msgstr ""
115msgid "Send"
113msgid "Send"
116msgstr ""
114msgstr ""
117
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
121msgid "Emergency Call"
120msgstr ""
122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160msgid "Search"
162msgid "Search"
161msgstr ""
163msgstr ""
162
164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164#, qt-format
166#, qt-format
165msgid "Please enter %1"
167msgid "Please enter %1"
166msgstr ""
168msgstr ""
po/ca.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-10 07:45+0000\n"
11"PO-Revision-Date: 2014-01-10 07:45+0000\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +90,7 @@ msgstr ""
91msgid "See less"
90msgid "See less"
92msgstr ""
91msgstr ""
93
92
94−#: qml/Dash/DashApps.qml:38
93+#: qml/Dash/DashApps.qml:37
95msgid "Recent"
94msgid "Recent"
96msgstr ""
95msgstr ""
97
96
@@ -120,6 +119,10 @@ msgstr "Afegiu una ressenya"
120msgid "Send"
119msgid "Send"
121msgstr "Envia"
120msgstr "Envia"
122
121
122+#: qml/Greeter/Greeter.qml:151
123+msgid "Swipe to unlock"
124+msgstr ""
125+
123#: qml/Greeter/Lockscreen.qml:149
126#: qml/Greeter/Lockscreen.qml:149
124msgid "Emergency Call"
127msgid "Emergency Call"
125msgstr "Trucada d'emergència"
128msgstr "Trucada d'emergència"
@@ -165,23 +168,7 @@ msgstr ""
165msgid "Search"
168msgid "Search"
166msgstr "Cerca"
169msgstr "Cerca"
167
170
168−#: qml/Shell.qml:417
171+#: qml/Shell.qml:348
169#, qt-format
172#, qt-format
170msgid "Please enter %1"
173msgid "Please enter %1"
171msgstr "Introduïu %1"
174msgstr "Introduïu %1"
172−
173−#, qt-format
174−#~ msgid "(%1)"
175−#~ msgstr "(%1)"
176−
177−#~ msgid "Comments:"
178−#~ msgstr "Comentaris:"
179−
180−#~ msgid "Review"
181−#~ msgstr "Ressenya"
182−
183−#, qt-format
184−#~ msgid "%1 review"
185−#~ msgid_plural "%1 reviews"
186−#~ msgstr[0] "%1 ressenya"
187−#~ msgstr[1] "%1 ressenyes"
po/ckb.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "پێداچوونەوە زۆر بکە"
114msgid "Send"
113msgid "Send"
115msgstr "ناردن"
114msgstr "ناردن"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "هێڵی فریاگوزاری"
122msgstr "هێڵی فریاگوزاری"
@@ -159,23 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "گەڕان"
163msgstr "گەڕان"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "تکایە %1 بنووسە"
168msgstr "تکایە %1 بنووسە"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "لێدوانەکان:"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 پێداچوونەوە"
178−#~ msgstr[1] "%1 پێداچوونەوەکان"
179−
180−#~ msgid "Review"
181−#~ msgstr "پێداچوونەوە"
po/cs.po+9−23
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "Přidat recenzi"
114msgid "Send"
113msgid "Send"
115msgstr "Odeslat"
114msgstr "Odeslat"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "Tísňové volání"
122msgstr "Tísňové volání"
@@ -159,24 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Hledat"
163msgstr "Hledat"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "Zadejte prosím %1"
168msgstr "Zadejte prosím %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Komentáře:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
173−
174−#~ msgid "Review"
175−#~ msgstr "Recenze"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 recenze"
181−#~ msgstr[1] "%1 recenze"
182−#~ msgstr[2] "%1 recenzí"
po/da.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 20:16+0000\n"
11"PO-Revision-Date: 2014-01-14 20:16+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Danish <da@li.org>\n"
13"Language-Team: Danish <da@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/de.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 11:01+0000\n"
11"PO-Revision-Date: 2014-01-15 11:01+0000\n"
12"Last-Translator: Dennis Baudys <Unknown>\n"
12"Last-Translator: Dennis Baudys <Unknown>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
87msgid "See less"
86msgid "See less"
88msgstr ""
87msgstr ""
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92msgstr ""
91msgstr ""
93
92
@@ -116,6 +115,10 @@ msgstr "Bewertung hinzufügen"
116msgid "Send"
115msgid "Send"
117msgstr "Senden"
116msgstr "Senden"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "Notruf"
124msgstr "Notruf"
@@ -161,23 +164,7 @@ msgstr ""
161msgid "Search"
164msgid "Search"
162msgstr "Suchen"
165msgstr "Suchen"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "Bitte geben Sie %1 ein"
170msgstr "Bitte geben Sie %1 ein"
168−
169−#~ msgid "Comments:"
170−#~ msgstr "Kommentare:"
171−
172−#, qt-format
173−#~ msgid "(%1)"
174−#~ msgstr "(%1)"
175−
176−#~ msgid "Review"
177−#~ msgstr "Bewertung"
178−
179−#, qt-format
180−#~ msgid "%1 review"
181−#~ msgid_plural "%1 reviews"
182−#~ msgstr[0] "%1 Bewertung"
183−#~ msgstr[1] "%1 Bewertungen"
po/el.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-02-26 09:58+0000\n"
11"PO-Revision-Date: 2014-02-26 09:58+0000\n"
12"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
12"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +88,7 @@ msgstr "Περρισότερα"
89msgid "See less"
88msgid "See less"
90msgstr "Λιγότερα"
89msgstr "Λιγότερα"
91
90
92−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
92msgid "Recent"
94msgstr ""
93msgstr ""
95
94
@@ -118,6 +117,10 @@ msgstr "Προσθέστε την αξιολόγησή σας"
118msgid "Send"
117msgid "Send"
119msgstr "Αποστολή"
118msgstr "Αποστολή"
120
119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
121#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
125msgid "Emergency Call"
123msgstr "Κλήση έκτακτης ανάγκης"
126msgstr "Κλήση έκτακτης ανάγκης"
@@ -163,23 +166,7 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
163msgid "Search"
166msgid "Search"
164msgstr "Αναζήτηση"
167msgstr "Αναζήτηση"
165
168
166−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
167#, qt-format
170#, qt-format
168msgid "Please enter %1"
171msgid "Please enter %1"
169msgstr "Πληκτρολογήστε %1"
172msgstr "Πληκτρολογήστε %1"
170−
171−#, qt-format
172−#~ msgid "%1 review"
173−#~ msgid_plural "%1 reviews"
174−#~ msgstr[0] "%1 αξιολόγηση"
175−#~ msgstr[1] "%1 αξιολογήσεις"
176−
177−#, qt-format
178−#~ msgid "(%1)"
179−#~ msgstr "(%1)"
180−
181−#~ msgid "Comments:"
182−#~ msgstr "Σχόλια:"
183−
184−#~ msgid "Review"
185−#~ msgstr "Αξιολόγηση"
po/en_AU.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-09-28 07:46+0000\n"
11"PO-Revision-Date: 2013-09-28 07:46+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "Add a review"
114msgid "Send"
113msgid "Send"
115msgstr "Send"
114msgstr "Send"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "Emergency Call"
122msgstr "Emergency Call"
@@ -159,23 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Search"
163msgstr "Search"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "Please enter %1"
168msgstr "Please enter %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Comments:"
169−
170−#~ msgid "Review"
171−#~ msgstr "Review"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 review"
177−#~ msgstr[1] "%1 reviews"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/en_GB.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-03-07 13:27+0000\n"
11"PO-Revision-Date: 2014-03-07 13:27+0000\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
12"Last-Translator: Andi Chandler <Unknown>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr "See more"
87msgid "See less"
86msgid "See less"
88msgstr "See less"
87msgstr "See less"
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92msgstr ""
91msgstr ""
93
92
@@ -116,6 +115,10 @@ msgstr "Add a review"
116msgid "Send"
115msgid "Send"
117msgstr "Send"
116msgstr "Send"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "Emergency Call"
124msgstr "Emergency Call"
@@ -161,23 +164,7 @@ msgstr "Please enter SIM PIN"
161msgid "Search"
164msgid "Search"
162msgstr "Search"
165msgstr "Search"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "Please enter %1"
170msgstr "Please enter %1"
168−
169−#~ msgid "Comments:"
170−#~ msgstr "Comments:"
171−
172−#~ msgid "Review"
173−#~ msgstr "Review"
174−
175−#, qt-format
176−#~ msgid "%1 review"
177−#~ msgid_plural "%1 reviews"
178−#~ msgstr[0] "%1 review"
179−#~ msgstr[1] "%1 reviews"
180−
181−#, qt-format
182−#~ msgid "(%1)"
183−#~ msgstr "(%1)"
po/eo.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/es.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-03-28 22:37+0000\n"
11"PO-Revision-Date: 2014-03-28 22:37+0000\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-03-29 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +89,7 @@ msgstr "Ver más"
89msgid "See less"
89msgid "See less"
90msgstr "Ver menos"
90msgstr "Ver menos"
91
91
92−#: qml/Dash/DashApps.qml:38
92+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
93msgid "Recent"
94msgstr "Recientes"
94msgstr "Recientes"
95
95
@@ -118,6 +118,10 @@ msgstr "Añadir una reseña"
118msgid "Send"
118msgid "Send"
119msgstr "Enviar"
119msgstr "Enviar"
120
120
121+#: qml/Greeter/Greeter.qml:151
122+msgid "Swipe to unlock"
123+msgstr ""
124+
121#: qml/Greeter/Lockscreen.qml:149
125#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
126msgid "Emergency Call"
123msgstr "Llamada de emergencia"
127msgstr "Llamada de emergencia"
@@ -163,7 +167,7 @@ msgstr "Escriba el PIN de la SIM"
163msgid "Search"
167msgid "Search"
164msgstr "Buscar"
168msgstr "Buscar"
165
169
166−#: qml/Shell.qml:417
170+#: qml/Shell.qml:348
167#, qt-format
171#, qt-format
168msgid "Please enter %1"
172msgid "Please enter %1"
169msgstr "Introduzca %1"
173msgstr "Introduzca %1"
po/eu.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-03-30 12:44+0000\n"
11"PO-Revision-Date: 2014-03-30 12:44+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-03-31 06:44+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +88,7 @@ msgstr "Ikusi gehiago"
88msgid "See less"
88msgid "See less"
89msgstr "Ikusi gutxiago"
89msgstr "Ikusi gutxiago"
90
90
91−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
92msgid "Recent"
92msgid "Recent"
93msgstr "Azkenak"
93msgstr "Azkenak"
94
94
@@ -117,6 +117,10 @@ msgstr "Gehitu kritika"
117msgid "Send"
117msgid "Send"
118msgstr "Bidali"
118msgstr "Bidali"
119
119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
120#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
121msgid "Emergency Call"
125msgid "Emergency Call"
122msgstr "Larrialdi-deia"
126msgstr "Larrialdi-deia"
@@ -162,7 +166,7 @@ msgstr "Sartu SIMaren PINa"
162msgid "Search"
166msgid "Search"
163msgstr "Bilatu"
167msgstr "Bilatu"
164
168
165−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
166#, qt-format
170#, qt-format
167msgid "Please enter %1"
171msgid "Please enter %1"
168msgstr "Sartu %1"
172msgstr "Sartu %1"
po/fa.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-31 19:02+0000\n"
11"PO-Revision-Date: 2013-10-31 19:02+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/fi.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-04-05 09:57+0000\n"
11"PO-Revision-Date: 2014-04-05 09:57+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +86,7 @@ msgstr "Näytä lisää"
86msgid "See less"
86msgid "See less"
87msgstr "Näytä vähemmän"
87msgstr "Näytä vähemmän"
88
88
89−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
90msgid "Recent"
91msgstr "Viimeisimmät"
91msgstr "Viimeisimmät"
92
92
@@ -115,6 +115,10 @@ msgstr "Lisää arvostelu"
115msgid "Send"
115msgid "Send"
116msgstr "Lähetä"
116msgstr "Lähetä"
117
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
118#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
123msgid "Emergency Call"
120msgstr "Hätäpuhelu"
124msgstr "Hätäpuhelu"
@@ -160,7 +164,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
160msgid "Search"
164msgid "Search"
161msgstr "Hae"
165msgstr "Hae"
162
166
163−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
164#, qt-format
168#, qt-format
165msgid "Please enter %1"
169msgid "Please enter %1"
166msgstr "Kirjoita %1"
170msgstr "Kirjoita %1"
po/fo.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Leita"
163msgstr "Leita"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/fr.po+30−34
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-28 00:34+0000\n"
11+"PO-Revision-Date: 2014-05-08 17:29+0000\n"
12−"Last-Translator: Pierre <Unknown>\n"
12+"Last-Translator: Sébastien Maes <nautilussebastien@gmail.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-10 08:01+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16996)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -25,7 +24,7 @@ msgstr "Conserver dans le lanceur"
25
24
26#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
27msgid "Unlock from Launcher"
26msgid "Unlock from Launcher"
28−msgstr ""
27+msgstr "Retirer du lanceur"
29
28
30#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
31msgid "Skip intro"
30msgid "Skip intro"
@@ -38,6 +37,7 @@ msgstr "Bord droit"
38#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
39msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
40msgstr ""
39msgstr ""
40+"Faites glisser votre doigt à partir du bord droit pour déverrouiller."
41
41
42#: qml/Components/EdgeDemo.qml:145
42#: qml/Components/EdgeDemo.qml:145
43msgid "Top edge"
43msgid "Top edge"
@@ -46,6 +46,8 @@ msgstr "Bord supérieur"
46#: qml/Components/EdgeDemo.qml:146
46#: qml/Components/EdgeDemo.qml:146
47msgid "Try swiping from the top edge to access the indicators"
47msgid "Try swiping from the top edge to access the indicators"
48msgstr ""
48msgstr ""
49+"Faites glisser votre doigt à partir du bord supérieur pour accéder aux "
50+"indicateurs."
49
51
50#: qml/Components/EdgeDemo.qml:171
52#: qml/Components/EdgeDemo.qml:171
51msgid "Close"
53msgid "Close"
@@ -54,6 +56,8 @@ msgstr "Fermer"
54#: qml/Components/EdgeDemo.qml:172
56#: qml/Components/EdgeDemo.qml:172
55msgid "Swipe up again to close the settings screen"
57msgid "Swipe up again to close the settings screen"
56msgstr ""
58msgstr ""
59+"Faites glisser à nouveau votre doigt vers le bord supérieur pour fermer "
60+"l'écran des paramètres"
57
61
58#: qml/Components/EdgeDemo.qml:199
62#: qml/Components/EdgeDemo.qml:199
59msgid "Left edge"
63msgid "Left edge"
@@ -62,16 +66,20 @@ msgstr "Bord gauche"
62#: qml/Components/EdgeDemo.qml:200
66#: qml/Components/EdgeDemo.qml:200
63msgid "Swipe from the left to reveal the launcher for quick access to apps"
67msgid "Swipe from the left to reveal the launcher for quick access to apps"
64msgstr ""
68msgstr ""
69+"Faites glisser votre doigt à partir du bord gauche pour afficher le lanceur "
70+"d'applications."
65
71
66#: qml/Components/EdgeDemo.qml:227
72#: qml/Components/EdgeDemo.qml:227
67msgid "Well done"
73msgid "Well done"
68−msgstr ""
74+msgstr "Félicitations"
69
75
70#: qml/Components/EdgeDemo.qml:228
76#: qml/Components/EdgeDemo.qml:228
71msgid ""
77msgid ""
72"You have now mastered the edge gestures and can start using the "
78"You have now mastered the edge gestures and can start using the "
73"phone<br><br>Tap on the screen to start"
79"phone<br><br>Tap on the screen to start"
74msgstr ""
80msgstr ""
81+"Vous maîtrisez maintenant les différents gestes et pouvez commencer à "
82+"utiliser le téléphone<br><br>Appuyez sur l'écran pour commencer"
75
83
76#: qml/Components/PageHeader.qml:365
84#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
85msgid "Recent searches"
@@ -79,28 +87,28 @@ msgstr "Recherches récentes"
79
87
80#: qml/Components/SeeMore.qml:35
88#: qml/Components/SeeMore.qml:35
81msgid "See more"
89msgid "See more"
82−msgstr ""
90+msgstr "Voir plus"
83
91
84#: qml/Components/SeeMore.qml:58
92#: qml/Components/SeeMore.qml:58
85msgid "See less"
93msgid "See less"
86−msgstr ""
94+msgstr "Voir moins"
87
95
88−#: qml/Dash/DashApps.qml:38
96+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
97msgid "Recent"
90−msgstr ""
98+msgstr "Récent"
91
99
92#: qml/Dash/PreviewListView.qml:52
100#: qml/Dash/PreviewListView.qml:52
93#, qt-format
101#, qt-format
94msgid "%1 Preview"
102msgid "%1 Preview"
95−msgstr ""
103+msgstr "%1 Aperçu"
96
104
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
105#: qml/Dash/Previews/PreviewActionCombo.qml:34
98msgid "More..."
106msgid "More..."
99−msgstr ""
107+msgstr "Plus..."
100
108
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
109#: qml/Dash/Previews/PreviewActionCombo.qml:34
102msgid "Less..."
110msgid "Less..."
103−msgstr ""
111+msgstr "Moins..."
104
112
105#: qml/Dash/Previews/PreviewRatingInput.qml:81
113#: qml/Dash/Previews/PreviewRatingInput.qml:81
106msgid "Rate this"
114msgid "Rate this"
@@ -114,6 +122,10 @@ msgstr "Ajouter un avis"
114msgid "Send"
122msgid "Send"
115msgstr "Envoyer"
123msgstr "Envoyer"
116
124
125+#: qml/Greeter/Greeter.qml:151
126+msgid "Swipe to unlock"
127+msgstr "Faites glisser pour déverrouiller"
128+
117#: qml/Greeter/Lockscreen.qml:149
129#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
130msgid "Emergency Call"
119msgstr "Appel d'urgence"
131msgstr "Appel d'urgence"
@@ -145,7 +157,7 @@ msgstr "Parlez maintenant…"
145
157
146#: qml/Hud/Hud.qml:94
158#: qml/Hud/Hud.qml:94
147msgid "Speaking..."
159msgid "Speaking..."
148−msgstr ""
160+msgstr "En cours d'écoute..."
149
161
150#: qml/Notifications/NotificationMenuItemFactory.qml:91
162#: qml/Notifications/NotificationMenuItemFactory.qml:91
151msgid "Show password"
163msgid "Show password"
@@ -153,29 +165,13 @@ msgstr "Afficher le mot de passe"
153
165
154#: qml/Notifications/NotificationMenuItemFactory.qml:103
166#: qml/Notifications/NotificationMenuItemFactory.qml:103
155msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
156−msgstr ""
168+msgstr "Veuillez entrer le code PIN de votre carte SIM"
157
169
158#: qml/Panel/SearchIndicator.qml:27
170#: qml/Panel/SearchIndicator.qml:27
159msgid "Search"
171msgid "Search"
160msgstr "Rechercher"
172msgstr "Rechercher"
161
173
162−#: qml/Shell.qml:417
174+#: qml/Shell.qml:348
163#, qt-format
175#, qt-format
164msgid "Please enter %1"
176msgid "Please enter %1"
165msgstr "Veuillez saisir %1"
177msgstr "Veuillez saisir %1"
166−
167−#~ msgid "Review"
168−#~ msgstr "Avis"
169−
170−#, qt-format
171−#~ msgid "%1 review"
172−#~ msgid_plural "%1 reviews"
173−#~ msgstr[0] "%1 avis"
174−#~ msgstr[1] "%1 avis"
175−
176−#~ msgid "Comments:"
177−#~ msgstr "Commentaires :"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/gd.po+9−25
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-09-30 10:34+0000\n"
11"PO-Revision-Date: 2013-09-30 10:34+0000\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
12"Last-Translator: Akerbeltz <fios@akerbeltz.org>\n"
13"Language-Team: Gaelic; Scottish <gd@li.org>\n"
13"Language-Team: Gaelic; Scottish <gd@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18−"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -92,7 +90,7 @@ msgstr ""
92msgid "See less"
90msgid "See less"
93msgstr ""
91msgstr ""
94
92
95−#: qml/Dash/DashApps.qml:38
93+#: qml/Dash/DashApps.qml:37
96msgid "Recent"
94msgid "Recent"
97msgstr ""
95msgstr ""
98
96
@@ -121,6 +119,10 @@ msgstr "Cuir lèirmheas ris"
121msgid "Send"
119msgid "Send"
122msgstr "Cuir"
120msgstr "Cuir"
123
121
122+#: qml/Greeter/Greeter.qml:151
123+msgid "Swipe to unlock"
124+msgstr ""
125+
124#: qml/Greeter/Lockscreen.qml:149
126#: qml/Greeter/Lockscreen.qml:149
125msgid "Emergency Call"
127msgid "Emergency Call"
126msgstr "Gairm èiginn"
128msgstr "Gairm èiginn"
@@ -166,25 +168,7 @@ msgstr ""
166msgid "Search"
168msgid "Search"
167msgstr "Lorg"
169msgstr "Lorg"
168
170
169−#: qml/Shell.qml:417
171+#: qml/Shell.qml:348
170#, qt-format
172#, qt-format
171msgid "Please enter %1"
173msgid "Please enter %1"
172msgstr "Cuir a-steach %1"
174msgstr "Cuir a-steach %1"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "Beachdan"
180−
181−#~ msgid "Review"
182−#~ msgstr "Lèirmheas"
183−
184−#, qt-format
185−#~ msgid "%1 review"
186−#~ msgid_plural "%1 reviews"
187−#~ msgstr[0] "%1 lèirmheas"
188−#~ msgstr[1] "%1 lèirmheas"
189−#~ msgstr[2] "%1 lèirmheasan"
190−#~ msgstr[3] "%1 lèirmheas"
po/gl.po+10−6
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-04-08 07:04+0000\n"
11+"PO-Revision-Date: 2014-05-03 07:31+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-09 07:31+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-06 07:34+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
18+"X-Generator: Launchpad (build 16996)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +86,7 @@ msgstr "Ver máis"
86msgid "See less"
86msgid "See less"
87msgstr "Ver menos"
87msgstr "Ver menos"
88
88
89−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
90msgid "Recent"
91msgstr "Recentes"
91msgstr "Recentes"
92
92
@@ -115,6 +115,10 @@ msgstr "Engadir unha opinión"
115msgid "Send"
115msgid "Send"
116msgstr "Enviar"
116msgstr "Enviar"
117
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr "Esvare para desbloquear"
121+
118#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
123msgid "Emergency Call"
120msgstr "Chamada de emerxencia"
124msgstr "Chamada de emerxencia"
@@ -160,7 +164,7 @@ msgstr "Introduza o PIN da SIM"
160msgid "Search"
164msgid "Search"
161msgstr "Buscar"
165msgstr "Buscar"
162
166
163−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
164#, qt-format
168#, qt-format
165msgid "Please enter %1"
169msgid "Please enter %1"
166msgstr "Introduza %1"
170msgstr "Introduza %1"
po/he.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-11-20 08:30+0000\n"
11"PO-Revision-Date: 2013-11-20 08:30+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "הוספת סקירה"
114msgid "Send"
113msgid "Send"
115msgstr "שליחה"
114msgstr "שליחה"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "שיחת חירום"
122msgstr "שיחת חירום"
@@ -159,23 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "חיפוש"
163msgstr "חיפוש"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "נא להזין %1"
168msgstr "נא להזין %1"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "הערות:"
173−
174−#~ msgid "Review"
175−#~ msgstr "סקירה"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "סקירה %1"
181−#~ msgstr[1] "%1 סקירות"
po/hi.po+9−9
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "समीक्षा दे"
114msgid "Send"
113msgid "Send"
115msgstr "भेजें"
114msgstr "भेजें"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "आपातकालीन कॉल"
122msgstr "आपातकालीन कॉल"
@@ -159,10 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "खोजें"
163msgstr "खोजें"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
166−
167−#~ msgid "Review"
168−#~ msgstr "समीक्षा"
po/hr.po+9−7
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
86msgid "See less"
84msgid "See less"
87msgstr ""
85msgstr ""
88
86
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
88msgid "Recent"
91msgstr ""
89msgstr ""
92
90
@@ -115,6 +113,10 @@ msgstr ""
115msgid "Send"
113msgid "Send"
116msgstr ""
114msgstr ""
117
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
121msgid "Emergency Call"
120msgstr ""
122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160msgid "Search"
162msgid "Search"
161msgstr "Pretraživanje"
163msgstr "Pretraživanje"
162
164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164#, qt-format
166#, qt-format
165msgid "Please enter %1"
167msgid "Please enter %1"
166msgstr ""
168msgstr ""
po/hu.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 23:02+0000\n"
11"PO-Revision-Date: 2014-01-14 23:02+0000\n"
12"Last-Translator: Kristóf Kiszel <Unknown>\n"
12"Last-Translator: Kristóf Kiszel <Unknown>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
87msgid "See less"
86msgid "See less"
88msgstr ""
87msgstr ""
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92msgstr ""
91msgstr ""
93
92
@@ -116,6 +115,10 @@ msgstr "Értékelés hozzáadása"
116msgid "Send"
115msgid "Send"
117msgstr "Küldés"
116msgstr "Küldés"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "Vészhívás"
124msgstr "Vészhívás"
@@ -161,23 +164,7 @@ msgstr ""
161msgid "Search"
164msgid "Search"
162msgstr "Keresés"
165msgstr "Keresés"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "Adja meg a következőt: %1"
170msgstr "Adja meg a következőt: %1"
168−
169−#, qt-format
170−#~ msgid "%1 review"
171−#~ msgid_plural "%1 reviews"
172−#~ msgstr[0] "%1 értékelés"
173−#~ msgstr[1] "%1 értékelés"
174−
175−#, qt-format
176−#~ msgid "(%1)"
177−#~ msgstr "(%1)"
178−
179−#~ msgid "Comments:"
180−#~ msgstr "Hozzászólások:"
181−
182−#~ msgid "Review"
183−#~ msgstr "Értékelés"
po/hy.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Որոնում"
163msgstr "Որոնում"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/id.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/is.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-09-18 16:22+0000\n"
11"PO-Revision-Date: 2013-09-18 16:22+0000\n"
12"Last-Translator: Andri Thorlacius <Unknown>\n"
12"Last-Translator: Andri Thorlacius <Unknown>\n"
13"Language-Team: Icelandic <is@li.org>\n"
13"Language-Team: Icelandic <is@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
86msgid "See less"
85msgid "See less"
87msgstr ""
86msgstr ""
88
87
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
89msgid "Recent"
91msgstr ""
90msgstr ""
92
91
@@ -115,6 +114,10 @@ msgstr "Gefa umsögn"
115msgid "Send"
114msgid "Send"
116msgstr "Senda"
115msgstr "Senda"
117
116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
122msgid "Emergency Call"
120msgstr "Neyðarsímtal"
123msgstr "Neyðarsímtal"
@@ -160,23 +163,7 @@ msgstr ""
160msgid "Search"
163msgid "Search"
161msgstr "Leita"
164msgstr "Leita"
162
165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164#, qt-format
167#, qt-format
165msgid "Please enter %1"
168msgid "Please enter %1"
166msgstr ""
169msgstr ""
167−
168−#, qt-format
169−#~ msgid "(%1)"
170−#~ msgstr "(%1)"
171−
172−#~ msgid "Comments:"
173−#~ msgstr "Athugasemdir:"
174−
175−#~ msgid "Review"
176−#~ msgstr "Umsögn"
177−
178−#, qt-format
179−#~ msgid "%1 review"
180−#~ msgid_plural "%1 reviews"
181−#~ msgstr[0] "%1 ummæli"
182−#~ msgstr[1] "%1 ummæli"
po/it.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-22 09:15+0000\n"
11"PO-Revision-Date: 2014-01-22 09:15+0000\n"
12"Last-Translator: Domenico <domenico.verde125@live.it>\n"
12"Last-Translator: Domenico <domenico.verde125@live.it>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -90,7 +89,7 @@ msgstr ""
90msgid "See less"
89msgid "See less"
91msgstr ""
90msgstr ""
92
91
93−#: qml/Dash/DashApps.qml:38
92+#: qml/Dash/DashApps.qml:37
94msgid "Recent"
93msgid "Recent"
95msgstr ""
94msgstr ""
96
95
@@ -119,6 +118,10 @@ msgstr "Aggiungi una recensione"
119msgid "Send"
118msgid "Send"
120msgstr "Invia"
119msgstr "Invia"
121
120
121+#: qml/Greeter/Greeter.qml:151
122+msgid "Swipe to unlock"
123+msgstr ""
124+
122#: qml/Greeter/Lockscreen.qml:149
125#: qml/Greeter/Lockscreen.qml:149
123msgid "Emergency Call"
126msgid "Emergency Call"
124msgstr "Chiamata di emergenza"
127msgstr "Chiamata di emergenza"
@@ -164,23 +167,7 @@ msgstr ""
164msgid "Search"
167msgid "Search"
165msgstr "Cerca"
168msgstr "Cerca"
166
169
167−#: qml/Shell.qml:417
170+#: qml/Shell.qml:348
168#, qt-format
171#, qt-format
169msgid "Please enter %1"
172msgid "Please enter %1"
170msgstr "Inserire %1"
173msgstr "Inserire %1"
171−
172−#, qt-format
173−#~ msgid "(%1)"
174−#~ msgstr "(%1)"
175−
176−#, qt-format
177−#~ msgid "%1 review"
178−#~ msgid_plural "%1 reviews"
179−#~ msgstr[0] "%1 recensione"
180−#~ msgstr[1] "%1 recensioni"
181−
182−#~ msgid "Comments:"
183−#~ msgstr "Commenti:"
184−
185−#~ msgid "Review"
186−#~ msgstr "Recensisci"
po/ja.po+9−13
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-18 07:01+0000\n"
11"PO-Revision-Date: 2014-01-18 07:01+0000\n"
12"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
12"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr "送信"
114msgstr "送信"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "検索"
163msgstr "検索"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "コメント:"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
po/km.po+9−21
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-03-04 02:32+0000\n"
11"PO-Revision-Date: 2014-03-04 02:32+0000\n"
12"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
12"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +88,7 @@ msgstr "មើល​ច្រើន​ទៀត"
89msgid "See less"
88msgid "See less"
90msgstr "មើល​តិច​ជាង"
89msgstr "មើល​តិច​ជាង"
91
90
92−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
92msgid "Recent"
94msgstr ""
93msgstr ""
95
94
@@ -118,6 +117,10 @@ msgstr "បន្ថែម​ការ​ពិនិត្យ"
118msgid "Send"
117msgid "Send"
119msgstr "ផ្ញើ"
118msgstr "ផ្ញើ"
120
119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
121#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
125msgid "Emergency Call"
123msgstr "ការ​ហៅ​ពេល​អាសន្ន"
126msgstr "ការ​ហៅ​ពេល​អាសន្ន"
@@ -163,22 +166,7 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
163msgid "Search"
166msgid "Search"
164msgstr "ស្វែង​រក"
167msgstr "ស្វែង​រក"
165
168
166−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
167#, qt-format
170#, qt-format
168msgid "Please enter %1"
171msgid "Please enter %1"
169msgstr "សូម​បញ្ចូល %1"
172msgstr "សូម​បញ្ចូល %1"
170−
171−#, qt-format
172−#~ msgid "(%1)"
173−#~ msgstr "(%1)"
174−
175−#, qt-format
176−#~ msgid "%1 review"
177−#~ msgid_plural "%1 reviews"
178−#~ msgstr[0] "ពិនិត្យ​មើល %1"
179−
180−#~ msgid "Comments:"
181−#~ msgstr "មតិយោបល់៖"
182−
183−#~ msgid "Review"
184−#~ msgstr "ការ​ពិនិត្យ"
po/kn.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "ಹುಡುಕು"
163msgstr "ಹುಡುಕು"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/ko.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-10 07:04+0000\n"
11"PO-Revision-Date: 2013-10-10 07:04+0000\n"
12"Last-Translator: Kim Boram <boramism@gmail.com>\n"
12"Last-Translator: Kim Boram <boramism@gmail.com>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "검색"
163msgstr "검색"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/ky.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Издөө"
163msgstr "Издөө"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/lo.po+9−13
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr "ສົ່ງ"
114msgstr "ສົ່ງ"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,14 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "ຊອກຫາ"
163msgstr "ຊອກຫາ"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "ກະລູນາປ້ອນ %1"
168msgstr "ກະລູນາປ້ອນ %1"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "ຄໍ່ເຫັນ"
po/lt.po+9−24
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 12:42+0000\n"
11"PO-Revision-Date: 2014-01-15 12:42+0000\n"
12"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
12"Last-Translator: Gediminas Paulauskas <menesis@pov.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr ""
89msgid "See less"
87msgid "See less"
90msgstr ""
88msgstr ""
91
89
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
91msgid "Recent"
94msgstr ""
92msgstr ""
95
93
@@ -118,6 +116,10 @@ msgstr "Pridėkite apžvalgą"
118msgid "Send"
116msgid "Send"
119msgstr "Siųsti"
117msgstr "Siųsti"
120
118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
124msgid "Emergency Call"
123msgstr "Pagalbos skambutis"
125msgstr "Pagalbos skambutis"
@@ -163,24 +165,7 @@ msgstr ""
163msgid "Search"
165msgid "Search"
164msgstr "Paieška"
166msgstr "Paieška"
165
167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167#, qt-format
169#, qt-format
168msgid "Please enter %1"
170msgid "Please enter %1"
169msgstr "Prašom įvesti %1"
171msgstr "Prašom įvesti %1"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "Komentarai:"
173−
174−#~ msgid "Review"
175−#~ msgstr "Apžvalga"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 apžvalga"
181−#~ msgstr[1] "%1 apžvalgos"
182−#~ msgstr[2] "%1 apžvalgų"
183−
184−#, qt-format
185−#~ msgid "(%1)"
186−#~ msgstr "(%1)"
po/lv.po+27−24
@@ -7,29 +7,28 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-01-11 16:48+0000\n"
11+"PO-Revision-Date: 2014-05-07 18:17+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
12"Last-Translator: Jānis-Marks Gailis <jeanmarc.gailis@gmail.com>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-10 08:01+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16996)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
23msgid "Lock to Launcher"
22msgid "Lock to Launcher"
24−msgstr ""
23+msgstr "Pieslēgt palaidējam"
25
24
26#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
27msgid "Unlock from Launcher"
26msgid "Unlock from Launcher"
28−msgstr ""
27+msgstr "Atslēgt no palaidēja"
29
28
30#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
31msgid "Skip intro"
30msgid "Skip intro"
32−msgstr ""
31+msgstr "Izlaist Intro"
33
32
34#: qml/Components/EdgeDemo.qml:113
33#: qml/Components/EdgeDemo.qml:113
35msgid "Right edge"
34msgid "Right edge"
@@ -37,7 +36,7 @@ msgstr "Labā mala"
37
36
38#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
39msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
40−msgstr ""
39+msgstr "Mēģiniet iesvelt no labās malas, lai atbloķētu tālruni"
41
40
42#: qml/Components/EdgeDemo.qml:145
41#: qml/Components/EdgeDemo.qml:145
43msgid "Top edge"
42msgid "Top edge"
@@ -45,7 +44,7 @@ msgstr "Augšējā mala"
45
44
46#: qml/Components/EdgeDemo.qml:146
45#: qml/Components/EdgeDemo.qml:146
47msgid "Try swiping from the top edge to access the indicators"
46msgid "Try swiping from the top edge to access the indicators"
48−msgstr ""
47+msgstr "Mēģiniet iesvelt no augšējās malas, lai piekļūt pie indikatoriem"
49
48
50#: qml/Components/EdgeDemo.qml:171
49#: qml/Components/EdgeDemo.qml:171
51msgid "Close"
50msgid "Close"
@@ -79,15 +78,15 @@ msgstr "Nesen veiktās meklēšanas"
79
78
80#: qml/Components/SeeMore.qml:35
79#: qml/Components/SeeMore.qml:35
81msgid "See more"
80msgid "See more"
82−msgstr ""
81+msgstr "Redzēt vairāk"
83
82
84#: qml/Components/SeeMore.qml:58
83#: qml/Components/SeeMore.qml:58
85msgid "See less"
84msgid "See less"
86−msgstr ""
85+msgstr "Redzēt mazāk"
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90−msgstr ""
89+msgstr "Nesens"
91
90
92#: qml/Dash/PreviewListView.qml:52
91#: qml/Dash/PreviewListView.qml:52
93#, qt-format
92#, qt-format
@@ -96,36 +95,40 @@ msgstr ""
96
95
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
96#: qml/Dash/Previews/PreviewActionCombo.qml:34
98msgid "More..."
97msgid "More..."
99−msgstr ""
98+msgstr "Vairāk..."
100
99
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
102msgid "Less..."
101msgid "Less..."
103−msgstr ""
102+msgstr "Mazāk..."
104
103
105#: qml/Dash/Previews/PreviewRatingInput.qml:81
104#: qml/Dash/Previews/PreviewRatingInput.qml:81
106msgid "Rate this"
105msgid "Rate this"
107−msgstr ""
106+msgstr "Novērtēt šo"
108
107
109#: qml/Dash/Previews/PreviewRatingInput.qml:126
108#: qml/Dash/Previews/PreviewRatingInput.qml:126
110msgid "Add a review"
109msgid "Add a review"
111−msgstr ""
110+msgstr "Komentēt"
112
111
113#: qml/Dash/Previews/PreviewRatingInput.qml:166
112#: qml/Dash/Previews/PreviewRatingInput.qml:166
114msgid "Send"
113msgid "Send"
114+msgstr "Sūtīt"
115+
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
115msgstr ""
118msgstr ""
116
119
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119−msgstr ""
122+msgstr "Neatliekamās Palīdzības zvans"
120
123
121#: qml/Greeter/PassphraseLockscreen.qml:59
124#: qml/Greeter/PassphraseLockscreen.qml:59
122#, qt-format
125#, qt-format
123msgid "Hello %1"
126msgid "Hello %1"
124−msgstr ""
127+msgstr "Sveiki, %1"
125
128
126#: qml/Greeter/PassphraseLockscreen.qml:59
129#: qml/Greeter/PassphraseLockscreen.qml:59
127msgid "Hello"
130msgid "Hello"
128−msgstr ""
131+msgstr "Sveiki"
129
132
130#: qml/Hud/HudParametrizedActionsPage.qml:132
133#: qml/Hud/HudParametrizedActionsPage.qml:132
131msgid "Confirm"
134msgid "Confirm"
@@ -149,7 +152,7 @@ msgstr "Runa..."
149
152
150#: qml/Notifications/NotificationMenuItemFactory.qml:91
153#: qml/Notifications/NotificationMenuItemFactory.qml:91
151msgid "Show password"
154msgid "Show password"
152−msgstr ""
155+msgstr "Rādīt paroli"
153
156
154#: qml/Notifications/NotificationMenuItemFactory.qml:103
157#: qml/Notifications/NotificationMenuItemFactory.qml:103
155msgid "Please enter SIM PIN"
158msgid "Please enter SIM PIN"
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Meklēt"
163msgstr "Meklēt"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165−msgstr ""
168+msgstr "Lūdzu ievadiet %1"
po/ml.po+10−23
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
11"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12−"Last-Translator: STyM Alfazz <Unknown>\n"
12+"Last-Translator: Stym alfaZ <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
87msgid "See less"
86msgid "See less"
88msgstr ""
87msgstr ""
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92msgstr ""
91msgstr ""
93
92
@@ -116,6 +115,10 @@ msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
116msgid "Send"
115msgid "Send"
117msgstr "അയയ്‌ക്കുക"
116msgstr "അയയ്‌ക്കുക"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "അടിയന്തിര വിളി"
124msgstr "അടിയന്തിര വിളി"
@@ -161,23 +164,7 @@ msgstr ""
161msgid "Search"
164msgid "Search"
162msgstr "തിരയുക"
165msgstr "തിരയുക"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "ദയവായി %1 നല്‍കുക"
170msgstr "ദയവായി %1 നല്‍കുക"
168−
169−#, qt-format
170−#~ msgid "(%1)"
171−#~ msgstr "(%1)"
172−
173−#~ msgid "Comments:"
174−#~ msgstr "അഭിപ്രായങ്ങള്‍:"
175−
176−#~ msgid "Review"
177−#~ msgstr "അവലോകനം"
178−
179−#, qt-format
180−#~ msgid "%1 review"
181−#~ msgid_plural "%1 reviews"
182−#~ msgstr[0] "%1 അവലോകനം"
183−#~ msgstr[1] "%1 അവലോകനങ്ങള്‍"
po/mr.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/ms.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "Tambah ulasan"
114msgid "Send"
113msgid "Send"
115msgstr "Hantar"
114msgstr "Hantar"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "panggilan Kecemasan"
122msgstr "panggilan Kecemasan"
@@ -159,23 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Gelintar"
163msgstr "Gelintar"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "Sila masukkan %1"
168msgstr "Sila masukkan %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Ulasan:"
169−
170−#~ msgid "Review"
171−#~ msgstr "Tinjauan"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 ulasan"
177−#~ msgstr[1] "%1 ulasan"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
po/my.po+9−13
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr "ပို့မည်"
114msgstr "ပို့မည်"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "အရေးပေါ်ခေါ်မည်"
122msgstr "အရေးပေါ်ခေါ်မည်"
@@ -159,14 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "ရှာဖွေ"
163msgstr "ရှာဖွေ"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "%1ကိုရိုက်ထည့်ပါ"
168msgstr "%1ကိုရိုက်ထည့်ပါ"
166−
167−#, qt-format
168−#~ msgid "(%1)"
169−#~ msgstr "(%1)"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "မှတ်ချက်များ-"
po/nb.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 07:02+0000\n"
11"PO-Revision-Date: 2013-06-27 07:02+0000\n"
12"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
12"Last-Translator: Joakim Langvand <jlangvand@gmail.com>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Søk"
163msgstr "Søk"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/nl.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 16:42+0000\n"
11"PO-Revision-Date: 2014-01-15 16:42+0000\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
12"Last-Translator: Hannie Dumoleyn <Unknown>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "Voeg recensie toe"
114msgid "Send"
113msgid "Send"
115msgstr "Versturen"
114msgstr "Versturen"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "Noodoproep"
122msgstr "Noodoproep"
@@ -159,23 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Zoeken"
163msgstr "Zoeken"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "Voer %1 in"
168msgstr "Voer %1 in"
166−
167−#, qt-format
168−#~ msgid "%1 review"
169−#~ msgid_plural "%1 reviews"
170−#~ msgstr[0] "%1 recensie"
171−#~ msgstr[1] "%1 recensies"
172−
173−#, qt-format
174−#~ msgid "(%1)"
175−#~ msgstr "(%1)"
176−
177−#~ msgid "Comments:"
178−#~ msgstr "Reacties:"
179−
180−#~ msgid "Review"
181−#~ msgstr "Recensie"
po/pl.po+9−24
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-10 11:38+0000\n"
11"PO-Revision-Date: 2014-01-10 11:38+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
18−"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +86,7 @@ msgstr ""
88msgid "See less"
86msgid "See less"
89msgstr ""
87msgstr ""
90
88
91−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
92msgid "Recent"
90msgid "Recent"
93msgstr ""
91msgstr ""
94
92
@@ -117,6 +115,10 @@ msgstr "Dodaj recenzję"
117msgid "Send"
115msgid "Send"
118msgstr "Wyślij"
116msgstr "Wyślij"
119
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
120#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
121msgid "Emergency Call"
123msgid "Emergency Call"
122msgstr "Telefon ratunkowy"
124msgstr "Telefon ratunkowy"
@@ -162,24 +164,7 @@ msgstr ""
162msgid "Search"
164msgid "Search"
163msgstr "Szukaj"
165msgstr "Szukaj"
164
166
165−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
166#, qt-format
168#, qt-format
167msgid "Please enter %1"
169msgid "Please enter %1"
168msgstr "Wprowadź %1"
170msgstr "Wprowadź %1"
169−
170−#~ msgid "Comments:"
171−#~ msgstr "Komentarze:"
172−
173−#~ msgid "Review"
174−#~ msgstr "Recenzja"
175−
176−#, qt-format
177−#~ msgid "%1 review"
178−#~ msgid_plural "%1 reviews"
179−#~ msgstr[0] "%1 opinia"
180−#~ msgstr[1] "%1 opinie"
181−#~ msgstr[2] "%1 opinii"
182−
183−#, qt-format
184−#~ msgid "(%1)"
185−#~ msgstr "(%1)"
po/pt.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 19:18+0000\n"
11"PO-Revision-Date: 2014-01-14 19:18+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/pt_BR.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-18 23:24+0000\n"
11"PO-Revision-Date: 2014-01-18 23:24+0000\n"
12"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
12"Last-Translator: Fábio Nogueira <deb-user-ba@ubuntu.com>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,7 +86,7 @@ msgstr ""
87msgid "See less"
86msgid "See less"
88msgstr ""
87msgstr ""
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92msgstr ""
91msgstr ""
93
92
@@ -116,6 +115,10 @@ msgstr "Adicionar uma análise"
116msgid "Send"
115msgid "Send"
117msgstr "Enviar"
116msgstr "Enviar"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "Chamada de emergência"
124msgstr "Chamada de emergência"
@@ -161,23 +164,7 @@ msgstr ""
161msgid "Search"
164msgid "Search"
162msgstr "Pesquisar"
165msgstr "Pesquisar"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "Por favor, digite %1"
170msgstr "Por favor, digite %1"
168−
169−#, qt-format
170−#~ msgid "(%1)"
171−#~ msgstr "(%1)"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 análise"
177−#~ msgstr[1] "%1 análises"
178−
179−#~ msgid "Comments:"
180−#~ msgstr "Comentários:"
181−
182−#~ msgid "Review"
183−#~ msgstr "Revisão"
po/ro.po+9−7
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 07:53+0000\n"
11"PO-Revision-Date: 2013-06-27 07:53+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18−"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
86msgid "See less"
84msgid "See less"
87msgstr ""
85msgstr ""
88
86
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
88msgid "Recent"
91msgstr ""
89msgstr ""
92
90
@@ -115,6 +113,10 @@ msgstr ""
115msgid "Send"
113msgid "Send"
116msgstr ""
114msgstr ""
117
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
121msgid "Emergency Call"
120msgstr ""
122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160msgid "Search"
162msgid "Search"
161msgstr "Căutare"
163msgstr "Căutare"
162
164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164#, qt-format
166#, qt-format
165msgid "Please enter %1"
167msgid "Please enter %1"
166msgstr ""
168msgstr ""
po/ru.po+9−5
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-04-03 13:07+0000\n"
11"PO-Revision-Date: 2014-04-03 13:07+0000\n"
12"Last-Translator: Zonov Roman <Unknown>\n"
12"Last-Translator: Zonov Roman <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-04-04 07:12+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
18−"X-Generator: Launchpad (build 16976)\n"
18+"X-Generator: Launchpad (build 16985)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -91,7 +91,7 @@ msgstr "Подробнее"
91msgid "See less"
91msgid "See less"
92msgstr "Вкратце"
92msgstr "Вкратце"
93
93
94−#: qml/Dash/DashApps.qml:38
94+#: qml/Dash/DashApps.qml:37
95msgid "Recent"
95msgid "Recent"
96msgstr "Недавние"
96msgstr "Недавние"
97
97
@@ -120,6 +120,10 @@ msgstr "Добавьте отзыв"
120msgid "Send"
120msgid "Send"
121msgstr "Отправить"
121msgstr "Отправить"
122
122
123+#: qml/Greeter/Greeter.qml:151
124+msgid "Swipe to unlock"
125+msgstr ""
126+
123#: qml/Greeter/Lockscreen.qml:149
127#: qml/Greeter/Lockscreen.qml:149
124msgid "Emergency Call"
128msgid "Emergency Call"
125msgstr "Экстренный вызов"
129msgstr "Экстренный вызов"
@@ -165,7 +169,7 @@ msgstr "Введите PIN код"
165msgid "Search"
169msgid "Search"
166msgstr "Поиск"
170msgstr "Поиск"
167
171
168−#: qml/Shell.qml:417
172+#: qml/Shell.qml:348
169#, qt-format
173#, qt-format
170msgid "Please enter %1"
174msgid "Please enter %1"
171msgstr "Пожалуйста, введите %1"
175msgstr "Пожалуйста, введите %1"
po/shn.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/si.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/sl.po+9−25
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-02-21 16:38+0000\n"
11"PO-Revision-Date: 2014-02-21 16:38+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18−"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -90,7 +88,7 @@ msgstr "Pokaži več"
90msgid "See less"
88msgid "See less"
91msgstr "Pokaži manj"
89msgstr "Pokaži manj"
92
90
93−#: qml/Dash/DashApps.qml:38
91+#: qml/Dash/DashApps.qml:37
94msgid "Recent"
92msgid "Recent"
95msgstr ""
93msgstr ""
96
94
@@ -119,6 +117,10 @@ msgstr "Dodaj oceno"
119msgid "Send"
117msgid "Send"
120msgstr "Pošlji"
118msgstr "Pošlji"
121
119
120+#: qml/Greeter/Greeter.qml:151
121+msgid "Swipe to unlock"
122+msgstr ""
123+
122#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
123msgid "Emergency Call"
125msgid "Emergency Call"
124msgstr "Klic v sili"
126msgstr "Klic v sili"
@@ -164,25 +166,7 @@ msgstr "Vnesite PIN kartice SIM"
164msgid "Search"
166msgid "Search"
165msgstr "Iskanje"
167msgstr "Iskanje"
166
168
167−#: qml/Shell.qml:417
169+#: qml/Shell.qml:348
168#, qt-format
170#, qt-format
169msgid "Please enter %1"
171msgid "Please enter %1"
170msgstr "Vnesite %1"
172msgstr "Vnesite %1"
171−
172−#~ msgid "Review"
173−#~ msgstr "Ocena"
174−
175−#~ msgid "Comments:"
176−#~ msgstr "Opombe:"
177−
178−#, qt-format
179−#~ msgid "%1 review"
180−#~ msgid_plural "%1 reviews"
181−#~ msgstr[0] "%1 ocen"
182−#~ msgstr[1] "%1 ocena"
183−#~ msgstr[2] "%1 oceni"
184−#~ msgstr[3] "%1 ocene"
185−
186−#, qt-format
187−#~ msgid "(%1)"
188−#~ msgstr "(%1)"
po/sq.po+9−16
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
13"Language-Team: Albanian <sq@li.org>\n"
13"Language-Team: Albanian <sq@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:43+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +85,7 @@ msgstr ""
86msgid "See less"
85msgid "See less"
87msgstr ""
86msgstr ""
88
87
89−#: qml/Dash/DashApps.qml:38
88+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
89msgid "Recent"
91msgstr ""
90msgstr ""
92
91
@@ -115,6 +114,10 @@ msgstr "Shto një rishikim"
115msgid "Send"
114msgid "Send"
116msgstr ""
115msgstr ""
117
116
117+#: qml/Greeter/Greeter.qml:151
118+msgid "Swipe to unlock"
119+msgstr ""
120+
118#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
122msgid "Emergency Call"
120msgstr ""
123msgstr ""
@@ -160,17 +163,7 @@ msgstr ""
160msgid "Search"
163msgid "Search"
161msgstr ""
164msgstr ""
162
165
163−#: qml/Shell.qml:417
166+#: qml/Shell.qml:348
164#, qt-format
167#, qt-format
165msgid "Please enter %1"
168msgid "Please enter %1"
166msgstr ""
169msgstr ""
167−
168−#, qt-format
169−#~ msgid "%1 review"
170−#~ msgid_plural "%1 reviews"
171−#~ msgstr[0] "%1 rishikim"
172−#~ msgstr[1] "%1 rishikime"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
po/sr.po+9−7
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 09:19+0000\n"
11"PO-Revision-Date: 2013-06-27 09:19+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Serbian <sr@li.org>\n"
13"Language-Team: Serbian <sr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -86,7 +84,7 @@ msgstr ""
86msgid "See less"
84msgid "See less"
87msgstr ""
85msgstr ""
88
86
89−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
90msgid "Recent"
88msgid "Recent"
91msgstr ""
89msgstr ""
92
90
@@ -115,6 +113,10 @@ msgstr ""
115msgid "Send"
113msgid "Send"
116msgstr ""
114msgstr ""
117
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
118#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
119msgid "Emergency Call"
121msgid "Emergency Call"
120msgstr ""
122msgstr ""
@@ -160,7 +162,7 @@ msgstr ""
160msgid "Search"
162msgid "Search"
161msgstr "Претрага"
163msgstr "Претрага"
162
164
163−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
164#, qt-format
166#, qt-format
165msgid "Please enter %1"
167msgid "Please enter %1"
166msgstr ""
168msgstr ""
po/sv.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Swedish <sv@li.org>\n"
13"Language-Team: Swedish <sv@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/sw.po+9−9
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
11"PO-Revision-Date: 2014-01-14 19:28+0000\n"
12"Last-Translator: Damas Mlabwa <Unknown>\n"
12"Last-Translator: Damas Mlabwa <Unknown>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr "Tuma"
114msgstr "Tuma"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,10 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "Tafuta"
163msgstr "Tafuta"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "Maoni:"
po/ta.po+10−23
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12−"Last-Translator: Arun Kumar -அருண் குமார் <thangam.arunx@gmail.com>\n"
12+"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20"Language: ta\n"
19"Language: ta\n"
21
20
22#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -88,7 +87,7 @@ msgstr ""
88msgid "See less"
87msgid "See less"
89msgstr ""
88msgstr ""
90
89
91−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
92msgid "Recent"
91msgid "Recent"
93msgstr ""
92msgstr ""
94
93
@@ -117,6 +116,10 @@ msgstr "ஒரு பரிசீலனையை சேர்"
117msgid "Send"
116msgid "Send"
118msgstr "அனுப்பு"
117msgstr "அனுப்பு"
119
118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
120#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
121msgid "Emergency Call"
124msgid "Emergency Call"
122msgstr "அவசர அழைப்பு"
125msgstr "அவசர அழைப்பு"
@@ -162,23 +165,7 @@ msgstr ""
162msgid "Search"
165msgid "Search"
163msgstr "தெடு"
166msgstr "தெடு"
164
167
165−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
166#, qt-format
169#, qt-format
167msgid "Please enter %1"
170msgid "Please enter %1"
168msgstr "தயவுச்செய்து %1 உள்ளிடு"
171msgstr "தயவுச்செய்து %1 உள்ளிடு"
169−
170−#, qt-format
171−#~ msgid "(%1)"
172−#~ msgstr "(%1)"
173−
174−#, qt-format
175−#~ msgid "%1 review"
176−#~ msgid_plural "%1 reviews"
177−#~ msgstr[0] "%1 பரிசீலனை"
178−#~ msgstr[1] "%1 பரிசீலனைகள்"
179−
180−#~ msgid "Review"
181−#~ msgstr "மறுஆய்வு"
182−
183−#~ msgid "Comments:"
184−#~ msgstr "கருத்துகள்:"
po/te.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-06-27 09:57+0000\n"
11"PO-Revision-Date: 2013-06-27 09:57+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/tr.po+9−22
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-03-05 08:54+0000\n"
11"PO-Revision-Date: 2014-03-05 08:54+0000\n"
12"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
12"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -88,7 +87,7 @@ msgstr "Daha fazlası"
88msgid "See less"
87msgid "See less"
89msgstr "Daha azını gör"
88msgstr "Daha azını gör"
90
89
91−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
92msgid "Recent"
91msgid "Recent"
93msgstr ""
92msgstr ""
94
93
@@ -117,6 +116,10 @@ msgstr "Bir inceleme ekle"
117msgid "Send"
116msgid "Send"
118msgstr "Gönder"
117msgstr "Gönder"
119
118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
120#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
121msgid "Emergency Call"
124msgid "Emergency Call"
122msgstr "Acil Arama"
125msgstr "Acil Arama"
@@ -162,23 +165,7 @@ msgstr "Lütfen SIM PIN'inizi girin"
162msgid "Search"
165msgid "Search"
163msgstr "Ara"
166msgstr "Ara"
164
167
165−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
166#, qt-format
169#, qt-format
167msgid "Please enter %1"
170msgid "Please enter %1"
168msgstr "Lütfen %1 girin"
171msgstr "Lütfen %1 girin"
169−
170−#~ msgid "Review"
171−#~ msgstr "İnceleme"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 inceleme"
177−#~ msgstr[1] "%1 inceleme"
178−
179−#, qt-format
180−#~ msgid "(%1)"
181−#~ msgstr "(%1)"
182−
183−#~ msgid "Comments:"
184−#~ msgstr "Yorumlar:"
po/ug.po+15−27
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11−"PO-Revision-Date: 2014-02-15 12:09+0000\n"
11+"PO-Revision-Date: 2014-04-22 05:46+0000\n"
12−"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12+"Last-Translator: abdurahman <Unknown>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,22 +86,22 @@ msgstr "جىقراق كۆرۈش"
87msgid "See less"
86msgid "See less"
88msgstr "ئازراق كۆرۈش"
87msgstr "ئازراق كۆرۈش"
89
88
90−#: qml/Dash/DashApps.qml:38
89+#: qml/Dash/DashApps.qml:37
91msgid "Recent"
90msgid "Recent"
92−msgstr ""
91+msgstr "يېقىنقى"
93
92
94#: qml/Dash/PreviewListView.qml:52
93#: qml/Dash/PreviewListView.qml:52
95#, qt-format
94#, qt-format
96msgid "%1 Preview"
95msgid "%1 Preview"
97−msgstr ""
96+msgstr "%1 ئالدىن كۆرۈپ بىقىش"
98
97
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
100msgid "More..."
99msgid "More..."
101−msgstr ""
100+msgstr "تېخىمۇ كۆپ…"
102
101
103#: qml/Dash/Previews/PreviewActionCombo.qml:34
102#: qml/Dash/Previews/PreviewActionCombo.qml:34
104msgid "Less..."
103msgid "Less..."
105−msgstr ""
104+msgstr "ئازراق..."
106
105
107#: qml/Dash/Previews/PreviewRatingInput.qml:81
106#: qml/Dash/Previews/PreviewRatingInput.qml:81
108msgid "Rate this"
107msgid "Rate this"
@@ -116,6 +115,10 @@ msgstr "باھا قوشۇش"
116msgid "Send"
115msgid "Send"
117msgstr "ئەۋەت"
116msgstr "ئەۋەت"
118
117
118+#: qml/Greeter/Greeter.qml:151
119+msgid "Swipe to unlock"
120+msgstr ""
121+
119#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
120msgid "Emergency Call"
123msgid "Emergency Call"
121msgstr "جىددىي تېلېفون"
124msgstr "جىددىي تېلېفون"
@@ -161,22 +164,7 @@ msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
161msgid "Search"
164msgid "Search"
162msgstr "ئىزدە"
165msgstr "ئىزدە"
163
166
164−#: qml/Shell.qml:417
167+#: qml/Shell.qml:348
165#, qt-format
168#, qt-format
166msgid "Please enter %1"
169msgid "Please enter %1"
167msgstr "%1 نى كىرگۈزۈڭ"
170msgstr "%1 نى كىرگۈزۈڭ"
168−
169−#, qt-format
170−#~ msgid "%1 review"
171−#~ msgid_plural "%1 reviews"
172−#~ msgstr[0] "%1 باھا"
173−
174−#, qt-format
175−#~ msgid "(%1)"
176−#~ msgstr "(%1)"
177−
178−#~ msgid "Comments:"
179−#~ msgstr "ئىنكاس:"
180−
181−#~ msgid "Review"
182−#~ msgstr "تەكشۈر"
po/uk.po+9−24
@@ -7,17 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-11-23 12:37+0000\n"
11"PO-Revision-Date: 2013-11-23 12:37+0000\n"
12"Last-Translator: Ignat Kizenko <Unknown>\n"
12"Last-Translator: Ignat Kizenko <Unknown>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
18−"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
20−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
21
19
22#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,7 +87,7 @@ msgstr ""
89msgid "See less"
87msgid "See less"
90msgstr ""
88msgstr ""
91
89
92−#: qml/Dash/DashApps.qml:38
90+#: qml/Dash/DashApps.qml:37
93msgid "Recent"
91msgid "Recent"
94msgstr ""
92msgstr ""
95
93
@@ -118,6 +116,10 @@ msgstr "Додати рецензію"
118msgid "Send"
116msgid "Send"
119msgstr "Надіслати"
117msgstr "Надіслати"
120
118
119+#: qml/Greeter/Greeter.qml:151
120+msgid "Swipe to unlock"
121+msgstr ""
122+
121#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
122msgid "Emergency Call"
124msgid "Emergency Call"
123msgstr "Терміновий виклик"
125msgstr "Терміновий виклик"
@@ -163,24 +165,7 @@ msgstr ""
163msgid "Search"
165msgid "Search"
164msgstr "Пошук"
166msgstr "Пошук"
165
167
166−#: qml/Shell.qml:417
168+#: qml/Shell.qml:348
167#, qt-format
169#, qt-format
168msgid "Please enter %1"
170msgid "Please enter %1"
169msgstr "Будь ласка, введіть %1"
171msgstr "Будь ласка, введіть %1"
170−
171−#~ msgid "Comments:"
172−#~ msgstr "Коментарі:"
173−
174−#~ msgid "Review"
175−#~ msgstr "Рецензія"
176−
177−#, qt-format
178−#~ msgid "%1 review"
179−#~ msgid_plural "%1 reviews"
180−#~ msgstr[0] "%1 рецензія"
181−#~ msgstr[1] "%1 рецензії"
182−#~ msgstr[2] "%1 рецензій"
183−
184−#, qt-format
185−#~ msgid "(%1)"
186−#~ msgstr "(%1)"
po/unity8.pot+7−3
@@ -8,7 +8,7 @@ msgid ""
8msgstr ""
8msgstr ""
9"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
10"Report-Msgid-Bugs-To: \n"
10"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -84,7 +84,7 @@ msgstr ""
84msgid "See less"
84msgid "See less"
85msgstr ""
85msgstr ""
86
86
87−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
88msgid "Recent"
88msgid "Recent"
89msgstr ""
89msgstr ""
90
90
@@ -113,6 +113,10 @@ msgstr ""
113msgid "Send"
113msgid "Send"
114msgstr ""
114msgstr ""
115
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
116#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
117msgid "Emergency Call"
121msgid "Emergency Call"
118msgstr ""
122msgstr ""
@@ -158,7 +162,7 @@ msgstr ""
158msgid "Search"
162msgid "Search"
159msgstr ""
163msgstr ""
160
164
161−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
162#, qt-format
166#, qt-format
163msgid "Please enter %1"
167msgid "Please enter %1"
164msgstr ""
168msgstr ""
po/vi.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/xh.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr ""
163msgstr ""
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/zh_CN.po+9−6
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2013-10-09 13:51+0000\n"
11"PO-Revision-Date: 2013-10-09 13:51+0000\n"
12"Last-Translator: Aron Xu <Unknown>\n"
12"Last-Translator: Aron Xu <Unknown>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr ""
114msgid "Send"
113msgid "Send"
115msgstr ""
114msgstr ""
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr ""
122msgstr ""
@@ -159,7 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "搜索"
163msgstr "搜索"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
po/zh_HK.po+9−21
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-25 13:32+0000\n"
11"PO-Revision-Date: 2014-01-25 13:32+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "新增評論"
114msgid "Send"
113msgid "Send"
115msgstr "傳送"
114msgstr "傳送"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "緊急電話"
122msgstr "緊急電話"
@@ -159,22 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "搜尋"
163msgstr "搜尋"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr "請輸入 %1"
168msgstr "請輸入 %1"
166−
167−#~ msgid "Comments:"
168−#~ msgstr "評論:"
169−
170−#~ msgid "Review"
171−#~ msgstr "評論"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 評論"
177−
178−#, qt-format
179−#~ msgid "(%1)"
180−#~ msgstr "(%1)"
po/zh_TW.po+9−21
@@ -7,16 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-03-25 16:48+0100\n"
10+"POT-Creation-Date: 2014-04-10 11:13-0400\n"
11"PO-Revision-Date: 2014-01-16 06:04+0000\n"
11"PO-Revision-Date: 2014-01-16 06:04+0000\n"
12"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
12"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
17+"X-Launchpad-Export-Date: 2014-05-01 06:44+0000\n"
19−"X-Generator: Launchpad (build 16967)\n"
18+"X-Generator: Launchpad (build 16985)\n"
20
19
21#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,7 +84,7 @@ msgstr ""
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/DashApps.qml:38
87+#: qml/Dash/DashApps.qml:37
89msgid "Recent"
88msgid "Recent"
90msgstr ""
89msgstr ""
91
90
@@ -114,6 +113,10 @@ msgstr "新增回覆"
114msgid "Send"
113msgid "Send"
115msgstr "發送"
114msgstr "發送"
116
115
116+#: qml/Greeter/Greeter.qml:151
117+msgid "Swipe to unlock"
118+msgstr ""
119+
117#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
118msgid "Emergency Call"
121msgid "Emergency Call"
119msgstr "緊急連絡"
122msgstr "緊急連絡"
@@ -159,22 +162,7 @@ msgstr ""
159msgid "Search"
162msgid "Search"
160msgstr "搜尋"
163msgstr "搜尋"
161
164
162−#: qml/Shell.qml:417
165+#: qml/Shell.qml:348
163#, qt-format
166#, qt-format
164msgid "Please enter %1"
167msgid "Please enter %1"
165msgstr ""
168msgstr ""
166−
167−#~ msgid "Comments:"
168−#~ msgstr "備註:"
169−
170−#~ msgid "Review"
171−#~ msgstr "回覆"
172−
173−#, qt-format
174−#~ msgid "%1 review"
175−#~ msgid_plural "%1 reviews"
176−#~ msgstr[0] "%1 回覆"
177−
178−#, qt-format
179−#~ msgid "(%1)"
180−#~ msgstr "(%1)"
qml/Bottombar/Bottombar.qmldeleted−227
@@ -1,227 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import "../Components"
19−import Utils 0.1
20−import Unity.Application 0.1
21−import Ubuntu.Gestures 0.1
22−import Ubuntu.Components 0.1
23−
24−Item {
25− id: bottombar
26−
27− // Whether there's an application on foreground (as opposed to have shell's Dash on foreground)
28− property bool applicationIsOnForeground
29−
30− property variant theHud
31− property bool enabled: false
32− property bool preventHiding: dragArea.dragging
33− readonly property real bottomEdgeButtonCenterDistance: units.gu(34)
34−
35− state: "hidden"
36−
37− function hide() {
38− dismissTimer.stop()
39− bottombar.state = "hidden"
40− }
41−
42− onApplicationIsOnForegroundChanged: {
43− if (!applicationIsOnForeground) {
44− hide()
45− }
46− }
47−
48− onStateChanged: {
49− if (state == "hidden") {
50− dismissTimer.stop()
51− bottomBarVisibilityCommunicatorShell.forceHidden = false
52− } else {
53− dismissTimer.restart()
54− }
55− }
56−
57− onPreventHidingChanged: {
58− if (!preventHiding) {
59− if (state == "hint" || state == "reveal")
60− hide()
61− }
62−
63− if (dismissTimer.running) {
64− dismissTimer.restart();
65− }
66− }
67−
68− Timer {
69− id: dismissTimer
70− interval: 1000
71− onTriggered: {
72− if (!bottombar.preventHiding) {
73− bottombar.state = "hidden"
74− } else {
75− dismissTimer.restart()
76− }
77− }
78− }
79−
80− HudButton {
81− id: hudButton
82−
83− readonly property bool centeredHud: parent.width < units.gu(68) // Nexus 7 has 67 gu width
84−
85− x: centeredHud ? parent.width / 2 - width / 2 : MathUtils.clamp(dragArea.touchStartX - (width / 2), 0, bottombar.width - width)
86− y: bottombar.height - bottomEdgeButtonCenterDistance - (height / 2) - bottomMargin
87− z: 1
88− visible: opacity != 0
89−
90− mouseOver: {
91− if (dragArea.status === DirectionalDragArea.Recognized) {
92− var touchLocal = mapFromItem(dragArea, dragArea.touchX, dragArea.touchY)
93− return touchLocal.x > 0 && touchLocal.x < width
94− && touchLocal.y > 0 && touchLocal.y < height
95− } else {
96− return false
97− }
98− }
99−
100− onClicked: theHud.show()
101−
102− Behavior on bottomMargin {
103− NumberAnimation{duration: hudButton.opacity < 0.01 ? 200 : 70; easing.type: Easing.OutQuart}
104− }
105−
106− Behavior on opacity {
107− NumberAnimation{duration: 200; easing.type: Easing.OutCubic}
108− }
109− }
110−
111− Connections {
112− target: theHud
113− onShownChanged: {
114− bottomBarVisibilityCommunicatorShell.forceHidden = theHud.shown
115− if (theHud.shown) {
116− bottombar.state = "hidden"
117− }
118− }
119− }
120−
121− EdgeDragArea {
122− id: dragArea
123− objectName: "hudDragArea"
124− width: parent.width
125− height: shell.edgeSize
126− anchors.bottom: parent.bottom
127−
128− distanceThreshold: units.gu(8)
129− enabled: !theHud.shown && bottombar.enabled && applicationIsOnForeground
130− direction: Direction.Upwards
131− maxSilenceTime: 2000
132−
133− property int previousStatus: -1
134− property real touchStartX: -1
135−
136− readonly property real distanceFromThreshold: (-distance) - distanceThreshold // distance is negative
137− readonly property real revealDistance: units.gu(2)
138− readonly property real commitDistance: units.gu(6)
139− readonly property real commitProgress: MathUtils.clamp(distanceFromThreshold / commitDistance, 0, 1)
140−
141− onStatusChanged: {
142− if (status === DirectionalDragArea.WaitingForTouch) {
143− if (previousStatus == DirectionalDragArea.Recognized) {
144− if (hudButton.mouseOver) {
145− hudButton.clicked()
146− }
147− }
148− } else if (status === DirectionalDragArea.Undecided) {
149− if (!hudButton.centeredHud) {
150− touchStartX = touchX
151− }
152− } else if (status === DirectionalDragArea.Recognized) {
153− bottombar.state = "hint"
154− }
155− previousStatus = status
156− }
157−
158− onDistanceChanged: {
159− if (status === DirectionalDragArea.Recognized) {
160− if (distanceFromThreshold > commitDistance)
161− bottombar.state = "shown"
162− else if (distanceFromThreshold > revealDistance)
163− bottombar.state = "reveal"
164− }
165− }
166− }
167−
168− Item {
169− id: dismissArea
170− anchors {
171− top: parent.top
172− left: parent.left
173− right: parent.right
174− }
175− height: parent.height - bottomBarVisibilityCommunicatorShell.position
176−
177− MouseArea {
178− anchors.fill: parent
179− enabled: bottombar.state == "shown"
180− onPressed: {
181− bottomBarVisibilityCommunicatorShell.forceHidden = true
182− bottombar.state = "hidden"
183− }
184− }
185−
186− InputFilterArea {
187− anchors.fill: parent
188− blockInput: (hudButton.opacity == 1)
189− }
190− }
191−
192− MouseArea {
193− anchors {
194− top: dismissArea.bottom
195− left: parent.left
196− right: parent.right
197− bottom: parent.bottom
198− }
199− enabled: bottombar.state == "shown" && bottomBarVisibilityCommunicatorShell.position > 0
200− onPressed: {
201− bottombar.state = "hidden"
202− }
203− }
204−
205− states: [
206− State {
207− name: "hidden"
208− PropertyChanges { target: hudButton; opacity: 0 }
209− PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) }
210− },
211− State {
212− name: "hint"
213− extend: "hidden"
214− PropertyChanges { target: hudButton; opacity: 0.5 }
215− },
216− State {
217− name: "reveal"
218− extend: "hint"
219− PropertyChanges { target: hudButton; bottomMargin: units.gu(-2) + units.gu(2) * dragArea.commitProgress }
220− },
221− State {
222− name: "shown"
223− PropertyChanges { target: hudButton; opacity: 1 }
224− PropertyChanges { target: hudButton; bottomMargin: units.gu(0) }
225− }
226− ]
227−}
qml/Bottombar/HudButton.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−Item {
21− id: item
22−
23− property bool mouseOver
24−
25− property int bottomMargin: units.gu(2)
26−
27− signal clicked()
28−
29− readonly property real scaleOnMouseOver: 1.2
30−
31− width: hudButton.width * scaleOnMouseOver
32− height: hudButton.height * scaleOnMouseOver
33−
34− Item {
35− id: hudButton
36−
37− anchors.centerIn: parent
38− height: units.gu(12)
39− width: height
40− opacity: item.mouseOver || abstractButton.pressed ? 1 : 0.7
41− scale: item.mouseOver || abstractButton.pressed ? scaleOnMouseOver : 1
42− Behavior on opacity {NumberAnimation{duration: 200; easing.type: Easing.OutQuart}}
43− Behavior on scale {NumberAnimation{duration: 200; easing.type: Easing.OutQuart}}
44−
45− AbstractButton {
46− id: abstractButton
47− anchors.fill: parent
48− style: Image {
49− anchors.fill: parent
50− source: "graphics/hud_invoke_button_active.png"
51− }
52−
53− onClicked: item.clicked()
54− }
55−
56− Image {
57− width: units.gu(4)
58− height: width
59− source: "graphics/hud.png"
60− anchors.centerIn: parent
61− fillMode: Image.PreserveAspectFit
62− }
63− }
64−}
qml/Bottombar/graphics/hud@20.pngdeleted

Binary file not shown.

qml/Bottombar/graphics/hud_invoke_button_active@20.pngdeleted

Binary file not shown.

qml/CMakeLists.txt−1
@@ -5,7 +5,6 @@ install(FILES ${QML_JS_FILES}
5 )
5 )
6
6
7set(QML_DIRS
7set(QML_DIRS
8− Bottombar
9 Components
8 Components
10 Dash
9 Dash
11 graphics
10 graphics
qml/Components/AnimationControllerWithSignals.qmldeleted−64
@@ -1,64 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−AnimationController {
20− signal animationCompletedAtBeginning()
21− signal animationCompletedAtEnd()
22− readonly property bool completed: progress == 1.0 || progress == 0.0
23− property bool completing: false
24−
25− function __completeAtBeginning() {
26− completing = false;
27− animationCompletedAtBeginning();
28− }
29−
30− function __completeAtEnd() {
31− completing = false;
32− animationCompletedAtEnd();
33− }
34−
35− function completeToBeginningWithSignal() {
36− if (progress == 0.0) {
37− __completeAtBeginning()
38− } else {
39− completing = true;
40− completeToBeginning();
41− }
42− }
43−
44− function completeToEndWithSignal() {
45− if (progress == 1.0) {
46− __completeAtEnd()
47− } else {
48− completing = true;
49− completeToEnd();
50− }
51− }
52−
53− onProgressChanged: {
54− if (!completing) {
55− return;
56− }
57−
58− if (progress == 0.0) {
59− __completeAtBeginning()
60− } else if (progress == 1.0) {
61− __completeAtEnd()
62− }
63− }
64−}
qml/Components/Carousel.qml+13−19
@@ -75,6 +75,7 @@ Item {
75 The scaling of the items is controlled by the variable continuousIndex, described below. */
75 The scaling of the items is controlled by the variable continuousIndex, described below. */
76 ListView {
76 ListView {
77 id: listView
77 id: listView
78+ objectName: "listView"
78
79
79 property int highlightIndex: -1
80 property int highlightIndex: -1
80 property real minimumTileWidth: 0
81 property real minimumTileWidth: 0
@@ -148,15 +149,19 @@ Item {
148 maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
149 maximumFlickVelocity: Math.max(2500 * Math.pow(realWidth / referenceWidth, 1.5), 2500) // 2500 is platform default
149 orientation: ListView.Horizontal
150 orientation: ListView.Horizontal
150
151
151− function itemClicked(index, delegateItem) {
152+ function getXFromContinuousIndex(index) {
152− listView.currentIndex = index
153− var x = CarouselJS.getXFromContinuousIndex(index,
153+ return CarouselJS.getXFromContinuousIndex(index,
154 realWidth,
154 realWidth,
155− realContentWidth,
155+ footerItem.x,
156 tileWidth,
156 tileWidth,
157 gapToMiddlePhase,
157 gapToMiddlePhase,
158 gapToEndPhase,
158 gapToEndPhase,
159 carousel.drawBuffer)
159 carousel.drawBuffer)
160+ }
161+
162+ function itemClicked(index, delegateItem) {
163+ listView.currentIndex = index
164+ var x = getXFromContinuousIndex(index);
160
165
161 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
166 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
162 /* We're clicking the selected item and
167 /* We're clicking the selected item and
@@ -174,13 +179,7 @@ Item {
174 }
179 }
175
180
176 function itemPressAndHold(index, delegateItem) {
181 function itemPressAndHold(index, delegateItem) {
177− var x = CarouselJS.getXFromContinuousIndex(index,
182+ var x = getXFromContinuousIndex(index);
178− realWidth,
179− realContentWidth,
180− tileWidth,
181− gapToMiddlePhase,
182− gapToEndPhase,
183− carousel.drawBuffer);
184
183
185 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
184 if (Math.abs(x - contentX) < 1 && delegateItem !== undefined) {
186 /* We're pressAndHold the selected item and
185 /* We're pressAndHold the selected item and
@@ -209,22 +208,17 @@ Item {
209 newContentX = disabledNewContentX
208 newContentX = disabledNewContentX
210 }
209 }
211 onMovementEnded: {
210 onMovementEnded: {
212− if (realContentX > 0 && realContentX < realContentWidth - realWidth)
211+ if (realContentX > 0)
213 stepAnimation.start()
212 stepAnimation.start()
214 }
213 }
215
214
216 SmoothedAnimation {
215 SmoothedAnimation {
217 id: stepAnimation
216 id: stepAnimation
217+ objectName: "stepAnimation"
218
218
219 target: listView
219 target: listView
220 property: "contentX"
220 property: "contentX"
221− to: CarouselJS.getXFromContinuousIndex(listView.selectedIndex,
221+ to: listView.getXFromContinuousIndex(listView.selectedIndex)
222− listView.realWidth,
223− listView.realContentWidth,
224− listView.tileWidth,
225− listView.gapToMiddlePhase,
226− listView.gapToEndPhase,
227− carousel.drawBuffer)
228 duration: 450
222 duration: 450
229 velocity: 200
223 velocity: 200
230 easing.type: Easing.InOutQuad
224 easing.type: Easing.InOutQuad
qml/Components/FilterGrid.qml+38−24
@@ -28,11 +28,6 @@ import "../Components"
28Item {
28Item {
29 id: root
29 id: root
30
30
31− /* If true, the number of elements displayed will be limited by collapsedRowCount.
32− If false, all elements will be displayed, effectively looking the same as a regular
33− ResponsiveGridView. */
34− property bool filter: true
35−
36 /* Whether, when collapsed, a button should be displayed enabling the user to expand
31 /* Whether, when collapsed, a button should be displayed enabling the user to expand
37 the grid to its full size. */
32 the grid to its full size. */
38 readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
33 readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
@@ -59,35 +54,54 @@ Item {
59 property alias cellHeight: iconTileGrid.cellHeight
54 property alias cellHeight: iconTileGrid.cellHeight
60 property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
55 property alias delegateCreationBegin: iconTileGrid.delegateCreationBegin
61 property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
56 property alias delegateCreationEnd: iconTileGrid.delegateCreationEnd
57+ readonly property alias originY: iconTileGrid.originY
62 readonly property alias flicking: iconTileGrid.flicking
58 readonly property alias flicking: iconTileGrid.flicking
63 readonly property alias moving: iconTileGrid.moving
59 readonly property alias moving: iconTileGrid.moving
64 readonly property alias pressDelay: iconTileGrid.pressDelay
60 readonly property alias pressDelay: iconTileGrid.pressDelay
65 property alias highlightIndex: iconTileGrid.highlightIndex
61 property alias highlightIndex: iconTileGrid.highlightIndex
66 readonly property alias currentItem: iconTileGrid.currentItem
62 readonly property alias currentItem: iconTileGrid.currentItem
63+ readonly property alias filtered: d.filter
64+
65+ QtObject {
66+ id: d
67+ // We do have filter and collapsed properties because we need to decouple
68+ // the real filtering with the animation since the closing animation
69+ // i.e. setFilter(false. true) we still need to not be filtering until
70+ // the animation finishes otherwise we hide the items when the animation
71+ // is still running
72+ property bool filter: true
73+ property bool collapsed: true
74+ }
67
75
68− height: !filterAnimation.running ? childrenRect.height : height
76+ height: d.collapsed ? root.collapsedHeight : root.uncollapsedHeight
69 clip: filterAnimation.running
77 clip: filterAnimation.running
70
78
79+ Behavior on height {
80+ id: heightBehaviour
81+ enabled: false
71− NumberAnimation {
82+ NumberAnimation {
72− property bool filterEndValue
73− id: filterAnimation
83+ id: filterAnimation
74− target: root
75− property: "height"
76− to: filterEndValue ? root.collapsedHeight : root.uncollapsedHeight
77− // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
84+ // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
78− // otherwise since both animations can run at the same time you'll get
85+ // otherwise since both animations can run at the same time you'll get
79− // some visual weirdness.
86+ // some visual weirdness.
80− duration: 200
87+ duration: 200
81− easing.type: Easing.InOutQuad
88+ easing.type: Easing.InOutQuad
82− onStopped: {
89+ onRunningChanged: {
83− root.filter = filterEndValue;
90+ if (!running) {
91+ d.filter = d.collapsed;
92+ }
93+ heightBehaviour.enabled = false;
94+ }
84 }
95 }
85 }
96 }
86
97
87− function startFilterAnimation(filter) {
98+ function setFilter(filter, animate) {
88− filterAnimation.filterEndValue = filter
99+ heightBehaviour.enabled = animate;
89− filterAnimation.start();
100+ d.collapsed = filter;
101+ if (!animate || !filter) {
102+ d.filter = filter;
103+ }
90− }
104+ }
91
105
92 ResponsiveGridView {
106 ResponsiveGridView {
93 id: iconTileGrid
107 id: iconTileGrid
@@ -104,7 +118,7 @@ Item {
104
118
105 model: LimitProxyModel {
119 model: LimitProxyModel {
106 model: root.model
120 model: root.model
107− limit: (filter && !filterAnimation.running) ? rowsWhenCollapsed * iconTileGrid.columns : -1
121+ limit: d.filter ? rowsWhenCollapsed * iconTileGrid.columns : -1
108 }
122 }
109 }
123 }
110}
124}
qml/Components/LazyImage.qml+1
@@ -36,6 +36,7 @@ Item {
36 property alias cache: image.cache
36 property alias cache: image.cache
37 property alias horizontalAlignment: image.horizontalAlignment
37 property alias horizontalAlignment: image.horizontalAlignment
38 property alias verticalAlignment: image.verticalAlignment
38 property alias verticalAlignment: image.verticalAlignment
39+ property alias sourceImage: image
39
40
40 state: "default"
41 state: "default"
41
42
qml/Components/ResponsiveGridView.qml+1
@@ -40,6 +40,7 @@ Item {
40 readonly property alias flicking: gridView.flicking
40 readonly property alias flicking: gridView.flicking
41 readonly property alias moving: gridView.moving
41 readonly property alias moving: gridView.moving
42 readonly property alias pressDelay: gridView.pressDelay
42 readonly property alias pressDelay: gridView.pressDelay
43+ readonly property alias originY: gridView.originY
43 property alias delegateCreationBegin: gridView.delegateCreationBegin
44 property alias delegateCreationBegin: gridView.delegateCreationBegin
44 property alias delegateCreationEnd: gridView.delegateCreationEnd
45 property alias delegateCreationEnd: gridView.delegateCreationEnd
45 property alias highlightIndex: gridView.highlightIndex
46 property alias highlightIndex: gridView.highlightIndex
qml/Components/ZoomableImage.qmlnew file+153
@@ -0,0 +1,153 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+
21+/*! \brief Zoomable for image.
22+
23+ This widget shows image contained in source,
24+ can be zoomable accordingly with zoomable.
25+ */
26+
27+Item {
28+ id: root
29+ property alias source: lazyImage.source
30+ property var zoomable: false
31+ property alias imageState: lazyImage.state
32+ property alias scaleTo: lazyImage.scaleTo
33+ property alias asynchronous: lazyImage.asynchronous
34+
35+ Flickable {
36+ id: flickable
37+ objectName: "flickable"
38+ clip: true
39+ contentHeight: imageContainer.height
40+ contentWidth: imageContainer.width
41+
42+ onHeightChanged: image.resetScale()
43+ onWidthChanged: image.resetScale()
44+ anchors.fill: parent
45+
46+ Item {
47+ id: imageContainer
48+ objectName: "imageContainer"
49+ width: Math.max(image.width * image.scale, flickable.width)
50+ height: Math.max(image.height * image.scale, flickable.height)
51+
52+ Item {
53+ id: image
54+ objectName: "image"
55+ property alias imageState: lazyImage.state
56+ property var prevScale
57+ anchors.centerIn: parent
58+
59+ signal imageReloaded
60+
61+ LazyImage {
62+ id: lazyImage
63+ objectName: "lazyImage"
64+ smooth: !flickable.movingVertically
65+ anchors.fill: parent
66+ fillMode: Image.PreserveAspectFit
67+ scaleTo: "fit"
68+
69+ onStateChanged: {
70+ if (state == "ready") {
71+ image.imageReloaded();
72+ }
73+ }
74+ }
75+
76+ onImageReloaded: {
77+ image.height = lazyImage.sourceImage.implicitHeight
78+ image.width = lazyImage.sourceImage.implicitWidth
79+ image.resetScale();
80+ }
81+
82+ function resetScale() {
83+ image.scale = Math.min(flickable.width / image.width, flickable.height / image.height);
84+ pinchArea.minScale = image.scale;
85+ prevScale = Math.min(image.scale, 1);
86+ }
87+
88+ onScaleChanged: {
89+ var currentWidth = width * scale
90+ var currentHeight = height * scale
91+ var scaleRatio = scale / prevScale
92+ if (currentWidth > flickable.width) {
93+ var xpos = flickable.width / 2 + flickable.contentX;
94+ var xoff = xpos * scaleRatio;
95+ flickable.contentX = xoff - flickable.width / 2;
96+ }
97+ if (currentHeight > flickable.height) {
98+ var ypos = flickable.height / 2 + flickable.contentY;
99+ var yoff = ypos * scaleRatio;
100+ flickable.contentY = yoff - flickable.height / 2;
101+ }
102+ prevScale = scale;
103+ }
104+ }
105+ }
106+
107+ PinchArea {
108+ id: pinchArea
109+ objectName: "pinchArea"
110+ property real minScale: 1.0
111+ anchors.fill: parent
112+ enabled: zoomable ? zoomable : false
113+
114+ pinch.target: image
115+ pinch.minimumScale: minScale
116+ pinch.maximumScale: 10
117+
118+ onPinchFinished: flickable.returnToBounds()
119+ }
120+
121+ MouseArea {
122+ id: mouseArea
123+ objectName: "mouseArea"
124+
125+ anchors.fill: parent
126+ enabled: zoomable ? zoomable : false
127+
128+ onWheel: {
129+ var startScale = image.scale;
130+ if (wheel.angleDelta.y > 0) {
131+ image.scale = startScale + 0.1;
132+ } else if (wheel.angleDelta.y < 0) {
133+ if (image.scale > 0.1 && image.scale > pinchArea.minScale) {
134+ image.scale = startScale - 0.1;
135+ }
136+ }
137+ wheel.accepted = true;
138+ }
139+
140+ onPressed: {
141+ mouse.accepted = false;
142+ }
143+
144+ onReleased: {
145+ mouse.accepted = false;
146+ }
147+
148+ onClicked: {
149+ mouse.accepted = false;
150+ }
151+ }
152+ }
153+}
qml/Dash/Card.qml+99−79
@@ -25,47 +25,53 @@ AbstractButton {
25 property var components
25 property var components
26 property var cardData
26 property var cardData
27
27
28− property alias fontScale: header.fontScale
28+ property real fontScale: 1.0
29− property alias headerAlignment: header.headerAlignment
29+ property int headerAlignment: Text.AlignLeft
30− property alias headerHeight: header.height
30+ readonly property int headerHeight: headerLoader.item ? headerLoader.item.height : 0
31+ property int fixedHeaderHeight: -1
31− readonly property alias title: header.title
32+ readonly property string title: cardData && cardData["title"] || ""
32
33
33 property bool showHeader: true
34 property bool showHeader: true
34
35
35 implicitWidth: childrenRect.width
36 implicitWidth: childrenRect.width
36− implicitHeight: summary.y + summary.height + (summary.text && background.visible ? units.gu(1) : 0)
37+ implicitHeight: summary.y + summary.height + (summary.text && backgroundLoader.active ? units.gu(1) : 0)
37
38
38− UbuntuShape {
39+ Loader {
39− id: background
40+ id: backgroundLoader
40− objectName: "background"
41+ objectName: "backgroundLoader"
41− radius: "medium"
42− visible: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"]
43− || artAndSummary)
44− property bool artAndSummary: components["art"]["field"] && components["summary"] || false
45− color: getColor(0) || "white"
46− gradientColor: getColor(1) || color
47− anchors.fill: parent
48− image: backgroundImage.source ? backgroundImage : null
49
42
50− property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
43+ readonly property bool artAndSummary: components["art"]["field"] && components["summary"] || false
44+ active: template["card-layout"] !== "horizontal" && (template["card-background"] || components["background"] || artAndSummary)
45+ anchors.fill: parent
51
46
47+ sourceComponent: UbuntuShape {
48+ objectName: "background"
49+ radius: "medium"
50+ color: getColor(0) || "white"
51+ gradientColor: getColor(1) || color
52+ anchors.fill: parent
53+ image: backgroundImage.source ? backgroundImage : null
54+
55+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
56+
52− property Image backgroundImage: Image {
57+ property Image backgroundImage: Image {
53− objectName: "backgroundImage"
58+ objectName: "backgroundImage"
54− source: {
59+ source: {
55− if (cardData && typeof cardData["background"] === "string") return cardData["background"]
60+ if (cardData && typeof cardData["background"] === "string") return cardData["background"]
56− else if (template && typeof template["card-background"] === "string") return template["card-background"]
61+ else if (template && typeof template["card-background"] === "string") return template["card-background"]
57− else return ""
62+ else return ""
63+ }
58 }
64 }
59− }
60
65
61− function getColor(index) {
66+ function getColor(index) {
62− if (cardData && typeof cardData["background"] === "object"
67+ if (cardData && typeof cardData["background"] === "object"
63− && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
68+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
64− return cardData["background"]["elements"][index];
69+ return cardData["background"]["elements"][index];
65− } else if (template && typeof template["card-background"] === "object"
70+ } else if (template && typeof template["card-background"] === "object"
66− && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
71+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
67− return template["card-background"]["elements"][index];
72+ return template["card-background"]["elements"][index];
68− } else return undefined;
73+ } else return undefined;
74+ }
69 }
75 }
70 }
76 }
71
77
@@ -111,7 +117,7 @@ AbstractButton {
111 function updateWidthHeightBindings() {
117 function updateWidthHeightBindings() {
112 if (isHorizontal) {
118 if (isHorizontal) {
113 width = Qt.binding(function() { return height * artShape.aspect });
119 width = Qt.binding(function() { return height * artShape.aspect });
114− height = Qt.binding(function() { return header.height });
120+ height = Qt.binding(function() { return root.headerHeight });
115 } else {
121 } else {
116 width = Qt.binding(function() { return root.width });
122 width = Qt.binding(function() { return root.width });
117 height = Qt.binding(function() { return width / artShape.aspect });
123 height = Qt.binding(function() { return width / artShape.aspect });
@@ -120,53 +126,58 @@ AbstractButton {
120 }
126 }
121 }
127 }
122
128
123− ShaderEffect {
129+ Loader {
124− id: overlay
130+ id: overlayLoader
125 anchors {
131 anchors {
126 left: artShape.left
132 left: artShape.left
127 right: artShape.right
133 right: artShape.right
128 bottom: artShape.bottom
134 bottom: artShape.bottom
129 }
135 }
136+ active: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
130
137
131− height: header.height
138+ sourceComponent: ShaderEffect {
132− opacity: header.opacity * 0.6
139+ id: overlay
133− visible: template && template["overlay"] && artShape.visible && artShape.image.status === Image.Ready || false
134
140
141+ height: headerLoader.item ? headerLoader.item.height : 0
142+ opacity: headerLoader.item ? headerLoader.item.opacity * 0.6 : 0
143+
135− property var source: ShaderEffectSource {
144+ property var source: ShaderEffectSource {
136− id: shaderSource
145+ id: shaderSource
137− sourceItem: artShape
146+ sourceItem: artShape
138− onVisibleChanged: if (visible) scheduleUpdate()
147+ onVisibleChanged: if (visible) scheduleUpdate()
139− live: false
148+ live: false
140− sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
149+ sourceRect: Qt.rect(0, artShape.height - overlay.height, artShape.width, overlay.height)
141− }
150+ }
142
151
143− vertexShader: "
152+ vertexShader: "
144− uniform highp mat4 qt_Matrix;
153+ uniform highp mat4 qt_Matrix;
145− attribute highp vec4 qt_Vertex;
154+ attribute highp vec4 qt_Vertex;
146− attribute highp vec2 qt_MultiTexCoord0;
155+ attribute highp vec2 qt_MultiTexCoord0;
147− varying highp vec2 coord;
156+ varying highp vec2 coord;
148− void main() {
157+ void main() {
149− coord = qt_MultiTexCoord0;
158+ coord = qt_MultiTexCoord0;
150− gl_Position = qt_Matrix * qt_Vertex;
159+ gl_Position = qt_Matrix * qt_Vertex;
151− }"
160+ }"
152−
161+
153− fragmentShader: "
162+ fragmentShader: "
154− varying highp vec2 coord;
163+ varying highp vec2 coord;
155− uniform sampler2D source;
164+ uniform sampler2D source;
156− uniform lowp float qt_Opacity;
165+ uniform lowp float qt_Opacity;
157− void main() {
166+ void main() {
158− lowp vec4 tex = texture2D(source, coord);
167+ lowp vec4 tex = texture2D(source, coord);
159− gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
168+ gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity;
160− }"
169+ }"
170+ }
161 }
171 }
162
172
163− CardHeader {
173+ Loader {
164− id: header
174+ id: headerLoader
165− objectName: "cardHeader"
175+ objectName: "cardHeaderLoader"
176+
166 anchors {
177 anchors {
167 top: {
178 top: {
168 if (template) {
179 if (template) {
169− if (template["overlay"]) return overlay.top;
180+ if (template["overlay"]) return overlayLoader.top;
170 if (template["card-layout"] === "horizontal") return artShape.top;
181 if (template["card-layout"] === "horizontal") return artShape.top;
171 }
182 }
172 return artShape.bottom;
183 return artShape.bottom;
@@ -179,29 +190,38 @@ AbstractButton {
179 }
190 }
180 right: parent.right
191 right: parent.right
181 }
192 }
193+ active: cardData && cardData["title"] || cardData && cardData["mascot"] || false
194+
195+ sourceComponent: CardHeader {
196+ id: header
197+ objectName: "cardHeader"
182
198
183− mascot: cardData && cardData["mascot"] || ""
199+ mascot: cardData && cardData["mascot"] || ""
184− title: cardData && cardData["title"] || ""
200+ title: root.title
185− subtitle: cardData && cardData["subtitle"] || ""
201+ subtitle: cardData && cardData["subtitle"] || ""
186
202
187− titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
203+ titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
188
204
189− opacity: showHeader ? 1 : 0
205+ opacity: showHeader ? 1 : 0
190− inOverlay: root.template && root.template["overlay"] === true
206+ inOverlay: root.template && root.template["overlay"] === true
191− fontColor: inOverlay ? "white" : summary.color
207+ fontColor: inOverlay ? "white" : summary.color
192− useMascotShape: !background.visible && !inOverlay
208+ useMascotShape: !backgroundLoader.active && !inOverlay
209+ headerAlignment: root.headerAlignment
210+ height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight
211+ fontScale: root.fontScale
193
212
194− Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
213+ Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
214+ }
195 }
215 }
196
216
197 Label {
217 Label {
198 id: summary
218 id: summary
199 objectName: "summaryLabel"
219 objectName: "summaryLabel"
200 anchors {
220 anchors {
201− top: header.visible ? header.bottom : artShape.bottom
221+ top: headerLoader.active ? headerLoader.bottom : artShape.bottom
202 left: parent.left
222 left: parent.left
203 right: parent.right
223 right: parent.right
204− margins: background.visible ? units.gu(1) : 0
224+ margins: backgroundLoader.active ? units.gu(1) : 0
205 topMargin: 0
225 topMargin: 0
206 }
226 }
207 wrapMode: Text.Wrap
227 wrapMode: Text.Wrap
@@ -211,6 +231,6 @@ AbstractButton {
211 height: text ? implicitHeight : 0
231 height: text ? implicitHeight : 0
212 fontSize: "small"
232 fontSize: "small"
213 // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
233 // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
214− color: background.visible && background.luminance < 0.7 ? "white" : "grey"
234+ color: backgroundLoader.active && backgroundLoader.item.luminance < 0.7 ? "white" : "grey"
215 }
235 }
216}
236}
qml/Dash/CardCarousel.qml+1−1
@@ -52,7 +52,7 @@ DashRenderer {
52 itemComponent: Card {
52 itemComponent: Card {
53 id: card
53 id: card
54 objectName: "carouselDelegate" + index
54 objectName: "carouselDelegate" + index
55− headerHeight: carousel.headerHeight
55+ fixedHeaderHeight: carousel.headerHeight
56 cardData: model
56 cardData: model
57 template: cardTool.template
57 template: cardTool.template
58 components: cardTool.components
58 components: cardTool.components
qml/Dash/CardFilterGrid.qml+7−10
@@ -24,12 +24,14 @@ DashRenderer {
24 collapsedHeight: filterGrid.collapsedHeight
24 collapsedHeight: filterGrid.collapsedHeight
25 margins: filterGrid.margins
25 margins: filterGrid.margins
26 uncollapsedHeight: filterGrid.uncollapsedHeight
26 uncollapsedHeight: filterGrid.uncollapsedHeight
27+ originY: filterGrid.originY
27 verticalSpacing: units.gu(1)
28 verticalSpacing: units.gu(1)
28 currentItem: filterGrid.currentItem
29 currentItem: filterGrid.currentItem
29 height: filterGrid.height
30 height: filterGrid.height
31+ filtered: filterGrid.filtered
30
32
31− function startFilterAnimation(filter) {
33+ function setFilter(filter, animate) {
32− filterGrid.startFilterAnimation(filter)
34+ filterGrid.setFilter(filter, animate)
33 }
35 }
34
36
35 FilterGrid {
37 FilterGrid {
@@ -40,18 +42,18 @@ DashRenderer {
40 delegateHeight: cardTool.cardHeight
42 delegateHeight: cardTool.cardHeight
41 verticalSpacing: genericFilterGrid.verticalSpacing
43 verticalSpacing: genericFilterGrid.verticalSpacing
42 model: genericFilterGrid.model
44 model: genericFilterGrid.model
43− filter: genericFilterGrid.filter
44 collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
45 collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
45 delegateCreationBegin: genericFilterGrid.delegateCreationBegin
46 delegateCreationBegin: genericFilterGrid.delegateCreationBegin
46 delegateCreationEnd: genericFilterGrid.delegateCreationEnd
47 delegateCreationEnd: genericFilterGrid.delegateCreationEnd
47− delegate: Item {
48+ delegate: Loader {
49+ asynchronous: true
48 width: filterGrid.cellWidth
50 width: filterGrid.cellWidth
49 height: filterGrid.cellHeight
51 height: filterGrid.cellHeight
50 Card {
52 Card {
51 id: card
53 id: card
52 width: cardTool.cardWidth
54 width: cardTool.cardWidth
53 height: cardTool.cardHeight
55 height: cardTool.cardHeight
54− headerHeight: cardTool.headerHeight
56+ fixedHeaderHeight: cardTool.headerHeight
55 anchors.horizontalCenter: parent.horizontalCenter
57 anchors.horizontalCenter: parent.horizontalCenter
56 objectName: "delegate" + index
58 objectName: "delegate" + index
57 cardData: model
59 cardData: model
@@ -64,10 +66,5 @@ DashRenderer {
64 onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
66 onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
65 }
67 }
66 }
68 }
67−
68− onFilterChanged: {
69− genericFilterGrid.filter = filter
70− filter = Qt.binding(function() { return genericFilterGrid.filter })
71− }
72 }
69 }
73}
70}
qml/Dash/CardHeader.qml+41−31
@@ -19,9 +19,9 @@ import Ubuntu.Components 0.1
19
19
20Item {
20Item {
21 id: root
21 id: root
22− property alias mascot: mascotImage.source
22+ property url mascot: ""
23 property alias title: titleLabel.text
23 property alias title: titleLabel.text
24− property alias subtitle: subtitleLabel.text
24+ property var subtitle
25
25
26 property alias titleWeight: titleLabel.font.weight
26 property alias titleWeight: titleLabel.font.weight
27 property alias titleSize: titleLabel.fontSize
27 property alias titleSize: titleLabel.fontSize
@@ -35,8 +35,8 @@ Item {
35 property bool useMascotShape: true
35 property bool useMascotShape: true
36 property color fontColor: Theme.palette.selected.backgroundText
36 property color fontColor: Theme.palette.selected.backgroundText
37
37
38− visible: mascotImage.status === Image.Ready || title
38+ visible: mascot != "" || title
39− height: row.height > 0 ? row.height + row.margins * 2 : 0
39+ implicitHeight: row.height > 0 ? row.height + row.margins * 2 : 0
40
40
41 Row {
41 Row {
42 id: row
42 id: row
@@ -44,7 +44,7 @@ Item {
44
44
45 property real margins: units.gu(1)
45 property real margins: units.gu(1)
46
46
47− spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
47+ spacing: mascotShapeLoader.active || mascotImageLoader.active || inOverlay ? margins : 0
48 anchors {
48 anchors {
49 top: parent.top; left: parent.left; right: parent.right
49 top: parent.top; left: parent.left; right: parent.right
50 margins: margins
50 margins: margins
@@ -52,33 +52,40 @@ Item {
52 rightMargin: spacing
52 rightMargin: spacing
53 }
53 }
54
54
55− UbuntuShape {
55+ Loader {
56− id: mascotShape
56+ id: mascotShapeLoader
57− objectName: "mascotShape"
57+ objectName: "mascotShapeLoader"
58
58
59+ active: useMascotShape && mascotImageLoader.item && mascotImageLoader.item.status === Image.Ready
60+ visible: active
61+ anchors.verticalCenter: parent.verticalCenter
59 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
62 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
60 width: units.gu(6)
63 width: units.gu(6)
61 height: units.gu(5.625)
64 height: units.gu(5.625)
62− anchors.verticalCenter: parent.verticalCenter
63− visible: useMascotShape && image && image.status === Image.Ready
64 readonly property int maxSize: Math.max(width, height) * 4
65 readonly property int maxSize: Math.max(width, height) * 4
65
66
66− image: useMascotShape ? mascotImage : null
67+ sourceComponent: UbuntuShape {
68+ image: mascotImageLoader.item
69+ }
67 }
70 }
68
71
69− Image {
72+ Loader {
70− id: mascotImage
73+ id: mascotImageLoader
71− objectName: "mascotImage"
74+ active: root.mascot != ""
72−
75+ visible: active && !useMascotShape && item.status === Image.Ready
73− width: source ? mascotShape.width : 0
74− height: mascotShape.height
75 anchors.verticalCenter: parent.verticalCenter
76 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
77
83
78− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
84+ sourceSize { width: mascotShapeLoader.maxSize; height: mascotShapeLoader.maxSize }
79− fillMode: Image.PreserveAspectCrop
85+ fillMode: Image.PreserveAspectCrop
80− horizontalAlignment: Image.AlignHCenter
86+ horizontalAlignment: Image.AlignHCenter
81− verticalAlignment: Image.AlignVCenter
87+ verticalAlignment: Image.AlignVCenter
88+ }
82 }
89 }
83
90
84 Column {
91 Column {
@@ -100,16 +107,19 @@ Item {
100 color: fontColor
107 color: fontColor
101 }
108 }
102
109
103− Label {
110+ Loader {
104− id: subtitleLabel
111+ active: titleLabel.text && root.subtitle
105− objectName: "subtitleLabel"
106 anchors { left: parent.left; right: parent.right }
112 anchors { left: parent.left; right: parent.right }
113+ sourceComponent: Label {
114+ id: subtitleLabel
115+ objectName: "subtitleLabel"
107− elide: Text.ElideRight
116+ elide: Text.ElideRight
108− fontSize: "small"
117+ fontSize: "small"
109− font.weight: Font.Light
118+ font.weight: Font.Light
110− visible: titleLabel.text && text
111− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
119+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
112− color: fontColor
120+ color: fontColor
121+ text: root.subtitle
122+ }
113 }
123 }
114 }
124 }
115 }
125 }
qml/Dash/DashContent.qml+5−10
@@ -28,13 +28,9 @@ Item {
28 readonly property alias currentIndex: dashContentList.currentIndex
28 readonly property alias currentIndex: dashContentList.currentIndex
29 property alias previewOpen: previewListView.open
29 property alias previewOpen: previewListView.open
30
30
31− property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
32 property ListModel searchHistory
31 property ListModel searchHistory
33
32
34− signal movementStarted()
35− signal movementEnded()
36 signal scopeLoaded(string scopeId)
33 signal scopeLoaded(string scopeId)
37− signal positionedAtBeginning()
38 signal gotoScope(string scopeId)
34 signal gotoScope(string scopeId)
39 signal openScope(var scope)
35 signal openScope(var scope)
40
36
@@ -72,7 +68,7 @@ Item {
72 dashContentList.currentIndex = index
68 dashContentList.currentIndex = index
73
69
74 if (reset) {
70 if (reset) {
75− dashContent.positionedAtBeginning()
71+ dashContentList.currentItem.item.positionAtBeginning()
76 }
72 }
77 }
73 }
78
74
@@ -115,8 +111,7 @@ Item {
115 highlightRangeMode: ListView.StrictlyEnforceRange
111 highlightRangeMode: ListView.StrictlyEnforceRange
116 // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
112 // TODO Investigate if we can switch to a smaller cache buffer when/if UbuntuShape gets more performant
117 cacheBuffer: 1073741823
113 cacheBuffer: 1073741823
118− onMovementStarted: dashContent.movementStarted()
114+ onMovementStarted: currentItem.item.showHeader();
119− onMovementEnded: dashContent.movementEnded()
120 clip: parent.x != 0
115 clip: parent.x != 0
121
116
122 // If the number of items is less than the current index, then need to reset to another item.
117 // If the number of items is less than the current index, then need to reset to another item.
@@ -136,7 +131,9 @@ Item {
136 width: ListView.view.width
131 width: ListView.view.width
137 height: ListView.view.height
132 height: ListView.view.height
138 asynchronous: true
133 asynchronous: true
139− source: scopeMapper.map(scope.id)
134+ // TODO This if will eventually go away since we're killing DashApps.qml
135+ // once we move app closing to the spread
136+ source: (scope.id == "clickscope") ? "DashApps.qml" : "GenericScopeView.qml"
140 objectName: scope.id + " loader"
137 objectName: scope.id + " loader"
141
138
142 readonly property bool moving: item ? item.moving : false
139 readonly property bool moving: item ? item.moving : false
@@ -155,8 +152,6 @@ Item {
155 item.scope = Qt.binding(function() { return scope })
152 item.scope = Qt.binding(function() { return scope })
156 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
153 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
157 item.tabBarHeight = dashPageHeader.implicitHeight;
154 item.tabBarHeight = dashPageHeader.implicitHeight;
158− dashContentList.movementStarted.connect(item.movementStarted)
159− dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
160 dashContent.scopeLoaded(item.scope.id)
155 dashContent.scopeLoaded(item.scope.id)
161 }
156 }
162 Connections {
157 Connections {
qml/Dash/DashRenderer.qml+5−3
@@ -20,8 +20,8 @@ Item {
20 // Can the item be expanded?
20 // Can the item be expanded?
21 property bool expandable: false
21 property bool expandable: false
22
22
23− // In case it can be expanded, should we filter it
23+ // In case it can be expanded, is it filtered
24− property bool filter: true
24+ property bool filtered: true
25
25
26 property int collapsedHeight: height
26 property int collapsedHeight: height
27
27
@@ -33,6 +33,8 @@ Item {
33
33
34 property var delegateCreationEnd: undefined
34 property var delegateCreationEnd: undefined
35
35
36+ property real originY: 0
37+
36 property real verticalSpacing: 0
38 property real verticalSpacing: 0
37
39
38 // The current item of the renderer
40 // The current item of the renderer
@@ -56,6 +58,6 @@ Item {
56 /// @param itemY is y of the held delegate
58 /// @param itemY is y of the held delegate
57 signal pressAndHold(int index, real itemY)
59 signal pressAndHold(int index, real itemY)
58
60
59− function startFilterAnimation(filter) {
61+ function setFilter(filter, animate) {
60 }
62 }
61}
63}
qml/Dash/GenericScopeView.qml+29−30
@@ -33,9 +33,6 @@ FocusScope {
33 property PageHeader pageHeader: null
33 property PageHeader pageHeader: null
34 property Item previewListView: null
34 property Item previewListView: null
35
35
36− signal movementStarted
37− signal positionedAtBeginning
38−
39 property bool enableHeightBehaviorOnNextCreation: false
36 property bool enableHeightBehaviorOnNextCreation: false
40 property var categoryView: categoryView
37 property var categoryView: categoryView
41
38
@@ -49,6 +46,14 @@ FocusScope {
49 shell.activateApplication(appId);
46 shell.activateApplication(appId);
50 }
47 }
51
48
49+ function positionAtBeginning() {
50+ categoryView.positionAtBeginning()
51+ }
52+
53+ function showHeader() {
54+ categoryView.showHeader()
55+ }
56+
52 Binding {
57 Binding {
53 target: scope
58 target: scope
54 property: "isActive"
59 property: "isActive"
@@ -69,10 +74,6 @@ FocusScope {
69 previewListView.open = false;
74 previewListView.open = false;
70 }
75 }
71
76
72− onMovementStarted: categoryView.showHeader()
73−
74− onPositionedAtBeginning: categoryView.positionAtBeginning()
75−
76 Binding {
77 Binding {
77 target: scopeView.scope
78 target: scopeView.scope
78 property: "searchQuery"
79 property: "searchQuery"
@@ -121,7 +122,7 @@ FocusScope {
121 showDivider: false
122 showDivider: false
122
123
123 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
124 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
124− readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
125+ readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filtered : true
125 readonly property string category: categoryId
126 readonly property string category: categoryId
126 readonly property var item: rendererLoader.item
127 readonly property var item: rendererLoader.item
127
128
@@ -167,9 +168,7 @@ FocusScope {
167 item.objectName = Qt.binding(function() { return categoryId })
168 item.objectName = Qt.binding(function() { return categoryId })
168 if (item.expandable) {
169 if (item.expandable) {
169 var shouldFilter = categoryId != categoryView.expandedCategoryId;
170 var shouldFilter = categoryId != categoryView.expandedCategoryId;
170− if (shouldFilter != item.filter) {
171+ item.setFilter(shouldFilter, false /*animate*/);
171− item.filter = shouldFilter;
172− }
173 }
172 }
174 updateDelegateCreationRange();
173 updateDelegateCreationRange();
175 item.cardTool = cardTool;
174 item.cardTool = cardTool;
@@ -218,11 +217,8 @@ FocusScope {
218 var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
217 var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
219 var growingVisible = !shouldFilter && y + height < categoryView.height;
218 var growingVisible = !shouldFilter && y + height < categoryView.height;
220 if (!previewListView.open || !shouldFilter) {
219 if (!previewListView.open || !shouldFilter) {
221− if (shrinkingVisible || growingVisible) {
220+ var animate = shrinkingVisible || growingVisible;
222− item.startFilterAnimation(shouldFilter)
221+ item.setFilter(shouldFilter, animate)
223− } else {
224− item.filter = shouldFilter;
225− }
226 if (!shouldFilter && !previewListView.open) {
222 if (!shouldFilter && !previewListView.open) {
227 categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
223 categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
228 }
224 }
@@ -237,26 +233,29 @@ FocusScope {
237 }
233 }
238
234
239 function updateDelegateCreationRange() {
235 function updateDelegateCreationRange() {
236+ if (categoryView.moving) {
240− // Do not update the range if we are overshooting up or down, since we'll come back
237+ // Do not update the range if we are overshooting up or down, since we'll come back
241− // to the stable position and delete/create items without any reason
238+ // to the stable position and delete/create items without any reason
242− if (categoryView.contentY < categoryView.originY) {
239+ if (categoryView.contentY < categoryView.originY) {
243− return;
240+ return;
241+ } else if (categoryView.contentHeight - categoryView.originY > categoryView.height &&
244− } else if (categoryView.contentY + categoryView.height > categoryView.contentHeight) {
242+ categoryView.contentY + categoryView.height > categoryView.contentHeight) {
245− return;
243+ return;
244+ }
246 }
245 }
247
246
248 if (item && item.hasOwnProperty("delegateCreationBegin")) {
247 if (item && item.hasOwnProperty("delegateCreationBegin")) {
249 if (baseItem.y + baseItem.height <= 0) {
248 if (baseItem.y + baseItem.height <= 0) {
250− // Not visible (item at top of the list)
249+ // Not visible (item at top of the list viewport)
251− item.delegateCreationBegin = baseItem.height
250+ item.delegateCreationBegin = item.originY + baseItem.height
252− item.delegateCreationEnd = baseItem.height
251+ item.delegateCreationEnd = item.originY + baseItem.height
253 } else if (baseItem.y >= categoryView.height) {
252 } else if (baseItem.y >= categoryView.height) {
254− // Not visible (item at bottom of the list)
253+ // Not visible (item at bottom of the list viewport)
255− item.delegateCreationBegin = 0
254+ item.delegateCreationBegin = item.originY
256− item.delegateCreationEnd = 0
255+ item.delegateCreationEnd = item.originY
257 } else {
256 } else {
258− item.delegateCreationBegin = Math.max(-baseItem.y, 0)
257+ item.delegateCreationBegin = item.originY + Math.max(-baseItem.y, 0)
259− item.delegateCreationEnd = Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
258+ item.delegateCreationEnd = item.originY + Math.min(categoryView.height + item.delegateCreationBegin, baseItem.height)
260 }
259 }
261 }
260 }
262 }
261 }
qml/Dash/Previews/PreviewProgress.qml+3−2
@@ -34,11 +34,12 @@ PreviewWidget {
34 ProgressBar {
34 ProgressBar {
35 id: progressBar
35 id: progressBar
36 objectName: "progressBar"
36 objectName: "progressBar"
37+ anchors.right: parent.right
37 value: 0
38 value: 0
38 maximumValue: 100
39 maximumValue: 100
39− implicitHeight: units.gu(5)
40+ implicitHeight: units.gu(4)
40 height: parent.height
41 height: parent.height
41− width: parent.width
42+ width: (root.width - units.gu(1)) / 2
42
43
43 property var source: widgetData["source"]
44 property var source: widgetData["source"]
44 // TODO Eventually we will need to support more sources other
45 // TODO Eventually we will need to support more sources other
qml/Dash/Previews/PreviewRatingDisplay.qml+4−2
@@ -71,7 +71,8 @@ PreviewWidget {
71 id: authorLabel
71 id: authorLabel
72 objectName: "authorLabel"
72 objectName: "authorLabel"
73 anchors { left: parent.left; right: parent.right }
73 anchors { left: parent.left; right: parent.right }
74+ // TODO cimi: Yet another fix requiring Palette update.
74− color: Theme.palette.selected.backgroundText
75+ color: "grey" //Theme.palette.selected.backgroundText
75 opacity: .8
76 opacity: .8
76 text: modelData["author"] || ""
77 text: modelData["author"] || ""
77 visible: text !== ""
78 visible: text !== ""
@@ -82,7 +83,8 @@ PreviewWidget {
82 id: reviewLabel
83 id: reviewLabel
83 objectName: "reviewLabel"
84 objectName: "reviewLabel"
84 anchors { left: parent.left; right: parent.right }
85 anchors { left: parent.left; right: parent.right }
86+ // TODO cimi: Yet another fix requiring Palette update.
85− color: Theme.palette.selected.backgroundText
87+ color: "grey" //Theme.palette.selected.backgroundText
86 opacity: .8
88 opacity: .8
87 text: modelData["review"] || ""
89 text: modelData["review"] || ""
88 visible: text !== ""
90 visible: text !== ""
qml/Dash/Previews/PreviewRatingInput.qml+6−4
@@ -76,7 +76,8 @@ PreviewWidget {
76 verticalCenter: parent.verticalCenter
76 verticalCenter: parent.verticalCenter
77 left: parent.left
77 left: parent.left
78 }
78 }
79+ // TODO cimi: Yet another fix requiring Palette update.
79− color: Theme.palette.selected.backgroundText
80+ color: "grey" //Theme.palette.selected.backgroundText
80 opacity: .8
81 opacity: .8
81 text: widgetData["rating-label"] || i18n.tr("Rate this")
82 text: widgetData["rating-label"] || i18n.tr("Rate this")
82 }
83 }
@@ -121,7 +122,8 @@ PreviewWidget {
121 left: parent.left
122 left: parent.left
122 right: parent.right
123 right: parent.right
123 }
124 }
125+ // TODO cimi: Yet another fix requiring Palette update.
124− color: Theme.palette.selected.backgroundText
126+ color: "grey" //Theme.palette.selected.backgroundText
125 opacity: .8
127 opacity: .8
126 text: widgetData["review-label"] || i18n.tr("Add a review")
128 text: widgetData["review-label"] || i18n.tr("Add a review")
127 }
129 }
@@ -153,8 +155,8 @@ PreviewWidget {
153 objectName: "submitButton"
155 objectName: "submitButton"
154
156
155 readonly property bool readyToSubmit: {
157 readonly property bool readyToSubmit: {
156− if (reviewTextArea.text === "" ||
157− (widgetData["visible"] === "both" && rating.value < 0)) return false;
158+ if ((widgetData["required"] !== "review" && rating.value < 0) ||
159+ (widgetData["required"] !== "rating" && reviewTextArea.text === "")) return false;
158 else return true;
160 else return true;
159 }
161 }
160
162
qml/Dash/Previews/PreviewZoomableImage.qml+4−7
@@ -28,14 +28,11 @@ PreviewWidget {
28 id: root
28 id: root
29 implicitHeight: units.gu(22)
29 implicitHeight: units.gu(22)
30
30
31− LazyImage {
31+ ZoomableImage {
32+ id: image
32 objectName: "image"
33 objectName: "image"
33− anchors {
34− top: parent.top
35− bottom: parent.bottom
36− }
37− scaleTo: "height"
38 source: widgetData["source"]
34 source: widgetData["source"]
39− initialWidth: units.gu(13)
35+ zoomable: widgetData["zoomable"] ? widgetData["zoomable"] : false
36+ anchors.fill: parent
40 }
37 }
41}
38}
qml/Dash/ScopeDelegateMapper.qmldeleted−30
@@ -1,30 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−QtObject {
20− property var scopeDelegateMapping: {"clickscope": "DashApps.qml"}
21− property string genericScope: "GenericScopeView.qml"
22−
23− function map(scopeId) {
24− var customScope = scopeDelegateMapping[scopeId]
25− if (customScope != undefined) {
26− return customScope
27− }
28− return genericScope
29− }
30−}
qml/Greeter/Clock.qml+3−6
@@ -24,14 +24,11 @@ Item {
24 implicitWidth: childrenRect.width
24 implicitWidth: childrenRect.width
25 implicitHeight: childrenRect.height
25 implicitHeight: childrenRect.height
26
26
27− // Allows to set the current Date. Will be overwritten if active
27+ // Allows to set the current Date. Will be overwritten if visible
28 property date currentDate
28 property date currentDate
29
29
30− // If active, time will be updated through the indicators service
31− property bool active: clock.enabled && clock.visible
32−
33 Component.onCompleted: {
30 Component.onCompleted: {
34− if (active) {
31+ if (visible) {
35 currentDate = new Date()
32 currentDate = new Date()
36 }
33 }
37 }
34 }
@@ -42,7 +39,7 @@ Item {
42
39
43 busName: "com.canonical.indicator.datetime"
40 busName: "com.canonical.indicator.datetime"
44 actionsObjectPath: "/com/canonical/indicator/datetime"
41 actionsObjectPath: "/com/canonical/indicator/datetime"
45− menuObjectPath: clock.active ? "/com/canonical/indicator/datetime/phone" : ""
42+ menuObjectPath: clock.visible ? "/com/canonical/indicator/datetime/phone" : ""
46
43
47 Indicators.RootActionState {
44 Indicators.RootActionState {
48 menu: timeModel.model
45 menu: timeModel.model
qml/Greeter/Greeter.qml+115−42
@@ -28,10 +28,10 @@ Showable {
28 property url defaultBackground
28 property url defaultBackground
29
29
30 // 1 when fully shown and 0 when fully hidden
30 // 1 when fully shown and 0 when fully hidden
31− property real showProgress: MathUtils.clamp((width + x) / width, 0, 1)
31+ property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1)
32
32
33 showAnimation: StandardAnimation { property: "x"; to: 0 }
33 showAnimation: StandardAnimation { property: "x"; to: 0 }
34− hideAnimation: StandardAnimation { property: "x"; to: -width }
34+ hideAnimation: __leftHideAnimation
35
35
36 property alias dragHandleWidth: dragHandle.width
36 property alias dragHandleWidth: dragHandle.width
37 property alias model: greeterContentLoader.model
37 property alias model: greeterContentLoader.model
@@ -40,19 +40,81 @@ Showable {
40 readonly property bool narrowMode: !multiUser && height > width
40 readonly property bool narrowMode: !multiUser && height > width
41 readonly property bool multiUser: LightDM.Users.count > 1
41 readonly property bool multiUser: LightDM.Users.count > 1
42
42
43− readonly property bool leftTeaserPressed: greeterContentLoader.status == Loader.Ready &&
44− greeterContentLoader.item.leftTeaserPressed
45− readonly property bool rightTeaserPressed: greeterContentLoader.status == Loader.Ready &&
46− greeterContentLoader.item.rightTeaserPressed
47−
48 readonly property int currentIndex: greeterContentLoader.currentIndex
43 readonly property int currentIndex: greeterContentLoader.currentIndex
49
44
45+ property var __leftHideAnimation: StandardAnimation { property: "x"; to: -width }
46+ property var __rightHideAnimation: StandardAnimation { property: "x"; to: width }
47+
50 signal selected(int uid)
48 signal selected(int uid)
51 signal unlocked(int uid)
49 signal unlocked(int uid)
50+ signal tease()
51+
52+ function hideRight() {
53+ if (shown) {
54+ hideAnimation = __rightHideAnimation
55+ hide()
56+ }
57+ }
58+
59+ onRequiredChanged: {
60+ // Reset hide animation to default once we're finished with it
61+ if (!required) {
62+ // Put back on left for reliable show direction and so that
63+ // if normal hide() is called, we don't animate from right.
64+ x = -width
65+ hideAnimation = __leftHideAnimation
66+ }
67+ }
68+
69+ // Bi-directional revealer
70+ DraggingArea {
71+ id: dragHandle
72+ anchors.fill: parent
73+ enabled: greeter.narrowMode || !greeter.locked
74+ orientation: Qt.Horizontal
75+ propagateComposedEvents: true
76+
77+ Component.onCompleted: {
78+ // set evaluators to baseline of dragValue == 0
79+ leftEvaluator.reset()
80+ rightEvaluator.reset()
81+ }
82+
83+ function maybeTease() {
84+ if (!greeter.locked || greeter.narrowMode)
85+ greeter.tease();
86+ }
87+
88+ onClicked: maybeTease()
89+ onDragStart: maybeTease()
90+ onPressAndHold: {} // eat event, but no need to tease, as drag will cover it
91+
92+ onDragEnd: {
93+ if (rightEvaluator.shouldAutoComplete())
94+ greeter.hideRight()
95+ else if (leftEvaluator.shouldAutoComplete())
96+ greeter.hide();
97+ else
98+ greeter.show(); // undo drag
99+ }
100+
101+ onDragValueChanged: {
102+ // dragValue is kept as a "step" value since we do this x adjusting on the fly
103+ greeter.x += dragValue
104+ }
105+
106+ EdgeDragEvaluator {
107+ id: rightEvaluator
108+ trackedPosition: dragHandle.dragValue + greeter.x
109+ maxDragDistance: parent.width
110+ direction: Direction.Rightwards
111+ }
52
112
53− onRightTeaserPressedChanged: {
113+ EdgeDragEvaluator {
54− if (rightTeaserPressed && (!locked || narrowMode) && x == 0) {
114+ id: leftEvaluator
55− teasingTimer.start();
115+ trackedPosition: dragHandle.dragValue + greeter.x
116+ maxDragDistance: parent.width
117+ direction: Direction.Leftwards
56 }
118 }
57 }
119 }
58
120
@@ -82,45 +144,56 @@ Showable {
82 }
144 }
83 }
145 }
84
146
85− Timer {
147+ onTease: showLabelAnimation.start()
86− id: teasingTimer
87− interval: 200
88− }
89
148
90− states: [
149+ Label {
91− State {
150+ id: swipeHint
92− name: "teasing"
151+ visible: greeter.shown
152+ property real baseOpacity: 0.5
153+ opacity: 0.0
154+ anchors.horizontalCenter: parent.horizontalCenter
155+ anchors.bottom: parent.bottom
156+ anchors.bottomMargin: units.gu(5)
157+ text: i18n.tr("Swipe to unlock")
158+ color: "white"
159+ font.weight: Font.Light
160+
161+ SequentialAnimation on opacity {
162+ id: showLabelAnimation
93− when: teasingTimer.running
163+ running: false
94− PropertyChanges {
164+ loops: 2
95− target: greeter
165+
96− x: -dragHandle.hintDisplacement
166+ StandardAnimation {
167+ from: 0.0
168+ to: swipeHint.baseOpacity
169+ duration: UbuntuAnimation.SleepyDuration
97 }
170 }
98− }
171+ PauseAnimation { duration: UbuntuAnimation.BriskDuration }
99− ]
172+ StandardAnimation {
100− transitions: [
173+ from: swipeHint.baseOpacity
101− Transition {
102− from: "*"
103− to: "*"
174+ to: 0.0
104− NumberAnimation {
175+ duration: UbuntuAnimation.SleepyDuration
105− target: greeter
106− property: "x"
107− duration: 300
108− easing.type: Easing.OutCubic
109 }
176 }
110 }
177 }
111− ]
178+ }
112−
113− DragHandle {
114− id: dragHandle
115
179
180+ // right side shadow
181+ Image {
182+ anchors.left: parent.right
116 anchors.top: parent.top
183 anchors.top: parent.top
117 anchors.bottom: parent.bottom
184 anchors.bottom: parent.bottom
118− anchors.right: parent.right
185+ visible: parent.required
119−
186+ fillMode: Image.Tile
120− hintDisplacement: units.gu(2)
187+ source: "../graphics/dropshadow_right.png"
121−
188+ }
122− enabled: greeter.narrowMode || !greeter.locked
123
189
124− direction: Direction.Leftwards
190+ // left side shadow
191+ Image {
192+ anchors.right: parent.left
193+ anchors.top: parent.top
194+ anchors.bottom: parent.bottom
195+ visible: parent.required
196+ fillMode: Image.Tile
197+ source: "../graphics/dropshadow_left.png"
125 }
198 }
126}
199}
qml/Greeter/GreeterContent.qml+1−10
@@ -20,15 +20,11 @@ import Ubuntu.Components 0.1
20import LightDM 0.1 as LightDM
20import LightDM 0.1 as LightDM
21import "../Components"
21import "../Components"
22
22
23−MouseArea {
23+Item {
24 id: root
24 id: root
25 anchors.fill: parent
25 anchors.fill: parent
26
26
27 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
27 property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error
28− property bool leftTeaserPressed: teasingMouseArea.pressed &&
29− teasingMouseArea.mouseX < teasingMouseArea.width / 2
30− property bool rightTeaserPressed: teasingMouseArea.pressed &&
31− teasingMouseArea.mouseX > teasingMouseArea.width / 2
32
28
33 signal selected(int uid)
29 signal selected(int uid)
34 signal unlocked(int uid)
30 signal unlocked(int uid)
@@ -74,11 +70,6 @@ MouseArea {
74 opacity: 0.4
70 opacity: 0.4
75 }
71 }
76
72
77− MouseArea {
78− id: teasingMouseArea
79− anchors.fill: parent
80− }
81−
82 Loader {
73 Loader {
83 id: loginLoader
74 id: loginLoader
84 objectName: "loginLoader"
75 objectName: "loginLoader"
qml/Greeter/Infographics.qml+3
@@ -457,5 +457,8 @@ Item {
457 !circleGrowAnimTimer.running)
457 !circleGrowAnimTimer.running)
458 infographic.model.nextDataSource()
458 infographic.model.nextDataSource()
459 }
459 }
460+
461+ onClicked: mouse.accepted = false
462+ onPressed: mouse.accepted = false
460 }
463 }
461}
464}
qml/Hud/Hud.qml+1−1
@@ -491,6 +491,6 @@ Item {
491 anchors.top: hudContentClipper.top
491 anchors.top: hudContentClipper.top
492 anchors.bottom: hudContentClipper.bottom
492 anchors.bottom: hudContentClipper.bottom
493 fillMode: Image.Tile
493 fillMode: Image.Tile
494− source: "graphics/dropshadow_right.png"
494+ source: "../graphics/dropshadow_right.png"
495 }
495 }
496}
496}
qml/Notifications/NotificationMenuItemFactory.qml+2−1
@@ -66,7 +66,8 @@ Loader {
66 TextField {
66 TextField {
67 id: textfield
67 id: textfield
68
68
69+ // TODO using Qt.ImhNoPredictiveText here until lp #1291575 is fixed for ubuntu-ui-toolkit
69− inputMethodHints: Qt.ImhNoAutoUppercase
70+ inputMethodHints: Qt.ImhNoAutoUppercase | Qt.ImhNoPredictiveText
70 anchors.left: parent.left; anchors.right: parent.right
71 anchors.left: parent.left; anchors.right: parent.right
71 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
72 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
72 height: units.gu(5)
73 height: units.gu(5)
qml/Notifications/Notifications.qml+11
@@ -16,6 +16,8 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import Unity.Notifications 1.0 as UnityNotifications
20+import Utils 0.1
19import "../Components"
21import "../Components"
20
22
21ListView {
23ListView {
@@ -25,6 +27,15 @@ ListView {
25 interactive: false
27 interactive: false
26
28
27 property real margin
29 property real margin
30+ property bool useModal: snapDecisionProxyModel.count > 0
31+
32+ SortFilterProxyModel {
33+ id: snapDecisionProxyModel
34+
35+ model: notificationList.model
36+ filterRole: UnityNotifications.ModelInterface.RoleType
37+ filterRegExp: RegExp(UnityNotifications.Notification.SnapDecision)
38+ }
28 spacing: delegate.fullscreen ? 0 : units.gu(.5)
39 spacing: delegate.fullscreen ? 0 : units.gu(.5)
29
40
30 currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
41 currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
qml/Shell.qml+84−104
@@ -28,9 +28,7 @@ import "Dash"
28import "Greeter"
28import "Greeter"
29import "Launcher"
29import "Launcher"
30import "Panel"
30import "Panel"
31−import "Hud"
32import "Components"
31import "Components"
33−import "Bottombar"
34import "Notifications"
32import "Notifications"
35import Unity.Notifications 1.0 as NotificationBackend
33import Unity.Notifications 1.0 as NotificationBackend
36
34
@@ -148,8 +146,8 @@ FocusScope {
148
146
149 available: !greeter.shown && !lockscreen.shown
147 available: !greeter.shown && !lockscreen.shown
150 hides: [stages, launcher, panel.indicators]
148 hides: [stages, launcher, panel.indicators]
151− shown: disappearingAnimationProgress !== 1.0
149+ shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
152− enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
150+ enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
153
151
154 anchors {
152 anchors {
155 fill: parent
153 fill: parent
@@ -159,18 +157,14 @@ FocusScope {
159 contentScale: 1.0 - 0.2 * disappearingAnimationProgress
157 contentScale: 1.0 - 0.2 * disappearingAnimationProgress
160 opacity: 1.0 - disappearingAnimationProgress
158 opacity: 1.0 - disappearingAnimationProgress
161 property real disappearingAnimationProgress: {
159 property real disappearingAnimationProgress: {
162− if (greeter.shown) {
160+ if (stages.overlayMode) {
163− return greeter.showProgress;
161+ return 0;
164 } else {
162 } else {
165− if (stages.overlayMode) {
166− return 0;
167− }
168 return stages.showProgress
163 return stages.showProgress
169 }
164 }
170 }
165 }
171
166
172− // FIXME: only necessary because stages.showProgress and
167+ // FIXME: only necessary because stages.showProgress is not animated
173− // greeterRevealer.animatedProgress are not animated
174 Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
168 Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
175 }
169 }
176 }
170 }
@@ -240,6 +234,8 @@ FocusScope {
240 function show(focusApp) {
234 function show(focusApp) {
241 shown = true;
235 shown = true;
242 panel.indicators.hide();
236 panel.indicators.hide();
237+ edgeDemo.stopDemo();
238+ greeter.hide();
243 if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
239 if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
244 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
240 ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
245 }
241 }
@@ -267,12 +263,6 @@ FocusScope {
267 stages.hide();
263 stages.hide();
268 }
264 }
269 }
265 }
270−
271− // If any app is focused when greeter is open, it's due to a user action
272− // like a snap decision (say, an incoming call).
273− // TODO: these should be protected to only unlock for certain applications / certain usecases
274− // potentially only in connection with a notification.
275− greeter.hide()
276 }
266 }
277
267
278 onApplicationAdded: {
268 onApplicationAdded: {
@@ -316,7 +306,7 @@ FocusScope {
316
306
317 readonly property int backgroundTopMargin: -panel.panelHeight
307 readonly property int backgroundTopMargin: -panel.panelHeight
318
308
319− hides: [launcher, panel.indicators, hud]
309+ hides: [launcher, panel.indicators]
320 shown: false
310 shown: false
321 enabled: true
311 enabled: true
322 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
312 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
@@ -366,59 +356,73 @@ FocusScope {
366 }
356 }
367 }
357 }
368
358
369− Greeter {
359+ Rectangle {
370− id: greeter
360+ anchors.fill: parent
371− objectName: "greeter"
361+ color: "black"
372−
362+ opacity: greeterWrapper.showProgress * 0.8
373− available: true
363+ }
374− hides: [launcher, panel.indicators, hud]
375− shown: true
376−
377− defaultBackground: shell.background
378
364
365+ Item {
366+ // Just a tiny wrapper to adjust greeter's x without messing with its own dragging
367+ id: greeterWrapper
368+ x: launcher.progress
379 y: panel.panelHeight
369 y: panel.panelHeight
380 width: parent.width
370 width: parent.width
381 height: parent.height - panel.panelHeight
371 height: parent.height - panel.panelHeight
382
372
383− dragHandleWidth: shell.edgeSize
373+ Behavior on x {SmoothedAnimation{velocity: 600}}
384
374
375+ readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
376+
377+ Greeter {
378+ id: greeter
379+ objectName: "greeter"
380+
381+ available: true
382+ hides: [launcher, panel.indicators]
383+ shown: true
384+
385+ defaultBackground: shell.background
386+
387+ width: parent.width
388+ height: parent.height
389+
390+ dragHandleWidth: shell.edgeSize
391+
385− onShownChanged: {
392+ onShownChanged: {
386− if (shown) {
393+ if (shown) {
387− lockscreen.reset();
394+ lockscreen.reset();
388− // If there is only one user, we start authenticating with that one here.
395+ // If there is only one user, we start authenticating with that one here.
389− // If there are more users, the Greeter will handle that
396+ // If there are more users, the Greeter will handle that
390− if (LightDM.Users.count == 1) {
397+ if (LightDM.Users.count == 1) {
391− LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
398+ LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
399+ }
400+ greeter.forceActiveFocus();
392 }
401 }
393− greeter.forceActiveFocus();
394 }
402 }
395− }
396
403
397− onUnlocked: greeter.hide()
404+ onUnlocked: greeter.hide()
398− onSelected: {
405+ onSelected: {
399− // Update launcher items for new user
406+ // Update launcher items for new user
400− var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
407+ var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
401− AccountsService.user = user;
408+ AccountsService.user = user;
402− LauncherModel.setUser(user);
409+ LauncherModel.setUser(user);
403− }
404−
405− onLeftTeaserPressedChanged: {
406− if (leftTeaserPressed) {
407− launcher.tease();
408 }
410 }
409− }
410
411
412+ onTease: launcher.tease()
413+
411− Binding {
414+ Binding {
412− target: ApplicationManager
415+ target: ApplicationManager
413− property: "suspended"
416+ property: "suspended"
414− value: greeter.shown && greeter.showProgress == 1
417+ value: greeter.shown && greeterWrapper.showProgress == 1
418+ }
415 }
419 }
416 }
420 }
417
421
418 InputFilterArea {
422 InputFilterArea {
419 anchors.fill: parent
423 anchors.fill: parent
420 blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
424 blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
421− || panel.indicators.shown || hud.shown
425+ || panel.indicators.shown
422 }
426 }
423
427
424 Connections {
428 Connections {
@@ -482,47 +486,6 @@ FocusScope {
482 }
486 }
483 }
487 }
484
488
485− Hud {
486− id: hud
487−
488− width: parent.width > units.gu(60) ? units.gu(40) : parent.width
489− height: parent.height
490−
491− available: !greeter.shown && !panel.indicators.shown && !lockscreen.shown && edgeDemo.dashEnabled
492− shown: false
493− showAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: 0; easing.type: Easing.Linear }
494− hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
495−
496− Connections {
497− target: ApplicationManager
498− onFocusedApplicationIdChanged: hud.hide()
499− }
500− }
501−
502− Revealer {
503− id: hudRevealer
504−
505− enabled: hud.shown
506− width: hud.width
507− anchors.left: hud.left
508− height: parent.height
509− target: hud.revealerTarget
510− closedValue: height
511− openedValue: 0
512− direction: Qt.RightToLeft
513− orientation: Qt.Vertical
514− handleSize: hud.handleHeight
515− onCloseClicked: target.hide()
516− }
517−
518− Bottombar {
519− id: bottombar
520− theHud: hud
521− anchors.fill: parent
522− enabled: hud.available
523− applicationIsOnForeground: ApplicationManager.focusedApplicationId
524− }
525−
526 InputFilterArea {
489 InputFilterArea {
527 blockInput: launcher.shown
490 blockInput: launcher.shown
528 anchors {
491 anchors {
@@ -542,7 +505,7 @@ FocusScope {
542 anchors.bottom: parent.bottom
505 anchors.bottom: parent.bottom
543 width: parent.width
506 width: parent.width
544 dragAreaWidth: shell.edgeSize
507 dragAreaWidth: shell.edgeSize
545− available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled
508+ available: edgeDemo.launcherEnabled
546
509
547 onShowDashHome: {
510 onShowDashHome: {
548 if (edgeDemo.running)
511 if (edgeDemo.running)
@@ -557,24 +520,41 @@ FocusScope {
557 launcher.hide();
520 launcher.hide();
558 }
521 }
559 }
522 }
523+ if (greeter.shown) {
524+ greeter.hideRight();
525+ launcher.hide();
526+ }
560 }
527 }
561 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
528 onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
562− onLauncherApplicationSelected:{
529+ onLauncherApplicationSelected: {
563− if (edgeDemo.running)
530+ if (!edgeDemo.running)
564− return;
565−
566− greeter.hide()
567− shell.activateApplication(appId)
531+ shell.activateApplication(appId)
568 }
532 }
569 onShownChanged: {
533 onShownChanged: {
570 if (shown) {
534 if (shown) {
571 panel.indicators.hide()
535 panel.indicators.hide()
572− hud.hide()
573− bottombar.hide()
574 }
536 }
575 }
537 }
576 }
538 }
577
539
540+ Rectangle {
541+ id: modalNotificationBackground
542+
543+ visible: notifications.useModal && !greeter.shown && (notifications.state == "narrow")
544+ color: "#000000"
545+ anchors.fill: parent
546+ opacity: 0.5
547+
548+ MouseArea {
549+ anchors.fill: parent
550+ }
551+
552+ InputFilterArea {
553+ anchors.fill: parent
554+ blockInput: modalNotificationBackground.visible
555+ }
556+ }
557+
578 Notifications {
558 Notifications {
579 id: notifications
559 id: notifications
580
560
qml/graphics/dropshadow_left@20.pngnew file

Binary file not shown.

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

Binary file not shown.

qml/graphics/phone_background.jpg

Binary file not shown.

qml/graphics/tablet_background.jpg

Binary file not shown.

run → run.shrenamed+15−1
@@ -68,8 +68,22 @@ if $MOUSE_TOUCH; then
68 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
68 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
69fi
69fi
70
70
71+control_c()
72+{
73+ /sbin/initctl stop unity8
74+ exit $?
75+}
76+
77+trap control_c INT
78+
71if $GDB; then
79if $GDB; then
72 gdb -ex run --args $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
80 gdb -ex run --args $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
73else
81else
82+ status=`/sbin/initctl status unity8`
83+ if [ "$status" != "unity8 stop/waiting" ]; then
84+ echo "Unity8 is already running, please stop it first"
85+ exit 1
86+ fi
74− $QML_PHONE_SHELL_PATH $QML_PHONE_SHELL_ARGS $@
87+ /sbin/initctl start unity8 BINARY="`readlink -f $QML_PHONE_SHELL_PATH` $QML_PHONE_SHELL_ARGS $@" QML2_IMPORT_PATH=$QML2_IMPORT_PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH
88+ tailf -n 0 ~/.cache/upstart/unity8.log
75fi
89fi
run_on_device → run_on_device.shrenamed+2−2
@@ -88,7 +88,7 @@ sync_code() {
88}
88}
89
89
90build() {
90build() {
91− exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build"
91+ exec_with_ssh PATH=/usr/lib/ccache:$PATH "cd $CODE_DIR/ && PATH=/usr/lib/ccache:$PATH ./build.sh"
92}
92}
93
93
94run() {
94run() {
@@ -105,7 +105,7 @@ run() {
105
105
106 exec_with_ssh "stop unity8"
106 exec_with_ssh "stop unity8"
107 exec_with_ssh "start maliit-server"
107 exec_with_ssh "start maliit-server"
108− exec_with_ssh "cd $CODE_DIR/ && ./run $ARGS -- $RUN_OPTIONS"
108+ exec_with_ssh "cd $CODE_DIR/ && ./run.sh $ARGS -- $RUN_OPTIONS"
109 exec_with_ssh "stop maliit-server"
109 exec_with_ssh "stop maliit-server"
110 exec_with_ssh "start unity8"
110 exec_with_ssh "start unity8"
111}
111}
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 @@
21
21
22from __future__ import absolute_import
22from __future__ import absolute_import
23
23
24−from unity8.process_helpers import unlock_unity
24+import logging
25−from unity8.shell import disable_qml_mocking
25+import os
26−from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
27
26
28from autopilot.matchers import Eventually
27from autopilot.matchers import Eventually
29from autopilot.platform import model
28from autopilot.platform import model
30−from testtools.matchers import Equals, NotEquals
29+from testtools.matchers import Equals
31
30
32−import logging
31+from unity8 import process_helpers
32+from unity8.application_lifecycle import tests
33
33
34−logger = logging.getLogger(__name__)
35
34
35+logger = logging.getLogger(__name__)
36
36
37−class ApplicationLifecycleTests(UnityTestCase):
38
37
39− scenarios = _get_device_emulation_scenarios()
38+class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
40
39
41 def setUp(self):
40 def setUp(self):
41+ if model() == 'Desktop':
42+ self.skipTest('Test cannot be run on the desktop.')
42 super(ApplicationLifecycleTests, self).setUp()
43 super(ApplicationLifecycleTests, self).setUp()
43− if model() == "Desktop":
44− self.skipTest("Test cannot be run on the desktop.")
45
44
46 def swipe_screen_from_right(self):
45 def swipe_screen_from_right(self):
47 width = self.main_window.width
46 width = self.main_window.width
@@ -54,80 +53,65 @@ class ApplicationLifecycleTests(UnityTestCase):
54 logger.info("Swiping screen from the right edge")
53 logger.info("Swiping screen from the right edge")
55 self.touch.drag(start_x, start_y, end_x, end_y)
54 self.touch.drag(start_x, start_y, end_x, end_y)
56
55
57− def _launch_app(self, app_name):
56+ def launch_fake_app(self):
58− """Launches the application *app_name*
57+ _, desktop_file_path = self.create_test_application()
59−
58+ desktop_file_name = os.path.basename(desktop_file_path)
60− Assumes that the desktop file resides at:
59+ application_name, _ = os.path.splitext(desktop_file_name)
61− /usr/share/applications/{app_name}.desktop
60+ self.launch_upstart_application(application_name)
61+ return application_name
62
62
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
76 def test_can_launch_application(self):
63 def test_can_launch_application(self):
77 """Must be able to launch an application."""
64 """Must be able to launch an application."""
78− unity_proxy = self.launch_unity()
65+ application_name = self.launch_fake_app()
79− unlock_unity(unity_proxy)
66+ self.assert_current_focused_application(application_name)
80−
81− app = self._launch_app("messaging-app")
82
67
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
90 def test_can_launch_multiple_applications(self):
68 def test_can_launch_multiple_applications(self):
91 """A second application launched must be focused."""
69 """A second application launched must be focused."""
92− unity_proxy = self.launch_unity()
70+ application1_name = self.launch_fake_app()
93− unlock_unity(unity_proxy)
71+ self.assert_current_focused_application(application1_name)
94−
72+
95− self._launch_app("messaging-app")
73+ application2_name = self.launch_fake_app()
96− self.assertThat(
74+ self.assertFalse(application1_name == application2_name)
97− self.main_window.get_current_focused_app_id(),
75+ self.assert_current_focused_application(application2_name)
98− Eventually(Equals("messaging-app"))
76+
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
108 def test_app_moves_from_unfocused_to_focused(self):
77 def test_app_moves_from_unfocused_to_focused(self):
109 """An application that is in the unfocused state must be able to be
78 """An application that is in the unfocused state must be able to be
110 brought back to the focused state.
79 brought back to the focused state.
111
80
112 """
81 """
113− unity_proxy = self.launch_unity()
82+ application1_name = self.launch_fake_app()
114− unlock_unity(unity_proxy)
83+ self.assert_current_focused_application(application1_name)
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− )
121
84
122− self._launch_app("address-book-app")
85+ application2_name = self.launch_fake_app()
123− self.assertThat(
86+ self.assertFalse(application1_name == application2_name)
124− self.main_window.get_current_focused_app_id(),
87+ self.assert_current_focused_application(application2_name)
125− Eventually(Equals("address-book-app"))
126− )
127
88
128 self.swipe_screen_from_right()
89 self.swipe_screen_from_right()
129
90
130− self.assertThat(
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()
131− self.main_window.get_current_focused_app_id(),
96+ greeter = self.main_window.get_greeter()
97+ self.assertThat(greeter.created, Eventually(Equals(True)))
98+
99+ application_name = self.launch_fake_app()
132− Eventually(Equals("messaging-app"))
100+ self.assertThat(greeter.created, Eventually(Equals(False)))
133− )
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 @@
20"""Test the integration with the URL dispatcher service."""
20"""Test the integration with the URL dispatcher service."""
21
21
22import os
22import os
23+import subprocess
23
24
24from autopilot import platform
25from autopilot import platform
25−from autopilot.matchers import Eventually
26−from testtools.matchers import Equals
27−from ubuntuuitoolkit import fixture_setup
28
26
29−from unity8 import process_helpers
27+from unity8.application_lifecycle import tests
30−from unity8.shell import tests
31
28
32
29
33−class URLDispatcherTestCase(tests.UnityTestCase):
30+class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
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−""")
50
31
51 def setUp(self):
32 def setUp(self):
52 if platform.model() == 'Desktop':
33 if platform.model() == 'Desktop':
53 self.skipTest("URL dispatcher doesn't work on the desktop.")
34 self.skipTest("URL dispatcher doesn't work on the desktop.")
54 super(URLDispatcherTestCase, self).setUp()
35 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)
65
36
66 def test_swipe_out_application_started_by_url_dispatcher(self):
37 def test_swipe_out_application_started_by_url_dispatcher(self):
67 _, desktop_file_path = self.create_test_application()
38 _, desktop_file_path = self.create_test_application()
@@ -70,12 +41,10 @@ MainView {
70
41
71 self.assertEqual('', self.main_window.get_current_focused_app_id())
42 self.assertEqual('', self.main_window.get_current_focused_app_id())
72 self.addCleanup(os.system, 'pkill qmlscene')
43 self.addCleanup(os.system, 'pkill qmlscene')
44+
45+ subprocess.check_call(
73− os.system('url-dispatcher application:///{}'.format(desktop_file_name))
46+ ['url-dispatcher', 'application:///{}'.format(desktop_file_name)])
74− self.assertThat(
47+ self.assert_current_focused_application(application_name)
75− self.main_window.get_current_focused_app_id,
76− Eventually(Equals(application_name)))
77
48
78 self.main_window.show_dash_swiping()
49 self.main_window.show_dash_swiping()
79− self.assertThat(
50+ self.assert_current_focused_application('')
80− self.main_window.get_current_focused_app_id,
81− Eventually(Equals('')))
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 @@
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
1# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2#
2#
3−# Unity - Indicators Autopilot Test Suite
3+# Unity Indicators Autopilot Test Suite
4−# Copyright (C) 2013 Canonical
4+# Copyright (C) 2013, 2014 Canonical
5#
5#
6# This program is free software: you can redistribute it and/or modify
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
7# it under the terms of the GNU General Public License as published by
@@ -15,20 +15,32 @@
15#
15#
16# You should have received a copy of the GNU General Public License
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/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18−#
19
18
20from __future__ import absolute_import
19from __future__ import absolute_import
21
20
21+from testscenarios import multiply_scenarios
22+
22from autopilot import platform
23from autopilot import platform
23−from testtools import skipIf
24
24
25from unity8.process_helpers import unlock_unity
25from unity8.process_helpers import unlock_unity
26−from unity8.shell.tests import UnityTestCase
26+from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
27
27
28
28
29class IndicatorTestCase(UnityTestCase):
29class IndicatorTestCase(UnityTestCase):
30
30
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 = [
32 ('Bluetooth', dict(indicator_name='indicator-bluetooth')),
44 ('Bluetooth', dict(indicator_name='indicator-bluetooth')),
33 ('Datetime', dict(indicator_name='indicator-datetime')),
45 ('Datetime', dict(indicator_name='indicator-datetime')),
34 ('Location', dict(indicator_name='indicator-location')),
46 ('Location', dict(indicator_name='indicator-location')),
@@ -37,14 +49,58 @@ class IndicatorTestCase(UnityTestCase):
37 ('Power', dict(indicator_name='indicator-power')),
49 ('Power', dict(indicator_name='indicator-power')),
38 ('Sound', dict(indicator_name='indicator-sound')),
50 ('Sound', dict(indicator_name='indicator-sound')),
39 ]
51 ]
52+ scenarios = multiply_scenarios(
53+ indicator_scenarios,
54+ IndicatorTestCase.device_emulation_scenarios
55+ )
40
56
41− @skipIf(platform.image_codename() == 'Desktop',
42− "Unity8/phablet-only test!")
43 def setUp(self):
57 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.')
45
62
46 def test_indicator_exists(self):
63 def test_indicator_exists(self):
47− unity_proxy = self.launch_unity()
64+ self.main_window._get_indicator_widget(
48− unlock_unity(unity_proxy)
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(
49− indicator = self.main_window.get_indicator(self.indicator_name)
104+ self.indicator_name)
50− self.assertIsNotNone(indicator)
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):
89 break
89 break
90
90
91
91
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+
92def restart_unity_with_testability(*args):
108def restart_unity_with_testability(*args):
93 """Restarts (or starts) unity with testability enabled.
109 """Restarts (or starts) unity with testability enabled.
94
110
tests/autopilot/unity8/shell/__init__.py+50−1
@@ -21,8 +21,9 @@
21
21
22from time import sleep
22from time import sleep
23from functools import wraps
23from functools import wraps
24−import logging
24+from gi.repository import Notify
25
25
26+import logging
26
27
27logger = logging.getLogger(__name__)
28logger = logging.getLogger(__name__)
28
29
@@ -48,6 +49,7 @@ def disable_qml_mocking(fn):
48 return fn(*args, **kwargs)
49 return fn(*args, **kwargs)
49 return wrapper
50 return wrapper
50
51
52+
51class DragMixin(object):
53class DragMixin(object):
52 def _drag(self, x1, y1, x2, y2):
54 def _drag(self, x1, y1, x2, y2):
53 # XXX This ugly code is here just temporarily, waiting for drag
55 # XXX This ugly code is here just temporarily, waiting for drag
@@ -69,3 +71,50 @@ class DragMixin(object):
69 self.touch._finger_move(int(x2), int(y2))
71 self.touch._finger_move(int(x2), int(y2))
70 except AttributeError:
72 except AttributeError:
71 self.touch._device.finger_move(int(x2), int(y2))
73 self.touch._device.finger_move(int(x2), int(y2))
74+
75+
76+def create_ephemeral_notification(
77+ summary='',
78+ body='',
79+ icon=None,
80+ hints=[],
81+ urgency='NORMAL'
82+):
83+ """Create an ephemeral (non-interactive) notification
84+
85+ :param summary: Summary text for the notification
86+ :param body: Body text to display in the notification
87+ :param icon: Path string to the icon to use
88+ :param hint_strings: List of tuples containing the 'name' and value
89+ for setting the hint strings for the notification
90+ :param urgency: Urgency string for the noticiation, either: 'LOW',
91+ 'NORMAL', 'CRITICAL'
92+ """
93+ Notify.init('Unity8')
94+
95+ logger.info(
96+ "Creating ephemeral: summary(%s), body(%s), urgency(%r) "
97+ "and Icon(%s)",
98+ summary,
99+ body,
100+ urgency,
101+ icon
102+ )
103+
104+ notification = Notify.Notification.new(summary, body, icon)
105+
106+ for hint in hints:
107+ key, value = hint
108+ notification.set_hint_string(key, value)
109+ logger.info("Adding hint to notification: (%s, %s)", key, value)
110+ notification.set_urgency(_get_urgency(urgency))
111+
112+ return notification
113+
114+
115+def _get_urgency(urgency):
116+ """Translates urgency string to enum."""
117+ _urgency_enums = {'LOW': Notify.Urgency.LOW,
118+ 'NORMAL': Notify.Urgency.NORMAL,
119+ 'CRITICAL': Notify.Urgency.CRITICAL}
120+ return _urgency_enums.get(urgency.upper())
tests/autopilot/unity8/shell/emulators/__init__.py+2−6
@@ -17,16 +17,12 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20−from autopilot import input, introspection
20+from ubuntuuitoolkit import emulators as toolkit_emulators
21
21
22
22
23−class UnityEmulatorBase(introspection.CustomEmulatorBase):
23+class UnityEmulatorBase(toolkit_emulators.UbuntuUIToolkitEmulatorBase):
24 """A base class for all unity emulators."""
24 """A base class for all unity emulators."""
25
25
26− def __init__(self, *args):
27− super(UnityEmulatorBase, self).__init__(*args)
28− self.pointing_device = input.Pointer(device=input.Touch.create())
29−
30
26
31class UnityEmulatorException(Exception):
27class UnityEmulatorException(Exception):
32 """Exception raised when there is an error with the Unity emulators."""
28 """Exception raised when there is an error with the Unity emulators."""
tests/autopilot/unity8/shell/emulators/dash.py+25−5
@@ -23,6 +23,8 @@ from unity8.shell import emulators
23
23
24from autopilot import logging as autopilot_logging
24from autopilot import logging as autopilot_logging
25from autopilot.introspection import dbus
25from autopilot.introspection import dbus
26+from testtools.matchers import MatchesAny, Equals
27+from ubuntuuitoolkit import emulators as toolkit_emulators
26
28
27
29
28logger = logging.getLogger(__name__)
30logger = logging.getLogger(__name__)
@@ -132,6 +134,19 @@ class Dash(emulators.UnityEmulatorBase):
132 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
134 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
133 self.dash_content_list.currentIndex.wait_for(original_index + 1)
135 self.dash_content_list.currentIndex.wait_for(original_index + 1)
134
136
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+
135
150
136class GenericScopeView(emulators.UnityEmulatorBase):
151class GenericScopeView(emulators.UnityEmulatorBase):
137 """Autopilot emulator for generic scopes."""
152 """Autopilot emulator for generic scopes."""
@@ -176,13 +191,18 @@ class DashApps(GenericScopeView):
176
191
177 """
192 """
178 category_element = self._get_category_element(category)
193 category_element = self._get_category_element(category)
179− application_tiles = category_element.select_many('Card')
194+ application_cards = category_element.select_many('Card')
180− # TODO return them on the same order they are displayed.
195+
181− # --elopio - 2014-1-15
196+ # sort by y, x
197+ application_cards = sorted(
198+ application_cards,
199+ key=lambda card: (card.globalRect.y, card.globalRect.x))
200+
182 result = []
201 result = []
183− for card in application_tiles:
202+ for card in application_cards:
184 if card.objectName != 'cardToolCard':
203 if card.objectName != 'cardToolCard':
204+ card_header = card.select_single('CardHeader')
185− result.append(card)
205+ result.append(card_header.title)
186 return result
206 return result
187
207
188
208
tests/autopilot/unity8/shell/emulators/main_window.py+32−2
@@ -20,6 +20,7 @@
20import logging
20import logging
21
21
22from autopilot import logging as autopilot_logging
22from autopilot import logging as autopilot_logging
23+from autopilot import input
23
24
24from unity8.shell import emulators
25from unity8.shell import emulators
25from unity8.shell.emulators.greeter import Greeter
26from unity8.shell.emulators.greeter import Greeter
@@ -87,12 +88,32 @@ class QQuickView(emulators.UnityEmulatorBase):
87 def get_pinentryField(self):
88 def get_pinentryField(self):
88 return self.select_single(objectName="pinentryField")
89 return self.select_single(objectName="pinentryField")
89
90
90− def get_indicator(self, indicator_name):
91+ def _get_indicator_widget(self, indicator_name):
91− return self.wait_select_single(
92+ return self.select_single(
92 'DefaultIndicatorWidget',
93 'DefaultIndicatorWidget',
93 objectName=indicator_name+'-widget'
94 objectName=indicator_name+'-widget'
94 )
95 )
95
96
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+
96 def get_shell_background(self):
117 def get_shell_background(self):
97 return self.select_single(
118 return self.select_single(
98 "CrossFadeImage", objectName="backgroundImage")
119 "CrossFadeImage", objectName="backgroundImage")
@@ -113,3 +134,12 @@ class QQuickView(emulators.UnityEmulatorBase):
113 def get_current_focused_app_id(self):
134 def get_current_focused_app_id(self):
114 """Return the id of the focused application."""
135 """Return the id of the focused application."""
115 return self.select_single('Shell').focusedApplicationId
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/test_emulators.py+20−12
@@ -39,6 +39,22 @@ from unity8.shell import emulators, fixture_setup, tests
39from unity8.shell.emulators import dash as dash_emulators
39from unity8.shell.emulators import dash as dash_emulators
40
40
41
41
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+
42class DashBaseTestCase(tests.UnityTestCase):
58class DashBaseTestCase(tests.UnityTestCase):
43
59
44 scenarios = tests._get_device_emulation_scenarios()
60 scenarios = tests._get_device_emulation_scenarios()
@@ -150,7 +166,7 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
150 available_applications = [
166 available_applications = [
151 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
167 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
152 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
168 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
153− 'Title.2.9', 'Title.2.10', 'Title.2.11']
169+ 'Title.2.10', 'Title.2.11', 'Title.2.12']
154
170
155 def setUp(self):
171 def setUp(self):
156 # Set up the fake scopes before launching unity.
172 # Set up the fake scopes before launching unity.
@@ -167,28 +183,20 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
167 self.assertEqual(
183 self.assertEqual(
168 'No category found with name unexisting category', str(exception))
184 'No category found with name unexisting category', str(exception))
169
185
170− def test_get_applications_should_return_list_with_names(self):
186+ def test_get_applications_should_return_correct_applications(self):
171 category = '2'
187 category = '2'
172 expected_apps_count = self._get_number_of_application_slots(category)
188 expected_apps_count = self._get_number_of_application_slots(category)
173 expected_applications = self.available_applications[
189 expected_applications = self.available_applications[
174 :expected_apps_count]
190 :expected_apps_count]
175−
176 applications = self.applications_scope.get_applications(category)
191 applications = self.applications_scope.get_applications(category)
177− applications_titles = []
178− for application in applications:
179− cardHeader = application.select_single('CardHeader')
180− applications_titles.append(cardHeader.title)
181−
182− self.assertThat(applications, HasLength(expected_apps_count))
183− for expected in expected_applications:
192+ self.assertEqual(expected_applications, applications)
184− self.assertThat(applications_titles, Contains(expected))
185
193
186 def _get_number_of_application_slots(self, category):
194 def _get_number_of_application_slots(self, category):
187 category_element = self.applications_scope._get_category_element(
195 category_element = self.applications_scope._get_category_element(
188 category)
196 category)
189 grid = category_element.select_single('CardFilterGrid')
197 grid = category_element.select_single('CardFilterGrid')
190 filtergrid = grid.select_single('FilterGrid')
198 filtergrid = grid.select_single('FilterGrid')
191− if (grid.filter):
199+ if (grid.filtered):
192 return filtergrid.collapsedRowCount * filtergrid.columns
200 return filtergrid.collapsedRowCount * filtergrid.columns
193 else:
201 else:
194 return filtergrid.uncollapsedRowCount * filtergrid.columns
202 return filtergrid.uncollapsedRowCount * filtergrid.columns
tests/autopilot/unity8/shell/tests/test_notifications.py+100−61
@@ -21,6 +21,7 @@
21
21
22from __future__ import absolute_import
22from __future__ import absolute_import
23
23
24+from unity8 import shell
24from unity8.process_helpers import unlock_unity
25from unity8.process_helpers import unlock_unity
25from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
26from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
26
27
@@ -64,7 +65,8 @@ class NotificationsBase(UnityTestCase):
64 if os.path.abspath(__file__).startswith('/usr/'):
65 if os.path.abspath(__file__).startswith('/usr/'):
65 return '/usr/share/unity8/graphics/' + icon_name
66 return '/usr/share/unity8/graphics/' + icon_name
66 else:
67 else:
67− return os.path.dirname(__file__) + "/../../../../../qml/graphics/" + icon_name
68+ return os.path.dirname(__file__) + (
69+ "/../../../../../qml/graphics/" + icon_name)
68
70
69 def _get_notifications_list(self):
71 def _get_notifications_list(self):
70 return self.main_window.select_single(
72 return self.main_window.select_single(
@@ -196,7 +198,7 @@ class InteractiveNotificationBase(NotificationsBase):
196 get_notification = lambda: notify_list.wait_select_single(
198 get_notification = lambda: notify_list.wait_select_single(
197 'Notification', objectName='notification1')
199 'Notification', objectName='notification1')
198 notification = get_notification()
200 notification = get_notification()
199− self._assert_notification(notification, None, None, True, True, 1.0)
201+ self._assert_notification(notification, summary, body, True, True, 1.0)
200 initial_height = notification.height
202 initial_height = notification.height
201 self.touch.tap_object(notification.select_single(objectName="button1"))
203 self.touch.tap_object(notification.select_single(objectName="button1"))
202 self.assertThat(
204 self.assertThat(
@@ -209,6 +211,89 @@ class InteractiveNotificationBase(NotificationsBase):
209 self.touch.tap_object(notification.select_single(objectName="button4"))
211 self.touch.tap_object(notification.select_single(objectName="button4"))
210 self.assert_notification_action_id_was_called("action_decline_4")
212 self.assert_notification_action_id_was_called("action_decline_4")
211
213
214+ def test_modal_sd_without_greeter (self):
215+ """A snap-decision on a phone should block input to shell beneath it when there's no greeter."""
216+ unity_proxy = self.launch_unity()
217+ unlock_unity(unity_proxy)
218+
219+ summary = "Incoming file"
220+ body = "Frank would like to send you the file: essay.pdf"
221+ icon_path = "sync-idle"
222+ hints = [
223+ ("x-canonical-snap-decisions", "true"),
224+ ("x-canonical-non-shaped-icon", "true"),
225+ ]
226+
227+ actions = [
228+ ('action_accept', 'Accept'),
229+ ('action_decline_1', 'Decline'),
230+ ]
231+
232+ self._create_interactive_notification(
233+ summary,
234+ body,
235+ icon_path,
236+ "NORMAL",
237+ actions,
238+ hints
239+ )
240+
241+ # verify that we cannot reveal the launcher (no longer interact with the shell)
242+ time.sleep(1)
243+ self.main_window.show_dash_swiping()
244+ launcher = self.main_window.get_launcher()
245+ self.assertThat(launcher.shown, Eventually(Equals(False)))
246+
247+ # verify and interact with the triggered snap-decision notification
248+ notify_list = self._get_notifications_list()
249+ get_notification = lambda: notify_list.wait_select_single(
250+ 'Notification', objectName='notification1')
251+ notification = get_notification()
252+ self._assert_notification(notification, summary, body, True, False, 1.0)
253+ self.touch.tap_object(notification.select_single(objectName="button0"))
254+ self.assert_notification_action_id_was_called("action_accept")
255+
256+ def test_modal_sd_with_greeter (self):
257+ """A snap-decision on a phone should not block input to the greeter beneath it."""
258+ unity_proxy = self.launch_unity()
259+
260+ summary = "Incoming file"
261+ body = "Frank would like to send you the file: essay.pdf"
262+ icon_path = "sync-idle"
263+ hints = [
264+ ("x-canonical-snap-decisions", "true"),
265+ ("x-canonical-non-shaped-icon", "true"),
266+ ]
267+
268+ actions = [
269+ ('action_accept', 'Accept'),
270+ ('action_decline_1', 'Decline'),
271+ ]
272+
273+ self._create_interactive_notification(
274+ summary,
275+ body,
276+ icon_path,
277+ "NORMAL",
278+ actions,
279+ hints
280+ )
281+
282+ # verify that we can swipe away the greeter (interact with the "shell")
283+ time.sleep(1)
284+ self.main_window.show_dash_swiping()
285+ greeter = self.main_window.get_greeter()
286+ self.assertThat(greeter.shown, Eventually(Equals(False)))
287+
288+ # verify and interact with the triggered snap-decision notification
289+ notify_list = self._get_notifications_list()
290+ get_notification = lambda: notify_list.wait_select_single(
291+ 'Notification', objectName='notification1')
292+ notification = get_notification()
293+ self._assert_notification(notification, summary, body, True, False, 1.0)
294+ self.touch.tap_object(notification.select_single(objectName="button0"))
295+ self.assert_notification_action_id_was_called("action_accept")
296+
212 def _create_interactive_notification(
297 def _create_interactive_notification(
213 self,
298 self,
214 summary="",
299 summary="",
@@ -354,7 +439,7 @@ class EphemeralNotificationsTests(NotificationsBase):
354 )
439 )
355 ]
440 ]
356
441
357− notification = self._create_ephemeral_notification(
442+ notification = shell.create_ephemeral_notification(
358 summary,
443 summary,
359 body,
444 body,
360 icon_path,
445 icon_path,
@@ -391,7 +476,7 @@ class EphemeralNotificationsTests(NotificationsBase):
391 )
476 )
392 ]
477 ]
393
478
394− notification = self._create_ephemeral_notification(
479+ notification = shell.create_ephemeral_notification(
395 summary,
480 summary,
396 None,
481 None,
397 None,
482 None,
@@ -403,7 +488,6 @@ class EphemeralNotificationsTests(NotificationsBase):
403
488
404 notification = lambda: notify_list.wait_select_single(
489 notification = lambda: notify_list.wait_select_single(
405 'Notification', objectName='notification1')
490 'Notification', objectName='notification1')
406−
407 self._assert_notification(
491 self._assert_notification(
408 notification(),
492 notification(),
409 summary,
493 summary,
@@ -434,7 +518,7 @@ class EphemeralNotificationsTests(NotificationsBase):
434 body_critical = 'Dude, this is so urgent you have no idea :)'
518 body_critical = 'Dude, this is so urgent you have no idea :)'
435 icon_path_critical = self._get_icon_path('avatars/anna_olsson.png')
519 icon_path_critical = self._get_icon_path('avatars/anna_olsson.png')
436
520
437− notification_normal = self._create_ephemeral_notification(
521+ notification_normal = shell.create_ephemeral_notification(
438 summary_normal,
522 summary_normal,
439 body_normal,
523 body_normal,
440 icon_path_normal,
524 icon_path_normal,
@@ -442,7 +526,7 @@ class EphemeralNotificationsTests(NotificationsBase):
442 )
526 )
443 notification_normal.show()
527 notification_normal.show()
444
528
445− notification_low = self._create_ephemeral_notification(
529+ notification_low = shell.create_ephemeral_notification(
446 summary_low,
530 summary_low,
447 body_low,
531 body_low,
448 icon_path_low,
532 icon_path_low,
@@ -450,7 +534,7 @@ class EphemeralNotificationsTests(NotificationsBase):
450 )
534 )
451 notification_low.show()
535 notification_low.show()
452
536
453− notification_critical = self._create_ephemeral_notification(
537+ notification_critical = shell.create_ephemeral_notification(
454 summary_critical,
538 summary_critical,
455 body_critical,
539 body_critical,
456 icon_path_critical,
540 icon_path_critical,
@@ -511,7 +595,7 @@ class EphemeralNotificationsTests(NotificationsBase):
511 summary = 'Summary-Body'
595 summary = 'Summary-Body'
512 body = 'This is a superfluous notification'
596 body = 'This is a superfluous notification'
513
597
514− notification = self._create_ephemeral_notification(summary, body)
598+ notification = shell.create_ephemeral_notification(summary, body)
515 notification.show()
599 notification.show()
516
600
517 notification = notify_list.wait_select_single(
601 notification = notify_list.wait_select_single(
@@ -535,7 +619,7 @@ class EphemeralNotificationsTests(NotificationsBase):
535
619
536 summary = 'Summary-Only'
620 summary = 'Summary-Only'
537
621
538− notification = self._create_ephemeral_notification(summary)
622+ notification = shell.create_ephemeral_notification(summary)
539 notification.show()
623 notification.show()
540
624
541 notification = notify_list.wait_select_single(
625 notification = notify_list.wait_select_single(
@@ -555,7 +639,7 @@ class EphemeralNotificationsTests(NotificationsBase):
555 body = 'This is the original content of this notification-bubble.'
639 body = 'This is the original content of this notification-bubble.'
556 icon_path = self._get_icon_path('avatars/funky.png')
640 icon_path = self._get_icon_path('avatars/funky.png')
557
641
558− notification = self._create_ephemeral_notification(
642+ notification = shell.create_ephemeral_notification(
559 summary,
643 summary,
560 body,
644 body,
561 icon_path
645 icon_path
@@ -579,7 +663,7 @@ class EphemeralNotificationsTests(NotificationsBase):
579 icon_path = self._get_icon_path('avatars/amanda.png')
663 icon_path = self._get_icon_path('avatars/amanda.png')
580 notification.update(summary, body, icon_path)
664 notification.update(summary, body, icon_path)
581 notification.show()
665 notification.show()
582− self._assert_notification(get_notification(), summary, body)
666+ self._assert_notification(get_notification(), summary, body, True, False, 1.0)
583
667
584 def test_update_notification_layout_change(self):
668 def test_update_notification_layout_change(self):
585 """Notification must allow updating its contents and layout while
669 """Notification must allow updating its contents and layout while
@@ -595,7 +679,7 @@ class EphemeralNotificationsTests(NotificationsBase):
595 icon_path = self._get_icon_path('avatars/anna_olsson.png')
679 icon_path = self._get_icon_path('avatars/anna_olsson.png')
596 hint_icon = self._get_icon_path('applicationIcons/phone-app.png')
680 hint_icon = self._get_icon_path('applicationIcons/phone-app.png')
597
681
598− notification = self._create_ephemeral_notification(
682+ notification = shell.create_ephemeral_notification(
599 summary,
683 summary,
600 body,
684 body,
601 icon_path
685 icon_path
@@ -626,7 +710,7 @@ class EphemeralNotificationsTests(NotificationsBase):
626 notification.show()
710 notification.show()
627
711
628 self.assertThat(get_notification, Eventually(NotEquals(None)))
712 self.assertThat(get_notification, Eventually(NotEquals(None)))
629− self._assert_notification(get_notification(), summary, body, False)
713+ self._assert_notification(get_notification(), summary, body, False, False, 1.0)
630
714
631 def test_append_hint(self):
715 def test_append_hint(self):
632 """Notification has to accumulate body-text using append-hint."""
716 """Notification has to accumulate body-text using append-hint."""
@@ -639,7 +723,7 @@ class EphemeralNotificationsTests(NotificationsBase):
639 body = 'Hey Bro Coly!'
723 body = 'Hey Bro Coly!'
640 icon_path = self._get_icon_path('avatars/amanda.png')
724 icon_path = self._get_icon_path('avatars/amanda.png')
641 body_sum = body
725 body_sum = body
642− notification = self._create_ephemeral_notification(
726+ notification = shell.create_ephemeral_notification(
643 summary,
727 summary,
644 body,
728 body,
645 icon_path,
729 icon_path,
@@ -675,7 +759,7 @@ class EphemeralNotificationsTests(NotificationsBase):
675 for new_body in bodies:
759 for new_body in bodies:
676 body = new_body
760 body = new_body
677 body_sum += '\n' + body
761 body_sum += '\n' + body
678− notification = self._create_ephemeral_notification(
762+ notification = shell.create_ephemeral_notification(
679 summary,
763 summary,
680 body,
764 body,
681 icon_path,
765 icon_path,
@@ -696,48 +780,3 @@ class EphemeralNotificationsTests(NotificationsBase):
696 False,
780 False,
697 1.0
781 1.0
698 )
782 )
699−
700− def _create_ephemeral_notification(
701− self,
702− summary="",
703− body="",
704− icon=None,
705− hints=[],
706− urgency="NORMAL"
707− ):
708− """Create an ephemeral (non-interactive) notification
709−
710− :param summary: Summary text for the notification
711− :param body: Body text to display in the notification
712− :param icon: Path string to the icon to use
713− :param hint_strings: List of tuples containing the 'name' and value
714− for setting the hint strings for the notification
715− :param urgency: Urgency string for the noticiation, either: 'LOW',
716− 'NORMAL', 'CRITICAL'
717−
718− """
719− logger.info(
720− "Creating ephemeral: summary(%s), body(%s), urgency(%r) "
721− "and Icon(%s)",
722− summary,
723− body,
724− urgency,
725− icon
726− )
727−
728− n = Notify.Notification.new(summary, body, icon)
729−
730− for hint in hints:
731− key, value = hint
732− n.set_hint_string(key, value)
733− logger.info("Adding hint to notification: (%s, %s)", key, value)
734− n.set_urgency(self._get_urgency(urgency))
735−
736− return n
737−
738− def _get_urgency(self, urgency):
739− """Translates urgency string to enum."""
740− _urgency_enums = {'LOW': Notify.Urgency.LOW,
741− 'NORMAL': Notify.Urgency.NORMAL,
742− 'CRITICAL': Notify.Urgency.CRITICAL}
743− return _urgency_enums.get(urgency.upper())
tests/autopilot/unity8/shell/tests/test_system_integration.py+1−1
@@ -37,5 +37,5 @@ class SystemIntegrationTests(UnityTestCase):
37 self.launch_unity()
37 self.launch_unity()
38
38
39 # invoke policykit to check permissions
39 # invoke policykit to check permissions
40− pid = subprocess.check_output("pidof -s unity8", shell=True)
40+ pid = subprocess.check_output(["pidof", "-s", "unity8"], universal_newlines=True)
41 subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
41 subprocess.check_call("pkcheck --action-id org.freedesktop.NetworkManager.enable-disable-network --process " + pid, shell=True)
tests/autopilot/unity8/shell/tests/test_upstart.py+2−2
@@ -82,7 +82,7 @@ class UpstartIntegrationTests(UnityTestCase):
82 ))
82 ))
83
83
84 def test_no_sigstop(self):
84 def test_no_sigstop(self):
85− self.patch_environment("UPSTART_JOB", "foo")
85+ self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "")
86 self._launch_unity()
86 self._launch_unity()
87 self._set_proxy()
87 self._set_proxy()
88
88
@@ -91,7 +91,7 @@ class UpstartIntegrationTests(UnityTestCase):
91 logger.debug("Unity loaded and ready.")
91 logger.debug("Unity loaded and ready.")
92
92
93 def test_expect_sigstop(self):
93 def test_expect_sigstop(self):
94− self.patch_environment("UPSTART_JOB", "unity8")
94+ self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "1")
95 self._launch_unity()
95 self._launch_unity()
96 self.assertThat(lambda: os.WIFSTOPPED(self._get_status()), Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
96 self.assertThat(lambda: os.WIFSTOPPED(self._get_status()), Eventually(Equals(True)), "Unity8 should raise SIGSTOP when ready")
97
97
tests/plugins/DashViews/CMakeLists.txt+23−35
@@ -25,46 +25,41 @@ remove_definitions(-DQT_NO_KEYWORDS)
25add_definitions(-DDASHVIEWSTEST_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
25add_definitions(-DDASHVIEWSTEST_FOLDER="${CMAKE_CURRENT_SOURCE_DIR}")
26add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
26add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
27
27
28+macro(add_lvwph_test FILENAME TESTNAME)
29+ add_executable(${TESTNAME}TestExec
30+ ${FILENAME}test.cpp
28−add_executable(listviewwithpageheadertestExec listviewwithpageheadertest.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
31+ ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
29−qt5_use_modules(listviewwithpageheadertestExec Test Core Qml)
32+ qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
30−target_link_libraries(listviewwithpageheadertestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
33+ target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
31−add_custom_target(testlistviewwithpageheader ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheader.xml,xunitxml -o -,txt)
32
34
33−add_executable(listviewwithpageheadertestsectionExec listviewwithpageheadertestsection.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
35+ add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
34−qt5_use_modules(listviewwithpageheadertestsectionExec Test Core Qml)
36+endmacro()
35−target_link_libraries(listviewwithpageheadertestsectionExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
36−add_custom_target(testlistviewwithpageheadersection ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersection.xml,xunitxml -o -,txt)
37
37
38−add_executable(listviewwithpageheadertestsectionexternalmodelExec listviewwithpageheadertestsectionexternalmodel.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/listviewwithpageheader.cpp)
38+add_lvwph_test(listviewwithpageheader ListViewWithPageHeader)
39−qt5_use_modules(listviewwithpageheadertestsectionexternalmodelExec Test Core Qml)
39+add_lvwph_test(listviewwithpageheadersection ListViewWithPageHeaderSection)
40−target_link_libraries(listviewwithpageheadertestsectionexternalmodelExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
40+add_lvwph_test(listviewwithpageheadersectionexternalmodel ListViewWithPageHeaderSectionExternalModel)
41−add_custom_target(testlistviewwithpageheadersectionexternalmodel ${CMAKE_CURRENT_BINARY_DIR}/listviewwithpageheadertestsectionexternalmodelExec -o ${CMAKE_BINARY_DIR}/testlistviewwithpageheadersectionexternalmodel.xml,xunitxml -o -,txt)
42
41
43macro(add_dashview_try_test FILENAME TESTNAME)
42macro(add_dashview_try_test FILENAME TESTNAME)
44− add_executable(${FILENAME}testExec
43+ add_executable(${TESTNAME}TestExec
45 ${FILENAME}test.cpp
44 ${FILENAME}test.cpp
46 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
45 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
47 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
46 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
48 )
47 )
49− qt5_use_modules(${FILENAME}testExec Test Core Qml)
48+ qt5_use_modules(${TESTNAME}TestExec Test Core Qml)
50− target_link_libraries(${FILENAME}testExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
49+ target_link_libraries(${TESTNAME}TestExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
51− add_custom_target(test${TESTNAME}
52− ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}testExec
53− -o ${CMAKE_BINARY_DIR}/test${TESTNAME}.xml,xunitxml
54− -o -,txt
55− DEPENDS ${FILENAME}testExec DashViews-qml
56− )
57
50
51+ add_binary_qml_test(${TESTNAME} "" "DashViews-qml")
52+
58− add_executable(${FILENAME}tryExec
53+ add_executable(${TESTNAME}tryExec
59 ${FILENAME}try.cpp
54 ${FILENAME}try.cpp
60 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
55 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/${FILENAME}.cpp
61 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
56 ${CMAKE_CURRENT_SOURCE_DIR}/../../../plugins/DashViews/abstractdashview.cpp
62 )
57 )
63− qt5_use_modules(${FILENAME}tryExec Test Core Qml)
58+ qt5_use_modules(${TESTNAME}tryExec Test Core Qml)
64− target_link_libraries(${FILENAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
59+ target_link_libraries(${TESTNAME}tryExec ${Qt5Gui_LIBRARIES} ${Qt5Quick_LIBRARIES})
65 add_custom_target(try${TESTNAME}
60 add_custom_target(try${TESTNAME}
66− ${CMAKE_CURRENT_BINARY_DIR}/${FILENAME}tryExec
61+ ${CMAKE_CURRENT_BINARY_DIR}/${TESTNAME}tryExec
67− DEPENDS ${FILENAME}tryExec DashViews-qml
62+ DEPENDS ${TESTNAME}tryExec DashViews-qml
68 )
63 )
69endmacro()
64endmacro()
70
65
@@ -72,13 +67,6 @@ add_dashview_try_test(verticaljournal VerticalJournal)
72add_dashview_try_test(horizontaljournal HorizontalJournal)
67add_dashview_try_test(horizontaljournal HorizontalJournal)
73add_dashview_try_test(organicgrid OrganicGrid)
68add_dashview_try_test(organicgrid OrganicGrid)
74
69
70+set(qmltest_DEFAULT_TARGETS qmluitests)
75set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
71set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
76−add_qml_test(. listviewwithpageheaderqml IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
72+add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
77−
78−add_dependencies(qmluitests testlistviewwithpageheader)
79−add_dependencies(qmluitests testlistviewwithpageheadersection)
80−add_dependencies(qmluitests testlistviewwithpageheadersectionexternalmodel)
81−add_dependencies(qmluitests testlistviewwithpageheaderqml)
82−add_dependencies(qmluitests testVerticalJournal)
83−add_dependencies(qmluitests testHorizontalJournal)
84−add_dependencies(qmluitests testOrganicGrid)
tests/plugins/DashViews/listviewwithpageheadertestsectionexternalmodel.cpp → tests/plugins/DashViews/listviewwithpageheadersectionexternalmodeltest.cpprenamed+1−5
@@ -24,11 +24,7 @@
24#include <QtTestGui>
24#include <QtTestGui>
25#pragma GCC diagnostic push
25#pragma GCC diagnostic push
26#pragma GCC diagnostic ignored "-pedantic"
26#pragma GCC diagnostic ignored "-pedantic"
27−#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
28−#include <private/qquicklistmodel_p.h>
29−#else
30#include <private/qqmllistmodel_p.h>
27#include <private/qqmllistmodel_p.h>
31−#endif
32#include <private/qquickanimation_p.h>
28#include <private/qquickanimation_p.h>
33#include <private/qquickitem_p.h>
29#include <private/qquickitem_p.h>
34#pragma GCC diagnostic pop
30#pragma GCC diagnostic pop
@@ -248,4 +244,4 @@ private:
248
244
249QTEST_MAIN(ListViewWithPageHeaderTestSection)
245QTEST_MAIN(ListViewWithPageHeaderTestSection)
250
246
251−#include "listviewwithpageheadertestsectionexternalmodel.moc"
247+#include "listviewwithpageheadersectionexternalmodeltest.moc"
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp → tests/plugins/DashViews/listviewwithpageheadersectiontest.cpprenamed+1−13
@@ -23,11 +23,7 @@
23#include <QtTestGui>
23#include <QtTestGui>
24#pragma GCC diagnostic push
24#pragma GCC diagnostic push
25#pragma GCC diagnostic ignored "-pedantic"
25#pragma GCC diagnostic ignored "-pedantic"
26−#if QT_VERSION < QT_VERSION_CHECK(5, 1, 0)
27−#include <private/qquicklistmodel_p.h>
28−#else
29#include <private/qqmllistmodel_p.h>
26#include <private/qqmllistmodel_p.h>
30−#endif
31#include <private/qquickanimation_p.h>
27#include <private/qquickanimation_p.h>
32#include <private/qquickitem_p.h>
28#include <private/qquickitem_p.h>
33#pragma GCC diagnostic pop
29#pragma GCC diagnostic pop
@@ -135,11 +131,7 @@ private Q_SLOTS:
135 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
131 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
136 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsection.qml"));
132 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertestsection.qml"));
137 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
133 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
138−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
139− model = view->rootObject()->findChild<QQuickListModel*>();
140−#else
141 model = view->rootObject()->findChild<QQmlListModel*>();
134 model = view->rootObject()->findChild<QQmlListModel*>();
142−#endif
143 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
135 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
144 QVERIFY(lvwph);
136 QVERIFY(lvwph);
145 QVERIFY(model);
137 QVERIFY(model);
@@ -2156,14 +2148,10 @@ private Q_SLOTS:
2156private:
2148private:
2157 QQuickView *view;
2149 QQuickView *view;
2158 ListViewWithPageHeader *lvwph;
2150 ListViewWithPageHeader *lvwph;
2159−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
2160− QQuickListModel *model;
2161−#else
2162 QQmlListModel *model;
2151 QQmlListModel *model;
2163−#endif
2164 QQmlComponent *otherDelegate;
2152 QQmlComponent *otherDelegate;
2165};
2153};
2166
2154
2167QTEST_MAIN(ListViewWithPageHeaderTestSection)
2155QTEST_MAIN(ListViewWithPageHeaderTestSection)
2168
2156
2169−#include "listviewwithpageheadertestsection.moc"
2157+#include "listviewwithpageheadersectiontest.moc"
tests/plugins/DashViews/listviewwithpageheadertest.cpp−15
@@ -23,11 +23,7 @@
23#include <QtTestGui>
23#include <QtTestGui>
24#pragma GCC diagnostic push
24#pragma GCC diagnostic push
25#pragma GCC diagnostic ignored "-pedantic"
25#pragma GCC diagnostic ignored "-pedantic"
26−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
27−#include <private/qquicklistmodel_p.h>
28−#else
29#include <private/qqmllistmodel_p.h>
26#include <private/qqmllistmodel_p.h>
30−#endif
31#include <private/qquickanimation_p.h>
27#include <private/qquickanimation_p.h>
32#include <private/qquickitem_p.h>
28#include <private/qquickitem_p.h>
33#pragma GCC diagnostic pop
29#pragma GCC diagnostic pop
@@ -124,11 +120,7 @@ private Q_SLOTS:
124 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
120 view->engine()->addImportPath(BUILT_PLUGINS_DIR);
125 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertest.qml"));
121 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/listviewwithpageheadertest.qml"));
126 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
122 lvwph = dynamic_cast<ListViewWithPageHeader*>(view->rootObject()->findChild<QQuickFlickable*>());
127−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
128− model = view->rootObject()->findChild<QQuickListModel*>();
129−#else
130 model = view->rootObject()->findChild<QQmlListModel*>();
123 model = view->rootObject()->findChild<QQmlListModel*>();
131−#endif
132 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
124 otherDelegate = view->rootObject()->findChild<QQmlComponent*>();
133 QVERIFY(lvwph);
125 QVERIFY(lvwph);
134 QVERIFY(model);
126 QVERIFY(model);
@@ -1747,9 +1739,6 @@ private Q_SLOTS:
1747
1739
1748 void testMaximizeVisibleAreaMoveUpAndShowHeader()
1740 void testMaximizeVisibleAreaMoveUpAndShowHeader()
1749 {
1741 {
1750−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1751− QSKIP("This test is extremely unstable in 5.0.x");
1752−#endif
1753 model->setProperty(0, "size", 800);
1742 model->setProperty(0, "size", 800);
1754 verifyItem(0, 50., 800., false);
1743 verifyItem(0, 50., 800., false);
1755
1744
@@ -1913,11 +1902,7 @@ private Q_SLOTS:
1913private:
1902private:
1914 QQuickView *view;
1903 QQuickView *view;
1915 ListViewWithPageHeader *lvwph;
1904 ListViewWithPageHeader *lvwph;
1916−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1917− QQuickListModel *model;
1918−#else
1919 QQmlListModel *model;
1905 QQmlListModel *model;
1920−#endif
1921 QQmlComponent *otherDelegate;
1906 QQmlComponent *otherDelegate;
1922};
1907};
1923
1908
tests/plugins/DashViews/tst_listviewwithpageheaderqml.qml → tests/plugins/DashViews/tst_ListViewWithPageHeaderQML.qmlrenamed

The content is the same.

tests/plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -20,6 +20,7 @@ macro(add_gesture_ui_test CLASSNAME)
20 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
20 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
21
21
22 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
22 add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
23+ add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
23endmacro(add_gesture_ui_test)
24endmacro(add_gesture_ui_test)
24
25
25macro(add_gesture_test CLASSNAME)
26macro(add_gesture_test CLASSNAME)
tests/plugins/Unity/Launcher/CMakeLists.txt+3−3
@@ -15,9 +15,9 @@ add_definitions(-DSRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
15add_definitions(-DLAUNCHER_TESTING)
15add_definitions(-DLAUNCHER_TESTING)
16
16
17### LauncherBackendTest
17### LauncherBackendTest
18−set(testBackendCommand ${CMAKE_CURRENT_BINARY_DIR}/launcherbackendtestExec
18+set(testBackendCommand dbus-test-runner --task ${CMAKE_CURRENT_BINARY_DIR}/launcherbackendtestExec
19− -o ${CMAKE_BINARY_DIR}/launcherbackendtest.xml,xunitxml
19+ --parameter -o --parameter ${CMAKE_BINARY_DIR}/launcherbackendtest.xml,xunitxml
20− -o -,txt)
20+ --parameter -o --parameter -,txt)
21add_test(NAME launcherbackendtest COMMAND ${testBackendCommand})
21add_test(NAME launcherbackendtest COMMAND ${testBackendCommand})
22add_custom_target(launcherbackendtest ${testBackendCommand})
22add_custom_target(launcherbackendtest ${testBackendCommand})
23add_executable(launcherbackendtestExec
23add_executable(launcherbackendtestExec
tests/plugins/Unity/Launcher/launcherbackendtest.cpp+167
@@ -20,6 +20,10 @@
20#include "launcherbackend.h"
20#include "launcherbackend.h"
21
21
22#include <QtTest>
22#include <QtTest>
23+#include <QDBusConnection>
24+#include <QDBusMessage>
25+#include <QDBusVariant>
26+
23
27
24class LauncherBackendTest : public QObject
28class LauncherBackendTest : public QObject
25{
29{
@@ -66,6 +70,169 @@ private Q_SLOTS:
66
70
67 QCOMPARE(backend.icon(appId), expectedIcon);
71 QCOMPARE(backend.icon(appId), expectedIcon);
68 }
72 }
73+
74+ void testGetItem_data() {
75+ QTest::addColumn<QString>("appId");
76+ QTest::addColumn<bool>("exists");
77+
78+ QTest::newRow("Exists") << "rel-icon" << true;
79+ QTest::newRow("Doesn't Exist") << "does-not-exist" << false;
80+ }
81+
82+ void testGetItem() {
83+ QFETCH(QString, appId);
84+ QFETCH(bool, exists);
85+
86+ LauncherBackend backend;
87+ auto item = backend.getItem(appId);
88+
89+ if (exists) {
90+ QVERIFY(item != nullptr);
91+ } else {
92+ QVERIFY(item == nullptr);
93+ }
94+ }
95+
96+ void testCount_data() {
97+ QTest::addColumn<QString>("appId");
98+ QTest::addColumn<bool>("setCount");
99+ QTest::addColumn<int>("inCount");
100+ QTest::addColumn<bool>("countVisible");
101+ QTest::addColumn<int>("expectedCount");
102+
103+ /* Get baseline data on things working */
104+ QTest::newRow("Baseline") << "rel-icon" << false << 0 << false << -1;
105+
106+ /* Valid count, but not visible */
107+ QTest::newRow("Not visible") << "rel-icon" << true << 42 << false << -1;
108+
109+ /* Turn it on */
110+ QTest::newRow("Visible Count") << "rel-icon" << true << 42 << true << 42;
111+
112+ /* Invalide app to load */
113+ QTest::newRow("Invalid App ID") << "this-app-doesnt-exist" << true << 42 << true << -1;
114+ }
115+
116+ void testCount() {
117+ QFETCH(QString, appId);
118+ QFETCH(bool, setCount);
119+ QFETCH(int, inCount);
120+ QFETCH(bool, countVisible);
121+ QFETCH(int, expectedCount);
122+
123+ LauncherBackend backend;
124+
125+ if (setCount)
126+ backend.setCount(appId, inCount);
127+ backend.setCountVisible(appId, countVisible);
128+
129+ QCOMPARE(backend.count(appId), expectedCount);
130+ }
131+
132+ void testDbusName_data() {
133+ QTest::addColumn<QString>("decoded");
134+ QTest::addColumn<QString>("encoded");
135+
136+ /* Passthrough test */
137+ QTest::newRow("Passthrough") << "fine" << "fine";
138+
139+ /* Number as first characeter */
140+ QTest::newRow("Number first") << "31337" << "_331337";
141+
142+ /* Underscore test */
143+ QTest::newRow("Underscore test") << "this_is_c_style_namespacing" << "this_5Fis_5Fc_5Fstyle_5Fnamespacing";
144+
145+ /* Hyphen test */
146+ QTest::newRow("Hyphen test") << "typical-application" << "typical_2Dapplication";
147+
148+ /* Japanese test */
149+ QTest::newRow("日本語 test") << "日本語" << "_E6_97_A5_E6_9C_AC_E8_AA_9E";
150+ }
151+
152+ void testDbusName() {
153+ QFETCH(QString, decoded);
154+ QFETCH(QString, encoded);
155+
156+ QString encodeOut = LauncherBackend::encodeAppId(decoded);
157+ QCOMPARE(encoded, encodeOut);
158+
159+ QString decodeOut = LauncherBackend::decodeAppId(encoded);
160+ QCOMPARE(decoded, decodeOut);
161+ }
162+
163+ void testDbusIface_data() {
164+ QTest::addColumn<QString>("appId");
165+ QTest::addColumn<bool>("setCount");
166+ QTest::addColumn<int>("inCount");
167+ QTest::addColumn<bool>("countVisible");
168+ QTest::addColumn<int>("expectedCount");
169+
170+ /* Get baseline data on things working */
171+ QTest::newRow("Baseline") << "rel-icon" << false << 0 << false << -1;
172+
173+ /* Turn it on */
174+ QTest::newRow("Visible Count") << "rel-icon" << true << 42 << true << 42;
175+
176+ /* Invalide app to load */
177+ QTest::newRow("Invalid App ID") << "this-app-doesnt-exist" << true << 42 << true << -1;
178+ }
179+
180+ void testDbusIface() {
181+ QFETCH(QString, appId);
182+ QFETCH(bool, setCount);
183+ QFETCH(int, inCount);
184+ QFETCH(bool, countVisible);
185+ QFETCH(int, expectedCount);
186+
187+ QDBusConnection con = QDBusConnection::sessionBus();
188+ QDBusMessage message;
189+ QDBusMessage reply;
190+
191+ LauncherBackend backend;
192+
193+ if (setCount) {
194+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
195+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
196+ "org.freedesktop.DBus.Properties",
197+ "Set");
198+ QVariantList cargs;
199+ cargs.append(QString("com.canonical.Unity.Launcher.Item"));
200+ cargs.append(QString("count"));
201+ cargs.append(QVariant::fromValue(QDBusVariant(inCount)));
202+
203+ message.setArguments(cargs);
204+ reply = con.call(message);
205+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
206+ }
207+
208+ /* Set countVisible */
209+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
210+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
211+ "org.freedesktop.DBus.Properties",
212+ "Set");
213+ QVariantList cvargs;
214+ cvargs.append(QString("com.canonical.Unity.Launcher.Item"));
215+ cvargs.append(QString("countVisible"));
216+ cvargs.append(QVariant::fromValue(QDBusVariant(countVisible)));
217+
218+ message.setArguments(cvargs);
219+ reply = con.call(message);
220+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
221+
222+ /* Get value */
223+ message = QDBusMessage::createMethodCall("com.canonical.Unity.Launcher",
224+ "/com/canonical/Unity/Launcher/" + LauncherBackend::encodeAppId(appId),
225+ "org.freedesktop.DBus.Properties",
226+ "Get");
227+ QVariantList getargs;
228+ getargs.append(QString("com.canonical.Unity.Launcher.Item"));
229+ getargs.append(QString("count"));
230+
231+ message.setArguments(getargs);
232+ reply = con.call(message);
233+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
234+ QCOMPARE(reply.arguments()[0].value<QDBusVariant>().variant().toInt(), expectedCount);
235+ }
69};
236};
70
237
71QTEST_GUILESS_MAIN(LauncherBackendTest)
238QTEST_GUILESS_MAIN(LauncherBackendTest)
tests/plugins/Utils/CMakeLists.txt+2−1
@@ -11,7 +11,8 @@ macro(run_tests)
11 -o ${CMAKE_BINARY_DIR}/${_test}.xml,xunitxml
11 -o ${CMAKE_BINARY_DIR}/${_test}.xml,xunitxml
12 -o -,txt)
12 -o -,txt)
13 add_test(NAME ${_test} COMMAND ${testCommand})
13 add_test(NAME ${_test} COMMAND ${testCommand})
14+ set_tests_properties(${_test} PROPERTIES ENVIRONMENT "LC_ALL=C")
14− add_custom_target(${_test} ${testCommand})
15+ add_custom_target(${_test} env "LC_ALL=C" ${testCommand})
15 add_executable(${_test}Exec ${_test}.cpp modeltest.cpp)
16 add_executable(${_test}Exec ${_test}.cpp modeltest.cpp)
16 qt5_use_modules(${_test}Exec Test Core Qml)
17 qt5_use_modules(${_test}Exec Test Core Qml)
17 target_link_libraries(${_test}Exec
18 target_link_libraries(${_test}Exec
tests/qmltests/CMakeLists.txt+3−2
@@ -11,13 +11,12 @@ set(qmltest_DEFAULT_IMPORT_PATHS
11set(qmltest_DEFAULT_TARGETS qmlunittests)
11set(qmltest_DEFAULT_TARGETS qmlunittests)
12set(qmltest_DEFAULT_NO_ADD_TEST FALSE)
12set(qmltest_DEFAULT_NO_ADD_TEST FALSE)
13set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
13set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "QT_QPA_PLATFORM=minimal")
14−add_qml_test(Components AnimationControllerWithSignals)
15add_qml_test(Panel IndicatorItem)
14add_qml_test(Panel IndicatorItem)
16add_qml_test(utils/Unity/Test UnityTest)
15add_qml_test(utils/Unity/Test UnityTest)
17
16
18set(qmltest_DEFAULT_TARGETS qmluitests)
17set(qmltest_DEFAULT_TARGETS qmluitests)
19set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
18set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
20−set(qmltest_DEFAULT_PROPERTIES "")
19+set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
21
20
22add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
21add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
23 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
22 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
@@ -33,9 +32,11 @@ add_qml_test(Components Revealer)
33add_qml_test(Components SeeMore)
32add_qml_test(Components SeeMore)
34add_qml_test(Components Showable)
33add_qml_test(Components Showable)
35add_qml_test(Components PageHeaderLabel)
34add_qml_test(Components PageHeaderLabel)
35+add_qml_test(Components ZoomableImage)
36add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
36add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
37add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
37add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
38add_qml_test(Dash Card)
38add_qml_test(Dash Card)
39+add_qml_benchmark(Dash CardBenchmark 1000)
39add_qml_test(Dash CardHeader)
40add_qml_test(Dash CardHeader)
40add_qml_test(Dash CardTool)
41add_qml_test(Dash CardTool)
41add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
42add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
tests/qmltests/Components/CMakeLists.txt+1
@@ -11,6 +11,7 @@ qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
11target_link_libraries(DragHandleTestExec UbuntuGestureQml)
11target_link_libraries(DragHandleTestExec UbuntuGestureQml)
12
12
13add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
13add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
14+add_manual_qml_test(. DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
14
15
15add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
16add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
16add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
17add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
tests/qmltests/Components/tst_AnimationControllerWithSignals.qmldeleted−142
@@ -1,142 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Components"
20−
21−TestCase {
22− id: testCase
23− name: "AnimationControllerWithSignals"
24−
25− property real someNumber: 0.0
26−
27− NumberAnimation {
28− id: someNumberAnimation
29− target: testCase
30− properties: "someNumber"
31− from: 1.0
32− to: 100.0
33− }
34−
35− Component {
36− id: testSubjectComponent
37− AnimationControllerWithSignals {}
38− }
39−
40− Loader {
41− id: loader
42− asynchronous: false
43− }
44−
45− SignalSpy {
46− id: signalSpy
47− }
48−
49− function test_completeToEndWithSignal() {
50− loader.sourceComponent = testSubjectComponent;
51− var testSubject = loader.item;
52−
53− testSubject.animation = someNumberAnimation;
54− testSubject.progress = 0;
55−
56− signalSpy.signalName = "animationCompletedAtEnd";
57− signalSpy.target = testSubject;
58− signalSpy.clear();
59−
60− compare(testSubject.completing, false)
61− compare(testSubject.completed, true)
62−
63− testSubject.completeToEndWithSignal();
64− compare(testSubject.completing, true)
65− compare(testSubject.completed, true)
66− compare(signalSpy.count, 0);
67−
68− testSubject.progress = 0.5;
69− compare(testSubject.completing, true)
70− compare(testSubject.completed, false)
71− compare(signalSpy.count, 0);
72−
73− testSubject.progress = 1.0;
74− compare(testSubject.completing, false)
75− compare(testSubject.completed, true)
76− compare(signalSpy.count, 1);
77−
78− testSubject.animation = null
79− loader.sourceComponent = undefined;
80− }
81−
82− function test_completeToBeginningWithSignal() {
83− loader.sourceComponent = testSubjectComponent;
84− var testSubject = loader.item;
85−
86− testSubject.animation = someNumberAnimation;
87− testSubject.progress = 1;
88−
89− signalSpy.signalName = "animationCompletedAtBeginning";
90− signalSpy.target = testSubject;
91− signalSpy.clear();
92−
93− compare(testSubject.completing, false)
94− compare(testSubject.completed, true)
95−
96− testSubject.completeToBeginningWithSignal();
97− compare(testSubject.completing, true)
98− compare(testSubject.completed, true)
99− compare(signalSpy.count, 0);
100−
101− testSubject.progress = 0.5;
102− compare(testSubject.completing, true)
103− compare(testSubject.completed, false)
104− compare(signalSpy.count, 0);
105−
106− testSubject.progress = 0;
107− compare(testSubject.completing, false)
108− compare(testSubject.completed, true)
109− compare(signalSpy.count, 1);
110−
111− testSubject.animation = null
112− loader.sourceComponent = undefined;
113− }
114−
115− function test_settingProgressWithoutCallingCompleteWithSignal() {
116− loader.sourceComponent = testSubjectComponent;
117− var testSubject = loader.item;
118−
119− testSubject.animation = someNumberAnimation;
120− testSubject.progress = 0;
121−
122− signalSpy.signalName = "animationCompletedAtEnd";
123− signalSpy.target = testSubject;
124− signalSpy.clear();
125−
126− compare(testSubject.completing, false)
127− compare(testSubject.completed, true)
128−
129− testSubject.progress = 0.5;
130− compare(testSubject.completing, false)
131− compare(testSubject.completed, false)
132− compare(signalSpy.count, 0);
133−
134− testSubject.progress = 1;
135− compare(testSubject.completing, false)
136− compare(testSubject.completed, true)
137− compare(signalSpy.count, 0);
138−
139− testSubject.animation = null
140− loader.sourceComponent = undefined;
141− }
142−}
tests/qmltests/Components/tst_Carousel.qml+34−7
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19import "../../../qml/Components/"
19import "../../../qml/Components/"
20import "../../../qml/Components/carousel.js" as Carousel
20import "../../../qml/Components/carousel.js" as Carousel
21+import Unity.Test 0.1 as UT
21
22
22Item {
23Item {
23 width: 700
24 width: 700
@@ -31,13 +32,17 @@ Item {
31 property int createdDelegates: 0
32 property int createdDelegates: 0
32 property int destroyedDelegates: 0
33 property int destroyedDelegates: 0
33
34
35+ itemComponent: BaseCarouselDelegate {
34− itemComponent: Rectangle {
36+ Rectangle {
37+ anchors.fill: parent
38+ border.color: "black"
35− color: "red"
39+ color: "red"
36− Component.onCompleted: carousel.createdDelegates++
40+ Component.onCompleted: carousel.createdDelegates++
37− Component.onDestruction: carousel.destroyedDelegates++
41+ Component.onDestruction: carousel.destroyedDelegates++
42+ }
38 }
43 }
39 }
44 }
40− TestCase {
45+ UT.UnityTestCase {
41 id: root
46 id: root
42 name: "Carousel"
47 name: "Carousel"
43 when: windowShown
48 when: windowShown
@@ -55,8 +60,11 @@ Item {
55 property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
60 property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
56 property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
61 property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
57
62
58− function test_onlyNeededItemsCreated() {
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() {
59− compare(carousel.createdDelegates, 10);
67+ tryCompare(carousel, "createdDelegates", 10);
60 compare(carousel.destroyedDelegates, 0);
68 compare(carousel.destroyedDelegates, 0);
61 }
69 }
62
70
@@ -216,5 +224,24 @@ Item {
216 data.maxTranslation)
224 data.maxTranslation)
217 compare(scale, data.result)
225 compare(scale, data.result)
218 }
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+ }
219 }
246 }
220}
247}
tests/qmltests/Components/tst_FilterGrid.qml+1−1
@@ -50,6 +50,7 @@ Rectangle {
50 CheckBox {
50 CheckBox {
51 id: filterCheckBox
51 id: filterCheckBox
52 checked: true
52 checked: true
53+ onCheckedChanged: filterGrid.setFilter(checked, false /*animate*/)
53 }
54 }
54 }
55 }
55 }
56 }
@@ -99,7 +100,6 @@ Rectangle {
99 maximumNumberOfColumns: 3
100 maximumNumberOfColumns: 3
100 collapsedRowCount:
101 collapsedRowCount:
101 collapsedRowCountSelector.values[collapsedRowCountSelector.selectedIndex]
102 collapsedRowCountSelector.values[collapsedRowCountSelector.selectedIndex]
102− filter: filterCheckBox.checked
103 minimumHorizontalSpacing: units.gu(1)
103 minimumHorizontalSpacing: units.gu(1)
104 delegateWidth: units.gu(6)
104 delegateWidth: units.gu(6)
105 delegateHeight: units.gu(6)
105 delegateHeight: units.gu(6)
tests/qmltests/Components/tst_ZoomableImage.qmlnew file+192
@@ -0,0 +1,192 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import "../../../qml/Components"
20+import Unity.Test 0.1 as UT
21+
22+Rectangle {
23+ id: root
24+ width: units.gu(30)
25+ height: units.gu(60)
26+ color: "lightgrey"
27+
28+ property var widgetData0: {
29+ "source": "",
30+ "zoomable": false
31+ }
32+
33+ property var widgetData1: {
34+ "source": "../../../qml/graphics/phone_background.jpg",
35+ "zoomable": false
36+ }
37+
38+ property var widgetData2: {
39+ "source": "../../../qml/Dash/graphics/phone/screenshots/gallery@12.png",
40+ "zoomable": true
41+ }
42+
43+ ZoomableImage {
44+ id: zoomableImage
45+ width: parent.width
46+ anchors.fill: parent
47+ asynchronous: false
48+ }
49+
50+ SignalSpy {
51+ id: signalSpy
52+ }
53+
54+ UT.UnityTestCase {
55+ name: "ZoomableImageTest"
56+ when: windowShown
57+
58+ function test_loadImage() {
59+ var lazyImage = findChild(zoomableImage, "lazyImage");
60+
61+ zoomableImage.source = widgetData0["source"];
62+ zoomableImage.zoomable = widgetData0["zoomable"];
63+ waitForRendering(zoomableImage);
64+ tryCompare(zoomableImage, "imageState", "default");
65+
66+ signalSpy.signalName = "onStateChanged";
67+ signalSpy.target = lazyImage;
68+ signalSpy.clear();
69+
70+ zoomableImage.source = widgetData1["source"];
71+ zoomableImage.zoomable = widgetData1["zoomable"];
72+ waitForRendering(lazyImage);
73+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData1["source"]); }, true);
74+ waitForRendering(zoomableImage);
75+ tryCompare(zoomableImage, "imageState", "ready");
76+ compare (signalSpy.count, 1);
77+ }
78+
79+ function get_filename(a) {
80+ var wordsA = a.split("/");
81+ var filenameA = wordsA[wordsA.length-1];
82+ return filenameA;
83+ }
84+
85+ function test_mousewheel() {
86+ var image = findChild(zoomableImage, "image");
87+ var lazyImage = findChild(zoomableImage, "lazyImage");
88+ var flickable = findChild(zoomableImage, "flickable");
89+
90+ zoomableImage.source = widgetData2["source"];
91+ zoomableImage.zoomable = true;
92+ waitForRendering(zoomableImage);
93+
94+ tryCompare(zoomableImage, "imageState", "ready");
95+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData2["source"]); }, true);
96+ waitForRendering(image);
97+
98+ // move mouse to center
99+ mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2);
100+
101+ // Test Zoom-in Zoom-out twice.
102+ for (var c=0; c<2; c++) {
103+ // zoom in
104+ for (var i=0; i<10; i++) {
105+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10);
106+ tryCompare(image, "scale", 1.0 + (i + 1) * 0.1);
107+ compare(flickable.contentWidth, lazyImage.width * image.scale);
108+ compare(flickable.contentHeight, lazyImage.height * image.scale);
109+ }
110+
111+ // zoom out
112+ for (var i=0; i<10; i++) {
113+ mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10);
114+ tryCompare(image, "scale", 2.0 - (i + 1) * 0.1);
115+ compare(flickable.contentWidth, lazyImage.width * image.scale);
116+ compare(flickable.contentHeight, lazyImage.height * image.scale);
117+ }
118+ }
119+ }
120+
121+ function test_pinch_data() {
122+ return [ { source:widgetData2["source"],
123+ zoomable:false,
124+ answer1: true,
125+ answer2: false,
126+ answer3: true,
127+ answer4: 1.0,
128+ answer5: 1.0 },
129+ { source:widgetData2["source"],
130+ zoomable:true,
131+ answer1: false,
132+ answer2: true,
133+ answer3: false,
134+ answer4: 1.7740461882048026,
135+ answer5: 1.0 }
136+ ]
137+ }
138+
139+ function test_pinch(data) {
140+ var image = findChild(zoomableImage, "image");
141+ var lazyImage = findChild(zoomableImage, "lazyImage");
142+ var flickable = findChild(zoomableImage, "flickable");
143+
144+ signalSpy.signalName = "onScaleChanged";
145+ signalSpy.target = image;
146+ signalSpy.clear();
147+
148+ zoomableImage.source = data.source;
149+ zoomableImage.zoomable = data.zoomable;
150+ waitForRendering(zoomableImage);
151+
152+ tryCompare(zoomableImage, "imageState", "ready");
153+ tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(data.source); }, true);
154+ waitForRendering(image);
155+
156+ var x1Start = zoomableImage.width * 2 / 6;
157+ var y1Start = zoomableImage.height * 2 / 6;
158+ var x1End = zoomableImage.width * 1 / 6;
159+ var y1End = zoomableImage.height * 1 / 6;
160+ var x2Start = zoomableImage.width * 4 / 6;
161+ var y2Start = zoomableImage.height * 4 / 6;
162+ var x2End = zoomableImage.width * 5 / 6;
163+ var y2End = zoomableImage.height * 5 / 6;
164+
165+ var oldScale = image.scale;
166+
167+ // move mouse to center
168+ mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2);
169+
170+ // Test Zoom-in Zoom-out twice.
171+ for (var c=0; c<2; c++) {
172+ wait(3000); // have to delay between two consequent pinch event.
173+ // pinch zoom-in
174+ touchPinch(zoomableImage, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End);
175+
176+ tryCompare(image, "scale", data.answer4);
177+ var newScale = image.scale;
178+ compare(newScale == oldScale, data.answer1, "scale factor not equal: "+ oldScale + "=?" + newScale);
179+ compare(newScale > oldScale, data.answer2, "scale factor didn't changed");
180+ compare(signalSpy.count == 0, data.answer3, "scale signal count error");
181+ compare(newScale, data.answer4, "scale factor error");
182+ compare(flickable.contentWidth, lazyImage.width * image.scale);
183+ compare(flickable.contentHeight, lazyImage.height * image.scale);
184+
185+ wait(3000); // have to delay between two consequent pinch event.
186+ // pinch zoom-out
187+ touchPinch(zoomableImage, x1End, y1End, x1Start, y1Start, x2End, y2End, x2Start, y2Start);
188+ tryCompare(image, "scale", data.answer5);
189+ }
190+ }
191+ }
192+}
tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+21−2
@@ -36,6 +36,8 @@ Rectangle {
36 property var triggeredDataReviewOnly: { "rating": invalidInputRating, "review": validInputText, "author": null }
36 property var triggeredDataReviewOnly: { "rating": invalidInputRating, "review": validInputText, "author": null }
37
37
38 property var widgetDataBoth: { "visible": "both", "required": "both" }
38 property var widgetDataBoth: { "visible": "both", "required": "both" }
39+ property var widgetDataBothRequireRating: { "visible": "both", "required": "rating" }
40+ property var widgetDataBothRequireReview: { "visible": "both", "required": "review" }
39 property var widgetDataRating: { "visible": "rating", "required": "rating" }
41 property var widgetDataRating: { "visible": "rating", "required": "rating" }
40 property var widgetDataRatingBroken: { "visible": "rating", "required": "review" }
42 property var widgetDataRatingBroken: { "visible": "rating", "required": "review" }
41 property var widgetDataReview: { "visible": "review", "required": "review" }
43 property var widgetDataReview: { "visible": "review", "required": "review" }
@@ -85,6 +87,14 @@ Rectangle {
85 {tag: "both, rating-only review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
87 {tag: "both, rating-only review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
86 {tag: "both, review-only review", widgetData: widgetDataBoth, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
88 {tag: "both, review-only review", widgetData: widgetDataBoth, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
87 {tag: "both, complete review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: validInputText, emitted: true},
89 {tag: "both, complete review", widgetData: widgetDataBoth, inputRating: validInputRating, inputText: validInputText, emitted: true},
90+ {tag: "both require rating, null review", widgetData: widgetDataBothRequireRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
91+ {tag: "both require rating, rating-only review", widgetData: widgetDataBothRequireRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
92+ {tag: "both require rating, review-only review", widgetData: widgetDataBothRequireRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
93+ {tag: "both require rating, complete review", widgetData: widgetDataBothRequireRating, inputRating: validInputRating, inputText: validInputText, emitted: true},
94+ {tag: "both require review, null review", widgetData: widgetDataBothRequireReview, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
95+ {tag: "both require review, rating-only review", widgetData: widgetDataBothRequireReview, inputRating: validInputRating, inputText: invalidInputText, emitted: false},
96+ {tag: "both require review, review-only review", widgetData: widgetDataBothRequireReview, inputRating: invalidInputRating, inputText: validInputText, emitted: true},
97+ {tag: "both require review, complete review", widgetData: widgetDataBothRequireReview, inputRating: validInputRating, inputText: validInputText, emitted: true},
88 {tag: "rating, null review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
98 {tag: "rating, null review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: invalidInputText, emitted: false},
89 {tag: "rating, rating-only review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
99 {tag: "rating, rating-only review", widgetData: widgetDataRating, inputRating: validInputRating, inputText: invalidInputText, emitted: true},
90 {tag: "rating, review-only review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
100 {tag: "rating, review-only review", widgetData: widgetDataRating, inputRating: invalidInputRating, inputText: validInputText, emitted: false},
@@ -114,7 +124,9 @@ Rectangle {
114 verify(rating.visible === true);
124 verify(rating.visible === true);
115
125
116 rating.value = data.inputRating;
126 rating.value = data.inputRating;
117− if (data.widgetData["required"] !== "rating" || data.inputRating < 0) {
127+ if (data.widgetData["required"] !== "rating" ||
128+ data.widgetData["visible"] !== "rating" ||
129+ data.inputRating < 0) {
118 compare(spy.count, 0);
130 compare(spy.count, 0);
119 } else {
131 } else {
120 compare(spy.count, 1);
132 compare(spy.count, 1);
@@ -129,7 +141,14 @@ Rectangle {
129 reviewTextArea.text = data.inputText;
141 reviewTextArea.text = data.inputText;
130 mouseClick(submitButton, submitButton.width / 2, submitButton.height / 2);
142 mouseClick(submitButton, submitButton.width / 2, submitButton.height / 2);
131 switch (data.widgetData["required"]) {
143 switch (data.widgetData["required"]) {
144+ case "rating": {
145+ if (rating.visible === false || data.inputRating < 0) {
132− case "rating": compare(spy.count, 0); break;
146+ compare(spy.count, 0);
147+ } else {
148+ compare(spy.count, 1);
149+ }
150+ break;
151+ }
133 case "both":
152 case "both":
134 default: {
153 default: {
135 if (data.inputRating < 0 || data.inputText === "") {
154 if (data.inputRating < 0 || data.inputText === "") {
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+6−3
@@ -36,7 +36,8 @@ Rectangle {
36
36
37 PreviewZoomableImage {
37 PreviewZoomableImage {
38 id: zoomableImage
38 id: zoomableImage
39− width: parent.width
39+ anchors.fill: parent
40+ widgetData: widgetData1
40 }
41 }
41
42
42 UT.UnityTestCase {
43 UT.UnityTestCase {
@@ -47,10 +48,12 @@ Rectangle {
47 var image = findChild(zoomableImage, "image");
48 var image = findChild(zoomableImage, "image");
48
49
49 zoomableImage.widgetData = widgetData0;
50 zoomableImage.widgetData = widgetData0;
51+ waitForRendering(zoomableImage);
50− tryCompare(image, "state", "default");
52+ tryCompare(image, "imageState", "default");
51
53
52 zoomableImage.widgetData = widgetData1;
54 zoomableImage.widgetData = widgetData1;
55+ waitForRendering(zoomableImage);
53− tryCompare(image, "state", "ready");
56+ tryCompare(image, "imageState", "ready");
54 }
57 }
55 }
58 }
56}
59}
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 {
182 when: windowShown
182 when: windowShown
183
183
184 property Item header: findChild(card, "cardHeader")
184 property Item header: findChild(card, "cardHeader")
185+ property Item headerLoader: findChild(card, "cardHeaderLoader")
185 property Item title: findChild(header, "titleLabel")
186 property Item title: findChild(header, "titleLabel")
186 property Item art: findChild(card, "artShape")
187 property Item art: findChild(card, "artShape")
187 property Item artImage: findChild(card, "artImage")
188 property Item artImage: findChild(card, "artImage")
188 property Item summary: findChild(card, "summaryLabel")
189 property Item summary: findChild(card, "summaryLabel")
189 property Item background: findChild(card, "background")
190 property Item background: findChild(card, "background")
191+ property Item backgroundLoader: findChild(card, "backgroundLoader")
190 property Item backgroundImage: findChild(card, "backgroundImage")
192 property Item backgroundImage: findChild(card, "backgroundImage")
191
193
192 function initTestCase() {
194 function initTestCase() {
@@ -244,8 +246,8 @@ Rectangle {
244 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
246 { tag: "Wide", width: units.gu(18.5), aspect: 0.5, index: 0 },
245 { tag: "Horizontal", width: units.gu(38), index: 5 },
247 { tag: "Horizontal", width: units.gu(38), index: 5 },
246 // Make sure card ends with header when there's no summary
248 // Make sure card ends with header when there's no summary
247− { tag: "NoSummary", height: function() { return header.y + header.height }, index: 6 },
249+ { tag: "NoSummary", height: function() { return headerLoader.y + headerLoader.height }, index: 6 },
248− { tag: "HorizontalNoSummary", height: function() { return header.height }, card_layout: "horizontal", index: 6 },
250+ { tag: "HorizontalNoSummary", height: function() { return headerLoader.height }, card_layout: "horizontal", index: 6 },
249 ]
251 ]
250 }
252 }
251
253
@@ -288,7 +290,7 @@ Rectangle {
288 { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
290 { tag: "Fit", height: units.gu(38), size: "large", width: units.gu(19), index: 4 },
289 { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
291 { tag: "VerticalWidth", width: function() { return header.width }, index: 0 },
290 { tag: "HorizontalHeight", height: function() { return header.height }, index: 5 },
292 { 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 },
292 ]
294 ]
293 }
295 }
294
296
@@ -332,7 +334,7 @@ Rectangle {
332 function test_art_layout(data) {
334 function test_art_layout(data) {
333 selector.selectedIndex = data.index;
335 selector.selectedIndex = data.index;
334
336
335− tryCompare(testCase.header, "x", data.left());
337+ tryCompare(testCase.headerLoader, "x", data.left());
336 }
338 }
337
339
338 function test_header_layout_data() {
340 function test_header_layout_data() {
@@ -349,13 +351,13 @@ Rectangle {
349 function test_header_layout(data) {
351 function test_header_layout(data) {
350 selector.selectedIndex = data.index;
352 selector.selectedIndex = data.index;
351
353
352− tryCompareFunction(function() { return testCase.header.y === data.top() }, true);
354+ tryCompareFunction(function() { return testCase.headerLoader.y === data.top() }, true);
353− tryCompareFunction(function() { return testCase.header.x === data.left() }, true);
355+ tryCompareFunction(function() { return testCase.headerLoader.x === data.left() }, true);
354 }
356 }
355
357
356 function test_summary_layout_data() {
358 function test_summary_layout_data() {
357 return [
359 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 },
359 { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
361 { tag: "Without header", top: function() { return art.y + art.height }, index: 7 },
360 ]
362 ]
361 }
363 }
@@ -400,7 +402,7 @@ Rectangle {
400
402
401 waitForRendering(card);
403 waitForRendering(card);
402
404
403− tryCompare(background, "visible", data.visible);
405+ tryCompare(backgroundLoader, "active", data.visible);
404
406
405 if (data.hasOwnProperty("color")) {
407 if (data.hasOwnProperty("color")) {
406 tryCompare(background, "color", data.color);
408 tryCompare(background, "color", data.color);
@@ -467,13 +469,13 @@ Rectangle {
467 function test_mascotShape(data) {
469 function test_mascotShape(data) {
468 selector.selectedIndex = data.index;
470 selector.selectedIndex = data.index;
469
471
470− var shape = findChild(card, "mascotShape");
472+ var shape = findChild(card, "mascotShapeLoader");
471 var image = findChild(card, "mascotImage");
473 var image = findChild(card, "mascotImage");
472
474
473 verify(shape, "Could not find shape.");
475 verify(shape, "Could not find shape.");
474 verify(image, "Could not find image.");
476 verify(image, "Could not find image.");
475
477
476− tryCompare(shape, "visible", data.shape);
478+ tryCompare(shape, "active", data.shape);
477 tryCompare(image, "visible", !data.shape);
479 tryCompare(image, "visible", !data.shape);
478 }
480 }
479 }
481 }
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 {
43
43
44 when: windowShown
44 when: windowShown
45
45
46− property Item mascot: findChild(cardHeader, "mascotShape")
46+ property Item mascot: findChild(cardHeader, "mascotShapeLoader")
47 property Item titleLabel: findChild(cardHeader, "titleLabel")
47 property Item titleLabel: findChild(cardHeader, "titleLabel")
48 property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
48 property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
49 property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
49 property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
tests/qmltests/Dash/tst_Dash.qml−11
@@ -41,16 +41,6 @@ Item {
41 showScopeOnLoaded: "MockScope2"
41 showScopeOnLoaded: "MockScope2"
42 }
42 }
43
43
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−
54 UT.UnityTestCase {
44 UT.UnityTestCase {
55 name: "Dash"
45 name: "Dash"
56 when: windowShown
46 when: windowShown
@@ -59,7 +49,6 @@ Item {
59
49
60 Component.onCompleted: {
50 Component.onCompleted: {
61 var dashContent = findChild(dash, "dashContent");
51 var dashContent = findChild(dash, "dashContent");
62− dashContent.scopeMapper = scopeDelegateMapper;
63 scopes = dashContent.scopes;
52 scopes = dashContent.scopes;
64 }
53 }
65
54
tests/qmltests/Dash/tst_DashContent.qml+27−51
@@ -35,13 +35,6 @@ Item {
35 property var panel: null
35 property var panel: null
36 // BEGIN To reduce warnings
36 // BEGIN To reduce warnings
37
37
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−
45 Scopes {
38 Scopes {
46 id: scopesModel
39 id: scopesModel
47 }
40 }
@@ -55,34 +48,9 @@ Item {
55 }
48 }
56 scopes : scopesModel
49 scopes : scopesModel
57
50
58− scopeMapper : scopeDelegateMapper
59 searchHistory: SearchHistoryModel {}
51 searchHistory: SearchHistoryModel {}
60 }
52 }
61
53
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−
86 SignalSpy {
54 SignalSpy {
87 id: scopeLoadedSpy
55 id: scopeLoadedSpy
88 target: dashContent
56 target: dashContent
@@ -97,7 +65,7 @@ Item {
97
65
98 UT.UnityTestCase {
66 UT.UnityTestCase {
99 name: "DashContent"
67 name: "DashContent"
100− when: scopesModel.loaded
68+ when: scopesModel.loaded && windowShown
101
69
102 function init() {
70 function init() {
103 scopesModel.clear();
71 scopesModel.clear();
@@ -108,7 +76,6 @@ Item {
108
76
109 function cleanup() {
77 function cleanup() {
110 movementStartedSpy.clear();
78 movementStartedSpy.clear();
111− clear_scope_status();
112 dashContent.visible = true;
79 dashContent.visible = true;
113
80
114 var dashContentList = findChild(dashContent, "dashContentList");
81 var dashContentList = findChild(dashContent, "dashContentList");
@@ -149,29 +116,38 @@ Item {
149 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
116 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
150 }
117 }
151
118
152− function test_movement_started_signal() {
119+ function test_show_header_on_list_movement() {
153− dashContent.setCurrentScopeAtIndex(3, true, false);
154−
155 var dashContentList = findChild(dashContent, "dashContentList");
120 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);
157
126
158− dashContentList.movementStarted();
127+ categoryListView.contentY = units.gu(11);
128+ console.log("contentY", categoryListView.contentY);
159
129
160− compare(movementStartedSpy.count, 1, "DashContent should have emitted movementStarted signal when content list did.");
130+ var startX = dashContentList.width/2;
161− compare(scopeStatus["MockScope1"].movementStarted, 1, "MockScope1 should have emitted movementStarted signal when content list did.");
131+ var startY = dashContentList.height/2;
162− compare(scopeStatus["MockScope2"].movementStarted, 1, "MockScope2 should have emitted movementStarted signal when content list did.");
132+ touchFlick(dashContentList, startX - units.gu(2), startY, startX, startY);
163− compare(scopeStatus["clickscope"].movementStarted, 1, "clickscope should have emitted movementStarted signal when content list did.");
133+ tryCompare(categoryListView, "contentY", units.gu(11) - categoryListView.pageHeader.height);
164− compare(scopeStatus["MockScope5"].movementStarted, 1, "MockScope5 should have emitted movementStarted signal when content list did.");
165 }
134 }
166
135
167− function test_positioned_at_beginning_signal() {
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+
168− dashContent.setCurrentScopeAtIndex(3, true, false);
147+ dashContent.setCurrentScopeAtIndex(0, false, true);
169
148
170− dashContent.positionedAtBeginning();
149+ compare(dashContentList.currentItem.item.objectName, "MockScope1")
171− compare(scopeStatus["MockScope1"].positionedAtBeginning, 1, "MockScope1 should have emitted positionedAtBeginning signal when DashContent did.");
150+ compare(categoryListView.contentY, 0);
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.");
175 }
151 }
176
152
177 // This tests that setting the current scope index will end up at the correct index even if
153 // This tests that setting the current scope index will end up at the correct index even if
tests/qmltests/Dash/tst_GenericScopeView.qml+4−4
@@ -64,7 +64,7 @@ Item {
64
64
65 UT.UnityTestCase {
65 UT.UnityTestCase {
66 name: "GenericScopeView"
66 name: "GenericScopeView"
67− when: scopes.loaded
67+ when: scopes.loaded && windowShown
68
68
69 function init() {
69 function init() {
70 genericScopeView.scope = scopes.get(2)
70 genericScopeView.scope = scopes.get(2)
@@ -140,7 +140,7 @@ Item {
140 mouseClick(header, header.width / 2, header.height / 2);
140 mouseClick(header, header.width / 2, header.height / 2);
141 tryCompareFunction(function() { middleHeight = category.height; return category.height > initialHeight; }, true);
141 tryCompareFunction(function() { middleHeight = category.height; return category.height > initialHeight; }, true);
142 tryCompare(category, "filtered", false);
142 tryCompare(category, "filtered", false);
143− verify(category.height > middleHeight);
143+ tryCompareFunction(function() { return category.height > middleHeight; }, true);
144
144
145 mouseClick(header, header.width / 2, header.height / 2);
145 mouseClick(header, header.width / 2, header.height / 2);
146 verify(category.expandable);
146 verify(category.expandable);
@@ -165,7 +165,7 @@ Item {
165
165
166 mouseClick(header2, header2.width / 2, header2.height / 2);
166 mouseClick(header2, header2.width / 2, header2.height / 2);
167 tryCompare(category2, "filtered", false);
167 tryCompare(category2, "filtered", false);
168− tryCompare(category2FilterGrid, "filter", false);
168+ tryCompare(category2FilterGrid, "filtered", false);
169
169
170 categoryListView.positionAtBeginning();
170 categoryListView.positionAtBeginning();
171
171
@@ -182,7 +182,7 @@ Item {
182 mouseClick(header0, header0.width / 2, header0.height / 2);
182 mouseClick(header0, header0.width / 2, header0.height / 2);
183 tryCompare(category0, "filtered", false);
183 tryCompare(category0, "filtered", false);
184 tryCompare(category2, "filtered", true);
184 tryCompare(category2, "filtered", true);
185− tryCompare(category2FilterGrid, "filter", true);
185+ tryCompare(category2FilterGrid, "filtered", true);
186 mouseClick(header0, header0.width / 2, header0.height / 2);
186 mouseClick(header0, header0.width / 2, header0.height / 2);
187 tryCompare(category0, "filtered", true);
187 tryCompare(category0, "filtered", true);
188 tryCompare(category2, "filtered", true);
188 tryCompare(category2, "filtered", true);
tests/qmltests/Greeter/tst_Clock.qml+3−3
@@ -71,10 +71,10 @@ Rectangle {
71 var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate)
71 var dateString = Qt.formatDate(dateObj, Qt.DefaultLocaleLongDate)
72 var timeString = Qt.formatTime(dateObj)
72 var timeString = Qt.formatTime(dateObj)
73
73
74− clock.enabled = false
74+ clock.visible = false
75 var timeModel = findInvisibleChild(clock, "timeModel")
75 var timeModel = findInvisibleChild(clock, "timeModel")
76
76
77− compare(timeModel.menuObjectPath, "", "Clock shouldn't be connected to Indicators when not active.")
77+ compare(timeModel.menuObjectPath, "", "Clock shouldn't be connected to Indicators when not visible.")
78
78
79 clock.currentDate = dateObj
79 clock.currentDate = dateObj
80
80
@@ -83,7 +83,7 @@ Rectangle {
83 var timeLabel = findChild(clock, "timeLabel")
83 var timeLabel = findChild(clock, "timeLabel")
84 compare(timeLabel.text, timeString, "Not the expected time")
84 compare(timeLabel.text, timeString, "Not the expected time")
85
85
86− clock.enabled = true
86+ clock.visible = true
87
87
88 verify(timeModel.menuObjectPath != "", "Should be connected to Indicators.")
88 verify(timeModel.menuObjectPath != "", "Should be connected to Indicators.")
89 }
89 }
tests/qmltests/Greeter/tst_Phone.qml+10−50
@@ -61,6 +61,12 @@ Item {
61 signalName: "unlocked"
61 signalName: "unlocked"
62 }
62 }
63
63
64+ SignalSpy {
65+ id: teaseSpy
66+ target: greeter
67+ signalName: "tease"
68+ }
69+
64 UT.UnityTestCase {
70 UT.UnityTestCase {
65 name: "Greeter"
71 name: "Greeter"
66 when: windowShown
72 when: windowShown
@@ -82,56 +88,10 @@ Item {
82 }
88 }
83
89
84 function test_teasingArea(data) {
90 function test_teasingArea(data) {
85− tryCompare(greeter, "leftTeaserPressed", false)
91+ teaseSpy.clear()
86− tryCompare(greeter, "rightTeaserPressed", false)
87− mousePress(greeter, data.posX, greeter.height - units.gu(1))
88− tryCompare(greeter, "leftTeaserPressed", data.leftPressed)
89− tryCompare(greeter, "rightTeaserPressed", data.rightPressed)
90− mouseRelease(greeter, data.posX, greeter.height - units.gu(1))
91− tryCompare(greeter, "leftTeaserPressed", false)
92− tryCompare(greeter, "rightTeaserPressed", false)
93− }
94−
95− function test_teaseLockedUnlocked_data() {
96− return [
97− {tag: "unlocked", locked: false, moved: false},
98− {tag: "locked", locked: true, moved: false},
99− {tag: "moved", locked: false, moved: true}
100− ];
101− }
102−
103− function test_teaseLockedUnlocked(data) {
104− tryCompare(greeter, "rightTeaserPressed", false);
105− tryCompare(greeter, "x", 0);
106− greeter.locked = data.locked;
107−
108− // simulate greeter being in the middle of a swipe
109− if (data.moved) {
110− greeter.x = -units.gu(4);
111− tryCompare(greeter, "x", -units.gu(4));
112− }
113−
114− mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1));
92+ mouseClick(greeter, data.posX, greeter.height - units.gu(1))
115− greeter.minX = 0; // This is needed because the transition actually makes x jump once before animating
116−
117− if (!data.moved) {
118− // Check if it has been moved over by 2 GUs. Give it a 2 pixel grace area
119− // because animation duration and teaseTimer are the same duration and
120− // might cause slight offsets
121− tryCompareFunction(function() { return greeter.minX <= -units.gu(2) + 2}, true);
122− } else {
123− // waiting 100ms to make sure nothing moves
124− wait(100);
93+ teaseSpy.wait()
125− compare(greeter.minX, 0, "Greeter teasing not disabled even though it's locked or moving.");
94+ tryCompare(teaseSpy, "count", 1)
126− }
127−
128− // Restore position in case we moved it for the test
129− if (data.moved) {
130− greeter.x = 0;
131− }
132−
133− // Wait until we're back to 0
134− tryCompareFunction(function() { return greeter.x;}, 0);
135 }
95 }
136
96
137 function test_statsWelcomeScreen() {
97 function test_statsWelcomeScreen() {
tests/qmltests/Greeter/tst_Tablet.qml+36−8
@@ -54,6 +54,12 @@ Item {
54 signalName: "selected"
54 signalName: "selected"
55 }
55 }
56
56
57+ SignalSpy {
58+ id: teaseSpy
59+ target: greeter
60+ signalName: "tease"
61+ }
62+
57 UT.UnityTestCase {
63 UT.UnityTestCase {
58 name: "Greeter"
64 name: "Greeter"
59 when: windowShown
65 when: windowShown
@@ -325,14 +331,36 @@ Item {
325 }
331 }
326
332
327 function test_teasingArea(data) {
333 function test_teasingArea(data) {
328− tryCompare(greeter, "leftTeaserPressed", false)
334+ teaseSpy.clear()
329− tryCompare(greeter, "rightTeaserPressed", false)
330− mousePress(greeter, data.posX, greeter.height - units.gu(1))
335+ mouseClick(greeter, data.posX, greeter.height - units.gu(1))
331− tryCompare(greeter, "leftTeaserPressed", data.leftPressed)
336+ teaseSpy.wait()
332− tryCompare(greeter, "rightTeaserPressed", data.rightPressed)
337+ tryCompare(teaseSpy, "count", 1)
338+ }
339+
340+ function test_teaseLockedUnlocked_data() {
341+ return [
342+ {tag: "unlocked", locked: false, narrow: false},
343+ {tag: "locked", locked: true, narrow: false},
344+ ];
345+ }
346+
347+ function test_teaseLockedUnlocked(data) {
348+ teaseSpy.clear()
349+ greeter.locked = data.locked;
350+
333− mouseRelease(greeter, data.posX, greeter.height - units.gu(1))
351+ mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1));
334− tryCompare(greeter, "leftTeaserPressed", false)
352+
335− tryCompare(greeter, "rightTeaserPressed", false)
353+ if (!data.locked || data.narrow) {
354+ teaseSpy.wait()
355+ tryCompare(teaseSpy, "count", 1);
356+ } else {
357+ // waiting 100ms to make sure nothing happens
358+ wait(100);
359+ compare(teaseSpy.count, 0, "Greeter teasing not disabled even though it's locked.");
360+ }
361+
362+ // Reset value
363+ greeter.locked = false;
336 }
364 }
337
365
338 function test_dbus_set_active_entry() {
366 function test_dbus_set_active_entry() {
tests/qmltests/Launcher/tst_Launcher.qml+1
@@ -66,6 +66,7 @@ Item {
66
66
67 UT.UnityTestCase {
67 UT.UnityTestCase {
68 id: revealer
68 id: revealer
69+ when: windowShown
69
70
70 function dragLauncherIntoView() {
71 function dragLauncherIntoView() {
71 var startX = launcher.dragAreaWidth/2;
72 var startX = launcher.dragAreaWidth/2;
tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+30−4
@@ -19,6 +19,7 @@ import QtTest 1.0
19import Unity.Test 0.1 as UT
19import Unity.Test 0.1 as UT
20import QMenuModel 0.1
20import QMenuModel 0.1
21import Unity.Indicators 0.1 as Indicators
21import Unity.Indicators 0.1 as Indicators
22+import Utils 0.1 as Utils
22
23
23Item {
24Item {
24 id: testView
25 id: testView
@@ -42,8 +43,13 @@ Item {
42 }
43 }
43 }
44 }
44
45
46+ Utils.GDateTimeFormatter {
47+ id: timeFormatter
48+ }
49+
45 UT.UnityTestCase {
50 UT.UnityTestCase {
46 name: "MenuItemFactory"
51 name: "MenuItemFactory"
52+ when: windowShown
47
53
48 property QtObject menuData: QtObject {
54 property QtObject menuData: QtObject {
49 property string label: "root"
55 property string label: "root"
@@ -357,8 +363,10 @@ Item {
357
363
358 function test_create_alarmMenu_data() {
364 function test_create_alarmMenu_data() {
359 return [
365 return [
360− {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
366+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
367+ time: new Date(2014, 04, 14).getTime()*1000, timeFormat: "%a %d %b %l:%M %p"},
361− {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
368+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
369+ time: new Date(2015, 12, 31).getTime()*1000, timeFormat: "%A" },
362 ];
370 ];
363 }
371 }
364
372
@@ -367,6 +375,12 @@ Item {
367 menuData.label = data.label;
375 menuData.label = data.label;
368 menuData.sensitive = data.enabled;
376 menuData.sensitive = data.enabled;
369 menuData.icon = data.icon;
377 menuData.icon = data.icon;
378+ menuData.ext = {
379+ 'xCanonicalTime': data.time,
380+ 'xCanonicalTimeFormat': data.timeFormat
381+ };
382+ timeFormatter.format = data.timeFormat;
383+ timeFormatter.time = data.time;
370
384
371 loader.data = menuData;
385 loader.data = menuData;
372 loader.sourceComponent = factory.load(menuData);
386 loader.sourceComponent = factory.load(menuData);
@@ -375,13 +389,16 @@ Item {
375
389
376 compare(loader.item.text, data.label, "Label does not match data");
390 compare(loader.item.text, data.label, "Label does not match data");
377 compare(loader.item.iconSource, data.icon, "Icon does not match data");
391 compare(loader.item.iconSource, data.icon, "Icon does not match data");
392+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
378 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
393 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
379 }
394 }
380
395
381 function test_create_appointmentMenu_data() {
396 function test_create_appointmentMenu_data() {
382 return [
397 return [
383− {label: "testLabel1", enabled: true, icon: "file:///testIcon1" },
398+ {label: "testLabel1", enabled: true, icon: "file:///testIcon1", color: Qt.rgba(0, 0, 0, 0),
399+ time: new Date(2014, 04, 14).getTime()*1000, timeFormat: "%a %d %b %l:%M %p"},
384− {label: "testLabel2", enabled: false, icon: "file:///testIcon2" },
400+ {label: "testLabel2", enabled: false, icon: "file:///testIcon2", color: Qt.rgba(1, 0, 0, 0),
401+ time: new Date(2015, 12, 31).getTime()*1000, timeFormat: "%A" },
385 ];
402 ];
386 }
403 }
387
404
@@ -390,6 +407,13 @@ Item {
390 menuData.label = data.label;
407 menuData.label = data.label;
391 menuData.sensitive = data.enabled;
408 menuData.sensitive = data.enabled;
392 menuData.icon = data.icon;
409 menuData.icon = data.icon;
410+ menuData.ext = {
411+ 'xCanonicalColor': data.colour,
412+ 'xCanonicalTime': data.time,
413+ 'xCanonicalTimeFormat': data.timeFormat
414+ };
415+ timeFormatter.format = data.timeFormat;
416+ timeFormatter.time = data.time;
393
417
394 loader.data = menuData;
418 loader.data = menuData;
395 loader.sourceComponent = factory.load(menuData);
419 loader.sourceComponent = factory.load(menuData);
@@ -398,6 +422,8 @@ Item {
398
422
399 compare(loader.item.text, data.label, "Label does not match data");
423 compare(loader.item.text, data.label, "Label does not match data");
400 compare(loader.item.iconSource, data.icon, "Icon does not match data");
424 compare(loader.item.iconSource, data.icon, "Icon does not match data");
425+ compare(loader.item.time, timeFormatter.timeString, "Time does not match data");
426+ compare(loader.item.eventColor, data.color, "Colour does not match data");
401 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
427 compare(loader.item.enabled, data.enabled, "Enabled does not match data");
402 }
428 }
403
429
tests/qmltests/Panel/Indicators/tst_MessageMenuItemFactory.qml+1
@@ -39,6 +39,7 @@ Item {
39
39
40 UT.UnityTestCase {
40 UT.UnityTestCase {
41 name: "MessageMenuItemFactory"
41 name: "MessageMenuItemFactory"
42+ when: windowShown
42
43
43 property QtObject menuData: QtObject {
44 property QtObject menuData: QtObject {
44 property string label: "root"
45 property string label: "root"
tests/qmltests/tst_Shell.qml+11
@@ -554,5 +554,16 @@ Item {
554
554
555 tryCompare(searchIndicator, "opacity", 0);
555 tryCompare(searchIndicator, "opacity", 0);
556 }
556 }
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+ }
557 }
568 }
558}
569}
tests/utils/modules/Unity/Test/UnityTestCase.qml+26
@@ -260,6 +260,32 @@ TestCase {
260 }
260 }
261 }
261 }
262
262
263+ function touchPinch(item, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End) {
264+ // Make sure the item is rendered
265+ waitForRendering(item);
266+
267+ var event1 = touchEvent();
268+ // first finger
269+ event1.press(0, x1Start, y1Start);
270+ event1.commit();
271+ // second finger
272+ event1.stationary(0);
273+ event1.press(1, x2Start, y2Start);
274+ event1.commit();
275+
276+ // pinch
277+ for (var i = 0.0; i < 1.0; i += 0.02) {
278+ event1.move(0, x1Start + (x1End - x1Start) * i, y1Start + (y1End - y1Start) * i);
279+ event1.move(1, x2Start + (x2End - x2Start) * i, y2Start + (y2End - y2Start) * i);
280+ event1.commit();
281+ }
282+
283+ // release
284+ event1.release(0, x1End, y1End);
285+ event1.release(1, x2End, y2End);
286+ event1.commit();
287+ }
288+
263 function fetchRootItem(item) {
289 function fetchRootItem(item) {
264 if (item.parent)
290 if (item.parent)
265 return fetchRootItem(item.parent)
291 return fetchRootItem(item.parent)
tools/CMakeLists.txt+2
@@ -9,3 +9,5 @@ qt5_use_modules(${SCOPE_TOOL} Qml Quick)
9install(TARGETS ${SCOPE_TOOL}
9install(TARGETS ${SCOPE_TOOL}
10 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
10 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
11 )
11 )
12+
13+install(FILES unlock-device DESTINATION ${SHELL_APP_DIR})
tools/unlock-devicenew file+42
@@ -0,0 +1,42 @@
1+#!/bin/bash
2+# -*- Mode: sh; indent-tabs-mode: nil; tab-width: 4 -*-
3+
4+# Our goal here is to get an Ubuntu Touch device into a testable unlocked state.
5+# This will include a reboot.
6+
7+WAIT_COMMAND="sleep 20"
8+
9+while getopts s:w: opt; do
10+ case $opt in
11+ s)
12+ export ANDROID_SERIAL=$OPTARG
13+ ;;
14+ w)
15+ WAIT_COMMAND=$OPTARG
16+ ;;
17+ esac
18+done
19+
20+UNLOCK_SCRIPT='
21+import dbus, logging;
22+from unity8 import process_helpers as helpers;
23+logging.basicConfig(level=logging.INFO);
24+bus = dbus.SystemBus().get_object("com.canonical.powerd", "/com/canonical/powerd");
25+cookie = bus.requestSysState("unlock-device-hold", 1, dbus_interface="com.canonical.powerd");
26+helpers.restart_unity_with_testability();
27+bus.clearSysState(cookie, dbus_interface="com.canonical.powerd");
28+helpers.unlock_unity()
29+'
30+
31+adb reboot
32+sleep 5
33+adb "wait-for-device"
34+eval "$WAIT_COMMAND"
35+UNLOCK_OUTPUT=$(adb shell "sudo -u phablet -i python3 -c '$UNLOCK_SCRIPT'" 2>&1)
36+if echo "$UNLOCK_OUTPUT" | grep 'Greeter unlocked' >/dev/null; then
37+ echo "I: Unlock passed"
38+ exit 0
39+else
40+ echo "I: Unlock failed, script output: '$UNLOCK_OUTPUT'"
41+ exit 1
42+fi