on xenial help sign in
merge
3d56449Michael Zanetti
.bazaar/plugins/makecheck_unity_phablet.py+1−1
@@ -18,7 +18,7 @@ from bzrlib import branch, errors
18from bzrlib.urlutils import dirname, local_path_from_url
18from bzrlib.urlutils import dirname, local_path_from_url
19
19
20def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
20def execute_makecheck(local_branch, master_branch, old_revision_number, old_revision_id, future_revision_number, future_revision_id, tree_delta, future_tree):
21− if not master_branch.basis_tree().has_filename("Shell.qml"):
21+ if not master_branch.basis_tree().has_filename("qml/Shell.qml"):
22 return
22 return
23
23
24 os.chdir(local_path_from_url(master_branch.base))
24 os.chdir(local_path_from_url(master_branch.base))
build+3
@@ -41,17 +41,20 @@ install_dependencies() {
41 sudo apt-get install devscripts \
41 sudo apt-get install devscripts \
42 equivs \
42 equivs \
43 gsettings-desktop-schemas \
43 gsettings-desktop-schemas \
44+ gsettings-ubuntu-schemas \
44 qmenumodel-qml \
45 qmenumodel-qml \
45 qtdeclarative5-dee-plugin \
46 qtdeclarative5-dee-plugin \
46 qtdeclarative5-gsettings1.0 \
47 qtdeclarative5-gsettings1.0 \
47 qtdeclarative5-ubuntu-ui-toolkit-plugin \
48 qtdeclarative5-ubuntu-ui-toolkit-plugin \
48 qtdeclarative5-ubuntu-settings-components \
49 qtdeclarative5-ubuntu-settings-components \
50+ qtdeclarative5-ubuntu-thumbnailer0.1 \
49 unity-notifications-impl \
51 unity-notifications-impl \
50 qtdeclarative5-xmllistmodel-plugin \
52 qtdeclarative5-xmllistmodel-plugin \
51 ubuntu-mobile-icons \
53 ubuntu-mobile-icons \
52 unity-scope-home \
54 unity-scope-home \
53 unity-lens-applications \
55 unity-lens-applications \
54 unity-plugin-scopes \
56 unity-plugin-scopes \
57+ xvfb \
55 || exit 5
58 || exit 5
56}
59}
57
60
cmake/modules/QmlTest.cmake+60−2
@@ -65,6 +65,7 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
65 cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
65 cmake_parse_arguments(qmltest "${options}" "" "${multi_value_keywords}" ${ARGN})
66
66
67 set(qmltest_TARGET test${COMPONENT_NAME})
67 set(qmltest_TARGET test${COMPONENT_NAME})
68+ set(qmltest_xvfb_TARGET xvfbtest${COMPONENT_NAME})
68 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
69 set(qmltest_FILE ${SUBPATH}/tst_${COMPONENT_NAME})
69
70
70 set(qmltestrunner_imports "")
71 set(qmltestrunner_imports "")
@@ -80,13 +81,71 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
80 endforeach(IMPORT_PATH)
81 endforeach(IMPORT_PATH)
81 endif()
82 endif()
82
83
84+ string(TOLOWER "${CMAKE_GENERATOR}" cmake_generator_lower)
85+ if(cmake_generator_lower STREQUAL "unix makefiles")
86+ set(function_ARGS $(FUNCTION))
87+ else()
88+ set(function_ARGS "")
89+ endif()
90+
83 set(qmltest_command
91 set(qmltest_command
84 env ${qmltest_ENVIRONMENT}
92 env ${qmltest_ENVIRONMENT}
85 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
93 ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
86 ${qmltestrunner_imports}
94 ${qmltestrunner_imports}
87 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
95 -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
88 -o -,txt
96 -o -,txt
97+ ${function_ARGS}
98+ )
99+ find_program( HAVE_GCC gcc )
100+ if (NOT ${HAVE_GCC} STREQUAL "")
101+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
102+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
103+ endif()
104+ set(qmltest_xvfb_command
105+ env ${qmltest_ENVIRONMENT} ${LD_PRELOAD_PATH}
106+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
107+ ${qmltestrunner_exe} -input ${CMAKE_CURRENT_SOURCE_DIR}/${qmltest_FILE}.qml
108+ ${qmltestrunner_imports}
109+ -o ${CMAKE_BINARY_DIR}/${qmltest_TARGET}.xml,xunitxml
110+ -o -,txt
111+ ${function_ARGS}
89 )
112 )
113+
114+ 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)
116+ add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
117+endmacro(add_qml_test)
118+
119+macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
120+ set(testCommand
121+ LD_LIBRARY_PATH=${LD_PATH}
122+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
123+ -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
124+ -o -,txt)
125+
126+ add_qmltest_target(test${CLASS_NAME} "${testCommand}" FALSE TRUE)
127+ add_dependencies(test${CLASS_NAME} ${CLASS_NAME}TestExec ${DEPS})
128+
129+ find_program( HAVE_GCC gcc )
130+ if (NOT ${HAVE_GCC} STREQUAL "")
131+ exec_program( gcc ARGS "-dumpmachine" OUTPUT_VARIABLE ARCH_TRIPLET )
132+ set(LD_PRELOAD_PATH "LD_PRELOAD=/usr/lib/${ARCH_TRIPLET}/mesa/libGL.so.1")
133+ endif()
134+ set(xvfbtestCommand
135+ ${LD_PRELOAD_PATH}
136+ LD_LIBRARY_PATH=${LD_PATH}
137+ xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
138+ ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
139+ -o ${CMAKE_BINARY_DIR}/${CLASS_NAME}Test.xml,xunitxml
140+ -o -,txt)
141+
142+ add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
143+ add_dependencies(qmluitests xvfbtest${CLASS_NAME})
144+
145+ add_manual_qml_test(. ${CLASS_NAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
146+endmacro(add_binary_qml_test)
147+
148+macro(add_qmltest_target qmltest_TARGET qmltest_command qmltest_NO_TARGETS qmltest_NO_ADD_TEST)
90 add_custom_target(${qmltest_TARGET} ${qmltest_command})
149 add_custom_target(${qmltest_TARGET} ${qmltest_command})
91
150
92 if(NOT "${qmltest_PROPERTIES}" STREQUAL "")
151 if(NOT "${qmltest_PROPERTIES}" STREQUAL "")
@@ -117,5 +176,4 @@ macro(add_qml_test SUBPATH COMPONENT_NAME)
117 endif()
176 endif()
118 endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
177 endif("${qmltest_NO_TARGETS}" STREQUAL "FALSE")
119
178
120− add_manual_qml_test(${SUBPATH} ${COMPONENT_NAME} ${ARGN})
179+endmacro(add_qmltest_target)
121−endmacro(add_qml_test)
data/unity8.conf+10−1
@@ -1,10 +1,12 @@
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
5+
4start 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
5stop on desktop-end
7stop on desktop-end
6
8
7−kill timeout 30
9+kill timeout 120
8
10
9respawn
11respawn
10expect stop
12expect stop
@@ -29,10 +31,17 @@ pre-start script
29 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
31 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
30 fi
32 fi
31
33
34+ if [ -z "$UNITY_SCOPES_LIST" ]; then
35+ # FIXME: remove once we have this in dconf
36+ initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator"
37+ fi
38+
32 # Remove the socket if still there
39 # Remove the socket if still there
33 if [ -S "$MIR_SERVER_FILE" ]; then
40 if [ -S "$MIR_SERVER_FILE" ]; then
34 rm "$MIR_SERVER_FILE"
41 rm "$MIR_SERVER_FILE"
35 fi
42 fi
43+
44+ initctl emit scope-ui-starting
36end script
45end script
37
46
38exec ${BINARY:-unity8} $ARGS
47exec ${BINARY:-unity8} $ARGS
debian/changelog+232
@@ -1,3 +1,235 @@
1+unity8 (7.86) trusty; urgency=medium
2+
3+ * humppaaa
4+
5+ -- Michael Zanetti <michael.zanetti@canonical.com> Thu, 10 Apr 2014 15:19:28 +0200
6+
7+unity8 (7.85+14.04.20140404-0ubuntu1) trusty; urgency=low
8+
9+ [ Albert Astals ]
10+ * Adapt to new TabBar
11+
12+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 04 Apr 2014 15:03:00 +0000
13+
14+unity8 (7.85+14.04.20140403.1-0ubuntu1) trusty; urgency=low
15+
16+ [ Michael Terry ]
17+ * Re-enable test_networkmanager_integration autopilot test on phone
18+ platforms
19+
20+ [ CI bot ]
21+ * Resync trunk
22+
23+ [ Leo Arias ]
24+ * Reverted the open_preview autopilot helper to return a Preview
25+ object.
26+
27+ [ Albert Astals ]
28+ * If not running in Mir load the "fake" application manager (LP:
29+ #1301547)
30+ * Remove unused properties from DashRenderer
31+
32+ [ Michael Zanetti ]
33+ * Fix tests after right edge merge. Drop old stages tests. Fix right
34+ edge tests if someone doesn't have the GRID_UNIT_PX exported. make
35+ GenericScopeView test more robust that broke because the ordering
36+ changed
37+ * add "make xvfbtestSomething" target to run qml tests in xvfb
38+ * make the "make test" commit hook work again
39+
40+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 03 Apr 2014 10:38:53 +0000
41+
42+unity8 (7.85+14.04.20140401.3-0ubuntu1) trusty; urgency=medium
43+
44+ [ Michał Sawicz ]
45+ * Bump version to ensure incompatibility with previous Unity.Application
46+ implementations.
47+ * We'll only have the unity-mir and mock Ubuntu.Application plugins
48+ now, no need for mangling the import paths.
49+
50+ [ Michal Hruby ]
51+ * Remove the albumart image provider. (LP: #1262711)
52+ * Don't reset search string after 2 seconds. (LP: #1297246)
53+
54+ [ James Henstridge ]
55+ * Remove the albumart image provider. (LP: #1262711)
56+
57+ [ Albert Astals ]
58+ * Carousel: Add test to make sure we only create the needed delegates
59+ and not more
60+ * LVWPH: Remove processEvents() call from updatePolish() It causes
61+ some reentrancy issues and in some times you end up in polishItems()
62+ with items that have been deleted because you called processEvents()
63+ This means i need a small tweak in itemGeometryChanged to not
64+ reposition items if we are inside a setContentHeight call and two
65+ small tweaks to tests since now things happen in a different order
66+ and numbers are different (though equivalent) (LP: #1297240)
67+ * Card.qml binding loops are gone. hooray \o/ Also made the aspect
68+ properties readonly
69+
70+ [ Mirco Müller ]
71+ * A potential fix for "Cannot read property 'state' of null"-failure
72+ on Jenkins with the VisualSnapDecisionsQueue QML-test of
73+ notifications.
74+
75+ [ Michael Terry ]
76+ * Pass user's preference for auto-brightness on to powerd. (LP:
77+ #1273174)
78+
79+ [ Michael Zanetti ]
80+ * Registers a dummy QObject as QTestRootObject in uqmlscene in order
81+ to fix make trySomething with Qt 5.2.
82+
83+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 01 Apr 2014 22:56:52 +0000
84+
85+unity8 (7.84+14.04.20140327.1-0ubuntu2) trusty; urgency=medium
86+
87+ * For now, have libunity-private depending on libunity-core-6.0-9 as the
88+ gsettings schema is here. The dependency wasn't direct and dropped from
89+ Touch image #271. Consequently, unity8 didn't start (gsettings
90+ segfaulting).
91+ Proper strategy will be to include the schema in another package to only
92+ pull it.
93+
94+ -- Didier Roche <didrocks@ubuntu.com> Tue, 01 Apr 2014 09:52:14 +0200
95+
96+unity8 (7.84+14.04.20140327.1-0ubuntu1) trusty; urgency=low
97+
98+ [ Michał Sawicz ]
99+ * Increase kill timeout so that crashes are not truncated.
100+
101+ [ Ying-Chun Liu ]
102+ * Fix a small typo in LazyImage: scale -> scaleTo
103+
104+ [ Albert Astals ]
105+ * Make geometry calls for autopilot work again -geometry is a internal
106+ Qt argument that only works for QWidget based apps Before it was
107+ being returned to us in -args but now it's eaten so we need to use a
108+ different one, -windowgeometry
109+ * Make "Recent" translatable and update pot file
110+
111+ [ Mirco Müller ]
112+ * Make visual queue of (up to five) snap-decisions contract and expand
113+ according to visual design-spec.
114+
115+ [ Michael Terry ]
116+ * Pass user's preference for auto-brightness on to powerd. (LP:
117+ #1273174)
118+
119+ [ Michael Zanetti ]
120+ * allow executing a single test function example: make testShell
121+ FUNCTION="Shell::test_background"
122+
123+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 27 Mar 2014 12:38:21 +0000
124+
125+unity8 (7.84+14.04.20140324.4-0ubuntu1) trusty; urgency=low
126+
127+ [ Michal Hruby ]
128+ * Change and extend the way non-installed scopes are started with the
129+ scope-tool.
130+ * Switch to new scope backend and apply required visual adaptations.
131+ (LP: #1294294)
132+
133+ [ Gerry Boland ]
134+ * Switch to new scope backend and apply required visual adaptations.
135+ (LP: #1294294)
136+
137+ [ Michał Sawicz ]
138+ * Fix rating input action to always be "rated", not dynamic. Based on
139+ http://developer.ubuntu.com/api/devel/ubuntu-14.04/cplusplus/unity-
140+ scopes/previewwidgets.html#rating-input
141+ * Switch to new scope backend and apply required visual adaptations.
142+ (LP: #1294294)
143+
144+ [ Kevin Gunn ]
145+ * Switch to new scope backend and apply required visual adaptations.
146+ (LP: #1294294)
147+
148+ [ Albert Astals ]
149+ * Switch to new scope backend and apply required visual adaptations.
150+ (LP: #1294294)
151+ * LVWPH: cull lost items lost items will be released on the next
152+ updatePolish cycle but meanwhile don't let them be visible
153+
154+ [ Daniel d'Andrada ]
155+ * Switch to new scope backend and apply required visual adaptations.
156+ (LP: #1294294)
157+
158+ [ Michał Karnicki ]
159+ * Switch to new scope backend and apply required visual adaptations.
160+ (LP: #1294294)
161+
162+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 24 Mar 2014 16:10:24 +0000
163+
164+unity8 (7.84+14.04.20140319.1-0ubuntu1) trusty; urgency=low
165+
166+ [ Michał Sawicz ]
167+ * Work around bug #1293478 - make sure to send ints, not doubles for
168+ volume control. (LP: #1293478)
169+
170+ [ Nick Dedekind ]
171+ * Fixed binding being cleared when manually changing slider value
172+ (lp#1283191). (LP: #1283191)
173+
174+ [ Albert Astals ]
175+ * Fix indicators highlight position on 5.2 We need to take into
176+ account the list originX if we're using the list delegates x outside
177+ the list itself
178+ * LVWPH: Make sure m_firstVisibleIndex is correctly set on
179+ removeNonVisibleItems
180+
181+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 19 Mar 2014 16:40:20 +0000
182+
183+unity8 (7.84+14.04.20140317.2-0ubuntu1) trusty; urgency=low
184+
185+ [ CI bot ]
186+ * Resync trunk
187+
188+ [ Michał Sawicz ]
189+ * Revert disable-hud, we weren't ready to land it yet.
190+
191+ [ Mirco Müller ]
192+ * The snap-decision AP-test for "incoming call"-case used the wrong
193+ objectName "notification0". It has to be "notification1".
194+
195+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 17 Mar 2014 15:54:39 +0000
196+
197+unity8 (7.84+14.04.20140314-0ubuntu1) trusty; urgency=low
198+
199+ [ Michał Sawicz ]
200+ * Fix tests under Qt 5.2.
201+ * CardHeader improvements depending on background. Also drop prices,
202+ they need to be reworked into attributes.
203+ * Bring Cards closer to design
204+ * Add back the workaround for not being able scroll the image gallery
205+ Taken from AppPreview.qml (LP: #1281709)
206+ * Only allow searching when preview isn't open. (LP: #1282475)
207+ * Adds carousel dynamic switch
208+
209+ [ Leo Arias ]
210+ * Update the url dispatcher test to use the fake app fixture from the
211+ toolkit.
212+
213+ [ Albert Astals ]
214+ * Fix tests under Qt 5.2.
215+ * Workaround compiz/unity7 behaviour change/bug
216+
217+ [ Michael Zanetti ]
218+ * Fix tests under Qt 5.2.
219+ * Disable HUD from the bottom edge.
220+
221+ [ Andrea Cimitan ]
222+ * Adds carousel dynamic switch
223+
224+ [ CI bot ]
225+ * Resync trunk
226+
227+ [ Michał Karnicki ]
228+ * CardHeader improvements depending on background. Also drop prices,
229+ they need to be reworked into attributes.
230+
231+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 14 Mar 2014 15:46:10 +0000
232+
1unity8 (7.84+14.04.20140307-0ubuntu1) trusty; urgency=low
233unity8 (7.84+14.04.20140307-0ubuntu1) trusty; urgency=low
2
234
3 * New rebuild forced
235 * New rebuild forced
debian/control+15−8
@@ -13,14 +13,12 @@ Build-Depends: cmake,
13 libgles2-mesa-dev[armhf],
13 libgles2-mesa-dev[armhf],
14 libgsettings-qt-dev,
14 libgsettings-qt-dev,
15 libhud-client2-dev,
15 libhud-client2-dev,
16− libjson-perl,
17 libnih-dbus-dev,
16 libnih-dbus-dev,
18 libnih-dev,
17 libnih-dev,
19 libpulse-dev,
18 libpulse-dev,
20 libqmenumodel-dev (>= 0.2.7),
19 libqmenumodel-dev (>= 0.2.7),
21− libunity-api-dev (>= 7.80.4),
20+ libunity-api-dev (>= 7.80.6),
22 libunity-mir-dev,
21 libunity-mir-dev,
23− libunity-scopes-json-def-phone,
24 libupstart-dev,
22 libupstart-dev,
25 libusermetricsoutput1-dev,
23 libusermetricsoutput1-dev,
26 libxcb1-dev,
24 libxcb1-dev,
@@ -82,12 +80,15 @@ Depends: gsettings-desktop-schemas,
82 qtdeclarative5-dee-plugin,
80 qtdeclarative5-dee-plugin,
83 qtdeclarative5-gsettings1.0,
81 qtdeclarative5-gsettings1.0,
84 qtdeclarative5-ubuntu-settings-components,
82 qtdeclarative5-ubuntu-settings-components,
83+ qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
84+ ubuntu-thumbnailer-impl-0,
85 qtdeclarative5-ubuntu-ui-toolkit-plugin,
85 qtdeclarative5-ubuntu-ui-toolkit-plugin,
86 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
86 qtdeclarative5-unity-notifications-plugin | unity-notifications-impl,
87 qtdeclarative5-xmllistmodel-plugin,
87 qtdeclarative5-xmllistmodel-plugin,
88+ unity-application-impl-2,
88 unity-launcher-impl-3,
89 unity-launcher-impl-3,
89 unity-notifications-impl-2,
90 unity-notifications-impl-2,
90− unity8-fake-env | qtubuntu-shell,
91+ unity8-fake-env | unity-application-impl,
91 unity8-private (= ${binary:Version}),
92 unity8-private (= ${binary:Version}),
92 unity8-private | unity-launcher-impl,
93 unity8-private | unity-launcher-impl,
93 unity-plugin-scopes | unity-scopes-impl,
94 unity-plugin-scopes | unity-scopes-impl,
@@ -96,8 +97,11 @@ Depends: gsettings-desktop-schemas,
96 libcap2-bin,
97 libcap2-bin,
97 ${misc:Depends},
98 ${misc:Depends},
98 ${shlibs:Depends},
99 ${shlibs:Depends},
99−Recommends: ${unity-default-masterscopes},
100+Recommends: unity-scope-click,
101+ unity-scope-mediascanner2,
102+ unity-scope-scopes,
100−Breaks: indicator-network (<< 0.5.1)
103+Breaks: indicator-network (<< 0.5.1),
104+ ubuntu-touch-session (<< 0.107),
101Replaces: ubuntu-touch-session (<< 0.82~)
105Replaces: ubuntu-touch-session (<< 0.82~)
102Description: Unity 8 shell
106Description: Unity 8 shell
103 The Unity 8 shell is the primary user interface for Ubuntu devices.
107 The Unity 8 shell is the primary user interface for Ubuntu devices.
@@ -134,7 +138,8 @@ Multi-Arch: same
134Pre-Depends: ${misc:Pre-Depends},
138Pre-Depends: ${misc:Pre-Depends},
135Depends: ${misc:Depends},
139Depends: ${misc:Depends},
136 ${shlibs:Depends},
140 ${shlibs:Depends},
137−Provides: qtubuntu-shell,
141+Provides: unity-application-impl,
142+ unity-application-impl-2,
138Description: Fake environment for running Unity 8 shell
143Description: Fake environment for running Unity 8 shell
139 Provides fake implementations of some QML modules used by Unity 8 shell
144 Provides fake implementations of some QML modules used by Unity 8 shell
140 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
145 (e.g Ubuntu.Application) so that you can run it in a sandboxed environment.
@@ -143,8 +148,10 @@ Package: unity8-private
143Architecture: any
148Architecture: any
144Multi-Arch: same
149Multi-Arch: same
145Pre-Depends: ${misc:Pre-Depends},
150Pre-Depends: ${misc:Pre-Depends},
151+Depends: gsettings-ubuntu-schemas,
146−Depends: ${misc:Depends},
152+ ${misc:Depends},
147 ${shlibs:Depends},
153 ${shlibs:Depends},
154+ libunity-core-6.0-9,
148Provides: unity-launcher-impl,
155Provides: unity-launcher-impl,
149 unity-launcher-impl-3,
156 unity-launcher-impl-3,
150Description: Unity 8 private libs
157Description: Unity 8 private libs
debian/rules−5
@@ -6,8 +6,6 @@
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−SCOPES_RECOMMENDS := $(shell perl debian/scopes-recommends-generator /usr/share/unity/client-scopes.json)
10−
11.PHONY: build
9.PHONY: build
12build %:
10build %:
13 dh $@ --parallel --fail-missing --with python2,python3
11 dh $@ --parallel --fail-missing --with python2,python3
@@ -41,6 +39,3 @@ override_dh_makeshlibs:
41# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
39# libMockLightDM-qml.so links against liblightdm-qt5-2.so which doesn't exist
42override_dh_shlibdeps:
40override_dh_shlibdeps:
43 dh_shlibdeps -XlibMockLightDM-qml.so
41 dh_shlibdeps -XlibMockLightDM-qml.so
44−
45−override_dh_gencontrol:
46− dh_gencontrol -- -Vunity-default-masterscopes="$(SCOPES_RECOMMENDS)"
debian/scopes-recommends-generatordeleted−27
@@ -1,27 +0,0 @@
1−#!/usr/bin/perl -w
2−
3−use strict;
4−binmode STDOUT, ":utf8";
5−use utf8;
6−
7−use JSON;
8−
9−my $json;
10−{
11− local $/; #Enable 'slurp' mode
12− open my $fh, "<", $ARGV[0];
13− $json = <$fh>;
14− close $fh;
15−}
16−# get it to a scalar
17−my $j = "[" . $json . "]";
18−
19−my $decoded_json = decode_json( $j );
20−
21−my $recommends_list = "";
22−for my $record ( @$decoded_json ) {
23− foreach my $key ( keys(%$record) ) {
24− $recommends_list = $recommends_list . $key . ", ";
25− }
26−}
27−print $recommends_list;
debian/unity8-fake-env.install+1
@@ -1,3 +1,4 @@
1+usr/lib/*/unity8/qml/nonmirplugins
1usr/lib/*/unity8/qml/mocks
2usr/lib/*/unity8/qml/mocks
2usr/lib/*/unity8/qml/scopefakes
3usr/lib/*/unity8/qml/scopefakes
3usr/share/unity8/mocks
4usr/share/unity8/mocks
debian/unity8.install+1−1
@@ -10,6 +10,6 @@ usr/share/unity8/Launcher
10usr/share/unity8/Notifications
10usr/share/unity8/Notifications
11usr/share/unity8/Panel
11usr/share/unity8/Panel
12usr/share/unity8/Shell.qml
12usr/share/unity8/Shell.qml
13−usr/share/unity8/SideStage
13+usr/share/unity8/Stages
14usr/share/unity8/graphics
14usr/share/unity8/graphics
15data/unity8.conf usr/share/upstart/sessions/
15data/unity8.conf usr/share/upstart/sessions/
include/paths.h.in+10
@@ -57,6 +57,16 @@ inline QStringList overrideImportPaths() {
57 return paths;
57 return paths;
58}
58}
59
59
60+inline QStringList nonMirImportPaths() {
61+ QStringList paths;
62+ if (isRunningInstalled()) {
63+ paths << QString("@CMAKE_INSTALL_PREFIX@/@SHELL_INSTALL_QML@/nonmirplugins");
64+ } else {
65+ paths << QString("@CMAKE_BINARY_DIR@/nonmirplugins");
66+ }
67+ return paths;
68+}
69+
60inline QStringList fallbackImportPaths() {
70inline QStringList fallbackImportPaths() {
61 QStringList paths;
71 QStringList paths;
62 if (isRunningInstalled()) {
72 if (isRunningInstalled()) {
plugins/DashViews/listviewwithpageheader.cpp+42−13
@@ -91,6 +91,7 @@
91
91
92#include "listviewwithpageheader.h"
92#include "listviewwithpageheader.h"
93
93
94+#include <QCoreApplication>
94#include <QDebug>
95#include <QDebug>
95#include <qqmlinfo.h>
96#include <qqmlinfo.h>
96#include <qqmlengine.h>
97#include <qqmlengine.h>
@@ -366,6 +367,18 @@ void ListViewWithPageHeader::positionAtBeginning()
366 m_previousContentY = m_visibleItems.first()->y() - headerHeight;
367 m_previousContentY = m_visibleItems.first()->y() - headerHeight;
367 }
368 }
368 setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
369 setContentY(m_visibleItems.first()->y() + m_clipItem->y() - headerHeight);
370+ if (m_headerItem) {
371+ // TODO This should not be needed and the code that adjust the m_headerItem position
372+ // in viewportMoved() should be enough but in some cases we have not found a way to reproduce
373+ // yet the code of viewportMoved() fails so here we make sure that at least if we are calling
374+ // positionAtBeginning the header item will be correctly positioned
375+ m_headerItem->setY(-m_minYExtent);
376+ }
377+}
378+
379+static inline bool uFuzzyCompare(qreal r1, qreal r2)
380+{
381+ return qFuzzyCompare(r1, r2) || (qFuzzyIsNull(r1) && qFuzzyIsNull(r2));
369}
382}
370
383
371void ListViewWithPageHeader::showHeader()
384void ListViewWithPageHeader::showHeader()
@@ -373,8 +386,8 @@ void ListViewWithPageHeader::showHeader()
373 if (!m_headerItem)
386 if (!m_headerItem)
374 return;
387 return;
375
388
376− auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
389+ const auto to = qMax(-minYExtent(), contentY() - m_headerItem->height() + m_headerItemShownHeight);
377− if (to != contentY()) {
390+ if (!uFuzzyCompare(to, contentY())) {
378 const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
391 const bool headerShownByItsOwn = contentY() < m_headerItem->y() + m_headerItem->height();
379 if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
392 if (headerShownByItsOwn && m_headerItemShownHeight == 0) {
380 // We are not clipping since we are just at the top of the viewport
393 // We are not clipping since we are just at the top of the viewport
@@ -491,11 +504,7 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
491 const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
504 const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
492 if (m_headerItem) {
505 if (m_headerItem) {
493 const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
506 const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
494− if (contentY() < -m_minYExtent) {
507+ if (uFuzzyCompare(contentY(), -m_minYExtent) || contentY() > -m_minYExtent) {
495− // Stick the header item to the top when dragging down
496− m_headerItem->setY(contentY());
497− m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
498− } else {
499 m_headerItem->setHeight(m_headerItem->implicitHeight());
508 m_headerItem->setHeight(m_headerItem->implicitHeight());
500 // We are going down (but it's not because of the rebound at the end)
509 // We are going down (but it's not because of the rebound at the end)
501 // (but the header was not shown by it's own position)
510 // (but the header was not shown by it's own position)
@@ -509,21 +518,32 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
509 m_headerItemShownHeight = 0;
518 m_headerItemShownHeight = 0;
510 m_headerItem->setY(-m_minYExtent);
519 m_headerItem->setY(-m_minYExtent);
511 } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
520 } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
521+ if (maximizeVisibleAreaRunning && diff > 0) {
512− if (maximizeVisibleAreaRunning && diff > 0) // If we are maximizing and the header was shown, make sure we hide it
522+ // If we are maximizing and the header was shown, make sure we hide it
513 m_headerItemShownHeight -= diff;
523 m_headerItemShownHeight -= diff;
514− else
524+ } else {
515 m_headerItemShownHeight += diff;
525 m_headerItemShownHeight += diff;
526+ }
516− if (contentY() == -m_minYExtent) {
527+ if (uFuzzyCompare(contentY(), -m_minYExtent)) {
517 m_headerItemShownHeight = 0;
528 m_headerItemShownHeight = 0;
518 } else {
529 } else {
519 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
530 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
520 }
531 }
521 if (m_headerItemShownHeight > 0) {
532 if (m_headerItemShownHeight > 0) {
533+ if (uFuzzyCompare(m_headerItem->height(), m_headerItemShownHeight)) {
534+ m_headerItem->setY(contentY());
535+ m_headerItemShownHeight = m_headerItem->height();
536+ } else {
522− m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
537+ m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
538+ }
523 } else {
539 } else {
524 m_headerItem->setY(-m_minYExtent);
540 m_headerItem->setY(-m_minYExtent);
525 }
541 }
526 }
542 }
543+ } else {
544+ // Stick the header item to the top when dragging down
545+ m_headerItem->setY(contentY());
546+ m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
527 }
547 }
528 // We will be changing the clip item, need to accomadate for it
548 // We will be changing the clip item, need to accomadate for it
529 // otherwise we move the firstItem down/up twice (unless the
549 // otherwise we move the firstItem down/up twice (unless the
@@ -759,6 +779,9 @@ bool ListViewWithPageHeader::removeNonVisibleItems(qreal bufferFrom, qreal buffe
759 ++i;
779 ++i;
760 }
780 }
761 }
781 }
782+ if (!foundVisible) {
783+ m_firstVisibleIndex = -1;
784+ }
762 if (m_firstVisibleIndex != oldFirstVisibleIndex) {
785 if (m_firstVisibleIndex != oldFirstVisibleIndex) {
763 adjustMinYExtent();
786 adjustMinYExtent();
764 }
787 }
@@ -824,6 +847,7 @@ ListViewWithPageHeader::ListItem *ListViewWithPageHeader::createItem(int modelIn
824 }
847 }
825 }
848 }
826 if (lostItem) {
849 if (lostItem) {
850+ listItem->setCulled(true);
827 releaseItem(listItem);
851 releaseItem(listItem);
828 listItem = nullptr;
852 listItem = nullptr;
829 } else {
853 } else {
@@ -1073,7 +1097,7 @@ void ListViewWithPageHeader::itemGeometryChanged(QQuickItem * /*item*/, const QR
1073{
1097{
1074 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1098 const qreal heightDiff = newGeometry.height() - oldGeometry.height();
1075 if (heightDiff != 0) {
1099 if (heightDiff != 0) {
1076− if (oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1100+ if (!m_inContentHeightKeepHeaderShown && oldGeometry.y() + oldGeometry.height() + m_clipItem->y() <= contentY() && !m_visibleItems.isEmpty()) {
1077 ListItem *firstItem = m_visibleItems.first();
1101 ListItem *firstItem = m_visibleItems.first();
1078 firstItem->setY(firstItem->y() - heightDiff);
1102 firstItem->setY(firstItem->y() - heightDiff);
1079 adjustMinYExtent();
1103 adjustMinYExtent();
@@ -1128,7 +1152,12 @@ void ListViewWithPageHeader::adjustMinYExtent()
1128 nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
1152 nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
1129// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
1153// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
1130 }
1154 }
1131− m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + (m_headerItem ? m_headerItem->implicitHeight() : 0);
1155+ const qreal headerHeight = (m_headerItem ? m_headerItem->implicitHeight() : 0);
1156+ m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + headerHeight;
1157+ if (m_minYExtent != 0 && qFuzzyIsNull(m_minYExtent)) {
1158+ m_minYExtent = 0;
1159+ m_visibleItems.first()->setY(nonCreatedHeight - m_clipItem->y() + headerHeight);
1160+ }
1132 }
1161 }
1133}
1162}
1134
1163
plugins/Powerd/CMakeLists.txt+8
@@ -1,4 +1,11 @@
1include(Plugins)
1include(Plugins)
2+include(FindPkgConfig)
3+
4+pkg_search_module(GIO REQUIRED gio-2.0)
5+
6+include_directories(
7+ ${GIO_INCLUDE_DIRS}
8+)
2
9
3add_definitions(-DSM_BUSNAME=systemBus)
10add_definitions(-DSM_BUSNAME=systemBus)
4
11
@@ -8,6 +15,7 @@ add_library(Powerd-qml MODULE
8 )
15 )
9
16
10qt5_use_modules(Powerd-qml DBus Qml)
17qt5_use_modules(Powerd-qml DBus Qml)
18+target_link_libraries(Powerd-qml ${GIO_LDFLAGS})
11
19
12export_qmlfiles(Powerd Powerd)
20export_qmlfiles(Powerd Powerd)
13export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
21export_qmlplugin(Powerd 0.1 Powerd TARGETS Powerd-qml)
plugins/Powerd/Powerd.cpp+17
@@ -17,6 +17,13 @@
17 */
17 */
18
18
19#include "Powerd.h"
19#include "Powerd.h"
20+#include <QDBusPendingCall>
21+
22+void autoBrightnessChanged(GSettings *settings, const gchar *key, QDBusInterface *powerd)
23+{
24+ bool value = g_settings_get_boolean(settings, key);
25+ powerd->asyncCall("userAutobrightnessEnable", QVariant(value));
26+}
20
27
21Powerd::Powerd(QObject* parent)
28Powerd::Powerd(QObject* parent)
22 : QObject(parent),
29 : QObject(parent),
@@ -33,4 +40,14 @@ Powerd::Powerd(QObject* parent)
33 "DisplayPowerStateChange",
40 "DisplayPowerStateChange",
34 this,
41 this,
35 SIGNAL(displayPowerStateChange(int, unsigned int)));
42 SIGNAL(displayPowerStateChange(int, unsigned int)));
43+
44+ systemSettings = g_settings_new("com.ubuntu.touch.system");
45+ g_signal_connect(systemSettings, "changed::auto-brightness", G_CALLBACK(autoBrightnessChanged), powerd);
46+ autoBrightnessChanged(systemSettings, "auto-brightness", powerd);
47+}
48+
49+Powerd::~Powerd()
50+{
51+ g_signal_handlers_disconnect_by_data(systemSettings, powerd);
52+ g_object_unref(systemSettings);
36}
53}
plugins/Powerd/Powerd.h+3
@@ -20,6 +20,7 @@
20#ifndef UNITY_POWERD_H
20#ifndef UNITY_POWERD_H
21#define UNITY_POWERD_H
21#define UNITY_POWERD_H
22
22
23+#include <gio/gio.h>
23#include <QtCore/QObject>
24#include <QtCore/QObject>
24#include <QtDBus/QDBusInterface>
25#include <QtDBus/QDBusInterface>
25
26
@@ -43,12 +44,14 @@ public:
43 };
44 };
44
45
45 explicit Powerd(QObject *parent = 0);
46 explicit Powerd(QObject *parent = 0);
47+ ~Powerd();
46
48
47Q_SIGNALS:
49Q_SIGNALS:
48 void displayPowerStateChange(int status, unsigned int flags);
50 void displayPowerStateChange(int status, unsigned int flags);
49
51
50private:
52private:
51 QDBusInterface *powerd;
53 QDBusInterface *powerd;
54+ GSettings *systemSettings;
52};
55};
53
56
54#endif
57#endif
plugins/Unity/Indicators/qml/MenuItemFactory.qml+7−1
@@ -77,6 +77,7 @@ Item {
77 property var menuModel: menuFactory.menuModel
77 property var menuModel: menuFactory.menuModel
78 property int menuIndex: -1
78 property int menuIndex: -1
79 property var extendedData: menuData && menuData.ext || undefined
79 property var extendedData: menuData && menuData.ext || undefined
80+ property var serverValue: getExtendedProperty(menuData, "actionState", undefined)
80
81
81 text: menuData && menuData.label || ""
82 text: menuData && menuData.label || ""
82 iconSource: menuData && menuData.icon || ""
83 iconSource: menuData && menuData.icon || ""
@@ -91,7 +92,6 @@ Item {
91 }
92 }
92 return maximum;
93 return maximum;
93 }
94 }
94− value: menuData && menuData.actionState || 0.0
95 enabled: menuData && menuData.sensitive || false
95 enabled: menuData && menuData.sensitive || false
96
96
97 onMenuModelChanged: {
97 onMenuModelChanged: {
@@ -100,6 +100,12 @@ Item {
100 onMenuIndexChanged: {
100 onMenuIndexChanged: {
101 loadAttributes();
101 loadAttributes();
102 }
102 }
103+ onServerValueChanged: {
104+ // value can be changed by slider, so a binding won't work.
105+ if (serverValue !== undefined) {
106+ value = serverValue;
107+ }
108+ }
103 onUpdated: {
109 onUpdated: {
104 menuModel.changeState(menuIndex, value);
110 menuModel.changeState(menuIndex, value);
105 }
111 }
plugins/Unity/Launcher/backend/launcherbackend.cpp+10−2
@@ -186,9 +186,10 @@ void LauncherBackend::syncFromAccounts()
186 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
186 if (m_accounts && defaults) { // Checking accounts as it'll be null when !useStorage
187 QGSettings gSettings("com.canonical.Unity.Launcher", "/com/canonical/unity/launcher/");
187 QGSettings gSettings("com.canonical.Unity.Launcher", "/com/canonical/unity/launcher/");
188 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
188 Q_FOREACH(const QString &entry, gSettings.get("favorites").toStringList()) {
189+ qDebug() << "loading entry" << entry;
189 if (entry.startsWith("application://")) {
190 if (entry.startsWith("application://")) {
190 QString appId = entry;
191 QString appId = entry;
191− // Transform "application://foobar.desktop" to "foobar"
192+ // Transform "application://foobar.desktop" to "application://foobar"
192 appId.remove("application://");
193 appId.remove("application://");
193 if (appId.endsWith(".desktop")) {
194 if (appId.endsWith(".desktop")) {
194 appId.chop(8);
195 appId.chop(8);
@@ -207,8 +208,14 @@ void LauncherBackend::syncFromAccounts()
207 QString appId = entry;
208 QString appId = entry;
208 appId.remove("appid://");
209 appId.remove("appid://");
209 // Strip hook name and current-user-version in case its there
210 // Strip hook name and current-user-version in case its there
211+
212+ if (appId.split('/').count() != 3) {
213+ qWarning() << "ignoring entry " + appId + ". Not a valid appId.";
214+ continue;
215+ }
210− appId = appId.split('/').first();
216+ appId = appId.split('/').first() + "_" + appId.split('/').at(1);
211 QString df = findDesktopFile(appId);
217 QString df = findDesktopFile(appId);
218+ qDebug() << "got df file" << df;
212
219
213 if (!df.isEmpty()) {
220 if (!df.isEmpty()) {
214 m_storedApps << appId;
221 m_storedApps << appId;
@@ -248,6 +255,7 @@ QString LauncherBackend::findDesktopFile(const QString &appId) const
248#ifdef LAUNCHER_TESTING
255#ifdef LAUNCHER_TESTING
249 searchDirs << "";
256 searchDirs << "";
250#endif
257#endif
258+ qDebug() << "search dirs are" << searchDirs;
251
259
252 do {
260 do {
253 if (dashPos != -1) {
261 if (dashPos != -1) {
plugins/Utils/CMakeLists.txt+2−3
@@ -11,13 +11,12 @@ include_directories(
11)
11)
12
12
13set(QMLPLUGIN_SRC
13set(QMLPLUGIN_SRC
14− albumartprovider.cpp
15 bottombarvisibilitycommunicatorshell.cpp
14 bottombarvisibilitycommunicatorshell.cpp
16− mediaartcache.cpp
17 qlimitproxymodelqml.cpp
15 qlimitproxymodelqml.cpp
18 qsortfilterproxymodelqml.cpp
16 qsortfilterproxymodelqml.cpp
19 timeformatter.cpp
17 timeformatter.cpp
20 unitymenumodelpaths.cpp
18 unitymenumodelpaths.cpp
19+ easingcurve.cpp
21 plugin.cpp
20 plugin.cpp
22 )
21 )
23
22
@@ -33,7 +32,7 @@ target_link_libraries(Utils-qml ${GIO_LDFLAGS})
33# files directly in targets.
32# files directly in targets.
34set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
33set_target_properties(Utils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
35
34
36−qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Concurrent)
35+qt5_use_modules(Utils-qml Qml Quick DBus Network XmlPatterns Gui Concurrent)
37
36
38# export the qmldir qmltypes and plugin files
37# export the qmldir qmltypes and plugin files
39export_qmlfiles(Utils Utils)
38export_qmlfiles(Utils Utils)
plugins/Utils/albumartprovider.cppdeleted−236
@@ -1,236 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17− * Pawel Stolowski <pawel.stolowski@canonical.com>
18−*/
19−
20−#include "albumartprovider.h"
21−#include <QString>
22−#include <QNetworkAccessManager>
23−#include <QEventLoop>
24−#include <QNetworkRequest>
25−#include <QNetworkReply>
26−#include <QXmlQuery>
27−#include <QTemporaryFile>
28−#include <QBuffer>
29−#include <QDebug>
30−#include <QFile>
31−#include <QStringList>
32−#include <QByteArray>
33−#include <QImage>
34−#include <QUrl>
35−#include <QUrlQuery>
36−#include <QtConcurrent>
37−
38−using namespace std;
39−
40−const std::string AlbumArtProvider::DEFAULT_ALBUM_ART = "/usr/share/unity/icons/album_missing.png";
41−const std::string AlbumArtProvider::UNITY_LENS_SCHEMA = "com.canonical.Unity.Lenses";
42−
43−static QByteArray download(QString url) {
44− QScopedPointer<QNetworkAccessManager> am(new QNetworkAccessManager);
45− QNetworkReply *reply = am->get(QNetworkRequest(QUrl(url)));
46− QEventLoop loop;
47− QObject::connect(am.data(), &QNetworkAccessManager::finished, &loop, &QEventLoop::quit);
48− loop.exec();
49−
50− if (reply->error() != QNetworkReply::NoError) {
51− qWarning() << "Error downloading from the network:" << reply->errorString();
52− return QByteArray();
53− }
54− return reply->readAll();
55−}
56−
57−AlbumArtProvider::AlbumArtProvider()
58− : QQuickImageProvider(QQmlImageProviderBase::Image, QQmlImageProviderBase::ForceAsynchronousImageLoading),
59− m_settings(nullptr)
60−{
61− auto schemas = g_settings_list_schemas();
62− if (schemas) {
63− for (int i = 0; schemas[i]; i++) {
64− if (g_strcmp0(schemas[i], UNITY_LENS_SCHEMA.c_str()) == 0) {
65− m_settings = g_settings_new(UNITY_LENS_SCHEMA.c_str());
66− break;
67− }
68− }
69− }
70− if (m_settings == nullptr) {
71− qWarning() << "Missing" << QString::fromStdString(UNITY_LENS_SCHEMA) << "schema";
72− }
73−}
74−
75−AlbumArtProvider::~AlbumArtProvider()
76−{
77− if (m_settings)
78− g_object_unref(m_settings);
79−}
80−
81−std::string AlbumArtProvider::get_lastfm_url(const albuminfo &ai) {
82− QString artist = QString::fromStdString(ai.artist);
83− QString album = QString::fromStdString(ai.album);
84− // audioscrobbler wants it without any / (as it would break the URL)
85− artist.remove('/');
86− album.remove('/');
87−
88− /// @todo: this is the old API which will probably get axed at some point in the future
89− /// The new 2.0 API requires an API key, but supports JSON output, etc, so switching
90− /// to it should be done ASAP.
91− QString request = QString("http://ws.audioscrobbler.com/1.0/album/%1/%2/info.xml").arg(artist)
92− .arg(album)
93− .toHtmlEscaped();
94− QFuture<QByteArray> future = QtConcurrent::run(download, request);
95− QByteArray arr = future.result();
96− if(arr.size() == 0) {
97− return "";
98− }
99− QXmlQuery query;
100− QBuffer tmp;
101− tmp.setData(arr);
102− tmp.open(QIODevice::ReadOnly);
103− query.bindVariable("reply", &tmp);
104− query.setQuery("doc($reply)/album/coverart/large[1]/text()");
105− QString image;
106− query.evaluateTo(&image);
107− image = image.trimmed();
108−
109− // return empty if last.fm tries to offer their default
110− // fallback artwork
111− if (image.contains("catalogue/noimage")) {
112− return "";
113− }
114−
115− return image.toStdString();
116−}
117−
118−bool AlbumArtProvider::download_and_store(const std::string &image_url, const std::string &output_file) {
119− QString url = QString::fromStdString(image_url);
120− QString fileName = QString::fromStdString(output_file);
121− QFuture<QByteArray> future = QtConcurrent::run(download, url);
122− QByteArray arr = future.result();
123− if (arr.size() == 0) {
124− return false;
125− }
126− QFile file(fileName);
127− if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
128− qWarning() << "Could not open file for writing:" << file.errorString();
129− return false;
130− }
131− if (file.write(arr) == -1){
132− qWarning() << "Could not write the image:" << file.error();
133− return false;
134− }
135−
136− return true;
137−}
138−
139−void AlbumArtProvider::fix_format(const std::string &fname) {
140− // MediaArtSpec requires jpg. Convert to it if necessary.
141− FILE *f = fopen(fname.c_str(), "r");
142− if(!f)
143− return;
144− unsigned char buf[2];
145− fread(buf, 1, 2, f);
146− fclose(f);
147− if(buf[0] == 0xff && buf[1] == 0xd8) {
148− return;
149− }
150− QImage im(fname.c_str());
151− im.save(fname.c_str(), "JPEG");
152−}
153−
154−std::string AlbumArtProvider::get_image(const std::string &artist, const std::string &album) {
155− albuminfo info;
156−
157− info.artist = artist;
158− info.album = album;
159−
160− if(info.album.empty() || info.artist.empty()) {
161− return DEFAULT_ALBUM_ART;
162− }
163− if(cache.has_art(info.artist, info.album)) {
164− // Image may have expired from cache between these two lines.
165− // It might expire before we return. C'est la vie.
166− return cache.get_art_file(info.artist, info.album);
167− }
168−
169− if (m_settings != nullptr && g_strcmp0(g_settings_get_string(m_settings, "remote-content-search"), "all") !=0) {
170− qDebug() << "Remote content disabled";
171− return DEFAULT_ALBUM_ART;
172− }
173−
174− std::string image_url = get_lastfm_url(info);
175− if(image_url.empty()) {
176− return DEFAULT_ALBUM_ART;
177− }
178− QTemporaryFile tempFile;
179− tempFile.open();
180− tempFile.setAutoRemove(true);
181− QString fname = tempFile.fileName();
182− std::string tmpname = fname.toUtf8().data();
183−
184− if(!download_and_store(image_url, tmpname)) {
185− return DEFAULT_ALBUM_ART;
186− }
187− fix_format(tmpname.c_str());
188− QFile f(fname);
189− if(!f.open(QIODevice::ReadWrite)) {
190− return DEFAULT_ALBUM_ART;
191− }
192− QByteArray arr = f.readAll();
193− f.close();
194−
195− cache.add_art(info.artist, info.album, arr.data(), arr.size());
196− try {
197− std::string res = cache.get_art_file(info.artist, info.album);
198− if(res.empty())
199− return DEFAULT_ALBUM_ART;
200− return res;
201− } catch(...) {
202− }
203− return DEFAULT_ALBUM_ART;
204−}
205−
206−QImage AlbumArtProvider::requestImage(const QString &id, QSize *realSize, const QSize &requestedSize) {
207− Q_UNUSED(requestedSize)
208−
209− QUrlQuery query(id);
210− if (!query.hasQueryItem(QStringLiteral("artist")) || !query.hasQueryItem(QStringLiteral("album"))) {
211− qWarning() << "Invalid albumart uri:" << id;
212− return QImage(QString::fromStdString(DEFAULT_ALBUM_ART));
213− }
214− const QString artist = query.queryItemValue(QStringLiteral("artist"), QUrl::FullyEncoded);
215− const QString album = query.queryItemValue(QStringLiteral("album"), QUrl::FullyEncoded);
216−
217− std::string tgt_path;
218− try {
219− tgt_path = get_image(artist.toStdString(), album.toStdString());
220− if(!tgt_path.empty()) {
221− QImage image;
222− image.load(QString::fromStdString(tgt_path));
223− // FIXME: Rescale to requested size preserving aspect.
224− *realSize = image.size();
225− return image;
226− }
227− } catch(std::exception &e) {
228− qDebug() << "Album art loader failed: " << e.what();
229− } catch(...) {
230− qDebug() << "Unknown error when generating image.";
231− }
232−
233− QImage fallback(QString::fromStdString(DEFAULT_ALBUM_ART));
234− *realSize = fallback.size();
235− return fallback;
236−}
plugins/Utils/albumartprovider.hdeleted−56
@@ -1,56 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Jussi Pakkanen <jussi.pakkanen@canonical.com>
17−*/
18−
19−#ifndef ALBUMART_PROVIDER_H_
20−#define ALBUMART_PROVIDER_H_
21−
22−#include <string>
23−#include <stdexcept>
24−#include <QQuickImageProvider>
25−#include <gio/gio.h>
26−
27−#include "mediaartcache.h"
28−
29−struct albuminfo {
30− std::string artist;
31− std::string album;
32−};
33−
34−class AlbumArtProvider : public QQuickImageProvider
35−{
36−public:
37− AlbumArtProvider();
38− ~AlbumArtProvider();
39− QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize);
40−
41− std::string get_image(const std::string &artist, const std::string &album);
42−
43− const static std::string DEFAULT_ALBUM_ART;
44− const static std::string UNITY_LENS_SCHEMA;
45−private:
46− MediaArtCache cache;
47− GSettings *m_settings;
48−
49− void fix_format(const std::string &fname);
50−
51− std::string get_lastfm_url(const albuminfo &ai);
52−
53− bool download_and_store(const std::string &image_url, const std::string &output_file);
54−};
55−
56−#endif
plugins/Utils/easingcurve.cppnew file+67
@@ -0,0 +1,67 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#include "easingcurve.h"
20+
21+
22+EasingCurve::EasingCurve(QObject *parent):
23+ QObject(parent)
24+{
25+
26+}
27+
28+QEasingCurve::Type EasingCurve::type() const
29+{
30+ return m_easingCurve.type();
31+}
32+
33+void EasingCurve::setType(const QEasingCurve::Type &type)
34+{
35+ m_easingCurve.setType(type);
36+ Q_EMIT typeChanged();
37+}
38+
39+qreal EasingCurve::period() const
40+{
41+ return m_easingCurve.period();
42+}
43+
44+void EasingCurve::setPeriod(qreal period)
45+{
46+ m_easingCurve.setPeriod(period);
47+ Q_EMIT periodChanged();
48+}
49+
50+qreal EasingCurve::progress() const
51+{
52+ return m_progress;
53+}
54+
55+void EasingCurve::setProgress(qreal progress)
56+{
57+ if (m_progress != progress) {
58+ m_progress = progress;
59+ m_value = m_easingCurve.valueForProgress(m_progress);
60+ Q_EMIT progressChanged();
61+ }
62+}
63+
64+qreal EasingCurve::value() const
65+{
66+ return m_value;
67+}
plugins/Utils/easingcurve.hnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+#ifndef EASINGCURVE_H
20+#define EASINGCURVE_H
21+
22+#include <QObject>
23+#include <QEasingCurve>
24+
25+/**
26+ * @brief The EasingCurve class
27+ *
28+ * This class exposes the QEasingCurve C++ API to QML.
29+ * This is useful for user interactive animations. While the QML Animation types
30+ * all require a "from", "to" and "duration", this one is based on "period" and
31+ * "progress". So you can control the position of the aimation by changing the
32+ * progress, also going back and forward in the animation. Depending on the type
33+ * of the easing curve, value will return the transformed progress.
34+ */
35+
36+class EasingCurve: public QObject
37+{
38+ Q_OBJECT
39+ Q_ENUMS(QEasingCurve::Type)
40+ Q_PROPERTY(QEasingCurve::Type type READ type WRITE setType NOTIFY typeChanged)
41+ Q_PROPERTY(qreal period READ period WRITE setPeriod NOTIFY periodChanged)
42+ Q_PROPERTY(qreal progress READ progress WRITE setProgress NOTIFY progressChanged)
43+ Q_PROPERTY(qreal value READ value NOTIFY progressChanged)
44+
45+public:
46+ EasingCurve(QObject *parent = 0);
47+
48+ QEasingCurve::Type type() const;
49+ void setType(const QEasingCurve::Type &type);
50+
51+ qreal period() const;
52+ void setPeriod(qreal period);
53+
54+ qreal progress() const;
55+ void setProgress(qreal progress);
56+
57+ qreal value() const;
58+
59+Q_SIGNALS:
60+ void typeChanged();
61+ void periodChanged();
62+ void progressChanged();
63+
64+private:
65+ QEasingCurve m_easingCurve;
66+ qreal m_progress;
67+ qreal m_value;
68+};
69+
70+#endif
plugins/Utils/mediaartcache.cppdeleted−178
@@ -1,178 +0,0 @@
1−/*
2− * This file is part of the Ubuntu TV Media Scanner
3− * Copyright (C) 2012-2013 Canonical Ltd.
4− *
5− * This program is free software: you can redistribute it and/or modify
6− * it under the terms of the GNU Lesser General Public License version 3 as
7− * published by the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− *
17− * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18− */
19−
20−#include"mediaartcache.h"
21−
22−#include<dirent.h>
23−#include<sys/stat.h>
24−#include<fcntl.h>
25−#include<unistd.h>
26−#include<errno.h>
27−#include<stdio.h>
28−#include<string.h>
29−#include<stdlib.h>
30−#include<assert.h>
31−#include<utime.h>
32−
33−#include<glib.h>
34−
35−#include<vector>
36−#include<algorithm>
37−#include<stdexcept>
38−
39−using namespace std;
40−
41−static string md5(const string &str) {
42− const unsigned char *buf = (const unsigned char *)str.c_str();
43− char *normalized = g_utf8_normalize((const gchar*)buf, str.size(), G_NORMALIZE_ALL);
44− string final;
45− gchar *result;
46−
47− if(normalized) {
48− buf = (const unsigned char*)normalized;
49− }
50− gssize bytes = str.length();
51−
52− result = g_compute_checksum_for_data(G_CHECKSUM_MD5, buf, bytes);
53− final = result;
54− g_free((gpointer)normalized);
55− g_free(result);
56− return final;
57−}
58−
59−MediaArtCache::MediaArtCache() {
60− string xdg_base = g_get_user_cache_dir();
61−
62− if (xdg_base == "") {
63− string s("Could not determine cache dir.");
64− throw runtime_error(s);
65− }
66− int ec = mkdir(xdg_base.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
67− if (ec < 0 && errno != EEXIST) {
68− string s("Could not create base dir.");
69− throw runtime_error(s);
70− }
71− root_dir = xdg_base + "/media-art";
72− ec = mkdir(root_dir.c_str(), S_IRUSR | S_IWUSR | S_IXUSR);
73− if (ec < 0 && errno != EEXIST) {
74− string s("Could not create cache dir.");
75− throw runtime_error(s);
76− }
77−}
78−
79−bool MediaArtCache::has_art(const std::string &artist, const std::string &album) const {
80− string fname = get_art_file(artist, album);
81− return access(fname.c_str(), R_OK) == 0;
82−}
83−
84−void MediaArtCache::add_art(const std::string &artist, const std::string &album,
85− char *data, unsigned int datalen) {
86− string abs_fname = get_full_filename(artist, album);
87− GError *err = nullptr;
88− if(!g_file_set_contents(abs_fname.c_str(), data, datalen, &err)) {
89− string e("Could not write file ");
90− e += abs_fname;
91− e += ": ";
92− e += err->message;
93− g_error_free(err);
94− throw runtime_error(e);
95− }
96−}
97−
98−string MediaArtCache::get_art_file(const std::string &artist, const std::string &album) const {
99− string abs_fname = get_full_filename(artist, album);
100−
101− if (access(abs_fname.c_str(), R_OK) == 0) {
102− utime(abs_fname.c_str(), nullptr); // update access times to current time
103− return abs_fname;
104− }
105− return "";
106−}
107−
108−std::string MediaArtCache::get_full_filename(const std::string &artist, const std::string & album) const {
109− return root_dir + "/" + compute_base_name(artist, album);
110−}
111−
112−
113−std::string MediaArtCache::compute_base_name(const std::string &artist, const std::string &album) const {
114− string type = "album";
115− string h1 = md5(artist);
116− string h2 = md5(album);
117− return type + "-" + h1 + "-" + h2 + ".jpg";
118−}
119−
120−
121−void MediaArtCache::clear() const {
122− DIR *d = opendir(root_dir.c_str());
123− if(!d) {
124− string s = "Something went wrong.";
125− throw runtime_error(s);
126− }
127− struct dirent *entry, *de;
128− entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
129− while(readdir_r(d, entry, &de) == 0 && de) {
130− string basename = entry->d_name;
131− if (basename == "." || basename == "..")
132− continue;
133− string fname = root_dir + "/" + basename;
134− if(remove(fname.c_str()) < 0) {
135− // This is not really an error worth
136− // halting everything for.
137− fprintf(stderr, "Could not delete file %s: %s.\n", fname.c_str(),
138− strerror(errno));
139− }
140− }
141− free(entry);
142− closedir(d);
143−}
144−
145−void MediaArtCache::prune() {
146− vector<pair<double, string>> mtimes;
147− DIR *d = opendir(root_dir.c_str());
148− if(!d) {
149− string s = "Something went wrong.";
150− throw runtime_error(s);
151− }
152− struct dirent *entry, *de;
153− entry = (dirent*)malloc(sizeof(dirent) + NAME_MAX);
154− while(readdir_r(d, entry, &de) == 0 && de) {
155− string basename = entry->d_name;
156− if (basename == "." || basename == "..")
157− continue;
158− string fname = root_dir + "/" + basename;
159− struct stat sbuf;
160− if(stat(fname.c_str(), &sbuf) != 0) {
161− continue;
162− }
163− // Use mtime because atime is not guaranteed to work if, for example
164− // the filesystem is mounted with noatime or relatime.
165− mtimes.push_back(make_pair(sbuf.st_mtim.tv_sec + sbuf.st_mtim.tv_nsec/1000000000.0, fname));
166− }
167− free(entry);
168− closedir(d);
169− if (mtimes.size() <= MAX_SIZE)
170− return;
171− sort(mtimes.begin(), mtimes.end());
172− for(size_t i=0; i < mtimes.size()-MAX_SIZE; i++) {
173− if(remove(mtimes[i].second.c_str()) < 0) {
174− fprintf(stderr, "Could not remove file %s: %s.\n",
175− mtimes[i].second.c_str(), strerror(errno));
176− }
177− }
178−}
plugins/Utils/mediaartcache.hdeleted−54
@@ -1,54 +0,0 @@
1−/*
2− * This file is part of the Ubuntu TV Media Scanner
3− * Copyright (C) 2012-2013 Canonical Ltd.
4− *
5− * This program is free software: you can redistribute it and/or modify
6− * it under the terms of the GNU Lesser General Public License version 3 as
7− * published by the Free Software Foundation.
8− *
9− * This program is distributed in the hope that it will be useful,
10− * but WITHOUT ANY WARRANTY; without even the implied warranty of
11− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12− * GNU Lesser General Public License for more details.
13− *
14− * You should have received a copy of the GNU Lesser General Public License
15− * along with this program. If not, see <http://www.gnu.org/licenses/>.
16− *
17− * Authored by: Jussi Pakkanen <jussi.pakkanen@canonical.com>
18− */
19−
20−#ifndef MEDIAARTCACHE_H
21−#define MEDIAARTCACHE_H
22−
23−#include<string>
24−
25−/*
26− * A class to store thumbnails for files according to
27− * https://wiki.gnome.org/MediaArtStorageSpec
28− *
29− * As this class deals mostly with the filesystem, all
30− * errors are reported with runtime_error exceptions.
31− */
32−
33−
34−class MediaArtCache {
35−private:
36− std::string root_dir;
37−
38− std::string compute_base_name(const std::string &artist, const std::string &album) const;
39− std::string get_full_filename(const std::string &artist, const std::string & album) const;
40−
41−public:
42− static const unsigned int MAX_SIZE = 200;
43−
44− MediaArtCache();
45− bool has_art(const std::string &artist, const std::string &album) const;
46− void add_art(const std::string &artist, const std::string &album,
47− char *data, unsigned int datalen);
48− std::string get_art_file(const std::string &artist, const std::string &album) const;
49− void clear() const;
50− void prune();
51− std::string get_cache_dir() const { return root_dir; }
52−};
53−
54−#endif
plugins/Utils/plugin.cpp+2−14
@@ -26,12 +26,12 @@
26#include "plugin.h"
26#include "plugin.h"
27
27
28// local
28// local
29−#include "albumartprovider.h"
30#include "bottombarvisibilitycommunicatorshell.h"
29#include "bottombarvisibilitycommunicatorshell.h"
31#include "qlimitproxymodelqml.h"
30#include "qlimitproxymodelqml.h"
32#include "qsortfilterproxymodelqml.h"
31#include "qsortfilterproxymodelqml.h"
33#include "timeformatter.h"
32#include "timeformatter.h"
34#include "unitymenumodelpaths.h"
33#include "unitymenumodelpaths.h"
34+#include "easingcurve.h"
35
35
36static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
36static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
37static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
37static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
@@ -46,25 +46,13 @@ void UtilsPlugin::registerTypes(const char *uri)
46 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
46 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
47 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
47 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
48 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
48 qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
49+ qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
49}
50}
50
51
51void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
52void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
52{
53{
53 QQmlExtensionPlugin::initializeEngine(engine, uri);
54 QQmlExtensionPlugin::initializeEngine(engine, uri);
54
55
55− try
56− {
57− engine->addImageProvider(QLatin1String("albumart"), new AlbumArtProvider);
58− }
59− catch (const std::runtime_error &e)
60− {
61− qWarning() << "Failed to register image provider for albumart:" << e.what();
62− }
63− catch (...)
64− {
65− qWarning() << "Failed to register image provider for albumart (unknown error)";
66− }
67−
68 QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
56 QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
69 BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
57 BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
70 QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
58 QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
po/am.po+24−30
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,27 +81,18 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
95+msgstr ""
104−msgstr[1] ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr ""
111msgstr ""
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "መላኪያ"
115msgstr "መላኪያ"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "አስተያየቶች:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr ""
119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "መፈለጊያ"
160msgstr "መፈለጊያ"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "እባክዎን ያስገቡ %1"
165msgstr "እባክዎን ያስገቡ %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "አስተያየቶች:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/ar.po+38−35
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 >= "
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"
18"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
77"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
77"أنت الآن بارع في إيماءات الحواف ويمكنك البدء باستخدام هاتفك<br><br>انقر على "
78"الشاشة للبدء"
78"الشاشة للبدء"
79
79
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
81msgid "Recent searches"
82msgstr "عمليات البحث الأخيرة"
82msgstr "عمليات البحث الأخيرة"
83
83
@@ -85,31 +85,18 @@ msgstr "عمليات البحث الأخيرة"
85msgid "See more"
85msgid "See more"
86msgstr "شاهد المزيد"
86msgstr "شاهد المزيد"
87
87
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
89msgid "See less"
89msgid "See less"
90msgstr "شاهد أقل"
90msgstr "شاهد أقل"
91
91
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
93+msgid "Recent"
94−msgstr "قيّم ذلك"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
94+msgstr ""
101
95
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
103−#: qml/Dash/Previews/Header.qml:105
104#, qt-format
97#, qt-format
105−msgid "%1 review"
98+msgid "%1 Preview"
106−msgid_plural "%1 reviews"
107−msgstr[0] "لا تعليقات (%1)"
108−msgstr[1] "تعليق واحد (%1)"
109−msgstr[2] "تعليقان (%1)"
110−msgstr[3] "%1 تعليقات"
111−msgstr[4] "%1 تعليقا"
112−msgstr[5] "%1 تعليق"
99+msgstr ""
113
100
114#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
115msgid "More..."
102msgid "More..."
@@ -119,22 +106,18 @@ msgstr "المزيد..."
119msgid "Less..."
106msgid "Less..."
120msgstr "أقل..."
107msgstr "أقل..."
121
108
122−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "قيّم ذلك"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123msgid "Add a review"
114msgid "Add a review"
124msgstr "أضف تعليق"
115msgstr "أضف تعليق"
125
116
126−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127msgid "Send"
118msgid "Send"
128msgstr "أرسل"
119msgstr "أرسل"
129
120
130−#: qml/Dash/Previews/Reviews.qml:86
131−msgid "Review"
132−msgstr "التعليق"
133−
134−#: qml/Dash/Previews/Reviews.qml:139
135−msgid "Comments:"
136−msgstr "التعليقات:"
137−
138#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
139msgid "Emergency Call"
122msgid "Emergency Call"
140msgstr "مكالمة طوارئ"
123msgstr "مكالمة طوارئ"
@@ -180,7 +163,27 @@ msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة
180msgid "Search"
163msgid "Search"
181msgstr "ابحث"
164msgstr "ابحث"
182
165
183−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
184#, qt-format
167#, qt-format
185msgid "Please enter %1"
168msgid "Please enter %1"
186msgstr "من فضلك أدخِل %1"
169msgstr "من فضلك أدخِل %1"
170+
171+#~ msgid "Review"
172+#~ msgstr "التعليق"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "التعليقات:"
180+
181+#, qt-format
182+#~ msgid "%1 review"
183+#~ msgid_plural "%1 reviews"
184+#~ msgstr[0] "لا تعليقات (%1)"
185+#~ msgstr[1] "تعليق واحد (%1)"
186+#~ msgstr[2] "تعليقان (%1)"
187+#~ msgstr[3] "%1 تعليقات"
188+#~ msgstr[4] "%1 تعليقا"
189+#~ msgstr[5] "%1 تعليق"
po/ast.po+19−33
@@ -7,16 +7,15 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-03-01 16:51+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16976)\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
@@ -77,7 +76,7 @@ msgstr ""
77"Agora domina los xestos de los bordes y pue principiar a usar el "
76"Agora domina los xestos de los bordes y pue principiar a usar el "
78"teléfonu<br><br>Toque la pantalla pa comenzar"
77"teléfonu<br><br>Toque la pantalla pa comenzar"
79
78
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
80msgid "Recent searches"
82msgstr "Busques recientes"
81msgstr "Busques recientes"
83
82
@@ -85,27 +84,18 @@ msgstr "Busques recientes"
85msgid "See more"
84msgid "See more"
86msgstr "Ver más"
85msgstr "Ver más"
87
86
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
89msgid "See less"
88msgid "See less"
90msgstr "Ver menos"
89msgstr "Ver menos"
91
90
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
92+msgid "Recent"
94−msgstr "Valorar esto"
93+msgstr "Reciente"
95
94
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95+#: qml/Dash/PreviewListView.qml:52
97−#: qml/Dash/Previews/Header.qml:93
98#, qt-format
96#, qt-format
99−msgid "(%1)"
97+msgid "%1 Preview"
100−msgstr "(%1)"
98+msgstr "Vista previa de %1"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 reseña"
108−msgstr[1] "%1 reseñes"
109
99
110#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111msgid "More..."
101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Más…"
115msgid "Less..."
105msgid "Less..."
116msgstr "Menos…"
106msgstr "Menos…"
117
107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Valorar esto"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119msgid "Add a review"
113msgid "Add a review"
120msgstr "Amestar una reseña"
114msgstr "Amestar una reseña"
121
115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123msgid "Send"
117msgid "Send"
124msgstr "Unviar"
118msgstr "Unviar"
125
119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Revisar"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Comentarios:"
133−
134#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
135msgid "Emergency Call"
121msgid "Emergency Call"
136msgstr "Llamada d'emerxencia"
122msgstr "Llamada d'emerxencia"
@@ -176,7 +162,7 @@ msgstr "Escriba'l PIN de la SIM"
176msgid "Search"
162msgid "Search"
177msgstr "Guetar"
163msgstr "Guetar"
178
164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180#, qt-format
166#, qt-format
181msgid "Please enter %1"
167msgid "Please enter %1"
182msgstr "Introduz %1"
168msgstr "Introduz %1"
po/az.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr "Son axtarışlar"
79msgstr "Son axtarışlar"
80
80
@@ -82,27 +82,18 @@ msgstr "Son axtarışlar"
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91−msgstr "Qiymət ver"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
91+msgstr ""
98
92
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
100−#: qml/Dash/Previews/Header.qml:105
101#, qt-format
94#, qt-format
102−msgid "%1 review"
95+msgid "%1 Preview"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rəy"
105−msgstr[1] "%1 rəy"
96+msgstr ""
106
97
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Qiymət ver"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116msgid "Add a review"
111msgid "Add a review"
117msgstr "Rəy yaz"
112msgstr "Rəy yaz"
118
113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120msgid "Send"
115msgid "Send"
121msgstr "Göndər"
116msgstr "Göndər"
122
117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Rəy"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Şərhlər:"
130−
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
132msgid "Emergency Call"
119msgid "Emergency Call"
133msgstr "Zərurət zəngi"
120msgstr "Zərurət zəngi"
@@ -173,7 +160,23 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr "Axtar"
161msgstr "Axtar"
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr "Xahiş edirik daxil edin: %1"
166msgstr "Xahiş edirik daxil edin: %1"
167+
168+#~ msgid "Comments:"
169+#~ msgstr "Şərhlər:"
170+
171+#~ msgid "Review"
172+#~ msgstr "Rəy"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 rəy"
178+#~ msgstr[1] "%1 rəy"
179+
180+#, qt-format
181+#~ msgid "(%1)"
182+#~ msgstr "(%1)"
po/bg.po+20−34
@@ -7,16 +7,15 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-01-28 19:22+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-04-03 06:06+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16967)\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
@@ -80,7 +79,7 @@ msgid ""
80"phone<br><br>Tap on the screen to start"
79"phone<br><br>Tap on the screen to start"
81msgstr ""
80msgstr ""
82
81
83−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
84msgid "Recent searches"
83msgid "Recent searches"
85msgstr "Последни търсения"
84msgstr "Последни търсения"
86
85
@@ -88,27 +87,18 @@ msgstr "Последни търсения"
88msgid "See more"
87msgid "See more"
89msgstr ""
88msgstr ""
90
89
91−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
92msgid "See less"
91msgid "See less"
93msgstr ""
92msgstr ""
94
93
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94+#: qml/Dash/DashApps.qml:38
96−msgid "Rate this"
97−msgstr "Оценете това"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
95+msgid "Recent"
103−msgstr "(%1)"
96+msgstr "Последни"
104
97
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
98+#: qml/Dash/PreviewListView.qml:52
106−#: qml/Dash/Previews/Header.qml:105
107#, qt-format
99#, qt-format
108−msgid "%1 review"
100+msgid "%1 Preview"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 отзив"
111−msgstr[1] "%1 отзива"
101+msgstr ""
112
102
113#: qml/Dash/Previews/PreviewActionCombo.qml:34
103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114msgid "More..."
104msgid "More..."
@@ -116,24 +106,20 @@ msgstr ""
116
106
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118msgid "Less..."
108msgid "Less..."
119−msgstr ""
109+msgstr "По-малко..."
120
110
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оценете това"
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122msgid "Add a review"
116msgid "Add a review"
123msgstr "Добави отзив"
117msgstr "Добави отзив"
124
118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126msgid "Send"
120msgid "Send"
127msgstr "Изпрати"
121msgstr "Изпрати"
128
122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзив"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Коментари:"
136−
137#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
138msgid "Emergency Call"
124msgid "Emergency Call"
139msgstr "Спешно повикване"
125msgstr "Спешно повикване"
@@ -179,7 +165,7 @@ msgstr ""
179msgid "Search"
165msgid "Search"
180msgstr "Търсене"
166msgstr "Търсене"
181
167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183#, qt-format
169#, qt-format
184msgid "Please enter %1"
170msgid "Please enter %1"
185msgstr "Моля, въведете %1"
171msgstr "Моля, въведете %1"
po/bs.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr ""
79msgstr ""
80
80
@@ -82,28 +82,19 @@ msgstr ""
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91msgstr ""
91msgstr ""
92
92
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
94−#: qml/Dash/Previews/Header.qml:93
95#, qt-format
94#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
97msgstr ""
96msgstr ""
98
97
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
109msgstr ""
100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
116−msgid "Add a review"
107+msgid "Rate this"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
121msgstr ""
108msgstr ""
122
109
123−#: qml/Dash/Previews/Reviews.qml:86
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124−msgid "Review"
111+msgid "Add a review"
125msgstr ""
112msgstr ""
126
113
127−#: qml/Dash/Previews/Reviews.qml:139
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128−msgid "Comments:"
115+msgid "Send"
129msgstr ""
116msgstr ""
130
117
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr ""
161msgstr ""
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
po/ca.po+33−30
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -79,7 +79,7 @@ msgid ""
79"phone<br><br>Tap on the screen to start"
79"phone<br><br>Tap on the screen to start"
80msgstr ""
80msgstr ""
81
81
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
83msgid "Recent searches"
83msgid "Recent searches"
84msgstr "Cerques recents"
84msgstr "Cerques recents"
85
85
@@ -87,27 +87,18 @@ msgstr "Cerques recents"
87msgid "See more"
87msgid "See more"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
91msgid "See less"
91msgid "See less"
92msgstr ""
92msgstr ""
93
93
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94+#: qml/Dash/DashApps.qml:38
95−msgid "Rate this"
95+msgid "Recent"
96msgstr ""
96msgstr ""
97
97
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:93
100−#, qt-format
101−msgid "(%1)"
102−msgstr "(%1)"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
106#, qt-format
99#, qt-format
107−msgid "%1 review"
100+msgid "%1 Preview"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 ressenya"
110−msgstr[1] "%1 ressenyes"
101+msgstr ""
111
102
112#: qml/Dash/Previews/PreviewActionCombo.qml:34
103#: qml/Dash/Previews/PreviewActionCombo.qml:34
113msgid "More..."
104msgid "More..."
@@ -117,22 +108,18 @@ msgstr ""
117msgid "Less..."
108msgid "Less..."
118msgstr ""
109msgstr ""
119
110
120−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr ""
114+
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
121msgid "Add a review"
116msgid "Add a review"
122msgstr "Afegiu una ressenya"
117msgstr "Afegiu una ressenya"
123
118
124−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
125msgid "Send"
120msgid "Send"
126msgstr "Envia"
121msgstr "Envia"
127
122
128−#: qml/Dash/Previews/Reviews.qml:86
129−msgid "Review"
130−msgstr "Ressenya"
131−
132−#: qml/Dash/Previews/Reviews.qml:139
133−msgid "Comments:"
134−msgstr "Comentaris:"
135−
136#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
137msgid "Emergency Call"
124msgid "Emergency Call"
138msgstr "Trucada d'emergència"
125msgstr "Trucada d'emergència"
@@ -178,7 +165,23 @@ msgstr ""
178msgid "Search"
165msgid "Search"
179msgstr "Cerca"
166msgstr "Cerca"
180
167
181−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
182#, qt-format
169#, qt-format
183msgid "Please enter %1"
170msgid "Please enter %1"
184msgstr "Introduïu %1"
171msgstr "Introduïu %1"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Comentaris:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Ressenya"
182+
183+#, qt-format
184+#~ msgid "%1 review"
185+#~ msgid_plural "%1 reviews"
186+#~ msgstr[0] "%1 ressenya"
187+#~ msgstr[1] "%1 ressenyes"
po/ckb.po+34−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "دوایین گەڕانەکان"
78msgstr "دوایین گەڕانەکان"
79
79
@@ -81,27 +81,18 @@ msgstr "دوایین گەڕانەکان"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "پلە دابنی بۆی"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
95+msgstr ""
103−msgstr[0] "%1 پێداچوونەوە"
104−msgstr[1] "%1 پێداچوونەوەکان"
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "پلە دابنی بۆی"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "پێداچوونەوە زۆر بکە"
111msgstr "پێداچوونەوە زۆر بکە"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "ناردن"
115msgstr "ناردن"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "پێداچوونەوە"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "لێدوانەکان:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "هێڵی فریاگوزاری"
119msgstr "هێڵی فریاگوزاری"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "گەڕان"
160msgstr "گەڕان"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "تکایە %1 بنووسە"
165msgstr "تکایە %1 بنووسە"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "لێدوانەکان:"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 پێداچوونەوە"
178+#~ msgstr[1] "%1 پێداچوونەوەکان"
179+
180+#~ msgid "Review"
181+#~ msgstr "پێداچوونەوە"
po/cs.po+35−32
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Poslední vyhledávání"
78msgstr "Poslední vyhledávání"
79
79
@@ -81,28 +81,18 @@ msgstr "Poslední vyhledávání"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "Ohodnoťte to"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recenze"
104−msgstr[1] "%1 recenze"
95+msgstr ""
105−msgstr[2] "%1 recenzí"
106
96
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
98msgid "More..."
@@ -112,22 +102,18 @@ msgstr ""
112msgid "Less..."
102msgid "Less..."
113msgstr ""
103msgstr ""
114
104
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Ohodnoťte to"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116msgid "Add a review"
110msgid "Add a review"
117msgstr "Přidat recenzi"
111msgstr "Přidat recenzi"
118
112
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120msgid "Send"
114msgid "Send"
121msgstr "Odeslat"
115msgstr "Odeslat"
122
116
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Recenze"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Komentáře:"
130−
131#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
132msgid "Emergency Call"
118msgid "Emergency Call"
133msgstr "Tísňové volání"
119msgstr "Tísňové volání"
@@ -173,7 +159,24 @@ msgstr ""
173msgid "Search"
159msgid "Search"
174msgstr "Hledat"
160msgstr "Hledat"
175
161
176−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
177#, qt-format
163#, qt-format
178msgid "Please enter %1"
164msgid "Please enter %1"
179msgstr "Zadejte prosím %1"
165msgstr "Zadejte prosím %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Komentáře:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#~ msgid "Review"
175+#~ msgstr "Recenze"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 recenze"
181+#~ msgstr[1] "%1 recenze"
182+#~ msgstr[2] "%1 recenzí"
po/da.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/de.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
75"phone<br><br>Tap on the screen to start"
75"phone<br><br>Tap on the screen to start"
76msgstr ""
76msgstr ""
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "Letzte Suchbegriffe"
80msgstr "Letzte Suchbegriffe"
81
81
@@ -83,27 +83,18 @@ msgstr "Letzte Suchbegriffe"
83msgid "See more"
83msgid "See more"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
91+msgid "Recent"
92−msgstr "Bewerten"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 Bewertung"
106−msgstr[1] "%1 Bewertungen"
97+msgstr ""
107
98
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113msgid "Less..."
104msgid "Less..."
114msgstr ""
105msgstr ""
115
106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Bewerten"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
112msgid "Add a review"
118msgstr "Bewertung hinzufügen"
113msgstr "Bewertung hinzufügen"
119
114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
116msgid "Send"
122msgstr "Senden"
117msgstr "Senden"
123
118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Bewertung"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentare:"
131−
132#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
120msgid "Emergency Call"
134msgstr "Notruf"
121msgstr "Notruf"
@@ -174,7 +161,23 @@ msgstr ""
174msgid "Search"
161msgid "Search"
175msgstr "Suchen"
162msgstr "Suchen"
176
163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178#, qt-format
165#, qt-format
179msgid "Please enter %1"
166msgid "Please enter %1"
180msgstr "Bitte geben Sie %1 ein"
167msgstr "Bitte geben Sie %1 ein"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Kommentare:"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#~ msgid "Review"
177+#~ msgstr "Bewertung"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 Bewertung"
183+#~ msgstr[1] "%1 Bewertungen"
po/el.po+34−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
77"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
77"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
78"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
78"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
79
79
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
81msgid "Recent searches"
82msgstr "Πρόσφατες αναζητήσεις"
82msgstr "Πρόσφατες αναζητήσεις"
83
83
@@ -85,27 +85,18 @@ msgstr "Πρόσφατες αναζητήσεις"
85msgid "See more"
85msgid "See more"
86msgstr "Περρισότερα"
86msgstr "Περρισότερα"
87
87
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
89msgid "See less"
89msgid "See less"
90msgstr "Λιγότερα"
90msgstr "Λιγότερα"
91
91
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
93+msgid "Recent"
94−msgstr "Βαθμολογήστε το"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
94+msgstr ""
101
95
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
103−#: qml/Dash/Previews/Header.qml:105
104#, qt-format
97#, qt-format
105−msgid "%1 review"
98+msgid "%1 Preview"
106−msgid_plural "%1 reviews"
99+msgstr ""
107−msgstr[0] "%1 αξιολόγηση"
108−msgstr[1] "%1 αξιολογήσεις"
109
100
110#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
111msgid "More..."
102msgid "More..."
@@ -115,22 +106,18 @@ msgstr ""
115msgid "Less..."
106msgid "Less..."
116msgstr ""
107msgstr ""
117
108
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Βαθμολογήστε το"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119msgid "Add a review"
114msgid "Add a review"
120msgstr "Προσθέστε την αξιολόγησή σας"
115msgstr "Προσθέστε την αξιολόγησή σας"
121
116
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123msgid "Send"
118msgid "Send"
124msgstr "Αποστολή"
119msgstr "Αποστολή"
125
120
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Αξιολόγηση"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Σχόλια:"
133−
134#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
135msgid "Emergency Call"
122msgid "Emergency Call"
136msgstr "Κλήση έκτακτης ανάγκης"
123msgstr "Κλήση έκτακτης ανάγκης"
@@ -176,7 +163,23 @@ msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
176msgid "Search"
163msgid "Search"
177msgstr "Αναζήτηση"
164msgstr "Αναζήτηση"
178
165
179−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
180#, qt-format
167#, qt-format
181msgid "Please enter %1"
168msgid "Please enter %1"
182msgstr "Πληκτρολογήστε %1"
169msgstr "Πληκτρολογήστε %1"
170+
171+#, qt-format
172+#~ msgid "%1 review"
173+#~ msgid_plural "%1 reviews"
174+#~ msgstr[0] "%1 αξιολόγηση"
175+#~ msgstr[1] "%1 αξιολογήσεις"
176+
177+#, qt-format
178+#~ msgid "(%1)"
179+#~ msgstr "(%1)"
180+
181+#~ msgid "Comments:"
182+#~ msgstr "Σχόλια:"
183+
184+#~ msgid "Review"
185+#~ msgstr "Αξιολόγηση"
po/en_AU.po+34−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Recent searches"
78msgstr "Recent searches"
79
79
@@ -81,27 +81,18 @@ msgstr "Recent searches"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "Rate this"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 review"
104−msgstr[1] "%1 reviews"
95+msgstr ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Rate this"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "Add a review"
111msgstr "Add a review"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "Send"
115msgstr "Send"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Review"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Comments:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "Emergency Call"
119msgstr "Emergency Call"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Search"
160msgstr "Search"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "Please enter %1"
165msgstr "Please enter %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Comments:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Review"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 review"
177+#~ msgstr[1] "%1 reviews"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/en_GB.po+34−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgstr ""
75"You have now mastered the edge gestures and can start using the "
75"You have now mastered the edge gestures and can start using the "
76"phone<br><br>Tap on the screen to start"
76"phone<br><br>Tap on the screen to start"
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "Recent searches"
80msgstr "Recent searches"
81
81
@@ -83,27 +83,18 @@ msgstr "Recent searches"
83msgid "See more"
83msgid "See more"
84msgstr "See more"
84msgstr "See more"
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr "See less"
88msgstr "See less"
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
91+msgid "Recent"
92−msgstr "Rate this"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 review"
106−msgstr[1] "%1 reviews"
97+msgstr ""
107
98
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
100msgid "More..."
@@ -113,22 +104,18 @@ msgstr "More..."
113msgid "Less..."
104msgid "Less..."
114msgstr "Less..."
105msgstr "Less..."
115
106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Rate this"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
112msgid "Add a review"
118msgstr "Add a review"
113msgstr "Add a review"
119
114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
116msgid "Send"
122msgstr "Send"
117msgstr "Send"
123
118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Review"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comments:"
131−
132#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
120msgid "Emergency Call"
134msgstr "Emergency Call"
121msgstr "Emergency Call"
@@ -174,7 +161,23 @@ msgstr "Please enter SIM PIN"
174msgid "Search"
161msgid "Search"
175msgstr "Search"
162msgstr "Search"
176
163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178#, qt-format
165#, qt-format
179msgid "Please enter %1"
166msgid "Please enter %1"
180msgstr "Please enter %1"
167msgstr "Please enter %1"
168+
169+#~ msgid "Comments:"
170+#~ msgstr "Comments:"
171+
172+#~ msgid "Review"
173+#~ msgstr "Review"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "%1 review"
179+#~ msgstr[1] "%1 reviews"
180+
181+#, qt-format
182+#~ msgid "(%1)"
183+#~ msgstr "(%1)"
po/eo.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/es.po+19−33
@@ -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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-02-20 05:43+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-03-29 07:34+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16967)\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
@@ -78,7 +77,7 @@ msgstr ""
78"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
77"Ahora domina los gestos de los bordes y puede usar el teléfono<br><br>Toque "
79"la pantalla para comenzar"
78"la pantalla para comenzar"
80
79
81−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
82msgid "Recent searches"
81msgid "Recent searches"
83msgstr "Búsquedas recientes"
82msgstr "Búsquedas recientes"
84
83
@@ -86,27 +85,18 @@ msgstr "Búsquedas recientes"
86msgid "See more"
85msgid "See more"
87msgstr "Ver más"
86msgstr "Ver más"
88
87
89−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
90msgid "See less"
89msgid "See less"
91msgstr "Ver menos"
90msgstr "Ver menos"
92
91
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
94−msgid "Rate this"
93+msgid "Recent"
95−msgstr "Valorar esto"
94+msgstr "Recientes"
96
95
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
98−#: qml/Dash/Previews/Header.qml:93
99#, qt-format
97#, qt-format
100−msgid "(%1)"
98+msgid "%1 Preview"
101−msgstr "(%1)"
99+msgstr "Previsualización de %1"
102−
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
104−#: qml/Dash/Previews/Header.qml:105
105−#, qt-format
106−msgid "%1 review"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 reseña"
109−msgstr[1] "%1 reseñas"
110
100
111#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112msgid "More..."
102msgid "More..."
@@ -116,22 +106,18 @@ msgstr "Más…"
116msgid "Less..."
106msgid "Less..."
117msgstr "Menos…"
107msgstr "Menos…"
118
108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Valorar esto"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120msgid "Add a review"
114msgid "Add a review"
121msgstr "Añadir una reseña"
115msgstr "Añadir una reseña"
122
116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124msgid "Send"
118msgid "Send"
125msgstr "Enviar"
119msgstr "Enviar"
126
120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Reseñar"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Comentarios:"
134−
135#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
136msgid "Emergency Call"
122msgid "Emergency Call"
137msgstr "Llamada de emergencia"
123msgstr "Llamada de emergencia"
@@ -177,7 +163,7 @@ msgstr "Escriba el PIN de la SIM"
177msgid "Search"
163msgid "Search"
178msgstr "Buscar"
164msgstr "Buscar"
179
165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181#, qt-format
167#, qt-format
182msgid "Please enter %1"
168msgid "Please enter %1"
183msgstr "Introduzca %1"
169msgstr "Introduzca %1"
po/eu.po+20−34
@@ -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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-03-16 17:40+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-17 05:13+0000\n"
17+"X-Launchpad-Export-Date: 2014-03-31 06:44+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16967)\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
@@ -77,7 +76,7 @@ msgstr ""
77"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
76"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
78"zaitezke<br><br>Ukitu pantaila hasteko"
77"zaitezke<br><br>Ukitu pantaila hasteko"
79
78
80−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
80msgid "Recent searches"
82msgstr "Azken bilaketak"
81msgstr "Azken bilaketak"
83
82
@@ -85,27 +84,18 @@ msgstr "Azken bilaketak"
85msgid "See more"
84msgid "See more"
86msgstr "Ikusi gehiago"
85msgstr "Ikusi gehiago"
87
86
88−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
89msgid "See less"
88msgid "See less"
90msgstr "Ikusi gutxiago"
89msgstr "Ikusi gutxiago"
91
90
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
92+msgid "Recent"
94−msgstr "Puntuatu hau"
93+msgstr "Azkenak"
95
94
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95+#: qml/Dash/PreviewListView.qml:52
97−#: qml/Dash/Previews/Header.qml:93
98#, qt-format
96#, qt-format
99−msgid "(%1)"
97+msgid "%1 Preview"
100−msgstr "(%1)"
98+msgstr "%1 aurrebista"
101−
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
103−#: qml/Dash/Previews/Header.qml:105
104−#, qt-format
105−msgid "%1 review"
106−msgid_plural "%1 reviews"
107−msgstr[0] "berrikuspen %1"
108−msgstr[1] "%1 berrikuspen"
109
99
110#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111msgid "More..."
101msgid "More..."
@@ -115,22 +105,18 @@ msgstr "Gehiago..."
115msgid "Less..."
105msgid "Less..."
116msgstr "Gutxiago..."
106msgstr "Gutxiago..."
117
107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Puntuatu hau"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119msgid "Add a review"
113msgid "Add a review"
120−msgstr "Gehitu berrikuspena"
114+msgstr "Gehitu kritika"
121
115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123msgid "Send"
117msgid "Send"
124msgstr "Bidali"
118msgstr "Bidali"
125
119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Berrikusi"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Iruzkinak:"
133−
134#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
135msgid "Emergency Call"
121msgid "Emergency Call"
136msgstr "Larrialdi-deia"
122msgstr "Larrialdi-deia"
@@ -176,7 +162,7 @@ msgstr "Sartu SIMaren PINa"
176msgid "Search"
162msgid "Search"
177msgstr "Bilatu"
163msgstr "Bilatu"
178
164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180#, qt-format
166#, qt-format
181msgid "Please enter %1"
167msgid "Please enter %1"
182msgstr "Sartu %1"
168msgstr "Sartu %1"
po/fa.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/fi.po+19−33
@@ -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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-03-09 19:22+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-04-08 07:13+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16976)\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
@@ -75,7 +74,7 @@ msgstr ""
75"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
74"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
76"käytön<br><br>Napauta näyttöä aloittaaksesi"
75"käytön<br><br>Napauta näyttöä aloittaaksesi"
77
76
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
78msgid "Recent searches"
80msgstr "Viimeisimmät haut"
79msgstr "Viimeisimmät haut"
81
80
@@ -83,27 +82,18 @@ msgstr "Viimeisimmät haut"
83msgid "See more"
82msgid "See more"
84msgstr "Näytä lisää"
83msgstr "Näytä lisää"
85
84
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
87msgid "See less"
86msgid "See less"
88msgstr "Näytä vähemmän"
87msgstr "Näytä vähemmän"
89
88
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
90+msgid "Recent"
92−msgstr "Arvioi tämä"
91+msgstr "Viimeisimmät"
93
92
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
95−#: qml/Dash/Previews/Header.qml:93
96#, qt-format
94#, qt-format
97−msgid "(%1)"
95+msgid "%1 Preview"
98−msgstr "(%1)"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 arvostelu"
96+msgstr "%1 esikatselu"
106−msgstr[1] "%1 arvostelua"
107
97
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
99msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Lisää..."
113msgid "Less..."
103msgid "Less..."
114msgstr "Vähemmän..."
104msgstr "Vähemmän..."
115
105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Arvioi tämä"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
111msgid "Add a review"
118msgstr "Lisää arvostelu"
112msgstr "Lisää arvostelu"
119
113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
115msgid "Send"
122msgstr "Lähetä"
116msgstr "Lähetä"
123
117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Arvostelu"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Kommentit:"
131−
132#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
119msgid "Emergency Call"
134msgstr "Hätäpuhelu"
120msgstr "Hätäpuhelu"
@@ -174,7 +160,7 @@ msgstr "Anna SIM-kortin PIN-koodi"
174msgid "Search"
160msgid "Search"
175msgstr "Hae"
161msgstr "Hae"
176
162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178#, qt-format
164#, qt-format
179msgid "Please enter %1"
165msgid "Please enter %1"
180msgstr "Kirjoita %1"
166msgstr "Kirjoita %1"
po/fo.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Leita"
160msgstr "Leita"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/fr.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11"PO-Revision-Date: 2014-01-28 00:34+0000\n"
11"PO-Revision-Date: 2014-01-28 00:34+0000\n"
12"Last-Translator: Pierre <Unknown>\n"
12"Last-Translator: Pierre <Unknown>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Recherches récentes"
78msgstr "Recherches récentes"
79
79
@@ -81,27 +81,18 @@ msgstr "Recherches récentes"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "Evaluez ceci"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 avis"
104−msgstr[1] "%1 avis"
95+msgstr ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Evaluez ceci"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "Ajouter un avis"
111msgstr "Ajouter un avis"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "Envoyer"
115msgstr "Envoyer"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Avis"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Commentaires :"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "Appel d'urgence"
119msgstr "Appel d'urgence"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Rechercher"
160msgstr "Rechercher"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "Veuillez saisir %1"
165msgstr "Veuillez saisir %1"
166+
167+#~ msgid "Review"
168+#~ msgstr "Avis"
169+
170+#, qt-format
171+#~ msgid "%1 review"
172+#~ msgid_plural "%1 reviews"
173+#~ msgstr[0] "%1 avis"
174+#~ msgstr[1] "%1 avis"
175+
176+#~ msgid "Comments:"
177+#~ msgstr "Commentaires :"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/gd.po+36−33
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 : "
17"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
18"(n > 2 && n < 20) ? 2 : 3;\n"
18"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,7 +80,7 @@ msgid ""
80"phone<br><br>Tap on the screen to start"
80"phone<br><br>Tap on the screen to start"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:340
83+#: qml/Components/PageHeader.qml:365
84msgid "Recent searches"
84msgid "Recent searches"
85msgstr "Na lorg thu o chionn goirid"
85msgstr "Na lorg thu o chionn goirid"
86
86
@@ -88,29 +88,18 @@ msgstr "Na lorg thu o chionn goirid"
88msgid "See more"
88msgid "See more"
89msgstr ""
89msgstr ""
90
90
91−#: qml/Components/SeeMore.qml:57
91+#: qml/Components/SeeMore.qml:58
92msgid "See less"
92msgid "See less"
93msgstr ""
93msgstr ""
94
94
95−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
95+#: qml/Dash/DashApps.qml:38
96−msgid "Rate this"
96+msgid "Recent"
97−msgstr "Rangaich seo"
98−
99−#. TRANSLATORS: Number of persons who rated this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:93
101−#, qt-format
102−msgid "(%1)"
103−msgstr "(%1)"
97+msgstr ""
104
98
105−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99+#: qml/Dash/PreviewListView.qml:52
106−#: qml/Dash/Previews/Header.qml:105
107#, qt-format
100#, qt-format
108−msgid "%1 review"
101+msgid "%1 Preview"
109−msgid_plural "%1 reviews"
110−msgstr[0] "%1 lèirmheas"
111−msgstr[1] "%1 lèirmheas"
112−msgstr[2] "%1 lèirmheasan"
102+msgstr ""
113−msgstr[3] "%1 lèirmheas"
114
103
115#: qml/Dash/Previews/PreviewActionCombo.qml:34
104#: qml/Dash/Previews/PreviewActionCombo.qml:34
116msgid "More..."
105msgid "More..."
@@ -120,22 +109,18 @@ msgstr ""
120msgid "Less..."
109msgid "Less..."
121msgstr ""
110msgstr ""
122
111
123−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
112+#: qml/Dash/Previews/PreviewRatingInput.qml:81
113+msgid "Rate this"
114+msgstr "Rangaich seo"
115+
116+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124msgid "Add a review"
117msgid "Add a review"
125msgstr "Cuir lèirmheas ris"
118msgstr "Cuir lèirmheas ris"
126
119
127−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128msgid "Send"
121msgid "Send"
129msgstr "Cuir"
122msgstr "Cuir"
130
123
131−#: qml/Dash/Previews/Reviews.qml:86
132−msgid "Review"
133−msgstr "Lèirmheas"
134−
135−#: qml/Dash/Previews/Reviews.qml:139
136−msgid "Comments:"
137−msgstr "Beachdan"
138−
139#: qml/Greeter/Lockscreen.qml:149
124#: qml/Greeter/Lockscreen.qml:149
140msgid "Emergency Call"
125msgid "Emergency Call"
141msgstr "Gairm èiginn"
126msgstr "Gairm èiginn"
@@ -181,7 +166,25 @@ msgstr ""
181msgid "Search"
166msgid "Search"
182msgstr "Lorg"
167msgstr "Lorg"
183
168
184−#: qml/Shell.qml:440
169+#: qml/Shell.qml:417
185#, qt-format
170#, qt-format
186msgid "Please enter %1"
171msgid "Please enter %1"
187msgstr "Cuir a-steach %1"
172msgstr "Cuir a-steach %1"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
177+
178+#~ msgid "Comments:"
179+#~ msgstr "Beachdan"
180+
181+#~ msgid "Review"
182+#~ msgstr "Lèirmheas"
183+
184+#, qt-format
185+#~ msgid "%1 review"
186+#~ msgid_plural "%1 reviews"
187+#~ msgstr[0] "%1 lèirmheas"
188+#~ msgstr[1] "%1 lèirmheas"
189+#~ msgstr[2] "%1 lèirmheasan"
190+#~ msgstr[3] "%1 lèirmheas"
po/gl.po+19−33
@@ -7,16 +7,15 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-03-08 06:58+0000\n"
11+"PO-Revision-Date: 2014-04-08 07:04+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−"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-04-09 07:31+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16976)\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
@@ -75,7 +74,7 @@ msgstr ""
75"Agora xa domina os xestos do bordo e pode comezar a usar o "
74"Agora xa domina os xestos do bordo e pode comezar a usar o "
76"teléfono<br><br>Toque na pantalla para comezar"
75"teléfono<br><br>Toque na pantalla para comezar"
77
76
78−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
78msgid "Recent searches"
80msgstr "Buscas recentes"
79msgstr "Buscas recentes"
81
80
@@ -83,27 +82,18 @@ msgstr "Buscas recentes"
83msgid "See more"
82msgid "See more"
84msgstr "Ver máis"
83msgstr "Ver máis"
85
84
86−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
87msgid "See less"
86msgid "See less"
88msgstr "Ver menos"
87msgstr "Ver menos"
89
88
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
90+msgid "Recent"
92−msgstr "Valore isto"
91+msgstr "Recentes"
93
92
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
95−#: qml/Dash/Previews/Header.qml:93
96#, qt-format
94#, qt-format
97−msgid "(%1)"
95+msgid "%1 Preview"
98−msgstr "(%1)"
96+msgstr "%1 previsualización"
99−
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101−#: qml/Dash/Previews/Header.qml:105
102−#, qt-format
103−msgid "%1 review"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 opinión"
106−msgstr[1] "%1 opinións"
107
97
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
99msgid "More..."
@@ -113,22 +103,18 @@ msgstr "Máis…"
113msgid "Less..."
103msgid "Less..."
114msgstr "Menos..."
104msgstr "Menos..."
115
105
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Valore isto"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
111msgid "Add a review"
118msgstr "Engadir unha opinión"
112msgstr "Engadir unha opinión"
119
113
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
115msgid "Send"
122msgstr "Enviar"
116msgstr "Enviar"
123
117
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Opinión"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentarios:"
131−
132#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
119msgid "Emergency Call"
134msgstr "Chamada de emerxencia"
120msgstr "Chamada de emerxencia"
@@ -174,7 +160,7 @@ msgstr "Introduza o PIN da SIM"
174msgid "Search"
160msgid "Search"
175msgstr "Buscar"
161msgstr "Buscar"
176
162
177−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
178#, qt-format
164#, qt-format
179msgid "Please enter %1"
165msgid "Please enter %1"
180msgstr "Introduza %1"
166msgstr "Introduza %1"
po/he.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "חיפושים אחרונים"
78msgstr "חיפושים אחרונים"
79
79
@@ -81,27 +81,18 @@ msgstr "חיפושים אחרונים"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "דירוג היישום"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "סקירה %1"
104−msgstr[1] "%1 סקירות"
95+msgstr ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "דירוג היישום"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "הוספת סקירה"
111msgstr "הוספת סקירה"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "שליחה"
115msgstr "שליחה"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "סקירה"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "הערות:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "שיחת חירום"
119msgstr "שיחת חירום"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "חיפוש"
160msgstr "חיפוש"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "נא להזין %1"
165msgstr "נא להזין %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "הערות:"
173+
174+#~ msgid "Review"
175+#~ msgstr "סקירה"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "סקירה %1"
181+#~ msgstr[1] "%1 סקירות"
po/hi.po+19−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "पिछले खोजों"
78msgstr "पिछले खोजों"
79
79
@@ -81,28 +81,19 @@ msgstr "पिछले खोजों"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "समीक्षा दे"
111msgstr "समीक्षा दे"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "भेजें"
115msgstr "भेजें"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "समीक्षा"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr ""
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "आपातकालीन कॉल"
119msgstr "आपातकालीन कॉल"
@@ -172,7 +159,10 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "खोजें"
160msgstr "खोजें"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
166+
167+#~ msgid "Review"
168+#~ msgstr "समीक्षा"
po/hr.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr "Nedavne pretrage"
79msgstr "Nedavne pretrage"
80
80
@@ -82,28 +82,19 @@ msgstr "Nedavne pretrage"
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91msgstr ""
91msgstr ""
92
92
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
94−#: qml/Dash/Previews/Header.qml:93
95#, qt-format
94#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
97msgstr ""
96msgstr ""
98
97
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
109msgstr ""
100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
116−msgid "Add a review"
107+msgid "Rate this"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
121msgstr ""
108msgstr ""
122
109
123−#: qml/Dash/Previews/Reviews.qml:86
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124−msgid "Review"
111+msgid "Add a review"
125msgstr ""
112msgstr ""
126
113
127−#: qml/Dash/Previews/Reviews.qml:139
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128−msgid "Comments:"
115+msgid "Send"
129msgstr ""
116msgstr ""
130
117
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr "Pretraživanje"
161msgstr "Pretraživanje"
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
po/hu.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
75"phone<br><br>Tap on the screen to start"
75"phone<br><br>Tap on the screen to start"
76msgstr ""
76msgstr ""
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "Legutóbbi keresések"
80msgstr "Legutóbbi keresések"
81
81
@@ -83,27 +83,18 @@ msgstr "Legutóbbi keresések"
83msgid "See more"
83msgid "See more"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
91+msgid "Recent"
92−msgstr "Osztályzás"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 értékelés"
106−msgstr[1] "%1 értékelés"
97+msgstr ""
107
98
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113msgid "Less..."
104msgid "Less..."
114msgstr ""
105msgstr ""
115
106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Osztályzás"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
112msgid "Add a review"
118msgstr "Értékelés hozzáadása"
113msgstr "Értékelés hozzáadása"
119
114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
116msgid "Send"
122msgstr "Küldés"
117msgstr "Küldés"
123
118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Értékelés"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Hozzászólások:"
131−
132#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
120msgid "Emergency Call"
134msgstr "Vészhívás"
121msgstr "Vészhívás"
@@ -174,7 +161,23 @@ msgstr ""
174msgid "Search"
161msgid "Search"
175msgstr "Keresés"
162msgstr "Keresés"
176
163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178#, qt-format
165#, qt-format
179msgid "Please enter %1"
166msgid "Please enter %1"
180msgstr "Adja meg a következőt: %1"
167msgstr "Adja meg a következőt: %1"
168+
169+#, qt-format
170+#~ msgid "%1 review"
171+#~ msgid_plural "%1 reviews"
172+#~ msgstr[0] "%1 értékelés"
173+#~ msgstr[1] "%1 értékelés"
174+
175+#, qt-format
176+#~ msgid "(%1)"
177+#~ msgstr "(%1)"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Hozzászólások:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Értékelés"
po/hy.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Վերջին որոնումներ"
78msgstr "Վերջին որոնումներ"
79
79
@@ -81,28 +81,19 @@ msgstr "Վերջին որոնումներ"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Որոնում"
160msgstr "Որոնում"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/id.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/is.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr "Nýlegar leitir"
79msgstr "Nýlegar leitir"
80
80
@@ -82,27 +82,18 @@ msgstr "Nýlegar leitir"
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91−msgstr "Gefa þessu einkunn"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
91+msgstr ""
98
92
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
100−#: qml/Dash/Previews/Header.qml:105
101#, qt-format
94#, qt-format
102−msgid "%1 review"
95+msgid "%1 Preview"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 ummæli"
105−msgstr[1] "%1 ummæli"
96+msgstr ""
106
97
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Gefa þessu einkunn"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116msgid "Add a review"
111msgid "Add a review"
117msgstr "Gefa umsögn"
112msgstr "Gefa umsögn"
118
113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120msgid "Send"
115msgid "Send"
121msgstr "Senda"
116msgstr "Senda"
122
117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "Umsögn"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "Athugasemdir:"
130−
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
132msgid "Emergency Call"
119msgid "Emergency Call"
133msgstr "Neyðarsímtal"
120msgstr "Neyðarsímtal"
@@ -173,7 +160,23 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr "Leita"
161msgstr "Leita"
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
167+
168+#, qt-format
169+#~ msgid "(%1)"
170+#~ msgstr "(%1)"
171+
172+#~ msgid "Comments:"
173+#~ msgstr "Athugasemdir:"
174+
175+#~ msgid "Review"
176+#~ msgstr "Umsögn"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ummæli"
182+#~ msgstr[1] "%1 ummæli"
po/it.po+34−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgid ""
78"phone<br><br>Tap on the screen to start"
78"phone<br><br>Tap on the screen to start"
79msgstr ""
79msgstr ""
80
80
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
82msgid "Recent searches"
82msgid "Recent searches"
83msgstr "Ricerche recenti"
83msgstr "Ricerche recenti"
84
84
@@ -86,27 +86,18 @@ msgstr "Ricerche recenti"
86msgid "See more"
86msgid "See more"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
90msgid "See less"
90msgid "See less"
91msgstr ""
91msgstr ""
92
92
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93+#: qml/Dash/DashApps.qml:38
94−msgid "Rate this"
94+msgid "Recent"
95−msgstr "Valuta"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
95+msgstr ""
102
96
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
97+#: qml/Dash/PreviewListView.qml:52
104−#: qml/Dash/Previews/Header.qml:105
105#, qt-format
98#, qt-format
106−msgid "%1 review"
99+msgid "%1 Preview"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 recensione"
109−msgstr[1] "%1 recensioni"
100+msgstr ""
110
101
111#: qml/Dash/Previews/PreviewActionCombo.qml:34
102#: qml/Dash/Previews/PreviewActionCombo.qml:34
112msgid "More..."
103msgid "More..."
@@ -116,22 +107,18 @@ msgstr ""
116msgid "Less..."
107msgid "Less..."
117msgstr ""
108msgstr ""
118
109
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Valuta"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120msgid "Add a review"
115msgid "Add a review"
121msgstr "Aggiungi una recensione"
116msgstr "Aggiungi una recensione"
122
117
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124msgid "Send"
119msgid "Send"
125msgstr "Invia"
120msgstr "Invia"
126
121
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Recensisci"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Commenti:"
134−
135#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
136msgid "Emergency Call"
123msgid "Emergency Call"
137msgstr "Chiamata di emergenza"
124msgstr "Chiamata di emergenza"
@@ -177,7 +164,23 @@ msgstr ""
177msgid "Search"
164msgid "Search"
178msgstr "Cerca"
165msgstr "Cerca"
179
166
180−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
181#, qt-format
168#, qt-format
182msgid "Please enter %1"
169msgid "Please enter %1"
183msgstr "Inserire %1"
170msgstr "Inserire %1"
171+
172+#, qt-format
173+#~ msgid "(%1)"
174+#~ msgstr "(%1)"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 recensione"
180+#~ msgstr[1] "%1 recensioni"
181+
182+#~ msgid "Comments:"
183+#~ msgstr "Commenti:"
184+
185+#~ msgid "Review"
186+#~ msgstr "Recensisci"
po/ja.po+24−30
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "最近の検索"
78msgstr "最近の検索"
79
79
@@ -81,27 +81,18 @@ msgstr "最近の検索"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
95+msgstr ""
104−msgstr[1] ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr ""
111msgstr ""
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "送信"
115msgstr "送信"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "コメント:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr ""
119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "検索"
160msgstr "検索"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "コメント:"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
po/km.po+33−30
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgstr ""
77"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
77"ឥឡូវ​អ្នក​បាន​ពិនិត្យ​កាយវិការ​គែម​ "
78"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
78"និង​អាច​ចាប់ផ្ដើម​ប្រើ​ទូរស័ព្ទ<br><br>ប៉ះ លើ​អេក្រង់​ដើម្បី​ចាប់ផ្ដើម"
79
79
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
81msgid "Recent searches"
82msgstr "ការ​ស្វែងរក​ថ្មី"
82msgstr "ការ​ស្វែងរក​ថ្មី"
83
83
@@ -85,26 +85,18 @@ msgstr "ការ​ស្វែងរក​ថ្មី"
85msgid "See more"
85msgid "See more"
86msgstr "មើល​ច្រើន​ទៀត"
86msgstr "មើល​ច្រើន​ទៀត"
87
87
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
89msgid "See less"
89msgid "See less"
90msgstr "មើល​តិច​ជាង"
90msgstr "មើល​តិច​ជាង"
91
91
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
93+msgid "Recent"
94−msgstr "វាយតម្លៃ​វា"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
94+msgstr ""
101
95
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
103−#: qml/Dash/Previews/Header.qml:105
104#, qt-format
97#, qt-format
105−msgid "%1 review"
98+msgid "%1 Preview"
106−msgid_plural "%1 reviews"
99+msgstr ""
107−msgstr[0] "ពិនិត្យ​មើល %1"
108
100
109#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
110msgid "More..."
102msgid "More..."
@@ -114,22 +106,18 @@ msgstr "ច្រើនជាង​..."
114msgid "Less..."
106msgid "Less..."
115msgstr "តិច​ជាង..."
107msgstr "តិច​ជាង..."
116
108
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "វាយតម្លៃ​វា"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118msgid "Add a review"
114msgid "Add a review"
119msgstr "បន្ថែម​ការ​ពិនិត្យ"
115msgstr "បន្ថែម​ការ​ពិនិត្យ"
120
116
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122msgid "Send"
118msgid "Send"
123msgstr "ផ្ញើ"
119msgstr "ផ្ញើ"
124
120
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "ការ​ពិនិត្យ"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "មតិយោបល់៖"
132−
133#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
134msgid "Emergency Call"
122msgid "Emergency Call"
135msgstr "ការ​ហៅ​ពេល​អាសន្ន"
123msgstr "ការ​ហៅ​ពេល​អាសន្ន"
@@ -175,7 +163,22 @@ msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
175msgid "Search"
163msgid "Search"
176msgstr "ស្វែង​រក"
164msgstr "ស្វែង​រក"
177
165
178−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
179#, qt-format
167#, qt-format
180msgid "Please enter %1"
168msgid "Please enter %1"
181msgstr "សូម​បញ្ចូល %1"
169msgstr "សូម​បញ្ចូល %1"
170+
171+#, qt-format
172+#~ msgid "(%1)"
173+#~ msgstr "(%1)"
174+
175+#, qt-format
176+#~ msgid "%1 review"
177+#~ msgid_plural "%1 reviews"
178+#~ msgstr[0] "ពិនិត្យ​មើល %1"
179+
180+#~ msgid "Comments:"
181+#~ msgstr "មតិយោបល់៖"
182+
183+#~ msgid "Review"
184+#~ msgstr "ការ​ពិនិត្យ"
po/kn.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
78msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
79
79
@@ -81,28 +81,19 @@ msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "ಹುಡುಕು"
160msgstr "ಹುಡುಕು"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/ko.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "최근 검색"
78msgstr "최근 검색"
79
79
@@ -81,28 +81,19 @@ msgstr "최근 검색"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "검색"
160msgstr "검색"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/ky.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Соңку издөөлөр"
78msgstr "Соңку издөөлөр"
79
79
@@ -81,28 +81,19 @@ msgstr "Соңку издөөлөр"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Издөө"
160msgstr "Издөө"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/lo.po+24−30
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,27 +81,18 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
97−
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
95+msgstr ""
104−msgstr[1] ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr ""
111msgstr ""
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "ສົ່ງ"
115msgstr "ສົ່ງ"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "ຄໍ່ເຫັນ"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr ""
119msgstr ""
@@ -172,7 +159,14 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "ຊອກຫາ"
160msgstr "ຊອກຫາ"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "ກະລູນາປ້ອນ %1"
165msgstr "ກະລູນາປ້ອນ %1"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "ຄໍ່ເຫັນ"
po/lt.po+35−32
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 && "
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"
18"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
77"phone<br><br>Tap on the screen to start"
77"phone<br><br>Tap on the screen to start"
78msgstr ""
78msgstr ""
79
79
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
81msgid "Recent searches"
82msgstr "Paskiausios paieškos"
82msgstr "Paskiausios paieškos"
83
83
@@ -85,28 +85,18 @@ msgstr "Paskiausios paieškos"
85msgid "See more"
85msgid "See more"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
89msgid "See less"
89msgid "See less"
90msgstr ""
90msgstr ""
91
91
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
93+msgid "Recent"
94−msgstr "Įvertinkite tai"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
94+msgstr ""
101
95
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
103−#: qml/Dash/Previews/Header.qml:105
104#, qt-format
97#, qt-format
105−msgid "%1 review"
98+msgid "%1 Preview"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 apžvalga"
108−msgstr[1] "%1 apžvalgos"
99+msgstr ""
109−msgstr[2] "%1 apžvalgų"
110
100
111#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112msgid "More..."
102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116msgid "Less..."
106msgid "Less..."
117msgstr ""
107msgstr ""
118
108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Įvertinkite tai"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120msgid "Add a review"
114msgid "Add a review"
121msgstr "Pridėkite apžvalgą"
115msgstr "Pridėkite apžvalgą"
122
116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124msgid "Send"
118msgid "Send"
125msgstr "Siųsti"
119msgstr "Siųsti"
126
120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Apžvalga"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Komentarai:"
134−
135#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
136msgid "Emergency Call"
122msgid "Emergency Call"
137msgstr "Pagalbos skambutis"
123msgstr "Pagalbos skambutis"
@@ -177,7 +163,24 @@ msgstr ""
177msgid "Search"
163msgid "Search"
178msgstr "Paieška"
164msgstr "Paieška"
179
165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181#, qt-format
167#, qt-format
182msgid "Please enter %1"
168msgid "Please enter %1"
183msgstr "Prašom įvesti %1"
169msgstr "Prašom įvesti %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Komentarai:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Apžvalga"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 apžvalga"
181+#~ msgstr[1] "%1 apžvalgos"
182+#~ msgstr[2] "%1 apžvalgų"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/lv.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11"PO-Revision-Date: 2014-01-11 16:48+0000\n"
11"PO-Revision-Date: 2014-01-11 16:48+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"
@@ -15,8 +15,8 @@ msgstr ""
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"
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-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Nesen veiktās meklēšanas"
78msgstr "Nesen veiktās meklēšanas"
79
79
@@ -81,28 +81,19 @@ msgstr "Nesen veiktās meklēšanas"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Meklēt"
160msgstr "Meklēt"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/ml.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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 Alfazz <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
75"phone<br><br>Tap on the screen to start"
75"phone<br><br>Tap on the screen to start"
76msgstr ""
76msgstr ""
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "സമീപകാല തിരയലുകള്‍"
80msgstr "സമീപകാല തിരയലുകള്‍"
81
81
@@ -83,27 +83,18 @@ msgstr "സമീപകാല തിരയലുകള്‍"
83msgid "See more"
83msgid "See more"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
92−msgstr "ഇത് അവലോകനം ചെയ്യുക"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
91+msgid "Recent"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
97+msgstr ""
105−msgstr[0] "%1 അവലോകനം"
106−msgstr[1] "%1 അവലോകനങ്ങള്‍"
107
98
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113msgid "Less..."
104msgid "Less..."
114msgstr ""
105msgstr ""
115
106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "ഇത് അവലോകനം ചെയ്യുക"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
112msgid "Add a review"
118msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
113msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
119
114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
116msgid "Send"
122msgstr "അയയ്‌ക്കുക"
117msgstr "അയയ്‌ക്കുക"
123
118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "അവലോകനം"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "അഭിപ്രായങ്ങള്‍:"
131−
132#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
120msgid "Emergency Call"
134msgstr "അടിയന്തിര വിളി"
121msgstr "അടിയന്തിര വിളി"
@@ -174,7 +161,23 @@ msgstr ""
174msgid "Search"
161msgid "Search"
175msgstr "തിരയുക"
162msgstr "തിരയുക"
176
163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178#, qt-format
165#, qt-format
179msgid "Please enter %1"
166msgid "Please enter %1"
180msgstr "ദയവായി %1 നല്‍കുക"
167msgstr "ദയവായി %1 നല്‍കുക"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#~ msgid "Comments:"
174+#~ msgstr "അഭിപ്രായങ്ങള്‍:"
175+
176+#~ msgid "Review"
177+#~ msgstr "അവലോകനം"
178+
179+#, qt-format
180+#~ msgid "%1 review"
181+#~ msgid_plural "%1 reviews"
182+#~ msgstr[0] "%1 അവലോകനം"
183+#~ msgstr[1] "%1 അവലോകനങ്ങള്‍"
po/mr.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/ms.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Gelintar baru-baru ini"
78msgstr "Gelintar baru-baru ini"
79
79
@@ -81,27 +81,18 @@ msgstr "Gelintar baru-baru ini"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "Kadar ini"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 ulasan"
104−msgstr[1] "%1 ulasan"
95+msgstr ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Kadar ini"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "Tambah ulasan"
111msgstr "Tambah ulasan"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "Hantar"
115msgstr "Hantar"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Tinjauan"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Ulasan:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "panggilan Kecemasan"
119msgstr "panggilan Kecemasan"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Gelintar"
160msgstr "Gelintar"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "Sila masukkan %1"
165msgstr "Sila masukkan %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Ulasan:"
169+
170+#~ msgid "Review"
171+#~ msgstr "Tinjauan"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 ulasan"
177+#~ msgstr[1] "%1 ulasan"
178+
179+#, qt-format
180+#~ msgid "(%1)"
181+#~ msgstr "(%1)"
po/my.po+25−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
78msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
79
79
@@ -81,27 +81,18 @@ msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
90−msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
89+msgid "Recent"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
95+msgstr ""
104−msgstr[1] ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr ""
111msgstr ""
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "ပို့မည်"
115msgstr "ပို့မည်"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "မှတ်ချက်များ-"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "အရေးပေါ်ခေါ်မည်"
119msgstr "အရေးပေါ်ခေါ်မည်"
@@ -172,7 +159,14 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "ရှာဖွေ"
160msgstr "ရှာဖွေ"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "%1ကိုရိုက်ထည့်ပါ"
165msgstr "%1ကိုရိုက်ထည့်ပါ"
166+
167+#, qt-format
168+#~ msgid "(%1)"
169+#~ msgstr "(%1)"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "မှတ်ချက်များ-"
po/nb.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Siste søk"
78msgstr "Siste søk"
79
79
@@ -81,28 +81,19 @@ msgstr "Siste søk"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Søk"
160msgstr "Søk"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/nl.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "Recente zoekopdrachten"
78msgstr "Recente zoekopdrachten"
79
79
@@ -81,27 +81,18 @@ msgstr "Recente zoekopdrachten"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "Beoordeel dit"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 recensie"
104−msgstr[1] "%1 recensies"
95+msgstr ""
105
96
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "Beoordeel dit"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr "Voeg recensie toe"
111msgstr "Voeg recensie toe"
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "Versturen"
115msgstr "Versturen"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr "Recensie"
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Reacties:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr "Noodoproep"
119msgstr "Noodoproep"
@@ -172,7 +159,23 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Zoeken"
160msgstr "Zoeken"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr "Voer %1 in"
165msgstr "Voer %1 in"
166+
167+#, qt-format
168+#~ msgid "%1 review"
169+#~ msgid_plural "%1 reviews"
170+#~ msgstr[0] "%1 recensie"
171+#~ msgstr[1] "%1 recensies"
172+
173+#, qt-format
174+#~ msgid "(%1)"
175+#~ msgstr "(%1)"
176+
177+#~ msgid "Comments:"
178+#~ msgstr "Reacties:"
179+
180+#~ msgid "Review"
181+#~ msgstr "Recensie"
po/pl.po+35−32
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 "
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"
18"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgid ""
76"phone<br><br>Tap on the screen to start"
76"phone<br><br>Tap on the screen to start"
77msgstr ""
77msgstr ""
78
78
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
80msgid "Recent searches"
80msgid "Recent searches"
81msgstr "Ostatnie wyszukiwania"
81msgstr "Ostatnie wyszukiwania"
82
82
@@ -84,28 +84,18 @@ msgstr "Ostatnie wyszukiwania"
84msgid "See more"
84msgid "See more"
85msgstr ""
85msgstr ""
86
86
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
88msgid "See less"
88msgid "See less"
89msgstr ""
89msgstr ""
90
90
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91+#: qml/Dash/DashApps.qml:38
92−msgid "Rate this"
92+msgid "Recent"
93−msgstr "Oceń to"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
93+msgstr ""
100
94
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
95+#: qml/Dash/PreviewListView.qml:52
102−#: qml/Dash/Previews/Header.qml:105
103#, qt-format
96#, qt-format
104−msgid "%1 review"
97+msgid "%1 Preview"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 opinia"
107−msgstr[1] "%1 opinie"
98+msgstr ""
108−msgstr[2] "%1 opinii"
109
99
110#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
111msgid "More..."
101msgid "More..."
@@ -115,22 +105,18 @@ msgstr ""
115msgid "Less..."
105msgid "Less..."
116msgstr ""
106msgstr ""
117
107
118−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oceń to"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
119msgid "Add a review"
113msgid "Add a review"
120msgstr "Dodaj recenzję"
114msgstr "Dodaj recenzję"
121
115
122−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
123msgid "Send"
117msgid "Send"
124msgstr "Wyślij"
118msgstr "Wyślij"
125
119
126−#: qml/Dash/Previews/Reviews.qml:86
127−msgid "Review"
128−msgstr "Recenzja"
129−
130−#: qml/Dash/Previews/Reviews.qml:139
131−msgid "Comments:"
132−msgstr "Komentarze:"
133−
134#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
135msgid "Emergency Call"
121msgid "Emergency Call"
136msgstr "Telefon ratunkowy"
122msgstr "Telefon ratunkowy"
@@ -176,7 +162,24 @@ msgstr ""
176msgid "Search"
162msgid "Search"
177msgstr "Szukaj"
163msgstr "Szukaj"
178
164
179−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
180#, qt-format
166#, qt-format
181msgid "Please enter %1"
167msgid "Please enter %1"
182msgstr "Wprowadź %1"
168msgstr "Wprowadź %1"
169+
170+#~ msgid "Comments:"
171+#~ msgstr "Komentarze:"
172+
173+#~ msgid "Review"
174+#~ msgstr "Recenzja"
175+
176+#, qt-format
177+#~ msgid "%1 review"
178+#~ msgid_plural "%1 reviews"
179+#~ msgstr[0] "%1 opinia"
180+#~ msgstr[1] "%1 opinie"
181+#~ msgstr[2] "%1 opinii"
182+
183+#, qt-format
184+#~ msgid "(%1)"
185+#~ msgstr "(%1)"
po/pt.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/pt_BR.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgid ""
75"phone<br><br>Tap on the screen to start"
75"phone<br><br>Tap on the screen to start"
76msgstr ""
76msgstr ""
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "Pesquisas recentes"
80msgstr "Pesquisas recentes"
81
81
@@ -83,27 +83,18 @@ msgstr "Pesquisas recentes"
83msgid "See more"
83msgid "See more"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
91+msgid "Recent"
92−msgstr "Avaliar isto"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 análise"
106−msgstr[1] "%1 análises"
97+msgstr ""
107
98
108#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
109msgid "More..."
100msgid "More..."
@@ -113,22 +104,18 @@ msgstr ""
113msgid "Less..."
104msgid "Less..."
114msgstr ""
105msgstr ""
115
106
116−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "Avaliar isto"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
117msgid "Add a review"
112msgid "Add a review"
118msgstr "Adicionar uma análise"
113msgstr "Adicionar uma análise"
119
114
120−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
121msgid "Send"
116msgid "Send"
122msgstr "Enviar"
117msgstr "Enviar"
123
118
124−#: qml/Dash/Previews/Reviews.qml:86
125−msgid "Review"
126−msgstr "Revisão"
127−
128−#: qml/Dash/Previews/Reviews.qml:139
129−msgid "Comments:"
130−msgstr "Comentários:"
131−
132#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
133msgid "Emergency Call"
120msgid "Emergency Call"
134msgstr "Chamada de emergência"
121msgstr "Chamada de emergência"
@@ -174,7 +161,23 @@ msgstr ""
174msgid "Search"
161msgid "Search"
175msgstr "Pesquisar"
162msgstr "Pesquisar"
176
163
177−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
178#, qt-format
165#, qt-format
179msgid "Please enter %1"
166msgid "Please enter %1"
180msgstr "Por favor, digite %1"
167msgstr "Por favor, digite %1"
168+
169+#, qt-format
170+#~ msgid "(%1)"
171+#~ msgstr "(%1)"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 análise"
177+#~ msgstr[1] "%1 análises"
178+
179+#~ msgid "Comments:"
180+#~ msgstr "Comentários:"
181+
182+#~ msgid "Review"
183+#~ msgstr "Revisão"
po/ro.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 "
17"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
18"== 0) && (n != 0))) ? 2: 1));\n"
18"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr "Căutări recente"
79msgstr "Căutări recente"
80
80
@@ -82,28 +82,19 @@ msgstr "Căutări recente"
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91msgstr ""
91msgstr ""
92
92
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
94−#: qml/Dash/Previews/Header.qml:93
95#, qt-format
94#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
97msgstr ""
96msgstr ""
98
97
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
109msgstr ""
100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
116−msgid "Add a review"
107+msgid "Rate this"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
121msgstr ""
108msgstr ""
122
109
123−#: qml/Dash/Previews/Reviews.qml:86
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124−msgid "Review"
111+msgid "Add a review"
125msgstr ""
112msgstr ""
126
113
127−#: qml/Dash/Previews/Reviews.qml:139
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128−msgid "Comments:"
115+msgid "Send"
129msgstr ""
116msgstr ""
130
117
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr "Căutare"
161msgstr "Căutare"
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
po/ru.po+26−40
@@ -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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11−"PO-Revision-Date: 2014-01-26 15:56+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−"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-15 07:34+0000\n"
17+"X-Launchpad-Export-Date: 2014-04-04 07:12+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
18+"X-Generator: Launchpad (build 16976)\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
@@ -78,62 +76,50 @@ msgid ""
78"You have now mastered the edge gestures and can start using the "
76"You have now mastered the edge gestures and can start using the "
79"phone<br><br>Tap on the screen to start"
77"phone<br><br>Tap on the screen to start"
80msgstr ""
78msgstr ""
79+"Вы научились пользоваться Ubuntu и можете начать использовать свой "
80+"телефон<br><br>Нажмите на экран"
81
81
82−#: qml/Components/PageHeader.qml:340
82+#: qml/Components/PageHeader.qml:365
83msgid "Recent searches"
83msgid "Recent searches"
84msgstr "Последние поисковые запросы"
84msgstr "Последние поисковые запросы"
85
85
86#: qml/Components/SeeMore.qml:35
86#: qml/Components/SeeMore.qml:35
87msgid "See more"
87msgid "See more"
88−msgstr ""
88+msgstr "Подробнее"
89
89
90−#: qml/Components/SeeMore.qml:57
90+#: qml/Components/SeeMore.qml:58
91msgid "See less"
91msgid "See less"
92−msgstr ""
92+msgstr "Вкратце"
93
93
94−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
94+#: qml/Dash/DashApps.qml:38
95−msgid "Rate this"
95+msgid "Recent"
96−msgstr "Оцените это"
96+msgstr "Недавние"
97
97
98−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:93
100#, qt-format
99#, qt-format
101−msgid "(%1)"
100+msgid "%1 Preview"
102−msgstr "(%1)"
101+msgstr "Просмотр %1"
103−
104−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105−#: qml/Dash/Previews/Header.qml:105
106−#, qt-format
107−msgid "%1 review"
108−msgid_plural "%1 reviews"
109−msgstr[0] "%1 отзыв"
110−msgstr[1] "%1 отзыва"
111−msgstr[2] "%1 отзывов"
112
102
113#: qml/Dash/Previews/PreviewActionCombo.qml:34
103#: qml/Dash/Previews/PreviewActionCombo.qml:34
114msgid "More..."
104msgid "More..."
115−msgstr ""
105+msgstr "Ещё..."
116
106
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
118msgid "Less..."
108msgid "Less..."
119−msgstr ""
109+msgstr "Меньше..."
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:81
112+msgid "Rate this"
113+msgstr "Оцените это"
120
114
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122msgid "Add a review"
116msgid "Add a review"
123msgstr "Добавьте отзыв"
117msgstr "Добавьте отзыв"
124
118
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126msgid "Send"
120msgid "Send"
127msgstr "Отправить"
121msgstr "Отправить"
128
122
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Отзыв"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Комментарии:"
136−
137#: qml/Greeter/Lockscreen.qml:149
123#: qml/Greeter/Lockscreen.qml:149
138msgid "Emergency Call"
124msgid "Emergency Call"
139msgstr "Экстренный вызов"
125msgstr "Экстренный вызов"
@@ -173,13 +159,13 @@ msgstr "Показать пароль"
173
159
174#: qml/Notifications/NotificationMenuItemFactory.qml:103
160#: qml/Notifications/NotificationMenuItemFactory.qml:103
175msgid "Please enter SIM PIN"
161msgid "Please enter SIM PIN"
176−msgstr ""
162+msgstr "Введите PIN код"
177
163
178#: qml/Panel/SearchIndicator.qml:27
164#: qml/Panel/SearchIndicator.qml:27
179msgid "Search"
165msgid "Search"
180msgstr "Поиск"
166msgstr "Поиск"
181
167
182−#: qml/Shell.qml:440
168+#: qml/Shell.qml:417
183#, qt-format
169#, qt-format
184msgid "Please enter %1"
170msgid "Please enter %1"
185msgstr "Пожалуйста, введите %1"
171msgstr "Пожалуйста, введите %1"
po/shn.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/si.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/sl.po+36−33
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -78,7 +78,7 @@ msgstr ""
78"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
78"Sedaj, ko ste osvojili poteze robov, lahko začnete uporabljati "
79"telefon<br><br>Tapnite na zaslon za začetek"
79"telefon<br><br>Tapnite na zaslon za začetek"
80
80
81−#: qml/Components/PageHeader.qml:340
81+#: qml/Components/PageHeader.qml:365
82msgid "Recent searches"
82msgid "Recent searches"
83msgstr "Nedavna iskanja"
83msgstr "Nedavna iskanja"
84
84
@@ -86,29 +86,18 @@ msgstr "Nedavna iskanja"
86msgid "See more"
86msgid "See more"
87msgstr "Pokaži več"
87msgstr "Pokaži več"
88
88
89−#: qml/Components/SeeMore.qml:57
89+#: qml/Components/SeeMore.qml:58
90msgid "See less"
90msgid "See less"
91msgstr "Pokaži manj"
91msgstr "Pokaži manj"
92
92
93−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
93+#: qml/Dash/DashApps.qml:38
94−msgid "Rate this"
94+msgid "Recent"
95−msgstr "Ocenite"
96−
97−#. TRANSLATORS: Number of persons who rated this app/video/whatever
98−#: qml/Dash/Previews/Header.qml:93
99−#, qt-format
100−msgid "(%1)"
101−msgstr "(%1)"
95+msgstr ""
102
96
103−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
97+#: qml/Dash/PreviewListView.qml:52
104−#: qml/Dash/Previews/Header.qml:105
105#, qt-format
98#, qt-format
106−msgid "%1 review"
99+msgid "%1 Preview"
107−msgid_plural "%1 reviews"
108−msgstr[0] "%1 ocen"
109−msgstr[1] "%1 ocena"
110−msgstr[2] "%1 oceni"
100+msgstr ""
111−msgstr[3] "%1 ocene"
112
101
113#: qml/Dash/Previews/PreviewActionCombo.qml:34
102#: qml/Dash/Previews/PreviewActionCombo.qml:34
114msgid "More..."
103msgid "More..."
@@ -118,22 +107,18 @@ msgstr "Več ..."
118msgid "Less..."
107msgid "Less..."
119msgstr "Manj ..."
108msgstr "Manj ..."
120
109
121−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
110+#: qml/Dash/Previews/PreviewRatingInput.qml:81
111+msgid "Rate this"
112+msgstr "Ocenite"
113+
114+#: qml/Dash/Previews/PreviewRatingInput.qml:126
122msgid "Add a review"
115msgid "Add a review"
123msgstr "Dodaj oceno"
116msgstr "Dodaj oceno"
124
117
125−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
118+#: qml/Dash/Previews/PreviewRatingInput.qml:166
126msgid "Send"
119msgid "Send"
127msgstr "Pošlji"
120msgstr "Pošlji"
128
121
129−#: qml/Dash/Previews/Reviews.qml:86
130−msgid "Review"
131−msgstr "Ocena"
132−
133−#: qml/Dash/Previews/Reviews.qml:139
134−msgid "Comments:"
135−msgstr "Opombe:"
136−
137#: qml/Greeter/Lockscreen.qml:149
122#: qml/Greeter/Lockscreen.qml:149
138msgid "Emergency Call"
123msgid "Emergency Call"
139msgstr "Klic v sili"
124msgstr "Klic v sili"
@@ -179,7 +164,25 @@ msgstr "Vnesite PIN kartice SIM"
179msgid "Search"
164msgid "Search"
180msgstr "Iskanje"
165msgstr "Iskanje"
181
166
182−#: qml/Shell.qml:440
167+#: qml/Shell.qml:417
183#, qt-format
168#, qt-format
184msgid "Please enter %1"
169msgid "Please enter %1"
185msgstr "Vnesite %1"
170msgstr "Vnesite %1"
171+
172+#~ msgid "Review"
173+#~ msgstr "Ocena"
174+
175+#~ msgid "Comments:"
176+#~ msgstr "Opombe:"
177+
178+#, qt-format
179+#~ msgid "%1 review"
180+#~ msgid_plural "%1 reviews"
181+#~ msgstr[0] "%1 ocen"
182+#~ msgstr[1] "%1 ocena"
183+#~ msgstr[2] "%1 oceni"
184+#~ msgstr[3] "%1 ocene"
185+
186+#, qt-format
187+#~ msgid "(%1)"
188+#~ msgstr "(%1)"
po/sq.po+28−31
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:48+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr ""
79msgstr ""
80
80
@@ -82,27 +82,18 @@ msgstr ""
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91−msgstr "Vlerësoje këtë"
92−
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
94−#: qml/Dash/Previews/Header.qml:93
95−#, qt-format
96−msgid "(%1)"
97−msgstr "(%1)"
91+msgstr ""
98
92
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
100−#: qml/Dash/Previews/Header.qml:105
101#, qt-format
94#, qt-format
102−msgid "%1 review"
95+msgid "%1 Preview"
103−msgid_plural "%1 reviews"
104−msgstr[0] "%1 rishikim"
105−msgstr[1] "%1 rishikime"
96+msgstr ""
106
97
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
@@ -112,22 +103,18 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
107+msgid "Rate this"
108+msgstr "Vlerësoje këtë"
109+
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116msgid "Add a review"
111msgid "Add a review"
117msgstr "Shto një rishikim"
112msgstr "Shto një rishikim"
118
113
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120msgid "Send"
115msgid "Send"
121msgstr ""
116msgstr ""
122
117
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr ""
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr ""
130−
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
132msgid "Emergency Call"
119msgid "Emergency Call"
133msgstr ""
120msgstr ""
@@ -173,7 +160,17 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr ""
161msgstr ""
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
167+
168+#, qt-format
169+#~ msgid "%1 review"
170+#~ msgid_plural "%1 reviews"
171+#~ msgstr[0] "%1 rishikim"
172+#~ msgstr[1] "%1 rishikime"
173+
174+#, qt-format
175+#~ msgid "(%1)"
176+#~ msgstr "(%1)"
po/sr.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,7 +74,7 @@ msgid ""
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76
76
77−#: qml/Components/PageHeader.qml:340
77+#: qml/Components/PageHeader.qml:365
78msgid "Recent searches"
78msgid "Recent searches"
79msgstr "Скорашње претраге"
79msgstr "Скорашње претраге"
80
80
@@ -82,28 +82,19 @@ msgstr "Скорашње претраге"
82msgid "See more"
82msgid "See more"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/SeeMore.qml:57
85+#: qml/Components/SeeMore.qml:58
86msgid "See less"
86msgid "See less"
87msgstr ""
87msgstr ""
88
88
89−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
89+#: qml/Dash/DashApps.qml:38
90−msgid "Rate this"
90+msgid "Recent"
91msgstr ""
91msgstr ""
92
92
93−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93+#: qml/Dash/PreviewListView.qml:52
94−#: qml/Dash/Previews/Header.qml:93
95#, qt-format
94#, qt-format
96−msgid "(%1)"
95+msgid "%1 Preview"
97msgstr ""
96msgstr ""
98
97
99−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
100−#: qml/Dash/Previews/Header.qml:105
101−#, qt-format
102−msgid "%1 review"
103−msgid_plural "%1 reviews"
104−msgstr[0] ""
105−msgstr[1] ""
106−
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
98#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
99msgid "More..."
109msgstr ""
100msgstr ""
@@ -112,20 +103,16 @@ msgstr ""
112msgid "Less..."
103msgid "Less..."
113msgstr ""
104msgstr ""
114
105
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
106+#: qml/Dash/Previews/PreviewRatingInput.qml:81
116−msgid "Add a review"
107+msgid "Rate this"
117−msgstr ""
118−
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
120−msgid "Send"
121msgstr ""
108msgstr ""
122
109
123−#: qml/Dash/Previews/Reviews.qml:86
110+#: qml/Dash/Previews/PreviewRatingInput.qml:126
124−msgid "Review"
111+msgid "Add a review"
125msgstr ""
112msgstr ""
126
113
127−#: qml/Dash/Previews/Reviews.qml:139
114+#: qml/Dash/Previews/PreviewRatingInput.qml:166
128−msgid "Comments:"
115+msgid "Send"
129msgstr ""
116msgstr ""
130
117
131#: qml/Greeter/Lockscreen.qml:149
118#: qml/Greeter/Lockscreen.qml:149
@@ -173,7 +160,7 @@ msgstr ""
173msgid "Search"
160msgid "Search"
174msgstr "Претрага"
161msgstr "Претрага"
175
162
176−#: qml/Shell.qml:440
163+#: qml/Shell.qml:417
177#, qt-format
164#, qt-format
178msgid "Please enter %1"
165msgid "Please enter %1"
179msgstr ""
166msgstr ""
po/sv.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/sw.po+19−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,22 +102,18 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr ""
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
115msgid "Add a review"
110msgid "Add a review"
116msgstr ""
111msgstr ""
117
112
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
119msgid "Send"
114msgid "Send"
120msgstr "Tuma"
115msgstr "Tuma"
121
116
122−#: qml/Dash/Previews/Reviews.qml:86
123−msgid "Review"
124−msgstr ""
125−
126−#: qml/Dash/Previews/Reviews.qml:139
127−msgid "Comments:"
128−msgstr "Maoni:"
129−
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
131msgid "Emergency Call"
118msgid "Emergency Call"
132msgstr ""
119msgstr ""
@@ -172,7 +159,10 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "Tafuta"
160msgstr "Tafuta"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "Maoni:"
po/ta.po+35−32
@@ -7,16 +7,16 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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: Thangamani Arun - தங்கமணி அருண் <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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20"Language: ta\n"
20"Language: ta\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -76,7 +76,7 @@ msgid ""
76"phone<br><br>Tap on the screen to start"
76"phone<br><br>Tap on the screen to start"
77msgstr ""
77msgstr ""
78
78
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
80msgid "Recent searches"
80msgid "Recent searches"
81msgstr "கடையாக தேடப்பட்டவைகள்"
81msgstr "கடையாக தேடப்பட்டவைகள்"
82
82
@@ -84,27 +84,18 @@ msgstr "கடையாக தேடப்பட்டவைகள்"
84msgid "See more"
84msgid "See more"
85msgstr ""
85msgstr ""
86
86
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
88msgid "See less"
88msgid "See less"
89msgstr ""
89msgstr ""
90
90
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91+#: qml/Dash/DashApps.qml:38
92−msgid "Rate this"
92+msgid "Recent"
93−msgstr "இதை மதிப்பிடு"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
93+msgstr ""
100
94
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
95+#: qml/Dash/PreviewListView.qml:52
102−#: qml/Dash/Previews/Header.qml:105
103#, qt-format
96#, qt-format
104−msgid "%1 review"
97+msgid "%1 Preview"
105−msgid_plural "%1 reviews"
98+msgstr ""
106−msgstr[0] "%1 பரிசீலனை"
107−msgstr[1] "%1 பரிசீலனைகள்"
108
99
109#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110msgid "More..."
101msgid "More..."
@@ -114,22 +105,18 @@ msgstr ""
114msgid "Less..."
105msgid "Less..."
115msgstr ""
106msgstr ""
116
107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "இதை மதிப்பிடு"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118msgid "Add a review"
113msgid "Add a review"
119msgstr "ஒரு பரிசீலனையை சேர்"
114msgstr "ஒரு பரிசீலனையை சேர்"
120
115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122msgid "Send"
117msgid "Send"
123msgstr "அனுப்பு"
118msgstr "அனுப்பு"
124
119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "மறுஆய்வு"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "கருத்துகள்:"
132−
133#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
134msgid "Emergency Call"
121msgid "Emergency Call"
135msgstr "அவசர அழைப்பு"
122msgstr "அவசர அழைப்பு"
@@ -175,7 +162,23 @@ msgstr ""
175msgid "Search"
162msgid "Search"
176msgstr "தெடு"
163msgstr "தெடு"
177
164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179#, qt-format
166#, qt-format
180msgid "Please enter %1"
167msgid "Please enter %1"
181msgstr "தயவுச்செய்து %1 உள்ளிடு"
168msgstr "தயவுச்செய்து %1 உள்ளிடு"
169+
170+#, qt-format
171+#~ msgid "(%1)"
172+#~ msgstr "(%1)"
173+
174+#, qt-format
175+#~ msgid "%1 review"
176+#~ msgid_plural "%1 reviews"
177+#~ msgstr[0] "%1 பரிசீலனை"
178+#~ msgstr[1] "%1 பரிசீலனைகள்"
179+
180+#~ msgid "Review"
181+#~ msgstr "மறுஆய்வு"
182+
183+#~ msgid "Comments:"
184+#~ msgstr "கருத்துகள்:"
po/te.po+16−29
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/tr.po+34−31
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -76,7 +76,7 @@ msgstr ""
76"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
76"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
77"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
77"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
78
78
79−#: qml/Components/PageHeader.qml:340
79+#: qml/Components/PageHeader.qml:365
80msgid "Recent searches"
80msgid "Recent searches"
81msgstr "Son aramalar"
81msgstr "Son aramalar"
82
82
@@ -84,27 +84,18 @@ msgstr "Son aramalar"
84msgid "See more"
84msgid "See more"
85msgstr "Daha fazlası"
85msgstr "Daha fazlası"
86
86
87−#: qml/Components/SeeMore.qml:57
87+#: qml/Components/SeeMore.qml:58
88msgid "See less"
88msgid "See less"
89msgstr "Daha azını gör"
89msgstr "Daha azını gör"
90
90
91−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
91+#: qml/Dash/DashApps.qml:38
92−msgid "Rate this"
92+msgid "Recent"
93−msgstr "Oyla"
94−
95−#. TRANSLATORS: Number of persons who rated this app/video/whatever
96−#: qml/Dash/Previews/Header.qml:93
97−#, qt-format
98−msgid "(%1)"
99−msgstr "(%1)"
93+msgstr ""
100
94
101−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
95+#: qml/Dash/PreviewListView.qml:52
102−#: qml/Dash/Previews/Header.qml:105
103#, qt-format
96#, qt-format
104−msgid "%1 review"
97+msgid "%1 Preview"
105−msgid_plural "%1 reviews"
106−msgstr[0] "%1 inceleme"
107−msgstr[1] "%1 inceleme"
98+msgstr ""
108
99
109#: qml/Dash/Previews/PreviewActionCombo.qml:34
100#: qml/Dash/Previews/PreviewActionCombo.qml:34
110msgid "More..."
101msgid "More..."
@@ -114,22 +105,18 @@ msgstr "Daha fazlası..."
114msgid "Less..."
105msgid "Less..."
115msgstr "Daha az.."
106msgstr "Daha az.."
116
107
117−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
108+#: qml/Dash/Previews/PreviewRatingInput.qml:81
109+msgid "Rate this"
110+msgstr "Oyla"
111+
112+#: qml/Dash/Previews/PreviewRatingInput.qml:126
118msgid "Add a review"
113msgid "Add a review"
119msgstr "Bir inceleme ekle"
114msgstr "Bir inceleme ekle"
120
115
121−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
116+#: qml/Dash/Previews/PreviewRatingInput.qml:166
122msgid "Send"
117msgid "Send"
123msgstr "Gönder"
118msgstr "Gönder"
124
119
125−#: qml/Dash/Previews/Reviews.qml:86
126−msgid "Review"
127−msgstr "İnceleme"
128−
129−#: qml/Dash/Previews/Reviews.qml:139
130−msgid "Comments:"
131−msgstr "Yorumlar:"
132−
133#: qml/Greeter/Lockscreen.qml:149
120#: qml/Greeter/Lockscreen.qml:149
134msgid "Emergency Call"
121msgid "Emergency Call"
135msgstr "Acil Arama"
122msgstr "Acil Arama"
@@ -175,7 +162,23 @@ msgstr "Lütfen SIM PIN'inizi girin"
175msgid "Search"
162msgid "Search"
176msgstr "Ara"
163msgstr "Ara"
177
164
178−#: qml/Shell.qml:440
165+#: qml/Shell.qml:417
179#, qt-format
166#, qt-format
180msgid "Please enter %1"
167msgid "Please enter %1"
181msgstr "Lütfen %1 girin"
168msgstr "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+33−30
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\n"
11"PO-Revision-Date: 2014-02-15 12:09+0000\n"
11"PO-Revision-Date: 2014-02-15 12:09+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
13"Language-Team: Uyghur <ug@li.org>\n"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -75,7 +75,7 @@ msgstr ""
75"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگەللەپ "
75"ئېكراننى چېكىپ باشلاڭ<br><br>سىز ھازىر گىرۋەك بارماق ئىشارەتلىرىنى ئىگەللەپ "
76"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
76"بولدىڭىز،ئەمدى تېلېفوننى ئىشلىتىشنى باشلىسىڭىز بولىدۇ"
77
77
78−#: qml/Components/PageHeader.qml:340
78+#: qml/Components/PageHeader.qml:365
79msgid "Recent searches"
79msgid "Recent searches"
80msgstr "يېقىنقى ئىزدەشلەر"
80msgstr "يېقىنقى ئىزدەشلەر"
81
81
@@ -83,26 +83,18 @@ msgstr "يېقىنقى ئىزدەشلەر"
83msgid "See more"
83msgid "See more"
84msgstr "جىقراق كۆرۈش"
84msgstr "جىقراق كۆرۈش"
85
85
86−#: qml/Components/SeeMore.qml:57
86+#: qml/Components/SeeMore.qml:58
87msgid "See less"
87msgid "See less"
88msgstr "ئازراق كۆرۈش"
88msgstr "ئازراق كۆرۈش"
89
89
90−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
90+#: qml/Dash/DashApps.qml:38
91−msgid "Rate this"
91+msgid "Recent"
92−msgstr "بۇنى باھالاڭ"
93−
94−#. TRANSLATORS: Number of persons who rated this app/video/whatever
95−#: qml/Dash/Previews/Header.qml:93
96−#, qt-format
97−msgid "(%1)"
98−msgstr "(%1)"
92+msgstr ""
99
93
100−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
94+#: qml/Dash/PreviewListView.qml:52
101−#: qml/Dash/Previews/Header.qml:105
102#, qt-format
95#, qt-format
103−msgid "%1 review"
96+msgid "%1 Preview"
104−msgid_plural "%1 reviews"
105−msgstr[0] "%1 باھا"
97+msgstr ""
106
98
107#: qml/Dash/Previews/PreviewActionCombo.qml:34
99#: qml/Dash/Previews/PreviewActionCombo.qml:34
108msgid "More..."
100msgid "More..."
@@ -112,22 +104,18 @@ msgstr ""
112msgid "Less..."
104msgid "Less..."
113msgstr ""
105msgstr ""
114
106
115−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
107+#: qml/Dash/Previews/PreviewRatingInput.qml:81
108+msgid "Rate this"
109+msgstr "بۇنى باھالاڭ"
110+
111+#: qml/Dash/Previews/PreviewRatingInput.qml:126
116msgid "Add a review"
112msgid "Add a review"
117msgstr "باھا قوشۇش"
113msgstr "باھا قوشۇش"
118
114
119−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
115+#: qml/Dash/Previews/PreviewRatingInput.qml:166
120msgid "Send"
116msgid "Send"
121msgstr "ئەۋەت"
117msgstr "ئەۋەت"
122
118
123−#: qml/Dash/Previews/Reviews.qml:86
124−msgid "Review"
125−msgstr "تەكشۈر"
126−
127−#: qml/Dash/Previews/Reviews.qml:139
128−msgid "Comments:"
129−msgstr "ئىنكاس:"
130−
131#: qml/Greeter/Lockscreen.qml:149
119#: qml/Greeter/Lockscreen.qml:149
132msgid "Emergency Call"
120msgid "Emergency Call"
133msgstr "جىددىي تېلېفون"
121msgstr "جىددىي تېلېفون"
@@ -173,7 +161,22 @@ msgstr "پارولىنى كىرگۈزۈڭPINكارتىڭىزنىڭ SIM"
173msgid "Search"
161msgid "Search"
174msgstr "ئىزدە"
162msgstr "ئىزدە"
175
163
176−#: qml/Shell.qml:440
164+#: qml/Shell.qml:417
177#, qt-format
165#, qt-format
178msgid "Please enter %1"
166msgid "Please enter %1"
179msgstr "%1 نى كىرگۈزۈڭ"
167msgstr "%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+35−32
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,8 +16,8 @@ msgstr ""
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 && "
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"
18"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
20−"X-Generator: Launchpad (build 16963)\n"
20+"X-Generator: Launchpad (build 16967)\n"
21
21
22#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:73
23#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -77,7 +77,7 @@ msgid ""
77"phone<br><br>Tap on the screen to start"
77"phone<br><br>Tap on the screen to start"
78msgstr ""
78msgstr ""
79
79
80−#: qml/Components/PageHeader.qml:340
80+#: qml/Components/PageHeader.qml:365
81msgid "Recent searches"
81msgid "Recent searches"
82msgstr "Нещодавні пошуки"
82msgstr "Нещодавні пошуки"
83
83
@@ -85,28 +85,18 @@ msgstr "Нещодавні пошуки"
85msgid "See more"
85msgid "See more"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Components/SeeMore.qml:57
88+#: qml/Components/SeeMore.qml:58
89msgid "See less"
89msgid "See less"
90msgstr ""
90msgstr ""
91
91
92−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
92+#: qml/Dash/DashApps.qml:38
93−msgid "Rate this"
93+msgid "Recent"
94−msgstr "Оцінити"
95−
96−#. TRANSLATORS: Number of persons who rated this app/video/whatever
97−#: qml/Dash/Previews/Header.qml:93
98−#, qt-format
99−msgid "(%1)"
100−msgstr "(%1)"
94+msgstr ""
101
95
102−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
96+#: qml/Dash/PreviewListView.qml:52
103−#: qml/Dash/Previews/Header.qml:105
104#, qt-format
97#, qt-format
105−msgid "%1 review"
98+msgid "%1 Preview"
106−msgid_plural "%1 reviews"
107−msgstr[0] "%1 рецензія"
108−msgstr[1] "%1 рецензії"
99+msgstr ""
109−msgstr[2] "%1 рецензій"
110
100
111#: qml/Dash/Previews/PreviewActionCombo.qml:34
101#: qml/Dash/Previews/PreviewActionCombo.qml:34
112msgid "More..."
102msgid "More..."
@@ -116,22 +106,18 @@ msgstr ""
116msgid "Less..."
106msgid "Less..."
117msgstr ""
107msgstr ""
118
108
119−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
109+#: qml/Dash/Previews/PreviewRatingInput.qml:81
110+msgid "Rate this"
111+msgstr "Оцінити"
112+
113+#: qml/Dash/Previews/PreviewRatingInput.qml:126
120msgid "Add a review"
114msgid "Add a review"
121msgstr "Додати рецензію"
115msgstr "Додати рецензію"
122
116
123−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
117+#: qml/Dash/Previews/PreviewRatingInput.qml:166
124msgid "Send"
118msgid "Send"
125msgstr "Надіслати"
119msgstr "Надіслати"
126
120
127−#: qml/Dash/Previews/Reviews.qml:86
128−msgid "Review"
129−msgstr "Рецензія"
130−
131−#: qml/Dash/Previews/Reviews.qml:139
132−msgid "Comments:"
133−msgstr "Коментарі:"
134−
135#: qml/Greeter/Lockscreen.qml:149
121#: qml/Greeter/Lockscreen.qml:149
136msgid "Emergency Call"
122msgid "Emergency Call"
137msgstr "Терміновий виклик"
123msgstr "Терміновий виклик"
@@ -177,7 +163,24 @@ msgstr ""
177msgid "Search"
163msgid "Search"
178msgstr "Пошук"
164msgstr "Пошук"
179
165
180−#: qml/Shell.qml:440
166+#: qml/Shell.qml:417
181#, qt-format
167#, qt-format
182msgid "Please enter %1"
168msgid "Please enter %1"
183msgstr "Будь ласка, введіть %1"
169msgstr "Будь ласка, введіть %1"
170+
171+#~ msgid "Comments:"
172+#~ msgstr "Коментарі:"
173+
174+#~ msgid "Review"
175+#~ msgstr "Рецензія"
176+
177+#, qt-format
178+#~ msgid "%1 review"
179+#~ msgid_plural "%1 reviews"
180+#~ msgstr[0] "%1 рецензія"
181+#~ msgstr[1] "%1 рецензії"
182+#~ msgstr[2] "%1 рецензій"
183+
184+#, qt-format
185+#~ msgid "(%1)"
186+#~ msgstr "(%1)"
po/unity8.pot+14−28
@@ -8,7 +8,7 @@ msgid ""
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-02-13 18:37+0000\n"
11+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -16,7 +16,6 @@ msgstr ""
16"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
17"Content-Type: text/plain; charset=CHARSET\n"
17"Content-Type: text/plain; charset=CHARSET\n"
18"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
19−"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\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
@@ -73,7 +72,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
72"phone<br><br>Tap on the screen to start"
74msgstr ""
73msgstr ""
75
74
76−#: qml/Components/PageHeader.qml:340
75+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
76msgid "Recent searches"
78msgstr ""
77msgstr ""
79
78
@@ -81,28 +80,19 @@ msgstr ""
81msgid "See more"
80msgid "See more"
82msgstr ""
81msgstr ""
83
82
84−#: qml/Components/SeeMore.qml:57
83+#: qml/Components/SeeMore.qml:58
85msgid "See less"
84msgid "See less"
86msgstr ""
85msgstr ""
87
86
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
87+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
88+msgid "Recent"
90msgstr ""
89msgstr ""
91
90
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
91+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
92#, qt-format
95−msgid "(%1)"
93+msgid "%1 Preview"
96msgstr ""
94msgstr ""
97
95
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
96#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
97msgid "More..."
108msgstr ""
98msgstr ""
@@ -111,20 +101,16 @@ msgstr ""
111msgid "Less..."
101msgid "Less..."
112msgstr ""
102msgstr ""
113
103
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
104+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
105+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
106msgstr ""
121
107
122−#: qml/Dash/Previews/Reviews.qml:86
108+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
109+msgid "Add a review"
124msgstr ""
110msgstr ""
125
111
126−#: qml/Dash/Previews/Reviews.qml:139
112+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
113+msgid "Send"
128msgstr ""
114msgstr ""
129
115
130#: qml/Greeter/Lockscreen.qml:149
116#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +158,7 @@ msgstr ""
172msgid "Search"
158msgid "Search"
173msgstr ""
159msgstr ""
174
160
175−#: qml/Shell.qml:440
161+#: qml/Shell.qml:417
176#, qt-format
162#, qt-format
177msgid "Please enter %1"
163msgid "Please enter %1"
178msgstr ""
164msgstr ""
po/vi.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/xh.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr ""
78msgstr ""
79
79
@@ -81,28 +81,19 @@ msgstr ""
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr ""
160msgstr ""
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/zh_CN.po+16−29
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "近期搜索"
78msgstr "近期搜索"
79
79
@@ -81,28 +81,19 @@ msgstr "近期搜索"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90msgstr ""
90msgstr ""
91
91
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
93−#: qml/Dash/Previews/Header.qml:93
94#, qt-format
93#, qt-format
95−msgid "(%1)"
94+msgid "%1 Preview"
96msgstr ""
95msgstr ""
97
96
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
99−#: qml/Dash/Previews/Header.qml:105
100−#, qt-format
101−msgid "%1 review"
102−msgid_plural "%1 reviews"
103−msgstr[0] ""
104−msgstr[1] ""
105−
106#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
107msgid "More..."
98msgid "More..."
108msgstr ""
99msgstr ""
@@ -111,20 +102,16 @@ msgstr ""
111msgid "Less..."
102msgid "Less..."
112msgstr ""
103msgstr ""
113
104
114−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
115−msgid "Add a review"
106+msgid "Rate this"
116−msgstr ""
117−
118−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
119−msgid "Send"
120msgstr ""
107msgstr ""
121
108
122−#: qml/Dash/Previews/Reviews.qml:86
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
123−msgid "Review"
110+msgid "Add a review"
124msgstr ""
111msgstr ""
125
112
126−#: qml/Dash/Previews/Reviews.qml:139
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
127−msgid "Comments:"
114+msgid "Send"
128msgstr ""
115msgstr ""
129
116
130#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
@@ -172,7 +159,7 @@ msgstr ""
172msgid "Search"
159msgid "Search"
173msgstr "搜索"
160msgstr "搜索"
174
161
175−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
176#, qt-format
163#, qt-format
177msgid "Please enter %1"
164msgid "Please enter %1"
178msgstr ""
165msgstr ""
po/zh_HK.po+33−30
@@ -7,7 +7,7 @@ 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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "最近的搜尋"
78msgstr "最近的搜尋"
79
79
@@ -81,26 +81,18 @@ msgstr "最近的搜尋"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "評價"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 評論"
95+msgstr ""
104
96
105#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
106msgid "More..."
98msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110msgid "Less..."
102msgid "Less..."
111msgstr ""
103msgstr ""
112
104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "評價"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114msgid "Add a review"
110msgid "Add a review"
115msgstr "新增評論"
111msgstr "新增評論"
116
112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118msgid "Send"
114msgid "Send"
119msgstr "傳送"
115msgstr "傳送"
120
116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "評論"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "評論:"
128−
129#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
130msgid "Emergency Call"
118msgid "Emergency Call"
131msgstr "緊急電話"
119msgstr "緊急電話"
@@ -171,7 +159,22 @@ msgstr ""
171msgid "Search"
159msgid "Search"
172msgstr "搜尋"
160msgstr "搜尋"
173
161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175#, qt-format
163#, qt-format
176msgid "Please enter %1"
164msgid "Please enter %1"
177msgstr "請輸入 %1"
165msgstr "請輸入 %1"
166+
167+#~ msgid "Comments:"
168+#~ msgstr "評論:"
169+
170+#~ msgid "Review"
171+#~ msgstr "評論"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 評論"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
po/zh_TW.po+33−30
@@ -7,7 +7,7 @@ msgid ""
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-02-13 18:37+0000\n"
10+"POT-Creation-Date: 2014-03-25 16:48+0100\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"
@@ -15,8 +15,8 @@ msgstr ""
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"
17"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
18+"X-Launchpad-Export-Date: 2014-03-28 06:49+0000\n"
19−"X-Generator: Launchpad (build 16963)\n"
19+"X-Generator: Launchpad (build 16967)\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -73,7 +73,7 @@ msgid ""
73"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
74msgstr ""
74msgstr ""
75
75
76−#: qml/Components/PageHeader.qml:340
76+#: qml/Components/PageHeader.qml:365
77msgid "Recent searches"
77msgid "Recent searches"
78msgstr "最近搜尋"
78msgstr "最近搜尋"
79
79
@@ -81,26 +81,18 @@ msgstr "最近搜尋"
81msgid "See more"
81msgid "See more"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/SeeMore.qml:57
84+#: qml/Components/SeeMore.qml:58
85msgid "See less"
85msgid "See less"
86msgstr ""
86msgstr ""
87
87
88−#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
88+#: qml/Dash/DashApps.qml:38
89−msgid "Rate this"
89+msgid "Recent"
90−msgstr "對此評比"
91−
92−#. TRANSLATORS: Number of persons who rated this app/video/whatever
93−#: qml/Dash/Previews/Header.qml:93
94−#, qt-format
95−msgid "(%1)"
96−msgstr "(%1)"
90+msgstr ""
97
91
98−#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
92+#: qml/Dash/PreviewListView.qml:52
99−#: qml/Dash/Previews/Header.qml:105
100#, qt-format
93#, qt-format
101−msgid "%1 review"
94+msgid "%1 Preview"
102−msgid_plural "%1 reviews"
103−msgstr[0] "%1 回覆"
95+msgstr ""
104
96
105#: qml/Dash/Previews/PreviewActionCombo.qml:34
97#: qml/Dash/Previews/PreviewActionCombo.qml:34
106msgid "More..."
98msgid "More..."
@@ -110,22 +102,18 @@ msgstr ""
110msgid "Less..."
102msgid "Less..."
111msgstr ""
103msgstr ""
112
104
113−#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
105+#: qml/Dash/Previews/PreviewRatingInput.qml:81
106+msgid "Rate this"
107+msgstr "對此評比"
108+
109+#: qml/Dash/Previews/PreviewRatingInput.qml:126
114msgid "Add a review"
110msgid "Add a review"
115msgstr "新增回覆"
111msgstr "新增回覆"
116
112
117−#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
113+#: qml/Dash/Previews/PreviewRatingInput.qml:166
118msgid "Send"
114msgid "Send"
119msgstr "發送"
115msgstr "發送"
120
116
121−#: qml/Dash/Previews/Reviews.qml:86
122−msgid "Review"
123−msgstr "回覆"
124−
125−#: qml/Dash/Previews/Reviews.qml:139
126−msgid "Comments:"
127−msgstr "備註:"
128−
129#: qml/Greeter/Lockscreen.qml:149
117#: qml/Greeter/Lockscreen.qml:149
130msgid "Emergency Call"
118msgid "Emergency Call"
131msgstr "緊急連絡"
119msgstr "緊急連絡"
@@ -171,7 +159,22 @@ msgstr ""
171msgid "Search"
159msgid "Search"
172msgstr "搜尋"
160msgstr "搜尋"
173
161
174−#: qml/Shell.qml:440
162+#: qml/Shell.qml:417
175#, qt-format
163#, qt-format
176msgid "Please enter %1"
164msgid "Please enter %1"
177msgstr ""
165msgstr ""
166+
167+#~ msgid "Comments:"
168+#~ msgstr "備註:"
169+
170+#~ msgid "Review"
171+#~ msgstr "回覆"
172+
173+#, qt-format
174+#~ msgid "%1 review"
175+#~ msgid_plural "%1 reviews"
176+#~ msgstr[0] "%1 回覆"
177+
178+#, qt-format
179+#~ msgid "(%1)"
180+#~ msgstr "(%1)"
qml/CMakeLists.txt+1−1
@@ -13,7 +13,7 @@ set(QML_DIRS
13 Hud
13 Hud
14 Panel
14 Panel
15 Launcher
15 Launcher
16− SideStage
16+ Stages
17 Notifications
17 Notifications
18 )
18 )
19
19
qml/Components/ApplicationManagerWrapper.qmldeleted−169
@@ -1,169 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Unity.Application 0.1
19−
20−Item {
21− id: root
22−
23− property alias mainStageApplications: mainStageModel
24− property alias sideStageApplications: sideStageModel
25− property variant mainStageFocusedApplication: null
26− property variant sideStageFocusedApplication: null
27− property bool sideStageEnabled: true
28− property bool keyboardVisible: ApplicationManager.keyboardVisible
29− property int keyboardHeight: ApplicationManager.keyboardHeight
30−
31− property bool fake: ApplicationManager.fake ? ApplicationManager.fake : false
32−
33− signal focusRequested(string appId)
34−
35− ApplicationsModelStageFiltered {
36− id: mainStageModel
37− stage: ApplicationInfo.MainStage
38− }
39−
40− ApplicationsModelStageFiltered {
41− id: sideStageModel
42− stage: ApplicationInfo.SideStage
43− }
44−
45− Connections {
46− target: ApplicationManager
47− onFocusedApplicationIdChanged: {
48− var app = ApplicationManager.findApplication(ApplicationManager.focusedApplicationId)
49− if (!app) { //nothing at all focused, so clear all
50− mainStageFocusedApplication = null;
51− sideStageFocusedApplication = null;
52− } else {
53− if (app.stage == ApplicationInfo.MainStage) {
54− mainStageFocusedApplication = app;
55− // possible the side stage app being unfocused fired this signal, so check for it
56− if (sideStageFocusedApplication && !sideStageFocusedApplication.focused)
57− sideStageFocusedApplication = null;
58− } else {
59− sideStageFocusedApplication = app;
60− // possible the main stage app being unfocused fired this signal, so check for it
61− if (mainStageFocusedApplication && !mainStageFocusedApplication.focused)
62− mainStageFocusedApplication = null;
63− }
64− }
65− }
66−
67− onFocusRequested: {
68− // if no side stage enabled, override application's stage parameter
69− var app = ApplicationManager.findApplication(appId);
70− if (app && app.stage === ApplicationInfo.SideStage && !sideStageEnabled) {
71− app.stage = ApplicationInfo.MainStage;
72− }
73−
74− root.focusRequested(appId);
75− }
76− }
77−
78− function activateApplication(desktopFile, argument) {
79− var appId;
80−
81− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
82− // TODO: convert entire shell to use appId only.
83− if (desktopFile.indexOf(".desktop") >= 0) {
84− appId = desktopFileToAppId(desktopFile);
85− } else {
86− appId = desktopFile;
87− }
88−
89− var application = ApplicationManager.findApplication(appId);
90− if (application !== null) {
91− return application;
92− }
93−
94− var execFlags = sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
95−
96− if (argument) {
97− return ApplicationManager.startApplication(appId, execFlags, [argument]);
98− } else {
99− return ApplicationManager.startApplication(appId, execFlags);
100− }
101− }
102−
103− function stopApplication(application) {
104− var appId;
105−
106− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
107− // TODO: convert entire shell to use appId only.
108− if (typeof application == "string") {
109− appId = application;
110− } else {
111− appId = desktopFileToAppId(application.desktopFile);
112− }
113−
114− ApplicationManager.stopApplication(appId);
115− }
116−
117− function focusApplication(application) {
118− if (application == null || application == undefined) {
119− return;
120− }
121−
122− ApplicationManager.focusApplication(application.appId);
123− }
124−
125− function unfocusCurrentApplication() {
126− ApplicationManager.unfocusCurrentApplication();
127− }
128−
129− function moveRunningApplicationStackPosition(from, to, stage) {
130− if (from == to || from < 0 || to < 0) return;
131−
132− if (stage == ApplicationInfo.SideStage) {
133− sideStageModel.move(from, to);
134− } else {
135− mainStageModel.move(from, to);
136− }
137− }
138−
139− function getApplicationFromDesktopFile(desktopFile, stage) {
140− var appId;
141−
142− // HACK: Applications identified sometimes with with appId, but mostly with desktopFile.
143− // TODO: convert entire shell to use appId only.
144− if (desktopFile.indexOf(".desktop") >= 0) {
145− appId = desktopFileToAppId(desktopFile);
146− } else {
147− appId = desktopFile;
148− }
149−
150− for (var i = 0, len = ApplicationManager.count; i < len; i++ ) {
151− var app = ApplicationManager.get(i);
152−
153− // if stage not specified, return whichever app running on either stage
154− if (app.appId == appId && (stage == undefined || app.stage == stage)) {
155− return app;
156− }
157− }
158− }
159−
160− function desktopFileToAppId(desktopFile) {
161− var right = desktopFile.lastIndexOf(".desktop");
162− var left = desktopFile.lastIndexOf("/");
163− if (left == -1 || right == -1 || left == right) {
164− console.log("ApplicationManagerWrapper: unable to extract appId from '" + desktopFile + "'");
165− return "";
166− }
167− return desktopFile.substring(left+1, right);
168− }
169−}
qml/Components/ApplicationScreenshot.qmldeleted−61
@@ -1,61 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Unity.Application 0.1
20−
21−Item {
22− id: applicationScreenshot
23−
24− property var application: null
25− property bool withBackground: false
26− property bool ready: applicationImage.ready || withBackground
27−
28− function setApplication(application) {
29− applicationScreenshot.application = application
30− }
31−
32− function clearApplication() {
33− applicationScreenshot.withBackground = false;
34− applicationScreenshot.application = null
35− applicationScreenshot.scheduleUpdate();
36− }
37−
38− function scheduleUpdate() {
39− applicationImage.scheduleUpdate()
40− }
41−
42− function updateFromCache() {
43− applicationImage.updateFromCache()
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "white" // FIXME should use normal background color of Suru theme
50− visible: applicationScreenshot.withBackground
51− }
52−
53− ApplicationImage {
54− id: applicationImage
55− objectName: "screenshot image"
56− width: applicationScreenshot.application ? parent.width : 0
57− height: applicationScreenshot.application ? parent.height : 0
58− visible: applicationScreenshot.application != null && ready
59− source: ApplicationManager.findApplication((application) ? application.appId : "")
60− }
61−}
qml/Components/ApplicationsModelStageFiltered.qmldeleted−49
@@ -1,49 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Utils 0.1
19−import Unity.Application 0.1
20−
21−SortFilterProxyModel {
22− id: root
23− property int stage
24−
25− function get(index) {
26− return model.get(mapRowToSource(index));
27− }
28−
29− function move(from, to) {
30− var realFrom = mapRowToSource(from);
31− if (realFrom == -1) {
32− console.log("ERROR; invalid from=" + from + " index in move operation");
33− return;
34− }
35− var realTo = mapRowToSource(to);
36− if (realTo == -1) {
37− // assuming wanting to move to end of list
38− realTo = model.count - 1;
39− }
40−
41− if (realFrom == realTo) return;
42− model.move(realFrom, realTo);
43− }
44−
45− model: ApplicationManager
46− dynamicSortFilter: true
47− filterRole: ApplicationManager.RoleStage
48− filterRegExp: RegExp(stage)
49−}
qml/Components/Carousel.qml+69−63
@@ -261,77 +261,83 @@ Item {
261 listView.gapToEndPhase,
261 listView.gapToEndPhase,
262 listView.translationXViewFactor)
262 listView.translationXViewFactor)
263
263
264+ delegate: tileWidth > 0 && tileHeight > 0 ? loaderComponent : undefined
265+
266+ Component {
267+ id: loaderComponent
268+
264− delegate: Loader {
269+ Loader {
265− property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
270+ property bool explicitlyScaled: explicitScaleFactor == carousel.selectedItemScaleFactor
266− property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
271+ property real explicitScaleFactor: explicitScale ? carousel.selectedItemScaleFactor : 1.0
267− readonly property bool explicitScale: (!listView.moving ||
272+ readonly property bool explicitScale: (!listView.moving ||
268− listView.realContentX <= 0 ||
273+ listView.realContentX <= 0 ||
269− listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
274+ listView.realContentX >= listView.realContentWidth - listView.realWidth) &&
270− listView.newContentX === listView.disabledNewContentX &&
275+ listView.newContentX === listView.disabledNewContentX &&
271− index === listView.selectedIndex
276+ index === listView.selectedIndex
272− readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
277+ readonly property real cachedTiles: listView.realPathItemCount + carousel.drawBuffer / listView.tileWidth
273− readonly property real distance: listView.continuousIndex - index
278+ readonly property real distance: listView.continuousIndex - index
274− readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
279+ readonly property real itemTranslationScale: CarouselJS.getItemScale(0.5,
275− (index + 0.5), // good approximation of scale while changing selected item
280+ (index + 0.5), // good approximation of scale while changing selected item
276− listView.count,
281+ listView.count,
277− listView.visibleTilesScaleFactor)
282+ listView.visibleTilesScaleFactor)
278− readonly property real itemScale: CarouselJS.getItemScale(distance,
283+ readonly property real itemScale: CarouselJS.getItemScale(distance,
279− listView.continuousIndex,
284+ listView.continuousIndex,
280− listView.count,
285+ listView.count,
281− listView.visibleTilesScaleFactor)
286+ listView.visibleTilesScaleFactor)
282− readonly property real translationX: CarouselJS.getItemTranslation(index,
287+ readonly property real translationX: CarouselJS.getItemTranslation(index,
283− listView.selectedIndex,
288+ listView.selectedIndex,
284− distance,
289+ distance,
285− itemScale,
290+ itemScale,
286− itemTranslationScale,
291+ itemTranslationScale,
287− listView.maximumItemTranslation)
292+ listView.maximumItemTranslation)
288−
293+
289− readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
294+ readonly property real xTransform: listView.viewTranslation + translationX * listView.scaleFactor
290− readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
295+ readonly property real center: x - listView.contentX + xTransform - drawBuffer + (width/2)
291−
296+
292− width: listView.tileWidth
297+ width: listView.tileWidth
293− height: listView.tileHeight
298+ height: listView.tileHeight
294− scale: itemScale * explicitScaleFactor
299+ scale: itemScale * explicitScaleFactor
295− sourceComponent: itemComponent
300+ sourceComponent: itemComponent
296− z: cachedTiles - Math.abs(index - listView.selectedIndex)
301+ z: cachedTiles - Math.abs(index - listView.selectedIndex)
297−
302+
298− transform: Translate {
303+ transform: Translate {
299− x: xTransform
304+ x: xTransform
300− }
305+ }
301
306
302− Behavior on explicitScaleFactor {
307+ Behavior on explicitScaleFactor {
303− SequentialAnimation {
308+ SequentialAnimation {
304− ScriptAction {
309+ ScriptAction {
305− script: if (!explicitScale)
310+ script: if (!explicitScale)
306− explicitlyScaled = false
311+ explicitlyScaled = false
307− }
312+ }
308− NumberAnimation {
313+ NumberAnimation {
309− duration: explicitScaleFactor === 1.0 ? 250 : 150
314+ duration: explicitScaleFactor === 1.0 ? 250 : 150
310− easing.type: Easing.InOutQuad
315+ easing.type: Easing.InOutQuad
311− }
316+ }
312− ScriptAction {
317+ ScriptAction {
313− script: if (explicitScale)
318+ script: if (explicitScale)
314− explicitlyScaled = true
319+ explicitlyScaled = true
320+ }
315 }
321 }
316 }
322 }
317− }
318
323
319− onLoaded: {
324+ onLoaded: {
320− item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
325+ item.explicitlyScaled = Qt.binding(function() { return explicitlyScaled; })
321− item.model = Qt.binding(function() { return model; })
326+ item.model = Qt.binding(function() { return model; })
322− }
327+ }
323
328
324− MouseArea {
329+ MouseArea {
325− id: mouseArea
330+ id: mouseArea
326
331
327− anchors.fill: parent
332+ anchors.fill: parent
328
333
329− onClicked: {
334+ onClicked: {
330− listView.itemClicked(index, item)
335+ listView.itemClicked(index, item)
331− }
336+ }
332
337
333− onPressAndHold: {
338+ onPressAndHold: {
334− listView.itemPressAndHold(index, item)
339+ listView.itemPressAndHold(index, item)
340+ }
335 }
341 }
336 }
342 }
337 }
343 }
qml/Components/LazyImage.qml+2−2
@@ -99,10 +99,10 @@ Item {
99 horizontalAlignment: Image.AlignHCenter
99 horizontalAlignment: Image.AlignHCenter
100 verticalAlignment: Image.AlignVCenter
100 verticalAlignment: Image.AlignVCenter
101 sourceSize.width: root.scaleTo == "width" ? root.width
101 sourceSize.width: root.scaleTo == "width" ? root.width
102− : root.scaleTo == "fit" && root.width < root.height ? root.width
102+ : root.scaleTo == "fit" && root.width <= root.height ? root.width
103 : 0
103 : 0
104 sourceSize.height: root.scaleTo == "height" ? root.height
104 sourceSize.height: root.scaleTo == "height" ? root.height
105− : root.scale == "fit" && root.height < root.width ? root.height
105+ : root.scaleTo == "fit" && root.height <= root.width ? root.height
106 : 0
106 : 0
107 }
107 }
108 }
108 }
qml/Components/ListItems/Header.qml+2−14
@@ -36,7 +36,7 @@ Item {
36 right: parent.right
36 right: parent.right
37 rightMargin: units.gu(0.5)
37 rightMargin: units.gu(0.5)
38 top: parent.top
38 top: parent.top
39− bottom: bottomBorder.top
39+ bottom: parent.bottom
40 }
40 }
41
41
42 Label {
42 Label {
@@ -47,14 +47,11 @@ Item {
47 verticalCenter: parent.verticalCenter
47 verticalCenter: parent.verticalCenter
48 }
48 }
49
49
50− color: Theme.palette.selected.backgroundText //at 60%
50+ color: "grey" // TODO karni: Update Ubuntu.Compoonents.Themes.Palette.
51− opacity: 0.6
52 font.family: "Ubuntu"
51 font.family: "Ubuntu"
53 fontSize: "medium"
52 fontSize: "medium"
54 elide: Text.ElideRight
53 elide: Text.ElideRight
55 textFormat: Text.PlainText
54 textFormat: Text.PlainText
56− style: Text.Raised
57− styleColor: "black"
58 width: parent.width - image.width - image.leftMargin - anchors.leftMargin
55 width: parent.width - image.width - image.leftMargin - anchors.leftMargin
59 }
56 }
60
57
@@ -68,15 +65,6 @@ Item {
68 }
65 }
69 }
66 }
70
67
71− ThinDivider {
72− id: bottomBorder
73− anchors {
74− left: parent.left
75− right: parent.right
76− bottom: parent.bottom
77− }
78− }
79−
80 MouseArea {
68 MouseArea {
81 anchors.fill: parent
69 anchors.fill: parent
82 onClicked: parent.clicked(mouse)
70 onClicked: parent.clicked(mouse)
qml/Components/OpenEffect.qmldeleted−138
@@ -1,138 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−Item {
20− id: effect
21− property bool enabled: topGapPx != positionPx || bottomGapPx != positionPx
22− property alias live: effectSource.live
23− property Item sourceItem
24− property ShaderEffectSource source: ShaderEffectSource {
25− id: effectSource
26− sourceItem: effect.enabled ? effect.sourceItem : null
27− hideSource: effect.enabled
28− live: false
29− sourceRect: {
30− if (effect.enabled) {
31− Qt.rect(0, -effect.topOverflow, sourceItem.width, sourceItem.height + effect.topOverflow + effect.bottomOverflow)
32− } else {
33− Qt.rect(0, 0, 0, 0)
34− }
35− }
36− }
37−
38− onEnabledChanged: if (!live && enabled) scheduleUpdate()
39−
40− /*!
41− \qmlproperty real positionPx
42− The y coordinate of where to perform the split.
43−
44− \qmlproperty real topGapPx
45− Gap's top edge.
46−
47− \qmlproperty real bottomGapPx
48− Gap's bottom edge.
49−
50− \qmlproperty real topOverflow
51− How much of the sourceItem should be sourced above its bounds.
52−
53− \qmlproperty real bottomOverflow
54− How much of the sourceItem should be sourced below its bounds.
55− */
56−
57− property real positionPx: 0
58− property real topGapPx: 0
59− property real bottomGapPx: height
60− property real topOverflow: 0.0
61− property real bottomOverflow: 0.0
62− property real topOpacity: 1.0
63− property real bottomOpacity: 1.0
64−
65− property real __roundedPositionPx: Math.round(positionPx)
66−
67− function scheduleUpdate() {
68− source.scheduleUpdate();
69− }
70−
71− ShaderEffect {
72− id: top
73− visible: effect.enabled
74− opacity: topOpacity
75− property ShaderEffectSource source: effect.source
76− property real positionPx: __roundedPositionPx
77− property real factor: effect.height / height
78−
79− clip: true
80−
81− anchors {
82− top: parent.top
83− left: parent.left
84− right: parent.right
85− topMargin: -topOverflow - positionPx + topGapPx
86− }
87− height: topOverflow + positionPx
88−
89− vertexShader: "
90− uniform highp mat4 qt_Matrix;
91− attribute highp vec4 qt_Vertex;
92− attribute highp vec2 qt_MultiTexCoord0;
93− varying highp vec2 qt_TexCoord0;
94− uniform highp float factor;
95−
96− void main() {
97− highp vec4 pos = qt_Vertex;
98− pos.y *= factor;
99− gl_Position = qt_Matrix * pos;
100− qt_TexCoord0 = qt_MultiTexCoord0;
101− }
102− "
103− }
104−
105− ShaderEffect {
106− id: bottom
107− visible: effect.enabled
108− opacity: bottomOpacity
109− property ShaderEffectSource source: effect.source
110− property real offset: effect.topOverflow + __roundedPositionPx
111− property real factor: effect.height / height
112−
113− clip: true
114−
115− anchors {
116− left: parent.left
117− right: parent.right
118− }
119− y: topOverflow + bottomGapPx
120− height: sourceItem.height - positionPx + bottomOverflow
121−
122− vertexShader: "
123− uniform highp mat4 qt_Matrix;
124− attribute highp vec4 qt_Vertex;
125− attribute highp vec2 qt_MultiTexCoord0;
126− varying highp vec2 qt_TexCoord0;
127− uniform highp float factor;
128− uniform highp float offset;
129−
130− void main() {
131− highp vec4 pos = qt_Vertex;
132− pos.y = (pos.y * factor) - offset;
133− gl_Position = qt_Matrix * pos;
134− qt_TexCoord0 = qt_MultiTexCoord0;
135− }
136− "
137− }
138−}
qml/Components/PageHeader.qml+27−2
@@ -18,7 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Ubuntu.Components.Popups 0.1
19import Ubuntu.Components.Popups 0.1
20import Ubuntu.Components.ListItems 0.1 as ListItem
20import Ubuntu.Components.ListItems 0.1 as ListItem
21−import Unity 0.1
21+import Unity 0.2
22
22
23Item {
23Item {
24 id: root
24 id: root
@@ -27,6 +27,9 @@ Item {
27 property ListModel searchHistory
27 property ListModel searchHistory
28 property Scope scope
28 property Scope scope
29 property alias childItem: itemContainer.children
29 property alias childItem: itemContainer.children
30+ property alias showBackButton: backButton.visible
31+
32+ signal backClicked
30
33
31 height: units.gu(8.5)
34 height: units.gu(8.5)
32 implicitHeight: units.gu(8.5)
35 implicitHeight: units.gu(8.5)
@@ -69,11 +72,33 @@ Item {
69
72
70 Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } }
73 Behavior on contentY { NumberAnimation { duration: 200; easing.type: Easing.OutQuad } }
71
74
75+ AbstractButton {
76+ id: backButton
77+ objectName: root.objectName + "_backButton"
78+ visible: false
79+ height: header.height
80+ y: header.contentY
81+ anchors {
82+ left: parent.left
83+ leftMargin: visible ? units.gu(2) : 0
84+ }
85+ width: visible ? image.width + units.gu(2) : 0
86+ onClicked: root.backClicked();
87+ Image {
88+ id: image
89+ anchors.centerIn: parent
90+ source: "graphics/headerback.png"
91+ }
92+ }
93+
72 // FIXME this could potentially be simplified to avoid all the containers
94 // FIXME this could potentially be simplified to avoid all the containers
73 Item {
95 Item {
74 id: headerContainer
96 id: headerContainer
75
97
76− width: parent.width
98+ anchors {
99+ left: backButton.right
100+ right: parent.right
101+ }
77 height: childrenRect.height
102 height: childrenRect.height
78
103
79 Item {
104 Item {
qml/Components/RatingStars.qmldeleted−41
@@ -1,41 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−
19−Row {
20− id: root
21− property int rating
22− property int maximumRating: 5
23− property int starCount: 5
24− height: childrenRect.height
25− width: childrenRect.width
26−
27− readonly property int effectiveRating: Math.max(0, Math.min(root.starCount * root.rating / root.maximumRating, root.maximumRating))
28−
29− Repeater {
30− model: root.effectiveRating
31− Image {
32− source: "graphics/icon_star_on.png"
33− }
34− }
35− Repeater {
36− model: root.starCount - root.effectiveRating
37− Image {
38− source: "graphics/icon_star_off.png"
39− }
40− }
41−}
qml/Components/ResponsiveFlowView.qml+3−10
@@ -27,9 +27,8 @@ Item {
27 property alias verticalSpacing: flow.verticalSpacing
27 property alias verticalSpacing: flow.verticalSpacing
28 property alias horizontalSpacing: flow.horizontalSpacing
28 property alias horizontalSpacing: flow.horizontalSpacing
29 property int referenceDelegateWidth
29 property int referenceDelegateWidth
30− property alias firstModel: repeater1.model
30+ property alias model: repeater.model
31− property alias secondModel: repeater2.model
32− property alias delegate: repeater1.delegate
31+ property alias delegate: repeater.delegate
33 readonly property int cellWidth: referenceDelegateWidth + horizontalSpacing
32 readonly property int cellWidth: referenceDelegateWidth + horizontalSpacing
34 readonly property int cellHeight: referenceDelegateWidth + verticalSpacing
33 readonly property int cellHeight: referenceDelegateWidth + verticalSpacing
35 property alias move: flow.move
34 property alias move: flow.move
@@ -69,13 +68,7 @@ Item {
69 property int margin: allocatableVerticalSpace - columns * horizontalSpacing
68 property int margin: allocatableVerticalSpace - columns * horizontalSpacing
70
69
71 Repeater {
70 Repeater {
72− id: repeater1
71+ id: repeater
73− model: (root.model) ? root.model[0] : null
74− }
75− Repeater {
76− id: repeater2
77− model: (root.model) ? root.model[1] : null
78− delegate: repeater1.delegate
79 }
72 }
80 }
73 }
81}
74}
qml/Components/ResponsiveGridView.qml−1
@@ -56,7 +56,6 @@ Item {
56 fill: parent
56 fill: parent
57 leftMargin: margin/2
57 leftMargin: margin/2
58 rightMargin: margin/2
58 rightMargin: margin/2
59− topMargin: verticalSpacing
60 }
59 }
61 clip: parent.height != totalContentHeight
60 clip: parent.height != totalContentHeight
62
61
qml/Components/SeeMore.qml+4−2
@@ -34,7 +34,8 @@ Item {
34 objectName: "seeMoreLabel"
34 objectName: "seeMoreLabel"
35 text: i18n.tr("See more")
35 text: i18n.tr("See more")
36 opacity: !more ? 0.8 : 0.4
36 opacity: !more ? 0.8 : 0.4
37+ // TODO: Fix requiring Palette update
37− color: Theme.palette.selected.backgroundText
38+ color: "grey" //Theme.palette.selected.backgroundText
38 font.weight: Font.Bold
39 font.weight: Font.Bold
39
40
40 MouseArea {
41 MouseArea {
@@ -56,7 +57,8 @@ Item {
56 objectName: "seeLessLabel"
57 objectName: "seeLessLabel"
57 text: i18n.tr("See less")
58 text: i18n.tr("See less")
58 opacity: more ? 0.8 : 0.4
59 opacity: more ? 0.8 : 0.4
60+ // TODO: Fix requiring Palette update
59− color: Theme.palette.selected.backgroundText
61+ color: "grey" //Theme.palette.selected.backgroundText
60 font.weight: Font.Bold
62 font.weight: Font.Bold
61
63
62 MouseArea {
64 MouseArea {
qml/Components/Stage.qmldeleted−563
@@ -1,563 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import Ubuntu.Gestures 0.1
21−
22−/*
23− Responsible for application switching.
24−
25− Drag from the right edge to switch to the next application.
26− While being dragged, this component will show an animation for the user to
27− visualize that he's changing the stacking of applications (next/new app comes from
28− right edge and current/old app fades out).
29− */
30−Showable {
31− id: stage
32−
33− width: units.gu(40)
34− height: units.gu(71)
35−
36− property int type: ApplicationInfo.MainStage
37− property var applicationManager
38− readonly property var applications:
39− type == ApplicationInfo.MainStage ? applicationManager.mainStageApplications
40− : applicationManager.sideStageApplications
41− property bool fullyShown: false
42− property bool fullyHidden: true
43− readonly property var focusedApplication:
44− type == ApplicationInfo.MainStage ? applicationManager.mainStageFocusedApplication
45− : applicationManager.sideStageFocusedApplication
46− property bool shouldUseScreenshots: true
47−
48− /* Will be true whenever application screenshots are being shown.
49− i.e. during application window transitions */
50− readonly property bool usingScreenshots: {
51− if (newApplicationScreenshot.application != null && oldApplicationScreenshot.application != null) {
52− return newApplicationScreenshot.ready && oldApplicationScreenshot.ready;
53− } else {
54− return newApplicationScreenshot.ready || oldApplicationScreenshot.ready;
55− }
56− }
57−
58− property bool rightEdgeEnabled: true
59− property bool switchingFromFullscreenToFullscreen: false
60−
61− property alias rightEdgeDraggingAreaWidth: rightEdgeDraggingArea.width
62−
63− // Y coordinate for non-fullscreen applications
64− property int normalApplicationY: 0
65−
66− function activateApplication(desktopFile, addDelay) {
67− var application = applicationManager.getApplicationFromDesktopFile(desktopFile, stage.type);
68− if (application != null && application == stage.focusedApplication) {
69− stage.show();
70− return;
71− }
72−
73− showStartingApplicationAnimation.prepare(application);
74− if (!stage.fullyShown) {
75− // if launching this app reveals the stage, make new application screenshot visible
76− newApplicationScreenshot.visible = true;
77− stage.show();
78− } else {
79− showStartingApplicationAnimation.start();
80− }
81−
82− if (addDelay) {
83− stage.__startingApplicationDesktopFile = desktopFile;
84− }
85− }
86−
87− Connections {
88− target: applicationManager
89− onFocusRequested: activateApplication(appId)
90− }
91−
92− /* Keep a reference to the focused application so that we can safely
93− unfocus it when the stage is not fully shown and refocus it when the stage
94− is fully shown again.
95− */
96− property var focusedApplicationWhenUsingScreenshots
97− onShouldUseScreenshotsChanged: {
98− if (showStartingApplicationAnimation.running || switchToApplicationAnimation.running) {
99− return;
100− }
101−
102− if (shouldUseScreenshots) {
103− stage.__focusApplicationUsingScreenshots(stage.focusedApplication);
104− } else {
105− if (stage.focusedApplicationWhenUsingScreenshots) {
106− stage.__focusActualApplication(stage.focusedApplicationWhenUsingScreenshots);
107− }
108− }
109− }
110−
111−
112− property Item newApplicationScreenshot: ApplicationScreenshot {
113− parent: stage
114− width: stage.width
115− height: stage.height - y
116− }
117− property Item oldApplicationScreenshot: ApplicationScreenshot {
118− parent: stage
119− width: stage.width
120− height: stage.height - y
121− }
122−
123− function __getApplicationIndex(application) {
124− if (!application)
125− return -1
126− for (var i = 0; i < stage.applications.count; i++ ) {
127− if (stage.applications.get(i).desktopFile == application.desktopFile) {
128− return i
129− }
130− }
131− return -1
132− }
133−
134−
135− property string __startingApplicationDesktopFile
136−
137− Timer {
138− id: delayedHideScreenshots
139− interval: 500 // on Galaxy Nexus, Telephony app is slowest application to draw a frame so needs this delay
140− onTriggered: {
141− __hideScreenshots();
142− }
143− }
144−
145− function __hideScreenshots() {
146− newApplicationScreenshot.clearApplication();
147− oldApplicationScreenshot.clearApplication();
148− newApplicationScreenshot.visible = false;
149− oldApplicationScreenshot.visible = false;
150− }
151−
152− function __focusApplication(application) {
153− if (!application) return
154− if (shouldUseScreenshots) {
155− stage.__focusApplicationUsingScreenshots(application);
156− } else {
157− stage.__focusActualApplication(application);
158− }
159− }
160−
161−
162− function __focusActualApplication(application) {
163− if (application == null) {
164− return;
165− }
166−
167− if (stage.focusedApplication == application) {
168− /* FIXME: this case is reached when showing the sidestage, we
169− need to refocus the side stage app in order to show it.
170− FIXME: this case is reached when doing a right edge swipe
171− while in the dash to bring back the stage.
172− FIXME: this case is reached when showStartingApplicationAnimation
173− finishes after the newly started application has been focused
174− automatically by the ApplicationManager.
175− */
176− if (stage.type == ApplicationInfo.SideStage) {
177− applicationManager.focusApplication(application);
178− }
179− if (!delayedHideScreenshots.running) {
180− stage.__hideScreenshots();
181− }
182− } else {
183− /* FIXME: calling ApplicationManager::focusApplication does not focus
184− the application immediately nor show the application's surface
185− immediately. Delay hiding the screenshots until it has done so.
186− */
187− delayedHideScreenshots.stop();
188− applicationManager.focusApplication(application);
189− }
190− stage.focusedApplicationWhenUsingScreenshots = null;
191− }
192−
193− function __focusApplicationUsingScreenshots(application) {
194− delayedHideScreenshots.stop();
195− if (application == null) {
196− return;
197− }
198−
199− if (newApplicationScreenshot.application != null) {
200− stage.focusedApplicationWhenUsingScreenshots = application;
201− return;
202− }
203−
204− newApplicationScreenshot.setApplication(application);
205− newApplicationScreenshot.scheduleUpdate();
206− newApplicationScreenshot.opacity = 1.0;
207− newApplicationScreenshot.x = 0.0;
208− newApplicationScreenshot.y = __getApplicationY(application);
209− newApplicationScreenshot.scale = 1.0;
210− newApplicationScreenshot.visible = true;
211− stage.focusedApplicationWhenUsingScreenshots = application;
212− stage.switchingFromFullscreenToFullscreen = false;
213− }
214−
215− function __getApplicationY(application) {
216− return Qt.binding( function(){
217− return (application && application.fullscreen
218− && application.stage !== ApplicationInfo.SideStage)
219− ? 0 : normalApplicationY;
220− } )
221− }
222−
223− /* FIXME: should hide the screenshots when the focused application's surface
224− is visible. There is no API in QtUbuntu to support that yet.
225− */
226− Connections {
227− target: stage
228− onFocusedApplicationChanged: {
229− if (stage.focusedApplication != null) {
230− /* Move application to the beginning of the list of running applications */
231− var index = stage.__getApplicationIndex(stage.focusedApplication);
232− applicationManager.moveRunningApplicationStackPosition(index, 0, stage.type);
233−
234− var startingApplication = applicationManager.getApplicationFromDesktopFile(
235− stage.__startingApplicationDesktopFile, stage.type);
236−
237− if (stage.focusedApplication == startingApplication) {
238− stage.__startingApplicationDesktopFile = "";
239−
240− /* Screenshots might still be in use at this point and their
241− use can be stopped before delayedHideScreenshots is complete.
242− Prepare for that case by setting appropriately
243− stage.focusedApplicationWhenUsingScreenshots.
244− */
245− stage.focusedApplicationWhenUsingScreenshots = stage.focusedApplication;
246−
247− /* FIXME: should hide the screenshots when the focused application's window
248− is visible. There is no API in qtubuntu to support that yet. Therefore
249− we delay their hiding to avoid a state where neither the screenshot nor
250− the application's window is visible.
251− */
252− delayedHideScreenshots.start();
253− } else {
254− stage.focusedApplicationWhenUsingScreenshots = null;
255− stage.__hideScreenshots();
256− }
257− }
258− }
259− }
260−
261− Connections {
262− target: stage.applications
263− onCountChanged: { __discardObsoleteScreenshots(); }
264− ignoreUnknownSignals: true
265− }
266− onFullyHiddenChanged: { __discardObsoleteScreenshots(); }
267− function __discardObsoleteScreenshots() {
268− if (stage.fullyHidden && stage.applications && stage.applications.count == 0) {
269− stage.focusedApplicationWhenUsingScreenshots = undefined;
270− stage.__hideScreenshots();
271− }
272− }
273−
274−
275− SequentialAnimation {
276− id: showStartingApplicationAnimation
277−
278− function prepare(newApplication) {
279− var oldApplication = stage.focusedApplication;
280− newApplicationScreenshot.setApplication(newApplication);
281− newApplicationScreenshot.updateFromCache();
282− oldApplicationScreenshot.setApplication(oldApplication);
283− oldApplicationScreenshot.scheduleUpdate();
284− newApplicationScreenshot.withBackground = true; // FIXME: should be withBackground = newApplication.state == Application.Starting
285− newApplicationScreenshot.y = __getApplicationY(newApplication);
286− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
287− stage.focusedApplicationWhenUsingScreenshots = newApplication;
288− stage.switchingFromFullscreenToFullscreen = false;
289− }
290−
291− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
292− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
293− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 0}
294− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 1}
295− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 0.8}
296− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
297− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 0.0}
298− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
299− PropertyAction {target: newApplicationScreenshot; property: "x"; value: 0.0}
300− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
301−
302− ParallelAnimation {
303− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
304− NumberAnimation {
305− target: newApplicationScreenshot
306− property: "scale"
307− duration: 500
308− easing.type: Easing.OutQuad
309− to: 1.0
310− }
311− NumberAnimation {
312− target: newApplicationScreenshot
313− property: "opacity"
314− duration: 500
315− easing.type: Easing.OutQuad
316− to: 1.0
317− }
318−
319− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
320−
321− NumberAnimation {
322− target: oldApplicationScreenshot
323− property: "x"
324− duration: 400
325− easing.type: Easing.OutQuad
326− to: stage.width
327− }
328− }
329−
330− ScriptAction {
331− script: {
332− if (!stage.focusedApplicationWhenUsingScreenshots) {
333− // FIXME: only here to support case where application does
334− // not exist yet but is about to
335− return;
336− }
337−
338− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
339− }
340− }
341− }
342−
343−
344− SequentialAnimation {
345− id: switchToApplicationAnimation
346−
347− function prepare(newApplication) {
348− var oldApplication = stage.focusedApplication;
349− newApplicationScreenshot.setApplication(newApplication);
350− newApplicationScreenshot.updateFromCache();
351− oldApplicationScreenshot.setApplication(oldApplication);
352− oldApplicationScreenshot.scheduleUpdate();
353− newApplicationScreenshot.withBackground = false;
354− newApplicationScreenshot.y = __getApplicationY(newApplication);
355− oldApplicationScreenshot.y = __getApplicationY(oldApplication);
356− stage.focusedApplicationWhenUsingScreenshots = newApplication;
357− stage.switchingFromFullscreenToFullscreen = newApplication && newApplication.fullscreen;
358− }
359−
360− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: false}
361− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: false}
362− PropertyAction {target: newApplicationScreenshot; property: "z"; value: 1}
363− PropertyAction {target: oldApplicationScreenshot; property: "z"; value: 0}
364− PropertyAction {target: newApplicationScreenshot; property: "scale"; value: 1.0}
365− PropertyAction {target: oldApplicationScreenshot; property: "scale"; value: 1.0}
366− PropertyAction {target: newApplicationScreenshot; property: "opacity"; value: 1.0}
367− PropertyAction {target: oldApplicationScreenshot; property: "opacity"; value: 1.0}
368− PropertyAction {target: newApplicationScreenshot; property: "x"; value: stage.width}
369− PropertyAction {target: oldApplicationScreenshot; property: "x"; value: 0.0}
370− PropertyAction {target: newApplicationScreenshot; property: "visible"; value: true}
371− PropertyAction {target: oldApplicationScreenshot; property: "visible"; value: true}
372−
373− ParallelAnimation {
374− NumberAnimation {
375− target: oldApplicationScreenshot
376− property: "scale"
377− duration: 500
378− easing.type: Easing.OutQuad
379− to: 0.8
380− }
381− NumberAnimation {
382− target: oldApplicationScreenshot
383− property: "opacity"
384− duration: 500
385− easing.type: Easing.OutQuad
386− to: 0.0
387− }
388−
389− NumberAnimation {
390− target: newApplicationScreenshot
391− property: "x"
392− duration: 500
393− easing.type: Easing.OutQuad
394− to: 0
395− }
396− }
397−
398− ScriptAction {
399− script: {
400− // move previously focused application to the end of the list of running applications
401− var oldApplication = oldApplicationScreenshot.application;
402− if (oldApplication != null) {
403− var oldApplicationIndex = stage.__getApplicationIndex(oldApplicationScreenshot.application);
404− applicationManager.moveRunningApplicationStackPosition(
405− oldApplicationIndex, stage.applications.count - 1, stage.type);
406− }
407−
408− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
409− }
410− }
411− }
412−
413−
414− function __dragValueToProgress(dragValue, startValue, applicationsCount) {
415− if (applicationsCount == 0) {
416− return 0;
417− } else if (applicationsCount == 1) {
418− // prevent the current app from moving more than 1/4 of the screen
419− var elasticValue = __elastic(dragValue, startValue/4);
420− return elasticValue / startValue;
421− } else {
422− return dragValue / startValue;
423− }
424− }
425−
426− function __elastic(x, limit) {
427− return limit * ( 1 - Math.pow( ( limit - 1 ) / limit, x ) )
428− }
429−
430− property real __startValue: stage.width
431−
432− AnimationControllerWithSignals {
433− id: switchToApplicationAnimationController
434−
435− onAnimationCompletedAtBeginning: {
436− animation = null;
437− stage.__focusApplication(oldApplicationScreenshot.application);
438− }
439− }
440−
441− EdgeDragEvaluator {
442− id: dragEvaluator
443− trackedPosition: rightEdgeDraggingArea.touchX
444− direction: rightEdgeDraggingArea.direction
445− maxDragDistance: stage.width
446− }
447−
448− EdgeDragArea {
449− id: rightEdgeDraggingArea
450−
451− enabled: {
452− if (status == DirectionalDragArea.WaitingForTouch) {
453− return switchToApplicationAnimationController.completed
454− && stage.applications.count > 0 && stage.rightEdgeEnabled
455− && !delayedHideScreenshots.running
456− } else {
457− return true
458− }
459− }
460− width: units.gu(2)
461− anchors.top: parent.top
462− anchors.bottom: parent.bottom
463− anchors.right: parent.right
464−
465− direction: Direction.Leftwards
466−
467− onDistanceChanged: {
468− if (status !== DirectionalDragArea.Recognized)
469− return
470−
471− var targetProgress = __dragValueToProgress(-distance, __startValue,
472− stage.applications.count)
473− var delta = targetProgress - switchToApplicationAnimationController.progress
474−
475− // When the gesture finally gets recognized, the finger will likely be
476− // reasonably far from the edge. If we made the progress immediately
477− // follow the finger position it would be visually unpleasant as there
478− // would be a jump to meet the finger's current position.
479− //
480− // The trick is not to go all the way (1.0) as it would cause the
481− // aforementioned jump.
482− switchToApplicationAnimationController.progress += 0.4 * delta
483− }
484−
485− property int lastStatus: -1
486−
487− onStatusChanged: {
488− if (status == DirectionalDragArea.Undecided) {
489− onUndecided();
490− } else if (status == DirectionalDragArea.WaitingForTouch) {
491− if (lastStatus == DirectionalDragArea.Undecided) {
492− // got rejected
493− switchToApplicationAnimationController.completeToBeginningWithSignal();
494− } else {
495− onGestureEnded();
496− }
497− }
498− lastStatus = status;
499− }
500−
501− function onUndecided() {
502− dragEvaluator.reset();
503−
504− var nextApplication = null;
505− if (stage.applications.count > 1) {
506− nextApplication = stage.applications.get(1);
507− }
508− switchToApplicationAnimationController.progress = 0
509− switchToApplicationAnimation.prepare(nextApplication);
510− switchToApplicationAnimationController.animation = switchToApplicationAnimation;
511−
512− }
513−
514− function onGestureEnded() {
515− if (stage.applications.count > 1 && dragEvaluator.shouldAutoComplete()) {
516− switchToApplicationAnimationController.completeToEndWithSignal();
517− } else {
518− switchToApplicationAnimationController.completeToBeginningWithSignal();
519− }
520− }
521− }
522−
523−
524− // FIXME: very bad hack to detect when an application was closed or crashed
525− property var __previouslyFocusedApplication
526− Connections {
527− target: stage
528− onFocusedApplicationChanged: {
529− if (stage.focusedApplication == null
530− && __getApplicationIndex(stage.__previouslyFocusedApplication) == -1) {
531− stage.__onFocusedApplicationClosed();
532− }
533− stage.__previouslyFocusedApplication = stage.focusedApplication;
534− }
535− }
536−
537− function __onFocusedApplicationClosed() {
538− if (!stage.shown) {
539− return;
540− }
541−
542− if (stage.applications.count > 0) {
543− // Do not change the focused application from within onFocusedApplicationChanged.
544− // This causes binding loop warnings besides being a bad practice in general
545− // (setting a property from within its "changed" signal handling)
546− // Hence the timer.
547− focusTopmostAppTimer.start();
548− } else {
549− stage.hide();
550− }
551− }
552−
553− Timer {
554− id: focusTopmostAppTimer
555− interval: 1; repeat: false
556− onTriggered: {
557− if (stage.applications.count > 0) {
558− stage.__focusApplication(stage.applications.get(0));
559− }
560− }
561− }
562−
563−}
qml/Components/Tile.qmldeleted−39
@@ -1,39 +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−AbstractButton {
21− property url source
22− property int fillMode: Image.PreserveAspectCrop
23− property int horizontalAlignment: Text.AlignHCenter
24− property string text
25− property int imageWidth
26− property int imageHeight
27− property int maximumLineCount: 1
28−
29− readonly property int center: (index % GridView.view.columns * width) + (width / 2)
30−
31− opacity: GridView.view.highlightIndex === -1 ? 1 :
32− GridView.view.highlightIndex === index ? 0.6 : 0.2
33−
34− Behavior on opacity {
35− UbuntuNumberAnimation {}
36− }
37−
38− style: TileStyle {}
39−}
qml/Components/TileStyle.qmldeleted−81
@@ -1,81 +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: tile
22−
23− anchors.fill: parent
24−
25− UbuntuShape {
26− id: icon
27− anchors {
28− top: parent.top
29− horizontalCenter: parent.horizontalCenter
30− }
31− radius: "medium"
32− width: styledItem.imageWidth
33− height: styledItem.imageHeight
34− image: Image {
35− id: image
36− objectName: "image"
37− sourceSize { width: icon.width; height: icon.height }
38− asynchronous: true
39− cache: false
40− source: styledItem.source
41− fillMode: styledItem.fillMode
42− horizontalAlignment: Image.AlignHCenter
43− verticalAlignment: Image.AlignVCenter
44− }
45− }
46−
47− UbuntuShape {
48− id: borderPressed
49− objectName: "borderPressed"
50−
51− anchors.fill: icon
52− radius: "medium"
53− borderSource: "radius_pressed.sci"
54− opacity: styledItem.pressed ? 1.0 : 0.0
55− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
56− }
57−
58− Label {
59− id: label
60− objectName: "label"
61− anchors {
62− baseline: icon.bottom
63− baselineOffset: units.gu(2)
64− left: parent.left
65− right: parent.right
66− leftMargin: units.gu(1)
67− rightMargin: units.gu(1)
68− }
69−
70− color: Theme.palette.selected.backgroundText
71− opacity: 0.9
72− style: Text.Raised
73− styleColor: "black"
74− fontSize: "small"
75− elide: Text.ElideMiddle
76− horizontalAlignment: styledItem.horizontalAlignment
77− text: styledItem.text
78− wrapMode: Text.Wrap
79− maximumLineCount: styledItem.maximumLineCount
80− }
81−}
qml/Components/VolumeControl.qml+6−2
@@ -22,6 +22,10 @@ Item {
22 objectName: "volumeControl"
22 objectName: "volumeControl"
23 visible: false
23 visible: false
24
24
25+ // TODO Work around http://pad.lv/1293478 until qmenumodel knows to cast
26+ readonly property int stepUp: 1
27+ readonly property int stepDown: -1
28+
25 QDBusActionGroup {
29 QDBusActionGroup {
26 id: actionGroup
30 id: actionGroup
27 busType: 1
31 busType: 1
@@ -32,11 +36,11 @@ Item {
32 }
36 }
33
37
34 function volumeUp() {
38 function volumeUp() {
35− actionGroup.actionObject.activate(1);
39+ actionGroup.actionObject.activate(stepUp);
36 }
40 }
37
41
38 function volumeDown() {
42 function volumeDown() {
39− actionGroup.actionObject.activate(-1);
43+ actionGroup.actionObject.activate(stepDown);
40 }
44 }
41
45
42 Component.onCompleted: actionGroup.start()
46 Component.onCompleted: actionGroup.start()
qml/Components/graphics/headerback@27.pngnew file

Binary file not shown.

qml/Dash/Apps/AppPreview.qmldeleted−167
@@ -1,167 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItems
20−import ".."
21−import "../Generic"
22−import "../Previews"
23−import "../../Components"
24−
25−GenericPreview {
26− id: root
27−
28− signal sendUserReview(string review)
29−
30− previewImages: previewImagesComponent
31− description: descriptionComponent
32− header: headerComponent
33−
34− // TODO: Ratings are not yet complete... enable this once they work
35− //ratings: ratingsComponent
36−
37− Component {
38− id: previewImagesComponent
39− ListView {
40− id: previewImageListView
41− spacing: units.gu(1)
42− orientation: ListView.Horizontal
43− height: units.gu(22)
44− model: previewData.infoMap["more-screenshots"] != null ? previewData.infoMap["more-screenshots"].value : [previewData.image]
45− cacheBuffer: width * 3
46−
47− // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
48− // we finally reached the point where this ListView doesn't correctly get swipe input any more but
49− // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
50− // layer to make sure this ListView can be swiped, regardless of what's behind it.
51− MouseArea {
52− anchors.fill: parent
53− enabled: parent.contentWidth > parent.width
54− }
55−
56− LazyImage {
57− objectName: "placeholderScreenshot"
58− anchors {
59− top: parent.top
60− bottom: parent.bottom
61− }
62− scaleTo: "height"
63− source: "broken_image"
64− initialWidth: units.gu(13)
65− visible: previewImageListView.count == 0
66− }
67−
68− delegate: LazyImage {
69− id: shape
70− anchors {
71− top: parent.top
72− bottom: parent.bottom
73− }
74− source: modelData ? modelData : ""
75− scaleTo: "height"
76− initialWidth: units.gu(13)
77− }
78− }
79− }
80−
81− Component {
82− id: headerComponent
83− Header {
84− objectName: "previewHeader"
85− title: previewData.title
86− icon: previewData.appIcon
87− subtitle: root.previewData.infoMap["publisher"] ? root.previewData.infoMap["publisher"].value : ""
88− rating: Math.round(root.previewData.rating * 10)
89− reviews: root.previewData.numRatings
90− rated: root.previewData.infoMap["rated"] ? root.previewData.infoMap["rated"].value : 0
91− }
92− }
93−
94− Component {
95− id: descriptionComponent
96− Column {
97− spacing: units.gu(1)
98−
99− Label {
100− objectName: "descriptionLabel"
101− anchors { left: parent.left; right: parent.right }
102− text: root.previewData.description
103− fontSize: "medium"
104− color: Theme.palette.selected.backgroundText
105− opacity: .6
106− wrapMode: Text.WordWrap
107− style: Text.Raised
108− styleColor: "black"
109− }
110− }
111− }
112−
113− Component {
114− id: ratingsComponent
115− Column {
116− id: columnReviewRating
117− objectName: "columnReviewRating"
118− visible: root.previewData.rating >= 0
119−
120− spacing: units.gu(1)
121− height: childrenRect.height
122−
123− ListItems.ThinDivider { }
124−
125− Item {
126− anchors { left: parent.left; right: parent.right }
127− height: rateLabel.height
128−
129− Label {
130− id: rateLabel
131− fontSize: "medium"
132− color: "white"
133− style: Text.Raised
134− styleColor: "black"
135− opacity: .9
136− text: i18n.tr("Rate this")
137−
138− anchors.left: parent.left
139− anchors.verticalCenter: parent.verticalCenter
140− }
141−
142− // FIXME these need to be made interactive and connected to the scope
143− RatingStars {
144− anchors.right: parent.right
145− anchors.verticalCenter: parent.verticalCenter
146− }
147− }
148−
149− ListItems.ThinDivider { }
150−
151− Reviews {
152− id: appReviews
153− objectName: "appReviews"
154−
155− anchors { left: parent.left; right: parent.right }
156−
157− model: root.previewData.infoMap["comments"] ? root.previewData.infoMap["comments"].value : undefined
158−
159− onSendReview: root.sendUserReview(review);
160−
161− onEditing: {
162− root.ensureVisible(appReviews.textArea);
163− }
164− }
165− }
166− }
167−}
qml/Dash/Apps/DashPluginFilterGrid.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−import "../Generic"
21−
22−GenericFilterGrid {
23− id: filtergrid
24−
25− delegate: Tile {
26− id: tile
27− objectName: "delegate" + index
28− width: filtergrid.cellWidth
29− height: filtergrid.cellHeight
30− text: model.title
31− imageWidth: filtergrid.iconWidth
32− imageHeight: filtergrid.iconHeight
33− source: model.icon
34−
35− style: FlatTileStyle {
36− disabled: model.rendererHints['scope_disabled'] === 1;
37− }
38−
39− onClicked: {
40− filtergrid.clicked(index, tile.y)
41− }
42−
43− onPressAndHold: {
44− filtergrid.pressAndHold(index, tile.y)
45− }
46− }
47−}
qml/Dash/Apps/FrequentlyUsedAppsModel.qmldeleted−110
@@ -1,110 +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−ListModel {
20− ListElement {
21− uri: "application://dialer-app.desktop"
22− icon: "../../graphics/applicationIcons/phone-app.png"
23− category: 0
24− mimetype: "application/x-desktop"
25− title: "Dialer"
26− comment: ""
27− dndUri: "file:///usr/share/applications/dialer-app.desktop"
28− metadata: "subscope:applications.scope/applications-non-click.scope"
29− }
30− ListElement {
31− uri: "application://messaging-app.desktop"
32− icon: "../../graphics/applicationIcons/messages-app.png"
33− category: 0
34− mimetype: "application/x-desktop"
35− title: "Messaging"
36− comment: ""
37− dndUri: "file:///usr/share/applications/messaging-app.desktop"
38− metadata: "subscope:applications.scope/applications-non-click.scope"
39− }
40− ListElement {
41− uri: "application://address-book-app.desktop"
42− icon: "../../graphics/applicationIcons/contacts-app.png"
43− category: 0
44− mimetype: "application/x-desktop"
45− title: "Contacts"
46− comment: ""
47− dndUri: "file:///usr/share/applications/address-book-app.desktop"
48− metadata: "subscope:applications.scope/applications-non-click.scope"
49− }
50− ListElement {
51− uri: "appid://com.ubuntu.camera/camera/current-user-version"
52− icon: "../../graphics/applicationIcons/camera.png"
53− category: 0
54− mimetype: "application/x-desktop"
55− title: "Camera"
56− comment: ""
57− dndUri: "appid://com.ubuntu.camera/camera/current-user-version"
58− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.camera"
59− }
60− ListElement {
61− uri: "appid://com.ubuntu.gallery/gallery/current-user-version"
62− icon: "../../graphics/applicationIcons/gallery.png"
63− category: 0
64− mimetype: "application/x-desktop"
65− title: "Gallery"
66− comment: ""
67− dndUri: "appid://com.ubuntu.gallery/gallery/current-user-version"
68− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.gallery"
69− }
70− ListElement {
71− uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
72− icon: "../../graphics/applicationIcons/facebook.png"
73− category: 0
74− mimetype: "application/x-desktop"
75− title: "Facebook"
76− comment: ""
77− dndUri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
78− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-facebook"
79− }
80− ListElement {
81− uri: "application://webbrowser-app.desktop"
82− icon: "../../graphics/applicationIcons/browser.png"
83− category: 0
84− mimetype: "application/x-desktop"
85− title: "Browser"
86− comment: ""
87− dndUri: "file:///usr/share/applications/webbrowser-app.desktop"
88− metadata: "subscope:applications.scope/applications-non-click.scope"
89− }
90− ListElement {
91− uri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
92− icon: "../../graphics/applicationIcons/gmail.png"
93− category: 0
94− mimetype: "application/x-desktop"
95− title: "GMail"
96− comment: ""
97− dndUri: "appid://com.ubuntu.developer.webapps.webapp-gmail/webapp-gmail/current-user-version"
98− metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.developer.webapps.webapp-gmail"
99− }
100− ListElement {
101− uri: "application://ubuntu-system-settings.desktop"
102− icon: "../../graphics/applicationIcons/system-settings.png"
103− category: 0
104− mimetype: "application/x-desktop"
105− title: "System Settings"
106− comment: ""
107− dndUri: "file:///usr/share/applications/ubuntu-system-settings.desktop"
108− metadata: "subscope:applications.scope/applications-non-click.scope"
109− }
110−}
qml/Dash/Apps/RunningApplicationTile.qml+16−27
@@ -23,7 +23,6 @@ import "../../Components/ListItems"
23AbstractButton {
23AbstractButton {
24 id: root
24 id: root
25 property var application
25 property var application
26− property bool __sideStageEnabled: shell.applicationManager.sideStageEnabled
27
26
28 signal requestedApplicationActivation(var application)
27 signal requestedApplicationActivation(var application)
29 signal requestedApplicationTermination(var application)
28 signal requestedApplicationTermination(var application)
@@ -34,7 +33,7 @@ AbstractButton {
34 // To avoid "binding loop" warning
33 // To avoid "binding loop" warning
35 height: shapedApplicationImage.height + labelContainer.height
34 height: shapedApplicationImage.height + labelContainer.height
36
35
37− width: shapedApplicationImage.width
36+ width: shapedApplicationImage.width <= units.gu(11) ? units.gu(11) : height
38
37
39 property bool terminationModeEnabled: false
38 property bool terminationModeEnabled: false
40
39
@@ -51,32 +50,23 @@ AbstractButton {
51 }
50 }
52 }
51 }
53
52
54− function updateScreenshotFromCache() {
55− applicationImage.updateFromCache();
56− }
57−
58− // FIXME: should use UbuntuShape from SDK
53+ UbuntuShape {
59− UbuntuShapeForItem {
60 id: shapedApplicationImage
54 id: shapedApplicationImage
61− anchors {
62− top: parent.top
63− horizontalCenter: parent.horizontalCenter
55+ anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
64− }
65
56
66− // FIXME: width and height should be defined according to the
67− // application window's aspect ratio.
68− width: (application.stage === ApplicationInfo.MainStage && __sideStageEnabled) ?
69− units.gu(22) : units.gu(11)
57+ height: units.gu(17)
70− height: (__sideStageEnabled) ? units.gu(22) : units.gu(19)
58+ width: applicationImage.width
71 radius: "medium"
59 radius: "medium"
72− image: applicationImage
73− }
74
60
75− ApplicationImage {
61+ image: Image {
76− id: applicationImage
62+ id: applicationImage
77− source: ApplicationManager.findApplication((application) ? application.appId : "")
63+ source: application.screenshot
78− width: shapedApplicationImage.width
64+ // height : width = ss.height : ss.width
79− height: shapedApplicationImage.height
65+ height: shapedApplicationImage.height
66+ fillMode: Image.PreserveAspectCrop
67+ width: Math.min(height, height * sourceSize.width / sourceSize.height)
68+ }
69+
80 }
70 }
81
71
82 UbuntuShape {
72 UbuntuShape {
@@ -108,10 +98,9 @@ AbstractButton {
108 }
98 }
109 text: (application) ? application.name : ""
99 text: (application) ? application.name : ""
110
100
111− color: Theme.palette.selected.backgroundText
101+ // TODO karni: Update Ubuntu.Components.Themes.Palette and use theme color instead
102+ color: "grey"
112 opacity: 0.9
103 opacity: 0.9
113− style: Text.Raised
114− styleColor: "black"
115 fontSize: "small"
104 fontSize: "small"
116 elide: Text.ElideMiddle
105 elide: Text.ElideMiddle
117 horizontalAlignment: Text.AlignHCenter
106 horizontalAlignment: Text.AlignHCenter
qml/Dash/Apps/RunningApplicationsGrid.qml+5−20
@@ -18,6 +18,7 @@ import QtQuick 2.0
18import "../../Components"
18import "../../Components"
19
19
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21+import Unity.Application 0.1
21
22
22ResponsiveFlowView {
23ResponsiveFlowView {
23 id: root
24 id: root
@@ -25,13 +26,7 @@ ResponsiveFlowView {
25
26
26 signal updateScreenshots
27 signal updateScreenshots
27 property alias enableHeightBehavior: heightBehaviour.enabled
28 property alias enableHeightBehavior: heightBehaviour.enabled
28− property bool enableHeightBehaviorOnNextCreation: firstModel.count + secondModel.count == 0
29+ property bool enableHeightBehaviorOnNextCreation: model.count === 0
29−
30− Connections {
31− target: shell
32− onDashShownChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
33− onStageScreenshotsReadyChanged: if (shell.dashShown && shell.stageScreenshotsReady) updateScreenshots();
34− }
35
30
36 Behavior on height {
31 Behavior on height {
37 id: heightBehaviour
32 id: heightBehaviour
@@ -40,13 +35,7 @@ ResponsiveFlowView {
40 }
35 }
41
36
42 Connections {
37 Connections {
43− target: root.firstModel
38+ target: root.model
44− onCountChanged: {
45− heightBehaviour.enabled = true;
46− }
47− }
48− Connections {
49− target: root.secondModel
50 onCountChanged: {
39 onCountChanged: {
51 heightBehaviour.enabled = true;
40 heightBehaviour.enabled = true;
52 }
41 }
@@ -85,17 +74,13 @@ ResponsiveFlowView {
85 root.terminationModeEnabled = true
74 root.terminationModeEnabled = true
86 }
75 }
87 onRequestedApplicationTermination: {
76 onRequestedApplicationTermination: {
88− shell.applicationManager.stopApplication(model.appId)
77+ ApplicationManager.stopApplication(model.appId)
89 }
78 }
90 onRequestedApplicationActivation: {
79 onRequestedApplicationActivation: {
91− shell.activateApplication(model.appId)
80+ ApplicationManager.requestFocusApplication(model.appId)
92 }
81 }
93
82
94 terminationModeEnabled: root.terminationModeEnabled
83 terminationModeEnabled: root.terminationModeEnabled
95−
96− Component.onCompleted: {
97− root.updateScreenshots.connect(updateScreenshotFromCache);
98− }
99 }
84 }
100 }
85 }
101
86
qml/Dash/Card.qml+43−14
@@ -16,8 +16,10 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+// For image://albumart and image://thumbnailer image providers
20+import Ubuntu.Thumbnailer 0.1
19
21
20−Item {
22+AbstractButton {
21 id: root
23 id: root
22 property var template
24 property var template
23 property var components
25 property var components
@@ -25,7 +27,8 @@ Item {
25
27
26 property alias fontScale: header.fontScale
28 property alias fontScale: header.fontScale
27 property alias headerAlignment: header.headerAlignment
29 property alias headerAlignment: header.headerAlignment
28− readonly property alias headerHeight: header.height
30+ property alias headerHeight: header.height
31+ readonly property alias title: header.title
29
32
30 property bool showHeader: true
33 property bool showHeader: true
31
34
@@ -44,6 +47,8 @@ Item {
44 anchors.fill: parent
47 anchors.fill: parent
45 image: backgroundImage.source ? backgroundImage : null
48 image: backgroundImage.source ? backgroundImage : null
46
49
50+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
51+
47 property Image backgroundImage: Image {
52 property Image backgroundImage: Image {
48 objectName: "backgroundImage"
53 objectName: "backgroundImage"
49 source: {
54 source: {
@@ -68,31 +73,50 @@ Item {
68 id: artShape
73 id: artShape
69 radius: "medium"
74 radius: "medium"
70 objectName: "artShape"
75 objectName: "artShape"
71− width: {
72− if (!visible) return 0
73− return image.fillMode === Image.PreserveAspectCrop || aspect < image.aspect ? image.width : height * image.aspect
74− }
75− height: {
76− if (!visible) return 0
77− return image.fillMode === Image.PreserveAspectCrop || aspect > image.aspect ? image.height : width / image.aspect
78− }
79 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
76 anchors.horizontalCenter: template && template["card-layout"] === "horizontal" ? undefined : parent.horizontalCenter
80 anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
77 anchors.left: template && template["card-layout"] === "horizontal" ? parent.left : undefined
81 visible: cardData && cardData["art"] || false
78 visible: cardData && cardData["art"] || false
82
79
83− property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
80+ readonly property real aspect: components !== undefined ? components["art"]["aspect-ratio"] : 1
81+ readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect
82+
83+ Component.onCompleted: updateWidthHeightBindings();
84+ onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
85+
86+ function updateWidthHeightBindings() {
87+ if (aspectSmallerThanImageAspect) {
88+ width = Qt.binding(function() { return !visible ? 0 : image.width });
89+ height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
90+ } else {
91+ width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
92+ height = Qt.binding(function() { return !visible ? 0 : image.height });
93+ }
94+ }
84
95
85 image: Image {
96 image: Image {
86− width: template && template["card-layout"] === "horizontal" ? height * artShape.aspect : root.width
87− height: template && template["card-layout"] === "horizontal" ? header.height : width / artShape.aspect
88 objectName: "artImage"
97 objectName: "artImage"
89 source: cardData && cardData["art"] || ""
98 source: cardData && cardData["art"] || ""
99+ cache: true
90 // FIXME uncomment when having investigated / fixed the crash
100 // FIXME uncomment when having investigated / fixed the crash
91 //sourceSize.width: width > height ? width : 0
101 //sourceSize.width: width > height ? width : 0
92 //sourceSize.height: height > width ? height : 0
102 //sourceSize.height: height > width ? height : 0
93 fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
103 fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop
94
104
95− property real aspect: implicitWidth / implicitHeight
105+ readonly property real aspect: implicitWidth / implicitHeight
106+ readonly property bool isHorizontal: template && template["card-layout"] === "horizontal"
107+
108+ Component.onCompleted: updateWidthHeightBindings();
109+ onIsHorizontalChanged: updateWidthHeightBindings();
110+
111+ function updateWidthHeightBindings() {
112+ if (isHorizontal) {
113+ width = Qt.binding(function() { return height * artShape.aspect });
114+ height = Qt.binding(function() { return header.height });
115+ } else {
116+ width = Qt.binding(function() { return root.width });
117+ height = Qt.binding(function() { return width / artShape.aspect });
118+ }
119+ }
96 }
120 }
97 }
121 }
98
122
@@ -163,6 +187,9 @@ Item {
163 titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
187 titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
164
188
165 opacity: showHeader ? 1 : 0
189 opacity: showHeader ? 1 : 0
190+ inOverlay: root.template && root.template["overlay"] === true
191+ fontColor: inOverlay ? "white" : summary.color
192+ useMascotShape: !background.visible && !inOverlay
166
193
167 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
194 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
168 }
195 }
@@ -183,5 +210,7 @@ Item {
183 text: cardData && cardData["summary"] || ""
210 text: cardData && cardData["summary"] || ""
184 height: text ? implicitHeight : 0
211 height: text ? implicitHeight : 0
185 fontSize: "small"
212 fontSize: "small"
213+ // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
214+ color: background.visible && background.luminance < 0.7 ? "white" : "grey"
186 }
215 }
187}
216}
qml/Dash/DashCarousel.qml → qml/Dash/CardCarousel.qmlrenamed+30−8
@@ -18,8 +18,9 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import "../Components"
19import "../Components"
20
20
21+
21DashRenderer {
22DashRenderer {
22− id: dashCarousel
23+ id: cardCarousel
23
24
24 property alias cacheBuffer: carousel.cacheBuffer
25 property alias cacheBuffer: carousel.cacheBuffer
25 property alias itemComponent: carousel.itemComponent
26 property alias itemComponent: carousel.itemComponent
@@ -34,14 +35,35 @@ DashRenderer {
34 Carousel {
35 Carousel {
35 id: carousel
36 id: carousel
36 anchors.fill: parent
37 anchors.fill: parent
37− tileAspectRatio: 198 / 288
38+ tileAspectRatio: cardCarousel.components && cardCarousel.components["art"]["aspect-ratio"] || 1.0
38− minimumTileWidth: units.gu(13)
39+ // FIXME we need to "reverse" the carousel to make the selected item the size
39− selectedItemScaleFactor: 1.14
40+ // and push others back.
41+ minimumTileWidth: cardTool.cardWidth / selectedItemScaleFactor
42+ selectedItemScaleFactor: cardTool.carouselSelectedItemScaleFactor
40 cacheBuffer: 1404 // 18px * 13gu * 6
43 cacheBuffer: 1404 // 18px * 13gu * 6
41− model: dashCarousel.model
44+ model: cardCarousel.model
42− highlightIndex: dashCarousel.highlightIndex
45+
46+ onClicked: cardCarousel.clicked(index, itemY)
47+ onPressAndHold: cardCarousel.pressAndHold(index, itemY)
48+
49+ property real fontScale: 1 / selectedItemScaleFactor
50+ property real headerHeight: cardTool.headerHeight / selectedItemScaleFactor
51+
52+ itemComponent: Card {
53+ id: card
54+ objectName: "carouselDelegate" + index
55+ headerHeight: carousel.headerHeight
56+ cardData: model
57+ template: cardTool.template
58+ components: cardTool.components
59+
60+ property bool explicitlyScaled
61+ property var model
62+
63+ enabled: false
64+ showHeader: explicitlyScaled
43
65
44− onClicked: dashCarousel.clicked(index, itemY)
66+ fontScale: carousel.fontScale
45− onPressAndHold: dashCarousel.pressAndHold(index, itemY)
67+ }
46 }
68 }
47}
69}
qml/Dash/CardFilterGrid.qmlnew file+73
@@ -0,0 +1,73 @@
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+
20+DashRenderer {
21+ id: genericFilterGrid
22+
23+ expandable: filterGrid.expandable
24+ collapsedHeight: filterGrid.collapsedHeight
25+ margins: filterGrid.margins
26+ uncollapsedHeight: filterGrid.uncollapsedHeight
27+ verticalSpacing: units.gu(1)
28+ currentItem: filterGrid.currentItem
29+ height: filterGrid.height
30+
31+ function startFilterAnimation(filter) {
32+ filterGrid.startFilterAnimation(filter)
33+ }
34+
35+ FilterGrid {
36+ id: filterGrid
37+ width: genericFilterGrid.width
38+ minimumHorizontalSpacing: units.gu(1)
39+ delegateWidth: cardTool.cardWidth
40+ delegateHeight: cardTool.cardHeight
41+ verticalSpacing: genericFilterGrid.verticalSpacing
42+ model: genericFilterGrid.model
43+ filter: genericFilterGrid.filter
44+ collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
45+ delegateCreationBegin: genericFilterGrid.delegateCreationBegin
46+ delegateCreationEnd: genericFilterGrid.delegateCreationEnd
47+ delegate: Item {
48+ width: filterGrid.cellWidth
49+ height: filterGrid.cellHeight
50+ Card {
51+ id: card
52+ width: cardTool.cardWidth
53+ height: cardTool.cardHeight
54+ headerHeight: cardTool.headerHeight
55+ anchors.horizontalCenter: parent.horizontalCenter
56+ objectName: "delegate" + index
57+ cardData: model
58+ template: cardTool.template
59+ components: cardTool.components
60+
61+ headerAlignment: cardTool.headerAlignment
62+
63+ onClicked: genericFilterGrid.clicked(index, card.y)
64+ onPressAndHold: genericFilterGrid.pressAndHold(index, card.y)
65+ }
66+ }
67+
68+ onFilterChanged: {
69+ genericFilterGrid.filter = filter
70+ filter = Qt.binding(function() { return genericFilterGrid.filter })
71+ }
72+ }
73+}
qml/Dash/CardHeader.qml+32−60
@@ -22,18 +22,20 @@ Item {
22 property alias mascot: mascotImage.source
22 property alias mascot: mascotImage.source
23 property alias title: titleLabel.text
23 property alias title: titleLabel.text
24 property alias subtitle: subtitleLabel.text
24 property alias subtitle: subtitleLabel.text
25− property alias price: priceLabel.text
26− property alias oldPrice: oldPriceLabel.text
27− property alias altPrice: altPriceLabel.text
28
25
29 property alias titleWeight: titleLabel.font.weight
26 property alias titleWeight: titleLabel.font.weight
27+ property alias titleSize: titleLabel.fontSize
30
28
31 // FIXME: Saviq, used to scale fonts down in Carousel
29 // FIXME: Saviq, used to scale fonts down in Carousel
32 property real fontScale: 1.0
30 property real fontScale: 1.0
33
31
34 property alias headerAlignment: titleLabel.horizontalAlignment
32 property alias headerAlignment: titleLabel.horizontalAlignment
35
33
34+ property bool inOverlay: false
35+ property bool useMascotShape: true
36+ property color fontColor: Theme.palette.selected.backgroundText
37+
36− visible: mascotImage.status === Image.Ready || title || price
38+ visible: mascotImage.status === Image.Ready || title
37 height: row.height > 0 ? row.height + row.margins * 2 : 0
39 height: row.height > 0 ? row.height + row.margins * 2 : 0
38
40
39 Row {
41 Row {
@@ -42,13 +44,13 @@ Item {
42
44
43 property real margins: units.gu(1)
45 property real margins: units.gu(1)
44
46
47+ spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
45 anchors {
48 anchors {
46 top: parent.top; left: parent.left; right: parent.right
49 top: parent.top; left: parent.left; right: parent.right
47 margins: margins
50 margins: margins
48 leftMargin: spacing
51 leftMargin: spacing
49 rightMargin: spacing
52 rightMargin: spacing
50 }
53 }
51− spacing: mascotShape.visible || (template && template["overlay"]) ? margins : 0
52
54
53 UbuntuShape {
55 UbuntuShape {
54 id: mascotShape
56 id: mascotShape
@@ -57,35 +59,45 @@ Item {
57 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
59 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
58 width: units.gu(6)
60 width: units.gu(6)
59 height: units.gu(5.625)
61 height: units.gu(5.625)
62+ anchors.verticalCenter: parent.verticalCenter
60− visible: image.status === Image.Ready
63+ visible: useMascotShape && image && image.status === Image.Ready
61− readonly property int maxSize: Math.max(width, height)
64+ readonly property int maxSize: Math.max(width, height) * 4
62
65
63− image: Image {
64− id: mascotImage
66+ image: useMascotShape ? mascotImage : null
67+ }
65
68
69+ Image {
70+ id: mascotImage
71+ objectName: "mascotImage"
72+
73+ width: source ? mascotShape.width : 0
74+ height: mascotShape.height
75+ anchors.verticalCenter: parent.verticalCenter
76+ visible: !useMascotShape && status === Image.Ready
77+
66− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
78+ sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
67− fillMode: Image.PreserveAspectCrop
79+ fillMode: Image.PreserveAspectCrop
68− horizontalAlignment: Image.AlignHCenter
80+ horizontalAlignment: Image.AlignHCenter
69− verticalAlignment: Image.AlignVCenter
81+ verticalAlignment: Image.AlignVCenter
70− }
71 }
82 }
72
83
73 Column {
84 Column {
74 objectName: "column"
85 objectName: "column"
75 width: parent.width - x
86 width: parent.width - x
76− spacing: units.gu(0.5)
87+ spacing: units.dp(2)
88+ anchors.verticalCenter: parent.verticalCenter
77
89
78 Label {
90 Label {
79 id: titleLabel
91 id: titleLabel
80 objectName: "titleLabel"
92 objectName: "titleLabel"
81 anchors { left: parent.left; right: parent.right }
93 anchors { left: parent.left; right: parent.right }
82 elide: Text.ElideRight
94 elide: Text.ElideRight
83− font.weight: Font.DemiBold
95+ font.weight: Font.Normal
96+ fontSize: "small"
84 wrapMode: Text.Wrap
97 wrapMode: Text.Wrap
85 maximumLineCount: 2
98 maximumLineCount: 2
86− fontSize: "small"
87 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
99 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
88− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
100+ color: fontColor
89 }
101 }
90
102
91 Label {
103 Label {
@@ -93,51 +105,11 @@ Item {
93 objectName: "subtitleLabel"
105 objectName: "subtitleLabel"
94 anchors { left: parent.left; right: parent.right }
106 anchors { left: parent.left; right: parent.right }
95 elide: Text.ElideRight
107 elide: Text.ElideRight
108+ fontSize: "small"
96 font.weight: Font.Light
109 font.weight: Font.Light
97 visible: titleLabel.text && text
110 visible: titleLabel.text && text
98− fontSize: "x-small"
99 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
111 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
100− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
112+ color: fontColor
101− }
102−
103− Row {
104− id: prices
105− objectName: "prices"
106− anchors { left: parent.left; right: parent.right }
107−
108− property int labels: {
109− var labels = 1; // price always visible
110− if (oldPriceLabel.text !== "") labels += 1;
111− if (altPriceLabel.text !== "") labels += 1;
112− return labels;
113− }
114− property real labelWidth: width / labels
115−
116− Label {
117− id: priceLabel
118− width: parent.labelWidth
119− elide: Text.ElideRight
120− font.weight: Font.DemiBold
121− color: Theme.palette.selected.foreground
122− visible: text
123− }
124−
125− Label {
126− id: oldPriceLabel
127− objectName: "oldPriceLabel"
128− width: parent.labelWidth
129− elide: Text.ElideRight
130− horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
131− visible: text
132− }
133−
134− Label {
135− id: altPriceLabel
136− width: parent.labelWidth
137− elide: Text.ElideRight
138− horizontalAlignment: Text.AlignRight
139− visible: text
140− }
141 }
113 }
142 }
114 }
143 }
115 }
qml/Dash/CardTool.qml+47−9
@@ -28,6 +28,22 @@ import QtQuick 2.0
28
28
29Item {
29Item {
30 id: cardTool
30 id: cardTool
31+
32+ /*!
33+ \brief Number of cards.
34+ */
35+ property int count
36+
37+ /*!
38+ \brief Width of the category view.
39+ */
40+ property real viewWidth
41+
42+ /*!
43+ \brief Scaling factor of selected Carousel item.
44+ */
45+ readonly property real carouselSelectedItemScaleFactor: 1.38 // XXX assuming 1.38 carousel scaling factor for cards
46+
31 /*!
47 /*!
32 \brief Template supplied for the category.
48 \brief Template supplied for the category.
33 */
49 */
@@ -39,9 +55,15 @@ Item {
39 property var components
55 property var components
40
56
41 /*!
57 /*!
42− \brief Width of the view, based on which carousel width is calculated.
58+ \brief The category layout for this card tool.
43 */
59 */
44− property var viewWidth
60+ property string categoryLayout: {
61+ var layout = template["category-layout"];
62+
63+ // carousel fallback mode to grid
64+ if (layout === "carousel" && count <= Math.ceil(carouselTool.realPathItemCount)) layout = "grid";
65+ return layout;
66+ }
45
67
46 // FIXME: Saviq
68 // FIXME: Saviq
47 // Only way for the card below to actually be laid out completely.
69 // Only way for the card below to actually be laid out completely.
@@ -56,7 +78,7 @@ Item {
56 If undefined, should use implicit width of the actual card.
78 If undefined, should use implicit width of the actual card.
57 */
79 */
58 readonly property var cardWidth: {
80 readonly property var cardWidth: {
59− switch (template !== undefined && template["category-layout"]) {
81+ switch (categoryLayout) {
60 case "grid":
82 case "grid":
61 case "vertical-journal":
83 case "vertical-journal":
62 if (template["card-layout"] === "horizontal") return units.gu(38);
84 if (template["card-layout"] === "horizontal") return units.gu(38);
@@ -66,10 +88,7 @@ Item {
66 }
88 }
67 return units.gu(18.5);
89 return units.gu(18.5);
68 case "carousel":
90 case "carousel":
69− if (viewWidth === undefined) return undefined
91+ return carouselTool.minimumTileWidth;
70− if (viewWidth <= units.gu(40)) return units.gu(18)
71− if (viewWidth >= units.gu(128)) return units.gu(26)
72− return units.gu(18 + Math.round((viewWidth - units.gu(40))/ units.gu(11)))
73 case undefined:
92 case undefined:
74 case "organic-grid":
93 case "organic-grid":
75 case "journal":
94 case "journal":
@@ -84,7 +103,7 @@ Item {
84 If undefined, should use implicit height of the actual card.
103 If undefined, should use implicit height of the actual card.
85 */
104 */
86 readonly property var cardHeight: {
105 readonly property var cardHeight: {
87− switch (template !== undefined && template["category-layout"]) {
106+ switch (categoryLayout) {
88 case "journal":
107 case "journal":
89 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
108 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
90 return units.gu(18.5);
109 return units.gu(18.5);
@@ -123,9 +142,28 @@ Item {
123 return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
142 return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
124 }
143 }
125
144
145+ QtObject {
146+ id: carouselTool
147+
148+ property real minimumTileWidth: {
149+ if (cardTool.viewWidth === undefined) return undefined;
150+ if (cardTool.viewWidth <= units.gu(40)) return units.gu(18);
151+ if (cardTool.viewWidth >= units.gu(128)) return units.gu(26);
152+ return units.gu(18 + Math.round((cardTool.viewWidth - units.gu(40)) / units.gu(11)));
153+ }
154+
155+ readonly property real pathItemCount: 4.8457 /// (848 / 175) reference values
156+
157+ property real realPathItemCount: {
158+ var scaledMinimumTileWidth = minimumTileWidth / cardTool.carouselSelectedItemScaleFactor;
159+ var tileWidth = Math.max(cardTool.viewWidth / pathItemCount, scaledMinimumTileWidth);
160+ return Math.min(cardTool.viewWidth / tileWidth, pathItemCount);
161+ }
162+ }
163+
126 Card {
164 Card {
127 id: card
165 id: card
128− objectName: "card"
166+ objectName: "cardToolCard"
129 template: cardTool.template
167 template: cardTool.template
130 components: cardTool.components
168 components: cardTool.components
131
169
qml/Dash/Dash.qml+57−4
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -16,7 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import Unity 0.1
19+import Unity 0.2
20import Utils 0.1
20import Utils 0.1
21import "../Components"
21import "../Components"
22
22
@@ -27,8 +27,9 @@ Showable {
27 visible: shown
27 visible: shown
28
28
29 property ListModel searchHistory: SearchHistoryModel {}
29 property ListModel searchHistory: SearchHistoryModel {}
30+ property bool searchable: !dashContent.previewOpen && !scopeItem.previewOpen
30
31
31− property string showScopeOnLoaded: "home.scope"
32+ property string showScopeOnLoaded: "clickscope"
32 property real contentScale: 1.0
33 property real contentScale: 1.0
33
34
34 function setCurrentScope(scopeId, animate, reset) {
35 function setCurrentScope(scopeId, animate, reset) {
@@ -39,6 +40,10 @@ Showable {
39 return
40 return
40 }
41 }
41
42
43+ closeOverlayScope();
44+
45+ dashContent.closePreview();
46+
42 if (scopeIndex == dashContent.currentIndex && !reset) {
47 if (scopeIndex == dashContent.currentIndex && !reset) {
43 // the scope is already the current one
48 // the scope is already the current one
44 return
49 return
@@ -47,6 +52,12 @@ Showable {
47 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
52 dashContent.setCurrentScopeAtIndex(scopeIndex, animate, reset)
48 }
53 }
49
54
55+ function closeOverlayScope() {
56+ if (dashContent.x != 0) {
57+ dashContent.x = 0;
58+ }
59+ }
60+
50 SortFilterProxyModel {
61 SortFilterProxyModel {
51 id: filteredScopes
62 id: filteredScopes
52 model: Scopes {
63 model: Scopes {
@@ -61,10 +72,19 @@ Showable {
61 DashContent {
72 DashContent {
62 id: dashContent
73 id: dashContent
63 objectName: "dashContent"
74 objectName: "dashContent"
64− anchors.fill: parent
75+ width: parent.width
76+ height: parent.height
65 model: filteredScopes
77 model: filteredScopes
66 scopes: scopes
78 scopes: scopes
67 searchHistory: dash.searchHistory
79 searchHistory: dash.searchHistory
80+ visible: x != -width
81+ onGotoScope: {
82+ dash.setCurrentScope(scopeId, true, false);
83+ }
84+ onOpenScope: {
85+ scopeItem.scope = scope;
86+ x = -width;
87+ }
68 onScopeLoaded: {
88 onScopeLoaded: {
69 if (scopeId == dash.showScopeOnLoaded) {
89 if (scopeId == dash.showScopeOnLoaded) {
70 dash.setCurrentScope(scopeId, false, false)
90 dash.setCurrentScope(scopeId, false, false)
@@ -72,6 +92,39 @@ Showable {
72 }
92 }
73 }
93 }
74 scale: dash.contentScale
94 scale: dash.contentScale
95+ clip: scale != 1.0 || scopeItem.visible
96+ Behavior on x {
97+ UbuntuNumberAnimation {
98+ onRunningChanged: {
99+ if (!running && dashContent.x == 0) {
100+ dashContent.closeScope(scopeItem.scope);
101+ scopeItem.scope = null;
102+ }
103+ }
104+ }
105+ }
106+ }
107+
108+ ScopeItem {
109+ id: scopeItem
110+ anchors.left: dashContent.right
111+ width: parent.width
112+ height: parent.height
113+ searchHistory: dash.searchHistory
114+ scale: dash.contentScale
75 clip: scale != 1.0
115 clip: scale != 1.0
116+ visible: scope != null
117+ onBack: {
118+ closeOverlayScope();
119+ }
120+ onGotoScope: {
121+ // TODO
122+ console.log("gotoScope from an openScope scope is not implemented");
123+ }
124+ onOpenScope: {
125+ // TODO
126+ console.log("openScope from an openScope scope is not implemented");
127+ }
128+
76 }
129 }
77}
130}
qml/Dash/DashApps.qml+7−23
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Utils 0.1
19import Utils 0.1
20+import Unity.Application 0.1
20import "../Components"
21import "../Components"
21import "../Components/ListItems"
22import "../Components/ListItems"
22import "Apps"
23import "Apps"
@@ -25,32 +26,15 @@ GenericScopeView {
25 id: scopeView
26 id: scopeView
26 objectName: "DashApps"
27 objectName: "DashApps"
27
28
28− // FIXME: a way to aggregate these models would be ideal
29+ property var runningApps: ApplicationManager
29− property var mainStageApplicationsModel: shell.applicationManager.mainStageApplications
30− property var sideStageApplicationModel: shell.applicationManager.sideStageApplications
31
30
32− ListModel {
31+ QtObject {
33− id: dummyVisibilityModifier
32+ id: countObject
34−
35− ListElement { name: "running-apps" }
36− }
37−
38− SortFilterProxyModel {
39− id: runningApplicationsModel
40−
41− property var firstModel: mainStageApplicationsModel
42− property var secondModel: sideStageApplicationModel
43− property bool canEnableTerminationMode: scopeView.isCurrent
44−
45− model: dummyVisibilityModifier
46− filterRole: 0
47− filterRegExp: invertMatch ? ((mainStageApplicationsModel.count === 0 &&
48− sideStageApplicationModel.count === 0) ? RegExp("running-apps") : RegExp("")) : RegExp("disabled")
49− invertMatch: scopeView.scope.searchQuery.length == 0
33+ property int count: scopeView.scope.searchQuery.length == 0 ? scopeView.runningApps.count : 0
50 }
34 }
51
35
52 onScopeChanged: {
36 onScopeChanged: {
53− scopeView.scope.categories.overrideResults("recent", runningApplicationsModel);
37+ scopeView.scope.categories.addSpecialCategory("running.apps.category", i18n.tr("Recent"), "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject);
54− enableHeightBehaviorOnNextCreation = (mainStageApplicationsModel.count + sideStageApplicationModel.count == 0)
38+ enableHeightBehaviorOnNextCreation = scopeView.runningApps.count === 0
55 }
39 }
56}
40}
qml/Dash/DashContent.qml+75−48
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013, 2014 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
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
5 * it under the terms of the GNU General Public License as published by
@@ -16,7 +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 0.1
19+import Unity 0.2
20+import Utils 0.1
20import "../Components"
21import "../Components"
21
22
22Item {
23Item {
@@ -24,7 +25,8 @@ Item {
24
25
25 property var model: null
26 property var model: null
26 property var scopes: null
27 property var scopes: null
27− property alias currentIndex: dashContentList.currentIndex
28+ readonly property alias currentIndex: dashContentList.currentIndex
29+ property alias previewOpen: previewListView.open
28
30
29 property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
31 property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
30 property ListModel searchHistory
32 property ListModel searchHistory
@@ -33,6 +35,8 @@ Item {
33 signal movementEnded()
35 signal movementEnded()
34 signal scopeLoaded(string scopeId)
36 signal scopeLoaded(string scopeId)
35 signal positionedAtBeginning()
37 signal positionedAtBeginning()
38+ signal gotoScope(string scopeId)
39+ signal openScope(var scope)
36
40
37 // If we set the current scope index before the scopes have been added,
41 // If we set the current scope index before the scopes have been added,
38 // then we need to wait until the loaded signals gets emitted from the scopes
42 // then we need to wait until the loaded signals gets emitted from the scopes
@@ -48,6 +52,12 @@ Item {
48 }
52 }
49
53
50 function setCurrentScopeAtIndex(index, animate, reset) {
54 function setCurrentScopeAtIndex(index, animate, reset) {
55+ // if the scopes haven't loaded yet, then wait until they are.
56+ if (!scopes.loaded) {
57+ set_current_index = [ index, animate, reset ]
58+ return;
59+ }
60+
51 var storedMoveDuration = dashContentList.highlightMoveDuration
61 var storedMoveDuration = dashContentList.highlightMoveDuration
52 var storedMoveSpeed = dashContentList.highlightMoveVelocity
62 var storedMoveSpeed = dashContentList.highlightMoveVelocity
53 if (!animate) {
63 if (!animate) {
@@ -55,11 +65,6 @@ Item {
55 dashContentList.highlightMoveDuration = 0
65 dashContentList.highlightMoveDuration = 0
56 }
66 }
57
67
58− // if the scopes haven't loaded yet, then wait until they are.
59− if (!scopes.loaded) {
60− set_current_index = [ index, animate, reset ]
61− return;
62− }
63 set_current_index = undefined;
68 set_current_index = undefined;
64
69
65 if (dashContentList.count > index)
70 if (dashContentList.count > index)
@@ -77,15 +82,27 @@ Item {
77 }
82 }
78 }
83 }
79
84
85+ function closeScope(scope) {
86+ dashContentList.currentItem.theScope.closeScope(scope)
87+ }
88+
89+ function closePreview() {
90+ previewListView.open = false;
91+ }
92+
80 Item {
93 Item {
81 id: dashContentListHolder
94 id: dashContentListHolder
82− anchors.fill: parent
95+
96+ x: previewListView.open ? -width : 0
97+ Behavior on x { UbuntuNumberAnimation { } }
98+ width: parent.width
99+ height: parent.height
83
100
84 ListView {
101 ListView {
85 id: dashContentList
102 id: dashContentList
86 objectName: "dashContentList"
103 objectName: "dashContentList"
87
104
88− interactive: dashContent.scopes.loaded && !previewListView.onScreen && !currentItem.moving
105+ interactive: dashContent.scopes.loaded && !previewListView.open && currentItem && !currentItem.moving
89
106
90 anchors.fill: parent
107 anchors.fill: parent
91 model: dashContent.model
108 model: dashContent.model
@@ -100,6 +117,7 @@ Item {
100 cacheBuffer: 1073741823
117 cacheBuffer: 1073741823
101 onMovementStarted: dashContent.movementStarted()
118 onMovementStarted: dashContent.movementStarted()
102 onMovementEnded: dashContent.movementEnded()
119 onMovementEnded: dashContent.movementEnded()
120+ clip: parent.x != 0
103
121
104 // If the number of items is less than the current index, then need to reset to another item.
122 // If the number of items is less than the current index, then need to reset to another item.
105 onCountChanged: {
123 onCountChanged: {
@@ -108,7 +126,7 @@ Item {
108 dashContent.setCurrentScopeAtIndex(count-1, true, true)
126 dashContent.setCurrentScopeAtIndex(count-1, true, true)
109 } else if (currentIndex < 0) {
127 } else if (currentIndex < 0) {
110 // setting currentIndex directly, cause we don't want to loose set_current_index
128 // setting currentIndex directly, cause we don't want to loose set_current_index
111− dashContent.currentIndex = 0
129+ dashContentList.currentIndex = 0
112 }
130 }
113 }
131 }
114 }
132 }
@@ -131,81 +149,90 @@ Item {
131 readonly property bool isLoaded: status == Loader.Ready
149 readonly property bool isLoaded: status == Loader.Ready
132
150
133 onLoaded: {
151 onLoaded: {
152+ item.objectName = scope.id
153+ item.pageHeader = dashPageHeader;
154+ item.previewListView = previewListView;
134 item.scope = Qt.binding(function() { return scope })
155 item.scope = Qt.binding(function() { return scope })
135 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
156 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
136− item.tabBarHeight = pageHeader.implicitHeight;
157+ item.tabBarHeight = dashPageHeader.implicitHeight;
137− item.pageHeader = pageHeader;
138− item.openEffect = openEffect;
139− item.previewListView = previewListView;
140 dashContentList.movementStarted.connect(item.movementStarted)
158 dashContentList.movementStarted.connect(item.movementStarted)
141 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
159 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
142 dashContent.scopeLoaded(item.scope.id)
160 dashContent.scopeLoaded(item.scope.id)
143 }
161 }
162+ Connections {
163+ target: isCurrent ? scope : null
164+ onGotoScope: {
165+ // Note here scopeId is the signal parameter and not the loader property
166+ dashContent.gotoScope(scopeId);
167+ }
168+ onOpenScope: {
169+ dashContent.openScope(scope);
170+ }
171+ }
144
172
145 Component.onDestruction: active = false
173 Component.onDestruction: active = false
146 }
174 }
147 }
175 }
148
176
149 PageHeader {
177 PageHeader {
150− id: pageHeader
178+ id: dashPageHeader
151 objectName: "pageHeader"
179 objectName: "pageHeader"
152 width: parent.width
180 width: parent.width
153 searchEntryEnabled: true
181 searchEntryEnabled: true
154 searchHistory: dashContent.searchHistory
182 searchHistory: dashContent.searchHistory
155− scope: dashContentList.currentItem.theScope
183+ scope: dashContentList.currentItem && dashContentList.currentItem.theScope
156
184
157 childItem: TabBar {
185 childItem: TabBar {
158 id: tabBar
186 id: tabBar
159 objectName: "tabbar"
187 objectName: "tabbar"
160− height: units.gu(7)
188+ height: units.gu(6.5)
161 width: parent.width
189 width: parent.width
162− selectionMode: false
163 style: DashContentTabBarStyle {}
190 style: DashContentTabBarStyle {}
164
191
192+ SortFilterProxyModel {
193+ id: tabBarModel
194+
165− model: dashContentList.model
195+ model: dashContentList.model
166−
196+
197+ property int selectedIndex: -1
167− onSelectedIndexChanged: {
198+ onSelectedIndexChanged: {
199+ if (dashContentList.currentIndex == -1 && tabBar.selectedIndex != -1) {
200+ // TODO This together with the Timer below
201+ // are a workaround for the first tab sometimes not showing the text.
202+ // But Tabs are going away in the future so not sure if makes
203+ // sense invetigating what's the problem at this stage
204+ selectionModeTimer.restart();
205+ }
168− dashContentList.currentIndex = selectedIndex;
206+ dashContentList.currentIndex = selectedIndex;
207+ }
169 }
208 }
170
209
210+ model: tabBarModel.count > 0 ? tabBarModel : null
211+
171 Connections {
212 Connections {
172 target: dashContentList
213 target: dashContentList
173 onCurrentIndexChanged: {
214 onCurrentIndexChanged: {
174− tabBar.selectedIndex = dashContentList.currentIndex
215+ tabBarModel.selectedIndex = dashContentList.currentIndex
175 }
216 }
176 }
217 }
177
218
178− Connections {
219+ Timer {
179− target: model
220+ id: selectionModeTimer
180− onCountChanged: {
221+ interval: 1
181− if (tabBar.selectedIndex < 0 && model.count > 0)
222+ onTriggered: tabBar.selectionMode = false
182− tabBar.selectedIndex = 0;
183− }
184− }
185−
186− Component.onCompleted: {
187− __styleInstance.headerTextStyle = Text.Raised
188− __styleInstance.headerTextStyleColor = "black"
189 }
223 }
190 }
224 }
191 }
225 }
192 }
226 }
193
227
194− DashContentOpenEffect {
195− id: openEffect
196− anchors {
197− fill: parent
198− bottomMargin: -bottomOverflow
199− }
200− sourceItem: dashContentListHolder
201− previewListView: previewListView
202− }
203−
204 PreviewListView {
228 PreviewListView {
205 id: previewListView
229 id: previewListView
206− openEffect: openEffect
230+ objectName: "dashContentPreviewList"
207− categoryView: dashContentList.currentItem ? dashContentList.currentItem.categoryView : null
231+ visible: x != width
208 scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
232 scope: dashContentList.currentItem ? dashContentList.currentItem.theScope : null
209− anchors.fill: parent
233+ pageHeader: dashPageHeader
234+ width: parent.width
235+ height: parent.height
236+ anchors.left: dashContentListHolder.right
210 }
237 }
211}
238}
qml/Dash/DashContentOpenEffect.qmldeleted−57
@@ -1,57 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−
21−OpenEffect {
22− property PreviewListView previewListView: null
23−
24− objectName: "openEffect"
25− anchors {
26− fill: parent
27− bottomMargin: -bottomOverflow
28− }
29−
30− enabled: gap > 0.0
31−
32− topGapPx: (1 - gap) * positionPx
33− topOpacity: (1 - gap * 1.2)
34− bottomGapPx: positionPx + gap * (targetBottomGapPx - positionPx)
35− bottomOverflow: units.gu(20)
36− live: !expansionAnimation.running
37−
38− property int targetBottomGapPx: height - units.gu(8) - bottomOverflow
39− property real gap: previewListView.open ? 1.0 : 0.0
40−
41− Behavior on gap {
42− NumberAnimation {
43− id: expansionAnimation
44− duration: 200
45− easing.type: Easing.InOutQuad
46− onRunningChanged: {
47− if (!previewListView.open && !running) {
48− previewListView.onScreen = false
49− }
50− }
51− }
52− }
53− Behavior on positionPx {
54− enabled: previewListView.open
55− UbuntuNumberAnimation {}
56− }
57−}
qml/Dash/DashContentTabBarStyle.qml+3
@@ -18,4 +18,7 @@ import Ubuntu.Components.Themes.Ambiance 0.1
18
18
19TabBarStyle {
19TabBarStyle {
20 indicatorImageSource: "graphics/tabbarchevron.png"
20 indicatorImageSource: "graphics/tabbarchevron.png"
21+ // TODO karni: These should come from updated Ubuntu Palette.
22+ headerTextColor: "#88888888"
23+ headerTextSelectedColor: "#888888"
21}
24}
qml/Dash/DashFilterGrid.qmldeleted−65
@@ -1,65 +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 ".."
20−
21−DashRenderer {
22− id: dashFilterGrid
23−
24− property alias cellWidth: filterGrid.cellWidth
25− property alias cellHeight: filterGrid.cellHeight
26− property alias delegate: filterGrid.delegate
27− property alias delegateWidth: filterGrid.delegateWidth
28− property alias delegateHeight: filterGrid.delegateHeight
29− property alias maximumNumberOfColumns: filterGrid.maximumNumberOfColumns
30− property alias minimumHorizontalSpacing: filterGrid.minimumHorizontalSpacing
31−
32− collapsedHeight: filterGrid.collapsedHeight
33− collapsedRowCount: filterGrid.collapsedRowCount
34− columns: filterGrid.columns
35− rows: filter ? filterGrid.collapsedRowCount : filterGrid.uncollapsedRowCount
36− currentItem: filterGrid.currentItem
37− expandable: filterGrid.expandable
38− height: filterGrid.height
39− margins: filterGrid.margins
40− uncollapsedHeight: filterGrid.uncollapsedHeight
41− verticalSpacing: filterGrid.verticalSpacing
42−
43− function startFilterAnimation(filter) {
44− filterGrid.startFilterAnimation(filter)
45− }
46−
47− FilterGrid {
48− id: filterGrid
49− width: dashFilterGrid.width
50− minimumHorizontalSpacing: units.gu(0.5)
51− delegateWidth: units.gu(11)
52− delegateHeight: units.gu(9.5)
53− verticalSpacing: units.gu(2)
54− model: dashFilterGrid.model
55− filter: dashFilterGrid.filter
56− highlightIndex: dashFilterGrid.highlightIndex
57− delegateCreationBegin: dashFilterGrid.delegateCreationBegin
58− delegateCreationEnd: dashFilterGrid.delegateCreationEnd
59−
60− onFilterChanged: {
61− dashFilterGrid.filter = filter
62− filter = Qt.binding(function() { return dashFilterGrid.filter })
63− }
64− }
65−}
qml/Dash/DashHome.qmldeleted−39
@@ -1,39 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Utils 0.1
20−import "../Components"
21−import "../Components/ListItems"
22−import "Apps"
23−
24−GenericScopeView {
25− id: root
26− objectName: "DashHome"
27−
28− SearchableResultModel {
29− id: appsModel
30−
31− model: FrequentlyUsedAppsModel {}
32− filterRole: 3
33− searchQuery: root.scope.searchQuery
34− }
35−
36− onScopeChanged: {
37− root.scope.categories.overrideResults("applications.scope", appsModel);
38− }
39−}
qml/Dash/DashPreview.qmldeleted−208
@@ -1,208 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−Item {
21− id: root
22−
23− property int keyboardSize: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
24− property var previewData
25− property alias showProcessingAction: waitingForActionMouseArea.enabled
26−
27− property real previewWidthRatio: 0.5
28− property bool isCurrent: false
29−
30− property Component previewImages
31− property Component header
32− property Component actions
33− property Component description
34− property Component ratings
35−
36− readonly property bool narrowMode: width <= height * 1.5
37− readonly property int columnWidth: narrowMode ? contentRow.width : (contentRow.width / 3) - contentRow.spacing
38− readonly property int contentSpacing: units.gu(3)
39−
40− clip: true
41−
42− function ensureVisible(item) {
43− var o = leftFlickable.mapFromItem(item, 0, 0, item.width, item.height);
44− var keyboardY = shell.height - root.keyboardSize;
45− if ((o.y + o.height) > keyboardY) {
46− leftFlickable.contentY += o.y + o.height - keyboardY;
47− }
48− }
49−
50− Connections {
51− target: shell.applicationManager
52− onMainStageFocusedApplicationChanged: {
53− root.close();
54− }
55− onSideStageFocusedApplicationChanged: {
56− root.close();
57− }
58− }
59−
60− onPreviewDataChanged: showProcessingAction = false
61−
62− MouseArea {
63− anchors.fill: parent
64− }
65−
66− Row {
67− id: contentRow
68− anchors {
69− left: parent.left
70− top: parent.top
71− right: parent.right
72− bottom: parent.bottom
73− topMargin: root.contentSpacing
74− leftMargin: root.contentSpacing
75− rightMargin: root.contentSpacing
76− }
77− height: childrenRect.height
78−
79− spacing: units.gu(2)
80−
81−
82− Flickable {
83− id: leftFlickable
84− objectName: "leftFlickable"
85− anchors {
86− top: parent.top
87− bottom: parent.bottom
88− }
89− width: root.columnWidth
90− contentHeight: leftColumn.height + root.contentSpacing
91− anchors.bottomMargin: root.keyboardSize
92− clip: true
93−
94− Behavior on contentY { NumberAnimation { duration: 300 } }
95−
96− Column {
97− id: leftColumn
98− objectName: "leftColumn"
99− height: childrenRect.height
100− spacing: root.contentSpacing
101− anchors {
102− left: parent.left
103− right: parent.right
104− }
105− }
106− }
107−
108− Flickable {
109− id: centerFlickable
110− anchors {
111− top: parent.top
112− bottom: parent.bottom
113− }
114− width: root.columnWidth
115− contentHeight: centerColumn.height
116− clip: true
117−
118− Column {
119− id: centerColumn
120− objectName: "centerColumn"
121− height: childrenRect.height
122− anchors {
123− left: parent.left
124− right: parent.right
125− }
126− spacing: root.contentSpacing
127− }
128− }
129−
130− Flickable {
131− id: rightFlickable
132− anchors {
133− top: parent.top
134− bottom: parent.bottom
135− }
136− width: root.columnWidth
137− contentHeight: rightColumn.height
138− clip: true
139−
140− Column {
141− id: rightColumn
142− objectName: "rightColumn"
143− height: childrenRect.height
144− anchors {
145− left: parent.left
146− right: parent.right
147− }
148− }
149− }
150− }
151−
152− Loader {
153− id: previewImageLoader
154− parent: leftColumn
155− sourceComponent: root.previewImages
156− anchors {
157− left: parent.left
158− right: parent.right
159− }
160− }
161−
162− Loader {
163− id: ratingsLoader
164− parent: root.narrowMode ? leftColumn : rightColumn
165− anchors {
166− left: parent.left
167− right: parent.right
168− }
169− sourceComponent: root.ratings
170− }
171−
172− Loader {
173− id: descriptionLoader
174− parent: root.narrowMode ? leftColumn : centerColumn
175− anchors {
176− left: parent.left
177− right: parent.right
178− }
179− sourceComponent: root.description
180− }
181−
182− Loader {
183− id: actionsLoader
184− parent: root.narrowMode ? leftColumn : centerColumn
185− anchors {
186− left: parent.left
187− right: parent.right
188− }
189− sourceComponent: root.actions
190− }
191−
192− Loader {
193− id: headerLoader
194− parent: root.narrowMode ? leftColumn : centerColumn
195− anchors {
196− left: parent.left
197− right: parent.right
198− }
199− sourceComponent: root.header
200− }
201−
202− MouseArea {
203− id: waitingForActionMouseArea
204− objectName: "waitingForActionMouseArea"
205− anchors.fill: parent
206− enabled: false
207− }
208−}
qml/Dash/DashPreviewPlaceholder.qmldeleted−25
@@ -1,25 +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−DashPreview {
21− ActivityIndicator {
22− anchors.centerIn: parent
23− running: true
24− }
25−}
qml/Dash/DashRenderer.qml+5−9
@@ -23,17 +23,8 @@ Item {
23 // In case it can be expanded, should we filter it
23 // In case it can be expanded, should we filter it
24 property bool filter: true
24 property bool filter: true
25
25
26− property int collapsedRowCount: 1
27−
28 property int collapsedHeight: height
26 property int collapsedHeight: height
29
27
30− property int columns: 1
31−
32− property int rows: 1
33−
34− // Index of the highlighted item
35− property int highlightIndex: -1
36−
37 property int margins: 0
28 property int margins: 0
38
29
39 property int uncollapsedHeight: height
30 property int uncollapsedHeight: height
@@ -50,6 +41,11 @@ Item {
50 // The model to renderer
41 // The model to renderer
51 property var model
42 property var model
52
43
44+ /*!
45+ \brief CardTool component.
46+ */
47+ property var cardTool: undefined
48+
53 /// Emitted when the user clicked on an item
49 /// Emitted when the user clicked on an item
54 /// @param index is the index of the clicked item
50 /// @param index is the index of the clicked item
55 /// @param itemY is y of the clicked delegate
51 /// @param itemY is y of the clicked delegate
qml/Dash/Generic/FlatTileStyle.qmldeleted−79
@@ -1,79 +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: tile
22−
23− property bool disabled: false
24−
25− anchors.fill: parent
26−
27− Image {
28− id: icon
29− objectName: "image"
30− width: styledItem.imageWidth
31− height: styledItem.imageHeight
32−
33− anchors.horizontalCenter: parent.horizontalCenter
34−
35− sourceSize { width: width; height: height }
36− asynchronous: true
37− cache: false
38− source: styledItem.source
39− fillMode: styledItem.fillMode
40− opacity: tile.disabled ? 0.3 : 1.0
41− horizontalAlignment: Image.AlignHCenter
42− verticalAlignment: Image.AlignVCenter
43− }
44−
45− UbuntuShape {
46− id: borderPressed
47− objectName: "borderPressed"
48−
49− anchors.fill: icon
50− radius: "medium"
51− borderSource: "radius_pressed.sci"
52− opacity: styledItem.pressed ? 1.0 : 0.0
53− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
54− }
55−
56− Label {
57− id: label
58− objectName: "label"
59− anchors {
60− baseline: icon.bottom
61− baselineOffset: units.gu(2)
62− left: parent.left
63− right: parent.right
64− leftMargin: units.gu(1)
65− rightMargin: units.gu(1)
66− }
67−
68− color: Theme.palette.selected.backgroundText
69− opacity: 0.9
70− style: Text.Raised
71− styleColor: "black"
72− fontSize: "small"
73− elide: Text.ElideMiddle
74− horizontalAlignment: styledItem.horizontalAlignment
75− text: styledItem.text
76− wrapMode: Text.Wrap
77− maximumLineCount: styledItem.maximumLineCount
78− }
79−}
qml/Dash/Generic/GenericCarousel.qmldeleted−53
@@ -1,53 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−import ".."
21−
22−DashCarousel {
23− id: genericCarousel
24− itemComponent: carouselDelegateGeneric
25−
26− Component {
27− id: carouselDelegateGeneric
28−
29− BaseCarouselDelegate {
30− id: item
31− objectName: "carouselDelegate"
32−
33− UbuntuShape {
34− anchors.fill: parent
35− radius: "medium"
36− borderSource: ""
37− image: Image {
38− asynchronous: true
39− sourceSize { width: item.width; height: item.height }
40− source: model ? model.icon : ""
41− }
42− }
43−
44− BorderImage {
45− anchors.centerIn: parent
46− opacity: 0.6
47− source: "../../Components/graphics/non-selected.sci"
48− width: parent.width + units.gu(1.5)
49− height: parent.height + units.gu(1.5)
50− }
51− }
52− }
53−}
qml/Dash/Generic/GenericFilterGrid.qmldeleted−46
@@ -1,46 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−import ".."
21−
22−DashFilterGrid {
23− id: genericFilterGrid
24−
25− property int iconWidth: units.gu(8)
26− property int iconHeight: units.gu(7.5)
27−
28− minimumHorizontalSpacing: units.gu(0.5)
29− delegateWidth: units.gu(11)
30− delegateHeight: units.gu(9.5)
31− verticalSpacing: units.gu(2)
32−
33− delegate: Tile {
34− id: tile
35− objectName: "delegate" + index
36− width: genericFilterGrid.cellWidth
37− height: genericFilterGrid.cellHeight
38− text: model.title
39− imageWidth: genericFilterGrid.iconWidth
40− imageHeight: genericFilterGrid.iconHeight
41− source: model.icon
42−
43− onClicked: genericFilterGrid.clicked(index, tile.y)
44− onPressAndHold: genericFilterGrid.pressAndHold(index, tile.y)
45− }
46−}
qml/Dash/Generic/GenericFilterGridPotrait.qmldeleted−28
@@ -1,28 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−
21−GenericFilterGrid {
22− minimumHorizontalSpacing: units.gu(0.5)
23− delegateWidth: units.gu(11)
24− delegateHeight: units.gu(18)
25− verticalSpacing: units.gu(2)
26− iconWidth: (width / columns) * 0.8
27− iconHeight: iconWidth * 16 / 11
28−}
qml/Dash/Generic/GenericPreview.qmldeleted−197
@@ -1,197 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItems
20−import Ubuntu.DownloadDaemonListener 0.1
21−import "../../Components"
22−import ".."
23−import "../Previews"
24−
25−DashPreview {
26− id: genericPreview
27−
28− previewImages: previewImagesComponent
29− header: headerComponent
30− actions: (previewData.infoMap !== undefined && previewData.infoMap["show_progressbar"]) ? progressComponent : actionsComponent
31− description: descriptionComponent
32−
33− Component {
34− id: previewImagesComponent
35−
36− LazyImage {
37− objectName: "genericPreviewImage"
38− anchors {
39− left: parent.left
40− right: parent.right
41− }
42− scaleTo: "width"
43− source: genericPreview.previewData.image
44− initialHeight: width
45− }
46− }
47−
48− Component {
49− id: headerComponent
50− Header {
51− title: previewData.title
52− subtitle: previewData.subtitle
53− }
54− }
55−
56− Component {
57− id: actionsComponent
58−
59− Column {
60− id: buttonList
61− spacing: units.gu(1)
62− Repeater {
63− objectName: "buttonList"
64− model: previewData.actions
65−
66− delegate: Button {
67− objectName: "button" + index
68− width: parent.width
69− height: buttonList.buttonHeight
70− color: Theme.palette.selected.foreground
71− text: modelData.displayName
72− iconSource: modelData.iconHint
73− iconPosition: "right"
74− onClicked: {
75− previewData.execute(modelData.id, { })
76− genericPreview.showProcessingAction = true;
77− }
78− }
79− }
80− }
81− }
82−
83− Component {
84− id: progressComponent
85−
86− ProgressBar {
87− id: progressBar
88− objectName: "progressBar"
89− value: 0
90− maximumValue: 100
91− height: units.gu(5)
92−
93− property var model: previewData.actions
94−
95− DownloadTracker {
96− service: "com.canonical.applications.Downloader"
97− dbusPath: previewData.infoMap["progressbar_source"] ? previewData.infoMap["progressbar_source"].value : ""
98−
99− onProgress: {
100− var percentage = parseInt(received * 100 / total);
101− progressBar.value = percentage;
102− }
103−
104− onFinished: {
105− previewData.execute(progressBar.model[0].id, { })
106− }
107−
108− onError: {
109− previewData.execute(progressBar.model[1].id, { "error": error });
110− }
111− }
112−
113− }
114− }
115−
116− Component {
117− id: descriptionComponent
118− Column {
119− spacing: units.gu(2)
120−
121− Label {
122− id: descriptionLabel
123− objectName: "descriptionLabel"
124− anchors { left: parent.left; right: parent.right }
125− visible: text != ""
126− fontSize: "small"
127− opacity: 0.6
128− color: "white"
129− text: previewData.description.replace(/[\r\n]/g, "<br />")
130− style: Text.Raised
131− styleColor: "black"
132− wrapMode: Text.WordWrap
133− textFormat: Text.RichText
134− // FIXME: workaround for https://bugreports.qt-project.org/browse/QTBUG-33020
135− onWidthChanged: { wrapMode = Text.NoWrap; wrapMode = Text.WordWrap }
136− }
137−
138− Column {
139− objectName: "infoHintColumn"
140− anchors {
141− left: parent.left
142− right: parent.right
143− }
144− Repeater {
145− objectName: "infoHintRepeater"
146− model: previewData.infoHints
147−
148− delegate: Item {
149− objectName: "infoHintItem" + index
150− width: parent.width
151− height: units.gu(5)
152− Row {
153− width: parent.width
154− spacing: units.gu(1)
155− property int columnWidth: (width - spacing) / 2
156− anchors.verticalCenter: parent.verticalCenter
157−
158− Label {
159− objectName: "displayNameLabel"
160− visible: valueLabel.visible
161− fontSize: "small"
162− opacity: 0.9
163− color: "white"
164− horizontalAlignment: Text.AlignLeft
165− width: parent.columnWidth
166− text: modelData.displayName
167− style: Text.Raised
168− styleColor: "black"
169− }
170− Label {
171− id: valueLabel
172− objectName: "valueLabel"
173− visible: modelData.value != ""
174− fontSize: "small"
175− opacity: 0.6
176− color: "white"
177− horizontalAlignment: Text.AlignRight
178− width: parent.columnWidth
179− text: modelData.value ? modelData.value : ""
180− style: Text.Raised
181− styleColor: "black"
182− wrapMode: Text.WordWrap
183− }
184− }
185− ListItems.ThinDivider {
186− anchors {
187− left: parent.left
188− bottom: parent.bottom
189− right: parent.right
190− }
191− }
192− }
193− }
194− }
195− }
196− }
197−}
qml/Dash/Generic/WeatherFilterGrid.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−
21−GenericFilterGrid {
22− id: filtergrid
23−
24− delegateHeight: units.gu(11.5)
25−
26− delegate: Tile {
27− id: tile
28− objectName: "delegate" + index
29− width: filtergrid.cellWidth
30− height: filtergrid.cellHeight
31− text: model.title
32− imageWidth: filtergrid.iconWidth
33− imageHeight: filtergrid.iconHeight
34− source: model.icon
35− maximumLineCount: 2
36−
37− style: FlatTileStyle {}
38−
39− onClicked: {
40− filtergrid.clicked(index, tile.y)
41− }
42−
43− onPressAndHold: {
44− filtergrid.pressAndHold(index, tile.y)
45− }
46− }
47−}
qml/Dash/GenericScopeView.qml+66−134
@@ -17,20 +17,20 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Utils 0.1
19import Utils 0.1
20−import Unity 0.1
20+import Unity 0.2
21+import Unity.Application 0.1
21import "../Components"
22import "../Components"
22import "../Components/ListItems" as ListItems
23import "../Components/ListItems" as ListItems
23
24
24FocusScope {
25FocusScope {
25 id: scopeView
26 id: scopeView
26
27
27− property Scope scope
28+ property Scope scope: null
28 property SortFilterProxyModel categories: categoryFilter
29 property SortFilterProxyModel categories: categoryFilter
29− property bool isCurrent
30+ property bool isCurrent: false
30 property alias moving: categoryView.moving
31 property alias moving: categoryView.moving
31 property int tabBarHeight: 0
32 property int tabBarHeight: 0
32 property PageHeader pageHeader: null
33 property PageHeader pageHeader: null
33− property OpenEffect openEffect: null
34 property Item previewListView: null
34 property Item previewListView: null
35
35
36 signal movementStarted
36 signal movementStarted
@@ -39,11 +39,8 @@ FocusScope {
39 property bool enableHeightBehaviorOnNextCreation: false
39 property bool enableHeightBehaviorOnNextCreation: false
40 property var categoryView: categoryView
40 property var categoryView: categoryView
41
41
42− // FIXME delay the search so that daemons have time to settle, note that
43− // removing this will break ScopeView::test_changeScope
44 onScopeChanged: {
42 onScopeChanged: {
45 if (scope) {
43 if (scope) {
46− timer.restart();
47 scope.activateApplication.connect(activateApp);
44 scope.activateApplication.connect(activateApp);
48 }
45 }
49 }
46 }
@@ -55,13 +52,7 @@ FocusScope {
55 Binding {
52 Binding {
56 target: scope
53 target: scope
57 property: "isActive"
54 property: "isActive"
58− value: isCurrent && !previewListView.onScreen
55+ value: isCurrent && !previewListView.open
59− }
60−
61− Timer {
62− id: timer
63− interval: 2000
64− onTriggered: scope.searchQuery = ""
65 }
56 }
66
57
67 SortFilterProxyModel {
58 SortFilterProxyModel {
@@ -92,7 +83,7 @@ FocusScope {
92 Binding {
83 Binding {
93 target: pageHeader
84 target: pageHeader
94 property: "searchQuery"
85 property: "searchQuery"
95− value: scopeView.scope.searchQuery
86+ value: scopeView.scope ? scopeView.scope.searchQuery : ""
96 when: isCurrent
87 when: isCurrent
97 }
88 }
98
89
@@ -115,30 +106,34 @@ FocusScope {
115 objectName: "categoryListView"
106 objectName: "categoryListView"
116 anchors.fill: parent
107 anchors.fill: parent
117 model: scopeView.categories
108 model: scopeView.categories
118− forceNoClip: previewListView.onScreen
109+ forceNoClip: previewListView.open
119
110
120 property string expandedCategoryId: ""
111 property string expandedCategoryId: ""
121− signal correctExpandedCategory();
122
112
123 onContentYChanged: pageHeader.positionRealHeader();
113 onContentYChanged: pageHeader.positionRealHeader();
124 onOriginYChanged: pageHeader.positionRealHeader();
114 onOriginYChanged: pageHeader.positionRealHeader();
125 onContentHeightChanged: pageHeader.positionRealHeader();
115 onContentHeightChanged: pageHeader.positionRealHeader();
126
116
127− Behavior on contentY {
128− enabled: previewListView.open
129− UbuntuNumberAnimation {}
130− }
131−
132 delegate: ListItems.Base {
117 delegate: ListItems.Base {
133 id: baseItem
118 id: baseItem
134 objectName: "dashCategory" + category
119 objectName: "dashCategory" + category
135 highlightWhenPressed: false
120 highlightWhenPressed: false
121+ showDivider: false
136
122
137 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
123 readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
138 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
124 readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filter : true
139 readonly property string category: categoryId
125 readonly property string category: categoryId
140 readonly property var item: rendererLoader.item
126 readonly property var item: rendererLoader.item
141
127
128+ CardTool {
129+ id: cardTool
130+
131+ count: results.count
132+ template: model.renderer
133+ components: model.components
134+ viewWidth: parent.width
135+ }
136+
142 Loader {
137 Loader {
143 id: rendererLoader
138 id: rendererLoader
144 anchors {
139 anchors {
@@ -147,7 +142,14 @@ FocusScope {
147 right: parent.right
142 right: parent.right
148 }
143 }
149
144
150− source: getRenderer(model.renderer, model.contentType, model.rendererHint, results)
145+ source: {
146+ switch (cardTool.categoryLayout) {
147+ case "carousel": return "CardCarousel.qml";
148+ case "running-apps": return "Apps/RunningApplicationsGrid.qml";
149+ case "grid":
150+ default: return "CardFilterGrid.qml";
151+ }
152+ }
151
153
152 onLoaded: {
154 onLoaded: {
153 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
155 if (item.enableHeightBehavior !== undefined && item.enableHeightBehaviorOnNextCreation !== undefined) {
@@ -155,9 +157,9 @@ FocusScope {
155 scopeView.enableHeightBehaviorOnNextCreation = false;
157 scopeView.enableHeightBehaviorOnNextCreation = false;
156 }
158 }
157 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
159 if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
158− // TODO: the running apps grid doesn't support standard scope results model yet
160+ // TODO: this is still a kludge :D Ideally add some kind of hook so that we
161+ // can do this from DashApps.qml or think a better way that needs no special casing
159− item.firstModel = Qt.binding(function() { return results.firstModel })
162+ item.model = Qt.binding(function() { return runningApps; })
160− item.secondModel = Qt.binding(function() { return results.secondModel })
161 item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
163 item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
162 } else {
164 } else {
163 item.model = Qt.binding(function() { return results })
165 item.model = Qt.binding(function() { return results })
@@ -170,6 +172,7 @@ FocusScope {
170 }
172 }
171 }
173 }
172 updateDelegateCreationRange();
174 updateDelegateCreationRange();
175+ item.cardTool = cardTool;
173 }
176 }
174
177
175 Component.onDestruction: {
178 Component.onDestruction: {
@@ -181,39 +184,24 @@ FocusScope {
181 Connections {
184 Connections {
182 target: rendererLoader.item
185 target: rendererLoader.item
183 onClicked: {
186 onClicked: {
184− // Prepare the preview in case activate() triggers a preview only
187+ if (scopeView.scope.id === "scopes" || (scopeView.scope.id == "clickscope" && categoryId == "local")) {
185− openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
188+ // TODO Technically it is possible that calling activate() will make the scope emit
186− previewListView.categoryId = categoryId
189+ // previewRequested so that we show a preview but there's no scope that does that yet
187− previewListView.categoryDelegate = rendererLoader.item
190+ // so it's not implemented
188− previewListView.model = target.model;
189− previewListView.init = true;
190− previewListView.currentIndex = index;
191−
192− var item = target.model.get(index);
191+ var item = target.model.get(index);
193−
194− if ((scopeView.scope.id == "applications.scope" && categoryId == "installed")
195− || (scopeView.scope.id == "home.scope" && categoryId == "applications.scope")) {
196− scopeView.scope.activate(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
192+ scopeView.scope.activate(item.result)
197− item.comment, item.dndUri, item.metadata)
198 } else {
193 } else {
194+ previewListView.model = target.model;
195+ previewListView.currentIndex = -1
196+ previewListView.currentIndex = index;
199 previewListView.open = true
197 previewListView.open = true
200−
201− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
202− item.comment, item.dndUri, item.metadata)
203 }
198 }
204 }
199 }
205 onPressAndHold: {
200 onPressAndHold: {
206− openEffect.positionPx = Math.max(mapToItem(categoryView, 0, itemY).y, pageHeader.height + categoryView.stickyHeaderHeight);
207− previewListView.categoryId = categoryId
208− previewListView.categoryDelegate = rendererLoader.item
209 previewListView.model = target.model;
201 previewListView.model = target.model;
210− previewListView.init = true;
202+ previewListView.currentIndex = -1
211 previewListView.currentIndex = index;
203 previewListView.currentIndex = index;
212 previewListView.open = true
204 previewListView.open = true
213−
214− var item = target.model.get(index)
215− scopeView.scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title,
216− item.comment, item.dndUri, item.metadata)
217 }
205 }
218 }
206 }
219 Connections {
207 Connections {
@@ -221,9 +209,6 @@ FocusScope {
221 onExpandedCategoryIdChanged: {
209 onExpandedCategoryIdChanged: {
222 collapseAllButExpandedCategory();
210 collapseAllButExpandedCategory();
223 }
211 }
224− onCorrectExpandedCategory: {
225− collapseAllButExpandedCategory();
226− }
227 function collapseAllButExpandedCategory() {
212 function collapseAllButExpandedCategory() {
228 var item = rendererLoader.item;
213 var item = rendererLoader.item;
229 if (item.expandable) {
214 if (item.expandable) {
@@ -275,6 +260,31 @@ FocusScope {
275 }
260 }
276 }
261 }
277 }
262 }
263+
264+ Image {
265+ visible: index != 0
266+ anchors {
267+ top: parent.top
268+ left: parent.left
269+ right: parent.right
270+ }
271+ fillMode: Image.Stretch
272+ source: "graphics/dash_divider_top_lightgrad.png"
273+ z: -1
274+ }
275+
276+ Image {
277+ // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
278+ visible: index != categoryView.model.count - 1
279+ anchors {
280+ bottom: parent.bottom
281+ left: parent.left
282+ right: parent.right
283+ }
284+ fillMode: Image.Stretch
285+ source: "graphics/dash_divider_top_darkgrad.png"
286+ z: -1
287+ }
278 }
288 }
279
289
280 onHeightChanged: rendererLoader.updateDelegateCreationRange();
290 onHeightChanged: rendererLoader.updateDelegateCreationRange();
@@ -302,95 +312,17 @@ FocusScope {
302 pageHeader: Item {
312 pageHeader: Item {
303 implicitHeight: scopeView.tabBarHeight
313 implicitHeight: scopeView.tabBarHeight
304 onHeightChanged: {
314 onHeightChanged: {
305− if (scopeView.pageHeader) {
315+ if (scopeView.pageHeader && scopeView.isCurrent) {
306 scopeView.pageHeader.height = height;
316 scopeView.pageHeader.height = height;
307 }
317 }
308 }
318 }
309 onYChanged: positionRealHeader();
319 onYChanged: positionRealHeader();
310
320
311 function positionRealHeader() {
321 function positionRealHeader() {
312− if (scopeView.pageHeader) {
322+ if (scopeView.pageHeader && scopeView.isCurrent) {
313 scopeView.pageHeader.y = y + parent.y;
323 scopeView.pageHeader.y = y + parent.y;
314 }
324 }
315 }
325 }
316 }
326 }
317 }
327 }
318−
319− function getDefaultRendererId(contentType) {
320− switch (contentType) {
321− default: return "grid";
322− }
323− }
324−
325− function getRenderer(rendererId, contentType, rendererHint, results) {
326− if (rendererId == "default") {
327− rendererId = getDefaultRendererId(contentType);
328− }
329− if (rendererId == "carousel") {
330− // Selectively disable carousel, 6 is fixed for now, should change on the form factor
331− if (results.count <= 6)
332− rendererId = "grid"
333− }
334− switch (rendererId) {
335− case "carousel": {
336− switch (contentType) {
337− case "music": return "Music/MusicCarousel.qml";
338− case "video": return "Video/VideoCarousel.qml";
339− default: return "Generic/GenericCarousel.qml";
340− }
341− }
342− case "grid": {
343− switch (contentType) {
344− case "apps": {
345− if (rendererHint == "toggled")
346− return "Apps/DashPluginFilterGrid.qml";
347− else
348− return "Generic/GenericFilterGrid.qml";
349− }
350− case "music": return "Music/MusicFilterGrid.qml";
351− case "video": return "Video/VideoFilterGrid.qml";
352− case "weather": return "Generic/WeatherFilterGrid.qml";
353− default: return "Generic/GenericFilterGrid.qml";
354− }
355− }
356− case "special": {
357− switch (contentType) {
358− case "apps": return "Apps/RunningApplicationsGrid.qml";
359− default: return "Generic/GenericFilterGrid.qml";
360− }
361− }
362− default: return "Generic/GenericFilterGrid.qml";
363− }
364− }
365−
366− Connections {
367− target: scopeView.scope
368− onPreviewReady: {
369− if (previewListView.init) {
370− // Preview was triggered because of a click on the item. Need to expand now.
371− if (!previewListView.open) {
372− previewListView.open = true
373− }
374−
375− var index = previewListView.currentIndex
376− previewListView.currentIndex = -1
377− previewListView.currentIndex = index
378− previewListView.init = false
379− }
380− previewListView.currentItem.previewData = preview
381− }
382− }
383−
384− // TODO: Move as InverseMouseArea to DashPreview
385− MouseArea {
386− objectName: "closePreviewMouseArea"
387− enabled: previewListView.onScreen
388− anchors {
389− fill: parent
390− topMargin: openEffect.bottomGapPx
391− }
392− onClicked: {
393− previewListView.open = false;
394− }
395− }
396}
328}
qml/Dash/Movie/MoviePreview.qmldeleted−71
@@ -1,71 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import ".."
20−import "../Generic"
21−import "../../Components"
22−import "../Previews"
23−
24−GenericPreview {
25− id: root
26−
27− property bool ready: previewData ? true : false
28− property url url: ready ? previewData.image : ""
29−
30− previewImages: previewImageComponent
31− header: headerComponent
32−
33− Component {
34− id: previewImageComponent
35− LazyImage {
36− anchors.left: parent.left
37− anchors.right: parent.right
38− scaleTo: "width"
39− visible: height > 0
40− source: root.url
41− initialHeight: width * 10 / 16
42−
43− Image {
44− objectName: "playButton"
45− anchors.centerIn: parent
46− readonly property bool bigButton: parent.width > units.gu(40)
47− width: bigButton ? units.gu(8) : units.gu(4.5)
48− height: width
49− source: "../graphics/play_button%1%2.png".arg(previewImageMouseArea.pressed ? "_active" : "").arg(bigButton ? "_big" : "")
50− }
51−
52− MouseArea {
53− id: previewImageMouseArea
54− anchors.fill: parent
55− onClicked: {
56− Qt.openUrlExternally(previewData.result.uri);
57− }
58− }
59− }
60− }
61−
62− Component {
63− id: headerComponent
64− Header {
65− title: previewData.title
66− rating: Math.round(previewData.rating * 10)
67− reviews: previewData.numRatings
68− rated: previewData.infoMap["rated"] ? previewData.infoMap["rated"].value : 0
69− }
70− }
71−}
qml/Dash/Music/CarouselDelegateMusic.qmldeleted−42
@@ -1,42 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−
21−BaseCarouselDelegate {
22− id: item
23−
24− UbuntuShape {
25− anchors.fill: parent
26− radius: "medium"
27− borderSource: ""
28− image: Image {
29− asynchronous: true
30− sourceSize { width: item.width; height: item.height }
31− source: model ? model.icon : ""
32− }
33− }
34−
35− BorderImage {
36− anchors.centerIn: parent
37− opacity: 0.6
38− source: "../../Components/graphics/non-selected.sci"
39− width: parent.width + units.gu(1.5)
40− height: parent.height + units.gu(1.5)
41− }
42−}
qml/Dash/Music/MusicCarousel.qmldeleted−34
@@ -1,34 +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 ".."
20−
21−DashCarousel {
22− id: musicCarousel
23− tileAspectRatio: 1
24− minimumTileWidth: units.gu(13)
25− itemComponent: carouselDelegateMusic
26− selectedItemScaleFactor: 1.2
27− cacheBuffer: 1404 // 18px * 13gu * 6
28−
29− Component {
30− id: carouselDelegateMusic
31− CarouselDelegateMusic {
32− }
33− }
34−}
qml/Dash/Music/MusicFilterGrid.qmldeleted−48
@@ -1,48 +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 "../Generic"
20−
21−GenericFilterGrid {
22− id: musicFilterGrid
23−
24− delegateWidth: units.gu(11)
25− delegateHeight: units.gu(16)
26− iconWidth: units.gu(11)
27− iconHeight: units.gu(11)
28−
29− delegate: Tile {
30− id: tile
31− objectName: "delegate" + index
32− width: musicFilterGrid.cellWidth
33− height: musicFilterGrid.cellHeight
34− text: model.comment
35− imageWidth: musicFilterGrid.iconWidth
36− imageHeight: musicFilterGrid.iconHeight
37− source: model.icon
38− maximumLineCount: 2
39− horizontalAlignment: Text.AlignLeft
40−
41− style: MusicTileStyle {
42− artist: model.title
43− }
44−
45− onClicked: musicFilterGrid.clicked(index, tile.y)
46− onPressAndHold: musicFilterGrid.pressAndHold(index, tile.y)
47− }
48−}
qml/Dash/Music/MusicPreview.qmldeleted−203
@@ -1,203 +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 QtMultimedia 5.0
19−import Ubuntu.Components 0.1
20−import Ubuntu.Components.ListItems 0.1
21−import ".."
22−import "../Generic"
23−import "../../Components"
24−import "../Previews"
25−
26−GenericPreview {
27− id: root
28−
29− previewImages: previewImageComponent
30− header: headerComponent
31− description: descriptionComponent
32−
33− Component {
34− id: previewImageComponent
35− LazyImage {
36− height: units.gu(22)
37− scaleTo: "height"
38− source: previewData ? previewData.image : ""
39− initialHeight: height
40− initialWidth: height
41− }
42− }
43−
44− Component {
45− id: headerComponent
46− Header {
47− title: previewData.title
48− subtitle: previewData.subtitle
49− }
50− }
51−
52− Component {
53− id: descriptionComponent
54−
55− Item {
56− height: childrenRect.height
57− Audio {
58− id: audioPlayer
59− objectName: "audioPlayer"
60− property real progress: audioPlayer.position / audioPlayer.duration
61−
62− property Item playingItem
63−
64− Component.onDestruction: {
65− audioPlayer.stop();
66− }
67−
68− onErrorStringChanged: console.warn("Audio player error:", errorString)
69−
70− }
71−
72− Connections {
73− target: root
74− onIsCurrentChanged: {
75− if (!root.isCurrent) {
76− audioPlayer.stop();
77− }
78− }
79− }
80−
81− Column {
82− anchors { left: parent.left; right: parent.right }
83− visible: trackRepeater.count > 0
84−
85− ThinDivider {
86− objectName: "topDivider"
87− anchors { left: parent.left; right: parent.right }
88− }
89−
90− Repeater {
91− id: trackRepeater
92− objectName: "trackRepeater"
93−
94− model: previewData.tracks
95−
96− delegate: Item {
97− id: trackItem
98− objectName: "trackItem" + index
99− anchors { left: parent.left; right: parent.right }
100− height: units.gu(5)
101− property bool isPlayingItem: audioPlayer.playingItem == trackItem
102−
103− function play() {
104− audioPlayer.stop();
105− // Make sure we change the source, even if two items point to the same uri location
106− audioPlayer.source = "";
107− audioPlayer.source = model.uri;
108− audioPlayer.playingItem = trackItem;
109− audioPlayer.play();
110− }
111−
112− Row {
113− id: trackRow
114− width: parent.width
115− spacing: units.gu(1)
116− property int column1Width: units.gu(3)
117− property int column2Width: width - (2 * spacing) - column1Width - column3Width
118− property int column3Width: units.gu(4)
119− anchors.verticalCenter: parent.verticalCenter
120−
121− Button {
122− objectName: "playButton"
123− width: trackRow.column1Width
124− height: width
125− iconSource: audioPlayer.playbackState == Audio.PlayingState && trackItem.isPlayingItem ? "image://theme/media-playback-pause" : "image://theme/media-playback-start"
126−
127− // Can't be "transparent" or "#00xxxxxx" as the button optimizes away the surrounding shape
128− // FIXME when this is resolved: https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1251685
129− color: "#01000000"
130−
131− onClicked: {
132− if (trackItem.isPlayingItem) {
133− if (audioPlayer.playbackState == Audio.PlayingState) {
134− audioPlayer.pause();
135− } else if (audioPlayer.playbackState == Audio.PausedState){
136− audioPlayer.play();
137− }
138− } else {
139− trackItem.play();
140− }
141− }
142− }
143−
144− Label {
145− objectName: "trackTitleLabel"
146− fontSize: "small"
147− opacity: 0.9
148− color: "white"
149− horizontalAlignment: Text.AlignLeft
150− anchors.verticalCenter: parent.verticalCenter
151− width: parent.column2Width
152− text: title
153− style: Text.Raised
154− styleColor: "black"
155− elide: Text.ElideRight
156−
157− UbuntuShape {
158− id: progressBarFill
159− objectName: "progressBarFill"
160− color: UbuntuColors.orange
161− anchors.left: progressBarImage.left
162− anchors.right: progressBarImage.right
163− anchors.verticalCenter: progressBarImage.verticalCenter
164− height: units.dp(2)
165− anchors.margins: units.dp(2)
166− anchors.rightMargin: maxWidth - (maxWidth * audioPlayer.progress) + units.dp(2)
167− visible: progressBarImage.visible
168− property int maxWidth: progressBarImage.width - units.dp(4)
169− }
170−
171− Image {
172− id: progressBarImage
173− anchors { left: parent.left; top: parent.bottom; right: parent.right }
174− height: units.dp(6)
175− visible: audioPlayer.playbackState != Audio.StoppedState && trackItem.isPlayingItem && model.length.length > 0
176− source: "graphics/music_progress_bg.png"
177− }
178− }
179−
180− Label {
181− id: valueLabel
182− objectName: "timeLabel"
183− fontSize: "small"
184− opacity: 0.9
185− color: "white"
186− anchors.verticalCenter: parent.verticalCenter
187− horizontalAlignment: Text.AlignRight
188− width: parent.column3Width
189− text: length
190− style: Text.Raised
191− styleColor: "black"
192− }
193− }
194−
195− ThinDivider {
196− anchors { left: parent.left; bottom: parent.bottom; right: parent.right }
197− }
198− }
199− }
200− }
201− }
202− }
203−}
qml/Dash/Music/MusicTileStyle.qmldeleted−102
@@ -1,102 +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: tile
22−
23− property alias artist: artistLabel.text
24−
25− anchors.fill: parent
26−
27− UbuntuShape {
28− id: icon
29− anchors {
30− top: parent.top
31− horizontalCenter: parent.horizontalCenter
32− }
33− radius: "medium"
34− width: styledItem.imageWidth
35− height: styledItem.imageHeight
36− image: Image {
37− id: image
38− objectName: "image"
39− sourceSize { width: icon.width; height: icon.height }
40− asynchronous: true
41− cache: false
42− source: styledItem.source
43− fillMode: styledItem.fillMode
44− horizontalAlignment: Image.AlignHCenter
45− verticalAlignment: Image.AlignVCenter
46− }
47− }
48−
49− UbuntuShape {
50− id: borderPressed
51− objectName: "borderPressed"
52−
53− anchors.fill: icon
54− radius: "medium"
55− borderSource: "radius_pressed.sci"
56− opacity: styledItem.pressed ? 1.0 : 0.0
57− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
58− }
59−
60− Label {
61− id: label
62− objectName: "label"
63− anchors {
64− baseline: icon.bottom
65− baselineOffset: units.gu(2)
66− left: icon.left
67− right: parent.right
68− rightMargin: units.gu(1)
69− leftMargin: units.dp(2)
70− }
71−
72− color: Theme.palette.selected.backgroundText
73− opacity: 0.9
74− style: Text.Raised
75− styleColor: "black"
76− fontSize: "small"
77− font.weight: Font.Bold
78− elide: Text.ElideRight
79− horizontalAlignment: styledItem.horizontalAlignment
80− text: styledItem.text
81− wrapMode: Text.Wrap
82− maximumLineCount: styledItem.maximumLineCount
83− }
84−
85− Label {
86− id: artistLabel
87− anchors {
88− top: label.bottom
89− left: label.left
90− right: label.right
91− rightMargin: units.gu(1)
92− }
93−
94− color: Theme.palette.selected.backgroundText
95− opacity: 0.9
96− style: Text.Raised
97− styleColor: "black"
98− fontSize: "x-small"
99− elide: Text.ElideMiddle
100− horizontalAlignment: styledItem.horizontalAlignment
101− }
102−}
qml/Dash/PreviewDelegateMapper.qmldeleted−38
@@ -1,38 +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 d: QtObject {
21− readonly property string genericPreview: "Generic/GenericPreview.qml"
22− readonly property string appPreview: "Apps/AppPreview.qml"
23− property var previewDelegateMapping: {"preview-generic": genericPreview,
24− "preview-application": appPreview,
25− "preview-movie": "Movie/MoviePreview.qml",
26− "preview-music": "Music/MusicPreview.qml",
27− }
28− }
29−
30− function map(rendererName) {
31− var customPreview = d.previewDelegateMapping[rendererName]
32− if (customPreview != undefined) {
33− return customPreview
34− }
35− console.debug("Renderer "+rendererName+" not found, using preview-generic")
36− return d.genericPreview
37− }
38−}
qml/Dash/PreviewListView.qml+52−133
@@ -16,53 +16,55 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19−import Unity 0.1
19+import Unity 0.2
20import "../Components"
20import "../Components"
21+import "Previews" as Previews
21
22
22Item {
23Item {
23− property OpenEffect openEffect: null
24+ id: root
24− property ScopeListView categoryView: null
25+
25 property Scope scope: null
26 property Scope scope: null
27+ property var pageHeader: null
26
28
27 property alias open: previewListView.open
29 property alias open: previewListView.open
28− property alias onScreen: previewListView.onScreen
29− property alias categoryId: previewListView.categoryId
30− property alias categoryDelegate: previewListView.categoryDelegate
31− property alias init: previewListView.init
32 property alias model: previewListView.model
30 property alias model: previewListView.model
33 property alias currentIndex: previewListView.currentIndex
31 property alias currentIndex: previewListView.currentIndex
34 property alias currentItem: previewListView.currentItem
32 property alias currentItem: previewListView.currentItem
35 property alias count: previewListView.count
33 property alias count: previewListView.count
36
34
37− Image {
35+ PageHeader {
38− objectName: "pointerArrow"
36+ id: header
39− anchors {
37+ objectName: root.objectName + "_pageHeader"
40− top: previewListView.bottom
41− left: parent.left
38+ width: parent.width
42− leftMargin: previewListView.categoryDelegate !== undefined && previewListView.categoryDelegate.currentItem ?
39+ searchEntryEnabled: false
43− previewListView.categoryDelegate.currentItem.center + (-width + margins) / 2 : 0
40+ scope: root.scope
44−
41+ height: units.gu(8.5)
45− Behavior on leftMargin {
42+ showBackButton: true
46− SmoothedAnimation {
43+ onBackClicked: root.open = false
47− duration: UbuntuAnimation.FastDuration
44+
48− }
45+ childItem: Label {
46+ id: label
47+ anchors {
48+ left: parent.left
49+ right: parent.right
50+ verticalCenter: parent.verticalCenter
49 }
51 }
52+ text: scope ? i18n.tr("%1 Preview").arg(scope.name) : ""
53+ // TODO Saviq: These should come from updated Ubuntu Palette.
54+ color: "#888888"
55+ font.family: "Ubuntu"
56+ font.weight: Font.Light
57+ fontSize: "x-large"
58+ elide: Text.ElideRight
50 }
59 }
51− height: units.gu(1)
52− width: units.gu(2)
53− property int margins: previewListView.categoryDelegate ? previewListView.categoryDelegate.margins : 0
54− opacity: previewListView.open ? .5 : 0
55−
56− source: "graphics/tooltip_arrow.png"
57 }
60 }
58
61
59 ListView {
62 ListView {
60 id: previewListView
63 id: previewListView
61− objectName: "previewListView"
64+ objectName: root.objectName + "_listView"
62− height: openEffect.bottomGapPx - openEffect.topGapPx
63 anchors {
65 anchors {
64− top: parent.top
66+ top: header.bottom
65− topMargin: openEffect.topGapPx
67+ bottom: parent.bottom
66 left: parent.left
68 left: parent.left
67 right: parent.right
69 right: parent.right
68 }
70 }
@@ -77,140 +79,57 @@ Item {
77
79
78 // To be set before opening the preview
80 // To be set before opening the preview
79 property string categoryId: ""
81 property string categoryId: ""
80− property var categoryDelegate
81
82
82 // because the ListView is built asynchronous, setting the
83 // because the ListView is built asynchronous, setting the
83 // currentIndex directly won't work. We need to refresh it
84 // currentIndex directly won't work. We need to refresh it
84 // when the first preview is ready to be displayed.
85 // when the first preview is ready to be displayed.
85 property bool init: true
86 property bool init: true
86
87
87− PreviewDelegateMapper {
88− id: previewDelegateMapper
89− }
90−
91− onCurrentIndexChanged: positionListView();
92−
93− function positionListView() {
94− if (!open) {
95− return;
96− }
97−
98− var row = Math.floor(currentIndex / categoryDelegate.columns);
99− if (categoryDelegate.collapsedRowCount <= row) {
100− categoryView.expandedCategoryId = categoryId
101− }
102−
103− categoryDelegate.highlightIndex = currentIndex
104−
105− if (!init && model !== undefined) {
106− var item = model.get(currentIndex)
107− scope.preview(item.uri, item.icon, item.category, 0, item.mimetype, item.title, item.comment, item.dndUri, item.metadata)
108− }
109−
110− // Adjust contentY in case we need to change to it to show the next row
111− if (categoryDelegate.rows > 1) {
112− var itemY = categoryView.contentItem.mapFromItem(categoryDelegate.currentItem).y;
113−
114− // Find new contentY and effect.postionPx
115− var newContentY = itemY - openEffect.positionPx - categoryDelegate.verticalSpacing;
116−
117− // Make sure the item is not covered by a header. Move the effect split down if necessary
118− var headerHeight = pageHeader.height + categoryView.stickyHeaderHeight;
119− var effectAdjust = Math.max(openEffect.positionPx, headerHeight);
120−
121− // Make sure we don't overscroll the listview. If yes, adjust effect position
122− if (newContentY < 0) {
123− effectAdjust += newContentY;
124− newContentY = 0;
125− }
126− if (newContentY > Math.max(0, categoryView.contentHeight - categoryView.height)) {
127− effectAdjust += -(categoryView.contentHeight - categoryView.height) + newContentY
128− newContentY = categoryView.contentHeight - categoryView.height;
129− }
130−
131− openEffect.positionPx = effectAdjust;
132− categoryView.contentY = newContentY;
133− }
134− }
135−
136 property bool open: false
88 property bool open: false
137− property bool onScreen: false
138
89
139 onOpenChanged: {
90 onOpenChanged: {
140 if (open) {
91 if (open) {
141− onScreen = true;
142− categoryDelegate.highlightIndex = currentIndex;
143 pageHeader.unfocus();
92 pageHeader.unfocus();
144− positionListView();
145 } else {
93 } else {
146 // Cancel any pending preview requests or actions
94 // Cancel any pending preview requests or actions
147− if (previewListView.currentItem.previewData !== undefined) {
95+ if (previewListView.currentItem && previewListView.currentItem.previewData !== undefined) {
148 previewListView.currentItem.previewData.cancelAction();
96 previewListView.currentItem.previewData.cancelAction();
149 }
97 }
150 scope.cancelActivation();
98 scope.cancelActivation();
151 model = undefined;
99 model = undefined;
152− categoryView.correctExpandedCategory();
153− categoryDelegate.highlightIndex = -1;
154 }
100 }
155 }
101 }
156
102
157− Rectangle {
158− anchors.fill: parent
159− color: Qt.rgba(0, 0, 0, .3)
160− z: -1
161− }
162−
163− delegate: Loader {
103+ delegate: Item {
164− id: previewLoader
165− objectName: "previewLoader" + index
104+ objectName: "previewItem" + index
166 height: previewListView.height
105 height: previewListView.height
167 width: previewListView.width
106 width: previewListView.width
168− asynchronous: true
169− source: previewListView.onScreen ?
170− (previewData !== undefined ? previewDelegateMapper.map(previewData.rendererName) : "DashPreviewPlaceholder.qml") : ""
171
107
172− onPreviewDataChanged: {
108+ readonly property bool ready: preview.previewModel.loaded
173− if (previewData !== undefined && source.toString().indexOf("DashPreviewPlaceholder.qml") != -1) {
174− previewLoader.opacity = 0;
175− }
176− }
177−
178− onSourceChanged: {
179− if (previewData !== undefined) {
180− fadeIn.start()
181− }
182− }
183
109
184− PropertyAnimation {
110+ Previews.Preview {
185− id: fadeIn
111+ id: preview
186− target: previewLoader
112+ objectName: "preview" + index
187− property: "opacity"
113+ anchors.fill: parent
188− from: 0.0
189− to: 1.0
190− duration: UbuntuAnimation.BriskDuration
191− }
192
114
193− property var previewData
115+ isCurrent: parent.ListView.isCurrentItem
194− property bool valid: item !== null
195
116
196− onLoaded: {
117+ previewModel: {
197− if (previewListView.onScreen && previewData !== undefined) {
118+ var previewStack = root.scope.preview(result);
198− item.previewData = Qt.binding(function() { return previewData })
119+ return previewStack.get(0);
199− item.isCurrent = Qt.binding(function() { return ListView.isCurrentItem })
200 }
120 }
201 }
121 }
202
122
203− Connections {
123+ MouseArea {
204− ignoreUnknownSignals: true
124+ id: processingMouseArea
205− target: item
125+ objectName: "processingMouseArea"
206− onClose: {
126+ anchors.fill: parent
207− previewListView.open = false
127+ enabled: !preview.previewModel.loaded || preview.previewModel.processingAction
208− }
209− }
210
128
211− function closePreviewSpinner() {
129+ ActivityIndicator {
212− if (item) {
130+ anchors.centerIn: parent
213− item.showProcessingAction = false;
131+ visible: root.open && parent.enabled
132+ running: visible
214 }
133 }
215 }
134 }
216 }
135 }
qml/Dash/Previews/Header.qmldeleted−109
@@ -1,109 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−
21−Row {
22− id: root
23− property alias icon: image.source
24− property alias title: titleLabel.text
25− property alias subtitle: subtitleLabel.text
26− property alias rating: ratingStars.rating
27− property int rated: 0
28− property int reviews: 0
29−
30− spacing: units.gu(2)
31− height: imageShape.visible ? imageShape.height : contentColumn.height
32−
33− UbuntuShape {
34− id: imageShape
35− width: height
36− height: Math.max(units.gu(6), contentColumn.height)
37− visible: image.source.toString().length > 0
38− image: Image {
39− id: image
40− sourceSize { width: imageShape.width; height: imageShape.height }
41− asynchronous: true
42− fillMode: Image.PreserveAspectFit
43− }
44− }
45−
46− Column {
47− id: contentColumn
48− spacing: units.gu(1)
49− width: parent.width - x
50−
51− Label {
52− id: titleLabel
53− objectName: "titleLabel"
54− fontSize: "large"
55− color: "white"
56− style: Text.Raised
57− styleColor: "black"
58− opacity: .9
59− width: parent.width
60− elide: Text.ElideRight
61− }
62−
63− Label {
64− id: subtitleLabel
65− objectName: "subtitleLabel"
66− fontSize: "medium"
67− color: "white"
68− style: Text.Raised
69− styleColor: "black"
70− opacity: .6
71− visible: text.length > 0
72− }
73−
74− Row {
75− visible: root.rating >= 0
76− spacing: units.gu(1)
77−
78− RatingStars {
79− id: ratingStars
80− maximumRating: 10
81− rating: -1
82− }
83−
84− Label {
85− id: ratedLabel
86− objectName: "ratedLabel"
87− fontSize: "medium"
88− color: "white"
89− style: Text.Raised
90− styleColor: "black"
91− opacity: .6
92− //TRANSLATORS: Number of persons who rated this app/video/whatever
93− text: i18n.tr("(%1)").arg(root.rated)
94− }
95−
96− Label {
97− id: reviewsLabel
98− objectName: "reviewsLabel"
99− fontSize: "medium"
100− color: "white"
101− style: Text.Raised
102− styleColor: "black"
103− opacity: .6
104− //TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
105− text: i18n.tr("%1 review", "%1 reviews", root.reviews).arg(root.reviews)
106− }
107− }
108− }
109−}
qml/Dash/Previews/Preview.qml+17−23
@@ -38,18 +38,12 @@ Item {
38
38
39 clip: true
39 clip: true
40
40
41− Connections {
41+ Binding {
42− target: shell.applicationManager
42+ target: previewModel
43− onMainStageFocusedApplicationChanged: {
43+ property: "widgetColumnCount"
44− root.close();
44+ value: row.columns
45− }
46− onSideStageFocusedApplicationChanged: {
47− root.close();
48− }
49 }
45 }
50
46
51− onPreviewModelChanged: processingMouseArea.enabled = false
52−
53 MouseArea {
47 MouseArea {
54 anchors.fill: parent
48 anchors.fill: parent
55 }
49 }
@@ -60,18 +54,21 @@ Item {
60 spacing: units.gu(1)
54 spacing: units.gu(1)
61 anchors { fill: parent; margins: spacing }
55 anchors { fill: parent; margins: spacing }
62
56
57+ property int columns: width >= units.gu(80) ? 2 : 1
58+ property real columnWidth: width / columns
59+
63 Repeater {
60 Repeater {
64− model: 1
61+ model: previewModel
65
62
66 delegate: ListView {
63 delegate: ListView {
67 id: column
64 id: column
68 anchors { top: parent.top; bottom: parent.bottom }
65 anchors { top: parent.top; bottom: parent.bottom }
69− width: row.width
66+ width: row.columnWidth
70 spacing: row.spacing
67 spacing: row.spacing
71 bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
68 bottomMargin: Qt.inputMethod.visible ? Qt.inputMethod.keyboardRectangle.height : 0
72
69
73− model: previewModel
70+ model: columnModel
74− cacheBuffer: units.gu(40)
71+ cacheBuffer: height
75
72
76 Behavior on contentY { UbuntuNumberAnimation { } }
73 Behavior on contentY { UbuntuNumberAnimation { } }
77
74
@@ -80,10 +77,14 @@ Item {
80 widgetType: model.type
77 widgetType: model.type
81 widgetData: model.properties
78 widgetData: model.properties
82 isCurrentPreview: root.isCurrent
79 isCurrentPreview: root.isCurrent
80+ anchors {
81+ left: parent.left
83− anchors { left: parent.left; right: parent.right }
82+ right: parent.right
83+ leftMargin: units.gu(1)
84+ rightMargin: units.gu(1)
85+ }
84
86
85 onTriggered: {
87 onTriggered: {
86− processingMouseArea.enabled = true;
87 previewModel.triggered(widgetId, actionId, data);
88 previewModel.triggered(widgetId, actionId, data);
88 }
89 }
89
90
@@ -94,11 +95,4 @@ Item {
94 }
95 }
95 }
96 }
96 }
97 }
97−
98− MouseArea {
99− id: processingMouseArea
100− objectName: "processingMouseArea"
101− anchors.fill: parent
102− enabled: false
103− }
104}
98}
qml/Dash/Previews/PreviewActions.qml+1−1
@@ -24,7 +24,7 @@ import QtQuick 2.1
24PreviewWidget {
24PreviewWidget {
25 id: root
25 id: root
26
26
27− height: row.height
27+ height: row.height + units.gu(1)
28
28
29 Row {
29 Row {
30 id: row
30 id: row
qml/Dash/Previews/PreviewAudioPlayback.qml+4−3
@@ -139,7 +139,7 @@ PreviewWidget {
139 objectName: "trackTitleLabel"
139 objectName: "trackTitleLabel"
140 anchors { top: parent.top; left: parent.left; right: parent.right }
140 anchors { top: parent.top; left: parent.left; right: parent.right }
141 opacity: 0.9
141 opacity: 0.9
142− color: Theme.palette.selected.backgroundText
142+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
143 fontSize: "small"
143 fontSize: "small"
144 horizontalAlignment: Text.AlignLeft
144 horizontalAlignment: Text.AlignLeft
145 text: modelData["title"]
145 text: modelData["title"]
@@ -152,7 +152,8 @@ PreviewWidget {
152 anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right }
152 anchors { top: trackTitleLabel.bottom; left: parent.left; right: parent.right }
153 visible: text !== ""
153 visible: text !== ""
154 opacity: 0.9
154 opacity: 0.9
155− color: Theme.palette.selected.backgroundText
155+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
156+ font.weight: Font.Light
156 fontSize: "small"
157 fontSize: "small"
157 horizontalAlignment: Text.AlignLeft
158 horizontalAlignment: Text.AlignLeft
158 text: modelData["subtitle"] || ""
159 text: modelData["subtitle"] || ""
@@ -192,7 +193,7 @@ PreviewWidget {
192 anchors.verticalCenter: parent.verticalCenter
193 anchors.verticalCenter: parent.verticalCenter
193 width: parent.column3Width
194 width: parent.column3Width
194 opacity: 0.9
195 opacity: 0.9
195− color: Theme.palette.selected.backgroundText
196+ color: "grey"//Theme.palette.selected.backgroundText // TODO karni: Use updated Palette.
196 fontSize: "small"
197 fontSize: "small"
197 horizontalAlignment: Text.AlignRight
198 horizontalAlignment: Text.AlignRight
198 text: audio.lengthToString(modelData["length"])
199 text: audio.lengthToString(modelData["length"])
qml/Dash/Previews/PreviewHeader.qml+5−1
@@ -34,5 +34,9 @@ PreviewWidget {
34 title: root.widgetData["title"] || ""
34 title: root.widgetData["title"] || ""
35 subtitle: root.widgetData["subtitle"] || ""
35 subtitle: root.widgetData["subtitle"] || ""
36 width: parent.width
36 width: parent.width
37+
38+ titleSize: "large"
39+ // TODO Change "grey" to Ubuntu.Components.Palette color once updated.
40+ fontColor: "grey"
37 }
41 }
38−}
42+}
qml/Dash/Previews/PreviewImageGallery.qml+19
@@ -32,6 +32,25 @@ PreviewWidget {
32 orientation: ListView.Horizontal
32 orientation: ListView.Horizontal
33 cacheBuffer: width * 3
33 cacheBuffer: width * 3
34 model: root.widgetData["sources"]
34 model: root.widgetData["sources"]
35+ clip: true
36+
37+ // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
38+ // we finally reached the point where this ListView doesn't correctly get swipe input any more but
39+ // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
40+ // layer to make sure this ListView can be swiped, regardless of what's behind it.
41+ MouseArea {
42+ anchors.fill: parent
43+ enabled: parent.contentWidth > parent.width
44+ }
45+
46+ // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
47+ // we finally reached the point where this ListView doesn't correctly get swipe input any more but
48+ // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
49+ // layer to make sure this ListView can be swiped, regardless of what's behind it.
50+ MouseArea {
51+ anchors.fill: parent
52+ enabled: parent.contentWidth > parent.width
53+ }
35
54
36 LazyImage {
55 LazyImage {
37 objectName: "placeholderScreenshot"
56 objectName: "placeholderScreenshot"
qml/Dash/Previews/PreviewRatingInput.qml+1−1
@@ -58,7 +58,7 @@ PreviewWidget {
58 reviewTextArea.text === "")) return;
58 reviewTextArea.text === "")) return;
59
59
60 var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
60 var data = {"rating": rating.value, "review": reviewTextArea.text, "author": null};
61− triggered(root.widgetId, widgetData["required"], data);
61+ triggered(root.widgetId, "rated", data);
62 }
62 }
63
63
64 Item {
64 Item {
qml/Dash/Previews/PreviewTextSummary.qml+6−3
@@ -38,7 +38,8 @@ PreviewWidget {
38 right: parent.right
38 right: parent.right
39 }
39 }
40 fontSize: "large"
40 fontSize: "large"
41+ // TODO karni: Yet another fix requiring Palette update.
41− color: Theme.palette.selected.backgroundText
42+ color: "grey" //Theme.palette.selected.backgroundText
42 visible: text !== ""
43 visible: text !== ""
43 opacity: .8
44 opacity: .8
44 text: widgetData["title"] || ""
45 text: widgetData["title"] || ""
@@ -58,8 +59,10 @@ PreviewWidget {
58 }
59 }
59 height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2)
60 height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2)
60 clip: true
61 clip: true
61− fontSize: "medium"
62+ fontSize: "small"
63+ lineHeight: 1.2
64+ // TODO karni: Yet another fix requiring Palette update.
62− color: Theme.palette.selected.backgroundText
65+ color: "grey" //Theme.palette.selected.backgroundText
63 opacity: .8
66 opacity: .8
64 text: widgetData["text"]
67 text: widgetData["text"]
65 wrapMode: Text.Wrap
68 wrapMode: Text.Wrap
qml/Dash/Previews/PreviewVideoPlayback.qml+1
@@ -16,6 +16,7 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19+import Ubuntu.Thumbnailer 0.1
19import "../../Components"
20import "../../Components"
20
21
21/*! \brief Preview widget for video.
22/*! \brief Preview widget for video.
qml/Dash/Previews/PreviewWidgetFactory.qml+1−1
@@ -46,7 +46,7 @@ Loader {
46 case "audio": return "PreviewAudioPlayback.qml";
46 case "audio": return "PreviewAudioPlayback.qml";
47 case "gallery": return "PreviewImageGallery.qml";
47 case "gallery": return "PreviewImageGallery.qml";
48 case "header": return "PreviewHeader.qml";
48 case "header": return "PreviewHeader.qml";
49− case "image": return "PreviewZoomableImage.qml"
49+ case "image": return "PreviewZoomableImage.qml";
50 case "progress": return "PreviewProgress.qml";
50 case "progress": return "PreviewProgress.qml";
51 case "rating-input": return "PreviewRatingInput.qml";
51 case "rating-input": return "PreviewRatingInput.qml";
52 case "reviews": return "PreviewRatingDisplay.qml";
52 case "reviews": return "PreviewRatingDisplay.qml";
qml/Dash/Previews/Reviews.qmldeleted−194
@@ -1,194 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Ubuntu.Components.ListItems 0.1 as ListItem
20−import "../../Components"
21−
22−Column {
23− id: root
24−
25− property var model
26− property alias textArea: reviewField
27−
28− signal sendReview(string review)
29− signal editing
30−
31− spacing: units.gu(2)
32− state: ""
33−
34− states: [
35− State {
36− name: ""
37− PropertyChanges { target: reviewField; width: root.width }
38− PropertyChanges { target: sendButton; opacity: 0 }
39− PropertyChanges { target: inverseArea; enabled: false }
40− },
41− State {
42− name: "editing"
43− PropertyChanges { target: reviewField; width: (root.width - row.spacing - sendButton.width) }
44− PropertyChanges { target: sendButton; opacity: 1 }
45− PropertyChanges { target: inverseArea; enabled: true }
46− }
47− ]
48−
49− transitions: [
50− Transition {
51− from: ""
52− to: "editing"
53− SequentialAnimation {
54− UbuntuNumberAnimation { target: reviewField; properties: "width"; duration: UbuntuAnimation.SlowDuration }
55− UbuntuNumberAnimation { target: sendButton; properties: "opacity"; duration: UbuntuAnimation.SlowDuration }
56− }
57− },
58− Transition {
59− from: "editing"
60− to: ""
61− SequentialAnimation {
62− UbuntuNumberAnimation { target: sendButton; properties: "opacity"; duration: UbuntuAnimation.SlowDuration }
63− UbuntuNumberAnimation { target: reviewField; properties: "width"; duration: UbuntuAnimation.SlowDuration }
64− }
65− }
66− ]
67−
68− Label {
69− fontSize: "medium"
70− color: "white"
71− style: Text.Raised
72− styleColor: "black"
73− opacity: .9
74− text: i18n.tr("Add a review")
75− }
76−
77− Row {
78− id: row
79− spacing: units.gu(1)
80− width: root.width
81−
82− // FIXME: needs to react to Qt.inputMethod geometry
83− TextArea {
84− id: reviewField
85− objectName: "reviewField"
86− placeholderText: i18n.tr("Review")
87− width: parent.width
88− verticalAlignment: Text.AlignVCenter
89− autoSize: true
90− maximumLineCount: 5
91−
92− Behavior on height { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
93−
94− onFocusChanged: {
95− if(reviewField.focus){
96− root.state = "editing";
97− reviewField.selectAll();
98− root.editing();
99− }
100− }
101−
102− // FIXME: not active when in wide mode
103− InverseMouseArea {
104− id: inverseArea
105− anchors.fill: parent
106− enabled: false
107− onPressed: {
108− reviewField.focus = false;
109− root.state = "";
110− }
111− }
112− }
113−
114− Button {
115− id: sendButton
116− objectName: "sendButton"
117− width: units.gu(10)
118− height: units.gu(4)
119− anchors.bottom: reviewField.bottom
120− color: Theme.palette.selected.foreground
121− text: i18n.tr("Send")
122− opacity: 0
123−
124− onClicked: {
125− root.sendReview(reviewField.text);
126− reviewField.text = ""
127− }
128− }
129− }
130−
131− ListItem.ThinDivider {}
132−
133− Label {
134− fontSize: "medium"
135− color: "white"
136− style: Text.Raised
137− styleColor: "black"
138− opacity: .9
139− text: i18n.tr("Comments:")
140− }
141−
142− Repeater {
143− objectName: "commentsArea"
144− model: root.model
145−
146− Column {
147− anchors { left: parent.left; right: parent.right }
148−
149− Column {
150− anchors { left: parent.left; right: parent.right }
151−
152− Label {
153− anchors { left: parent.left; right: parent.right }
154− text: modelData[0]
155− fontSize: "medium"
156− color: "white"
157− opacity: .8
158− wrapMode: Text.WordWrap
159− style: Text.Raised
160− styleColor: "black"
161− }
162−
163− Row {
164− spacing: units.gu(1)
165−
166− RatingStars {
167− maximumRating: 10
168− rating: modelData[1]
169− }
170−
171− Label {
172− text: modelData[2]
173− fontSize: "medium"
174− color: Theme.palette.selected.backgroundText
175− opacity: .6
176− style: Text.Raised
177− styleColor: "black"
178− }
179− }
180− }
181−
182− Label {
183− anchors { left: parent.left; right: parent.right }
184− text: modelData[3]
185− fontSize: "medium"
186− color: Theme.palette.selected.backgroundText
187− opacity: .6
188− wrapMode: Text.WordWrap
189− style: Text.Raised
190− styleColor: "black"
191− }
192− }
193− }
194−}
qml/Dash/ScopeDelegateMapper.qml+1−3
@@ -17,9 +17,7 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19QtObject {
19QtObject {
20− property var scopeDelegateMapping: {"applications.scope": "DashApps.qml",
20+ property var scopeDelegateMapping: {"clickscope": "DashApps.qml"}
21− "home.scope": "DashHome.qml"
22− }
23 property string genericScope: "GenericScopeView.qml"
21 property string genericScope: "GenericScopeView.qml"
24
22
25 function map(scopeId) {
23 function map(scopeId) {
qml/Dash/ScopeItem.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 Ubuntu.Components 0.1
19+import Unity 0.2
20+import "../Components"
21+
22+Item {
23+ id: root
24+
25+ property alias scope: scopeView.scope
26+ property alias previewOpen: previewListView.open
27+
28+ property ListModel searchHistory
29+
30+ signal back
31+ signal gotoScope(string scopeId)
32+ signal openScope(var scope)
33+
34+ Item {
35+ id: scopeViewHolder
36+
37+ x: previewListView.open ? -width : 0
38+ Behavior on x { UbuntuNumberAnimation { } }
39+ width: parent.width
40+ height: parent.height
41+
42+ GenericScopeView {
43+ id: scopeView
44+ width: parent.width
45+ height: parent.height
46+ isCurrent: scope != null
47+ tabBarHeight: scopeItemPageHeader.implicitHeight
48+ pageHeader: scopeItemPageHeader
49+ previewListView: previewListView
50+
51+ Connections {
52+ target: scopeView.isCurrent ? scope : null
53+ onGotoScope: root.gotoScope(scopeId);
54+ onOpenScope: root.openScope(scope);
55+ }
56+ }
57+
58+ PageHeader {
59+ id: scopeItemPageHeader
60+ width: parent.width
61+ searchEntryEnabled: true
62+ searchHistory: root.searchHistory
63+ scope: root.scope
64+ height: units.gu(8.5)
65+ showBackButton: true
66+ onBackClicked: root.back();
67+
68+ childItem: Label {
69+ id: label
70+ anchors {
71+ left: parent.left
72+ right: parent.right
73+ verticalCenter: parent.verticalCenter
74+ }
75+ text: scope ? scope.name : ""
76+ color: "#888888"
77+ font.family: "Ubuntu"
78+ font.weight: Font.Light
79+ fontSize: "x-large"
80+ elide: Text.ElideRight
81+ }
82+ }
83+ }
84+
85+ PreviewListView {
86+ id: previewListView
87+ visible: x != width
88+ pageHeader: scopeItemPageHeader
89+ scope: root.scope
90+ width: parent.width
91+ height: parent.height
92+ anchors.left: scopeViewHolder.right
93+ }
94+}
qml/Dash/SearchableResultModel.qmldeleted−44
@@ -1,44 +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 Utils 0.1
18−import Unity 0.1
19−
20−SortFilterProxyModel {
21− id: root
22−
23− property string searchQuery: ""
24− property bool hideOnSearch: false
25−
26− filterRole: CategoryResults.RoleTitle
27−
28− function get(index) {
29− return model.get(mapToSource(index))
30− }
31−
32− onSearchQueryChanged: {
33− if (searchQuery.length == 0) {
34− filterRegExp = RegExp("");
35− filterCaseSensitivity = Qt.CaseInsensitive;
36− } else if (!hideOnSearch) {
37− setFilterWildcard(searchQuery);
38− filterCaseSensitivity = Qt.CaseInsensitive;
39− } else {
40− filterRegExp = /^$/;
41− filterCaseSensitivity = Qt.CaseInsensitive;
42− }
43− }
44−}
qml/Dash/Video/CarouselDelegateVideo.qmldeleted−42
@@ -1,42 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−
21−BaseCarouselDelegate {
22− id: item
23−
24− UbuntuShape {
25− anchors.fill: parent
26− radius: "medium"
27− borderSource: ""
28− image: Image {
29− asynchronous: true
30− sourceSize { width: item.width; height: item.height }
31− source: model ? model.icon : ""
32− }
33− }
34−
35− BorderImage {
36− anchors.centerIn: parent
37− opacity: 0.6
38− source: "../../Components/graphics/non-selected.sci"
39− width: parent.width + units.gu(1.5)
40− height: parent.height + units.gu(1.5)
41− }
42−}
qml/Dash/Video/VideoCarousel.qmldeleted−34
@@ -1,34 +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 ".."
20−
21−DashCarousel {
22− id: videosCarousel
23− tileAspectRatio: 198 / 288
24− minimumTileWidth: units.gu(13)
25− itemComponent: carouselDelegateVideo
26− selectedItemScaleFactor: 1.14
27− cacheBuffer: 1404 // 18px * 13gu * 6
28−
29− Component {
30− id: carouselDelegateVideo
31− CarouselDelegateVideo {
32− }
33− }
34−}
qml/Dash/Video/VideoFilterGrid.qmldeleted−47
@@ -1,47 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../../Components"
20−import "../Generic"
21−
22−GenericFilterGrid {
23− id: videoFilterGrid
24−
25− delegateWidth: units.gu(11)
26− delegateHeight: units.gu(15)
27− iconWidth: units.gu(11)
28− iconHeight: units.gu(11)
29−
30− delegate: Tile {
31− id: tile
32− objectName: "delegate" + index
33− width: videoFilterGrid.cellWidth
34− height: videoFilterGrid.cellHeight
35− text: model.title
36− imageWidth: videoFilterGrid.iconWidth
37− imageHeight: videoFilterGrid.iconHeight
38− source: model.icon
39− maximumLineCount: 2
40− horizontalAlignment: Text.AlignLeft
41−
42− style: VideoTileStyle {}
43−
44− onClicked: videoFilterGrid.clicked(index, tile.y)
45− onPressAndHold: videoFilterGrid.pressAndHold(index, tile.y)
46− }
47−}
qml/Dash/Video/VideoTileStyle.qmldeleted−87
@@ -1,87 +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: tile
22−
23− anchors.fill: parent
24−
25− Image {
26− id: icon
27− anchors {
28− top: parent.top
29− horizontalCenter: parent.horizontalCenter
30− }
31− width: styledItem.imageWidth
32− height: styledItem.imageHeight
33− source: "graphics/movie_icon_holder.png"
34−
35− Image {
36− id: image
37− objectName: "image"
38− anchors {
39− fill: parent;
40− topMargin: units.gu(2);
41− bottomMargin: units.gu(2)
42− }
43− sourceSize { width: icon.width; height: icon.height }
44− asynchronous: true
45− cache: false
46− source: styledItem.source
47− fillMode: styledItem.fillMode
48− horizontalAlignment: Image.AlignHCenter
49− verticalAlignment: Image.AlignVCenter
50− }
51− }
52−
53− UbuntuShape {
54− id: borderPressed
55− objectName: "borderPressed"
56−
57− anchors.fill: icon
58− radius: "medium"
59− borderSource: "radius_pressed.sci"
60− opacity: styledItem.pressed ? 1.0 : 0.0
61− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
62− }
63−
64− Label {
65− id: label
66− objectName: "label"
67− anchors {
68− baseline: icon.bottom
69− baselineOffset: units.gu(2)
70− left: icon.left
71− right: parent.right
72− rightMargin: units.gu(1)
73− leftMargin: units.dp(2)
74− }
75−
76− color: Theme.palette.selected.backgroundText
77− opacity: 0.9
78− style: Text.Raised
79− styleColor: "black"
80− fontSize: "small"
81− elide: Text.ElideRight
82− horizontalAlignment: styledItem.horizontalAlignment
83− text: styledItem.text
84− wrapMode: Text.Wrap
85− maximumLineCount: styledItem.maximumLineCount
86− }
87−}
qml/Dash/Video/graphics/icon_button_amazon@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/icon_button_u1@20.pngdeleted

Binary file not shown.

qml/Dash/Video/graphics/movie_icon_holder@27.pngdeleted

Binary file not shown.

qml/Dash/graphics/dash_divider_top_darkgrad@27.pngnew file

Binary file not shown.

qml/Dash/graphics/dash_divider_top_lightgrad@27.pngnew file

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow2@27.pngnew file

Binary file not shown.

qml/Dash/graphics/header_handlearrow@20.pngdeleted

Binary file not shown.

qml/Dash/graphics/header_handlearrow@27.pngnew file

Binary file not shown.

qml/Dash/graphics/paper_landscape@27.pngnew file

Binary file not shown.

qml/Dash/graphics/paper_portrait@27.pngnew file

Binary file not shown.

qml/Dash/graphics/tabbarchevron@27.png

Binary file not shown.

qml/Launcher/Launcher.qml+2−2
@@ -18,7 +18,6 @@ import QtQuick 2.0
18import "../Components"
18import "../Components"
19import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
20import Ubuntu.Gestures 0.1
20import Ubuntu.Gestures 0.1
21−import Unity 0.1
22import Unity.Launcher 0.1
21import Unity.Launcher 0.1
23
22
24Item {
23Item {
@@ -30,7 +29,8 @@ Item {
30 property int dragAreaWidth: units.gu(1)
29 property int dragAreaWidth: units.gu(1)
31 property int minimizeDistance: units.gu(26)
30 property int minimizeDistance: units.gu(26)
32 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
31 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
33− (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
32+ (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) :
33+ (dragArea.dragging ? 0.001 : 0)
34
34
35 readonly property bool shown: panel.x > -panel.width
35 readonly property bool shown: panel.x > -panel.width
36
36
qml/Launcher/LauncherPanel.qml−1
@@ -17,7 +17,6 @@
17import QtQuick 2.0
17import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Ubuntu.Components.ListItems 0.1 as ListItems
19import Ubuntu.Components.ListItems 0.1 as ListItems
20−import Unity 0.1
21import Unity.Launcher 0.1
20import Unity.Launcher 0.1
22import Ubuntu.Components.Popups 0.1
21import Ubuntu.Components.Popups 0.1
23import "../Components/ListItems"
22import "../Components/ListItems"
qml/Notifications/Notification.qml+61−4
@@ -39,20 +39,72 @@ Item {
39
39
40 fullscreen: false
40 fullscreen: false
41 objectName: "background"
41 objectName: "background"
42− implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 4) : 0
42+ implicitHeight: type !== Notification.PlaceHolder ? (fullscreen ? maxHeight : contentColumn.height + contentColumn.spacing * 2) : 0
43
43
44 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
44 color: Qt.rgba(0.132, 0.117, 0.109, 0.97)
45 opacity: 0
45 opacity: 0
46
46
47+ state: {
48+ var result = "";
49+
50+ if (type == Notification.SnapDecision) {
51+ if (ListView.view.currentIndex == index) {
52+ result = "expanded";
53+ } else {
54+ if (ListView.view.count > 2) {
55+ if (ListView.view.currentIndex == -1 && index == 1) {
56+ result = "expanded";
57+ } else {
58+ result = "contracted";
59+ }
60+ } else {
61+ result = "expanded";
62+ }
63+ }
64+ }
65+
66+ return result;
67+ }
68+
69+ Behavior on height {
70+ id: normalHeightBehavior
71+
72+ //enabled: menuItemFactory.progress == 1
73+ enabled: true
74+ SequentialAnimation {
75+ PauseAnimation {
76+ duration: UbuntuAnimation.SnapDuration
77+ }
78+ UbuntuNumberAnimation {
79+ duration: UbuntuAnimation.SnapDuration
80+ }
81+ }
82+ }
83+
84+ states:[
85+ State {
86+ name: "contracted"
87+ PropertyChanges {target: notification; height: units.gu(8)}
88+ },
89+ State {
90+ name: "expanded"
91+ PropertyChanges {target: notification; height: implicitHeight}
92+ }
93+ ]
94+
47 clip: fullscreen ? false : true
95 clip: fullscreen ? false : true
96+
48 visible: type != Notification.PlaceHolder
97 visible: type != Notification.PlaceHolder
49
98
50 UbuntuShape {
99 UbuntuShape {
51 id: shapedBack
100 id: shapedBack
52
101
53 visible: !fullscreen
102 visible: !fullscreen
103+ anchors {
54− anchors.fill: parent
104+ fill: parent
105+ leftMargin: notification.margins
55− anchors.margins: notification.margins
106+ rightMargin: notification.margins
107+ }
56 color: parent.color
108 color: parent.color
57 opacity: parent.opacity
109 opacity: parent.opacity
58 radius: "medium"
110 radius: "medium"
@@ -104,17 +156,20 @@ Item {
104 MouseArea {
156 MouseArea {
105 id: interactiveArea
157 id: interactiveArea
106
158
107− anchors.fill: contentColumn
159+ anchors.fill: parent
108 objectName: "interactiveArea"
160 objectName: "interactiveArea"
109 onClicked: {
161 onClicked: {
110 if (notification.type == Notification.Interactive) {
162 if (notification.type == Notification.Interactive) {
111 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
163 notification.notification.invokeAction(actionRepeater.itemAt(0).actionId)
164+ } else {
165+ notificationList.currentIndex = index;
112 }
166 }
113 }
167 }
114 }
168 }
115
169
116 Column {
170 Column {
117 id: contentColumn
171 id: contentColumn
172+ objectName: "contentColumn"
118
173
119 anchors {
174 anchors {
120 left: parent.left
175 left: parent.left
@@ -207,6 +262,8 @@ Item {
207 model: unityMenuModel
262 model: unityMenuModel
208
263
209 NotificationMenuItemFactory {
264 NotificationMenuItemFactory {
265+ id: menuItemFactory
266+
210 anchors.left: parent.left; anchors.right: parent.right
267 anchors.left: parent.left; anchors.right: parent.right
211
268
212 menuModel: unityMenuModel
269 menuModel: unityMenuModel
qml/Notifications/Notifications.qml+4
@@ -25,6 +25,9 @@ ListView {
25 interactive: false
25 interactive: false
26
26
27 property real margin
27 property real margin
28+ spacing: delegate.fullscreen ? 0 : units.gu(.5)
29+
30+ currentIndex: (currentIndex < 1 && count > 1) ? 1 : -1
28
31
29 delegate: Notification {
32 delegate: Notification {
30 objectName: "notification" + index
33 objectName: "notification" + index
@@ -75,6 +78,7 @@ ListView {
75 displaced: Transition {
78 displaced: Transition {
76 UbuntuNumberAnimation {
79 UbuntuNumberAnimation {
77 properties: "x,y"
80 properties: "x,y"
81+ duration: UbuntuAnimation.SnapDuration
78 }
82 }
79 }
83 }
80}
84}
qml/Panel/IndicatorRow.qml+1−1
@@ -137,7 +137,7 @@ Item {
137 anchors.top: row.bottom
137 anchors.top: row.bottom
138 visible: indicatorRow.currentItem != null
138 visible: indicatorRow.currentItem != null
139
139
140− property real intendedX: row.x + (indicatorRow.currentItem != null ? indicatorRow.currentItem.x + centerOffset : 0)
140+ property real intendedX: row.x + (indicatorRow.currentItem != null ? (indicatorRow.currentItem.x - row.originX) + centerOffset : 0)
141 x: intendedX >= row.x ? (intendedX + width <= row.x + row.width ? intendedX : row.x + row.width - width) : row.x // listview boundaries
141 x: intendedX >= row.x ? (intendedX + width <= row.x + row.width ? intendedX : row.x + row.width - width) : row.x // listview boundaries
142 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
142 width: indicatorRow.currentItem != null ? indicatorRow.currentItem.width : 0
143
143
qml/Panel/Panel.qml+1−1
@@ -62,7 +62,7 @@ Item {
62 height: __panelMinusSeparatorLineHeight
62 height: __panelMinusSeparatorLineHeight
63 y: 0
63 y: 0
64
64
65− Behavior on y { StandardAnimation {} }
65+ Behavior on y { StandardAnimation { duration: UbuntuAnimation.FastDuration } }
66 }
66 }
67
67
68 PanelSeparatorLine {
68 PanelSeparatorLine {
qml/ScopeTool.qml+9−1
@@ -18,7 +18,7 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Ubuntu.Components.Popups 0.1
19import Ubuntu.Components.Popups 0.1
20import Utils 0.1
20import Utils 0.1
21−import Unity 0.1
21+import Unity 0.2
22import "Components"
22import "Components"
23import "Dash"
23import "Dash"
24
24
@@ -61,6 +61,14 @@ Rectangle {
61 color: "#FCFCFC"
61 color: "#FCFCFC"
62 }
62 }
63
63
64+ Image {
65+ anchors.fill: dashContent
66+ source: root.width > root.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
67+ fillMode: Image.PreserveAspectCrop
68+ horizontalAlignment: Image.AlignRight
69+ verticalAlignment: Image.AlignTop
70+ }
71+
64 DashContent {
72 DashContent {
65 id: dashContent
73 id: dashContent
66
74
qml/Shell.qml+203−327
@@ -31,7 +31,6 @@ import "Panel"
31import "Hud"
31import "Hud"
32import "Components"
32import "Components"
33import "Bottombar"
33import "Bottombar"
34−import "SideStage"
35import "Notifications"
34import "Notifications"
36import Unity.Notifications 1.0 as NotificationBackend
35import Unity.Notifications 1.0 as NotificationBackend
37
36
@@ -49,20 +48,24 @@ FocusScope {
49 readonly property real panelHeight: panel.panelHeight
48 readonly property real panelHeight: panel.panelHeight
50
49
51 property bool dashShown: dash.shown
50 property bool dashShown: dash.shown
52− property bool stageScreenshotsReady: {
51+
53− if (sideStage.shown) {
52+ property bool sideStageEnabled: shell.width >= units.gu(100)
54− if (mainStage.applications.count > 0) {
53+ readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
55− return mainStage.usingScreenshots && sideStage.usingScreenshots;
54+
56− } else {
55+ function activateApplication(appId) {
57− return sideStage.usingScreenshots;
56+ if (ApplicationManager.findApplication(appId)) {
57+ ApplicationManager.requestFocusApplication(appId);
58+ stages.show(true);
59+ if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
60+ applicationsDisplayLoader.item.select(appId);
58 }
61 }
59 } else {
62 } else {
60− return mainStage.usingScreenshots;
63+ var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
64+ ApplicationManager.startApplication(appId, execFlags);
65+ stages.show(false);
61 }
66 }
62 }
67 }
63
68
64− property var applicationManager: ApplicationManagerWrapper {}
65−
66 Binding {
69 Binding {
67 target: LauncherModel
70 target: LauncherModel
68 property: "applicationManager"
71 property: "applicationManager"
@@ -71,49 +74,6 @@ FocusScope {
71
74
72 Component.onCompleted: {
75 Component.onCompleted: {
73 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
76 Theme.name = "Ubuntu.Components.Themes.SuruGradient"
74−
75− applicationManager.sideStageEnabled = Qt.binding(function() { return sideStage.enabled })
76−
77− // FIXME: if application focused before shell starts, shell draws on top of it only.
78− // We should detect already running applications on shell start and bring them to the front.
79− applicationManager.unfocusCurrentApplication();
80− }
81−
82− readonly property bool applicationFocused: !!applicationManager.mainStageFocusedApplication
83− || !!applicationManager.sideStageFocusedApplication
84− // Used for autopilot testing.
85− readonly property string currentFocusedAppId: ApplicationManager.focusedApplicationId
86−
87− readonly property bool fullscreenMode: {
88− if (greeter.shown || lockscreen.shown) {
89− return false;
90− } else if (mainStage.usingScreenshots) { // Window Manager animating so want to re-evaluate fullscreen mode
91− return mainStage.switchingFromFullscreenToFullscreen;
92− } else if (applicationManager.mainStageFocusedApplication) {
93− return applicationManager.mainStageFocusedApplication.fullscreen;
94− } else {
95− return false;
96− }
97− }
98−
99− function activateApplication(appId, argument) {
100− if (applicationManager) {
101− // For newly started applications, as it takes them time to draw their first frame
102− // we add a delay before we hide the animation screenshots to compensate.
103− var addDelay = !applicationManager.getApplicationFromDesktopFile(appId);
104−
105− var application;
106− application = applicationManager.activateApplication(appId, argument);
107− if (application == null) {
108− return;
109− }
110− if (application.stage == ApplicationInfo.MainStage || !sideStage.enabled) {
111− mainStage.activateApplication(appId, addDelay);
112− } else {
113− sideStage.activateApplication(appId, addDelay);
114− }
115− stages.show();
116− }
117 }
77 }
118
78
119 GSettings {
79 GSettings {
@@ -125,27 +85,6 @@ FocusScope {
125 shell.background = gSettingsPicture
85 shell.background = gSettingsPicture
126 }
86 }
127
87
128− // This is a dummy image that is needed to determine if the picture url
129− // in backgroundSettings points to a valid picture file.
130− // We can't do this with the real background image because setting a
131− // new source in onStatusChanged triggers a binding loop detection
132− // inside Image, which causes it not to render even though a valid source
133− // would be set. We don't mind about this image staying black and just
134− // use it for verification to populate the source for the real
135− // background image.
136− Image {
137− source: shell.background
138− height: 0
139− width: 0
140− sourceSize.height: 0
141− sourceSize.width: 0
142− onStatusChanged: {
143− if (status == Image.Error && source != shell.defaultBackground) {
144− shell.background = defaultBackground
145− }
146− }
147− }
148−
149 VolumeControl {
88 VolumeControl {
150 id: volumeControl
89 id: volumeControl
151 }
90 }
@@ -154,245 +93,219 @@ FocusScope {
154 Keys.onVolumeDownPressed: volumeControl.volumeDown()
93 Keys.onVolumeDownPressed: volumeControl.volumeDown()
155
94
156 Item {
95 Item {
157− id: underlay
96+ id: underlayClipper
158− objectName: "underlay"
159 anchors.fill: parent
97 anchors.fill: parent
98+ anchors.rightMargin: stages.overlayWidth
99+ clip: stages.overlayMode && !stages.painting
100+
101+ InputFilterArea {
102+ anchors.fill: parent
103+ blockInput: parent.clip
104+ }
105+
106+ Item {
107+ id: underlay
108+ objectName: "underlay"
109+ anchors.fill: parent
110+ anchors.rightMargin: -parent.anchors.rightMargin
160
111
161− // Whether the underlay is fully covered by opaque UI elements.
112+ // Whether the underlay is fully covered by opaque UI elements.
162− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
113+ property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth
163
114
164− readonly property bool applicationRunning: ((mainStage.applications && mainStage.applications.count > 0)
115+ // Whether the user should see the topmost application surface (if there's one at all).
165− || (sideStage.applications && sideStage.applications.count > 0))
116+ readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
166
117
167− // Whether the user should see the topmost application surface (if there's one at all).
118+ // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
168− readonly property bool applicationSurfaceShouldBeSeen: applicationRunning && !stages.fullyHidden
119+ // through the translucent parts of the shell surface.
169− && !mainStage.usingScreenshots // but want sideStage animating over app surface
120+ visible: !fullyCovered && !applicationSurfaceShouldBeSeen
170
121
122+ CrossFadeImage {
123+ id: backgroundImage
124+ objectName: "backgroundImage"
171
125
126+ anchors.fill: parent
127+ source: shell.background
128+ fillMode: Image.PreserveAspectCrop
129+ }
172
130
173− // NB! Application surfaces are stacked behing the shell one. So they can only be seen by the user
131+ Rectangle {
174− // through the translucent parts of the shell surface.
132+ anchors.fill: parent
175− visible: !fullyCovered && !applicationSurfaceShouldBeSeen
133+ color: "black"
134+ opacity: dash.disappearingAnimationProgress
135+ }
176
136
177− CrossFadeImage {
137+ Image {
178− id: backgroundImage
138+ anchors.fill: dash
179− objectName: "backgroundImage"
139+ source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
140+ fillMode: Image.PreserveAspectCrop
141+ horizontalAlignment: Image.AlignRight
142+ verticalAlignment: Image.AlignTop
143+ }
180
144
181− anchors.fill: parent
145+ Dash {
182− source: shell.background
146+ id: dash
183− fillMode: Image.PreserveAspectCrop
147+ objectName: "dash"
184− }
185
148
186− Rectangle {
149+ available: !greeter.shown && !lockscreen.shown
187− anchors.fill: parent
150+ hides: [stages, launcher, panel.indicators]
188− color: "black"
151+ shown: disappearingAnimationProgress !== 1.0
189− opacity: dash.disappearingAnimationProgress
152+ enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
190− }
191
153
192− Dash {
154+ anchors {
193− id: dash
155+ fill: parent
194− objectName: "dash"
156+ topMargin: panel.panelHeight
195−
196− available: !greeter.shown && !lockscreen.shown
197− hides: [stages, launcher, panel.indicators]
198− shown: disappearingAnimationProgress !== 1.0
199− enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled
200− // FIXME: unfocus all applications when going back to the dash
201− onEnabledChanged: {
202− if (enabled) {
203− shell.applicationManager.unfocusCurrentApplication()
204 }
157 }
205− }
206
158
207− anchors {
159+ contentScale: 1.0 - 0.2 * disappearingAnimationProgress
208− fill: parent
160+ opacity: 1.0 - disappearingAnimationProgress
209− topMargin: panel.panelHeight
161+ property real disappearingAnimationProgress: {
162+ if (greeter.shown) {
163+ return greeter.showProgress;
164+ } else {
165+ if (stages.overlayMode) {
166+ return 0;
167+ }
168+ return stages.showProgress
169+ }
170+ }
171+
172+ // FIXME: only necessary because stages.showProgress and
173+ // greeterRevealer.animatedProgress are not animated
174+ Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
210 }
175 }
176+ }
177+ }
178+
179+ EdgeDragArea {
180+ id: stagesDragHandle
181+ direction: Direction.Leftwards
182+
183+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
184+ width: shell.edgeSize
211
185
212− contentScale: 1.0 - 0.2 * disappearingAnimationProgress
186+ property real progress: stages.width
213− opacity: 1.0 - disappearingAnimationProgress
187+
214− property real disappearingAnimationProgress: {
188+ onTouchXChanged: {
215− if (greeter.shown) {
189+ if (status == DirectionalDragArea.Recognized) {
216− return greeter.showProgress;
190+ if (ApplicationManager.count == 0) {
191+ progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
217 } else {
192 } else {
218− return stagesOuterContainer.showProgress;
193+ progress = stages.width - stagesDragHandle.width + touchX
219 }
194 }
220 }
195 }
196+ }
221
197
222− // FIXME: only necessary because stagesOuterContainer.showProgress and
198+ onDraggingChanged: {
223− // greeterRevealer.animatedProgress are not animated
199+ if (!dragging) {
224− Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
200+ if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
201+ stages.show(true)
202+ }
203+ stagesDragHandle.progress = stages.width;
204+ }
225 }
205 }
226 }
206 }
227
207
228 Item {
208 Item {
229− id: stagesOuterContainer
209+ id: stages
230−
210+ objectName: "stages"
231 width: parent.width
211 width: parent.width
232 height: parent.height
212 height: parent.height
233− x: launcher.progress
234− Behavior on x {SmoothedAnimation{velocity: 600}}
235
213
236− property real showProgress:
214+ x: {
237− MathUtils.clamp(1 - (x + stages.x) / shell.width, 0, 1)
215+ if (shown) {
216+ if (overlayMode || locked) {
217+ return 0;
218+ }
219+ return launcher.progress
220+ } else {
221+ return stagesDragHandle.progress
222+ }
223+ }
224+
225+ Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
238
226
239− Showable {
227+ property bool shown: false
240− id: stages
241− objectName: "stages"
242
228
243− x: width
229+ property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
244
230
245− property bool fullyShown: shown && x == 0 && parent.x == 0
231+ property bool fullyShown: x == 0
246− property bool fullyHidden: !shown && x == width
232+ property bool fullyHidden: x == width
247− available: !greeter.shown
248− hides: [panel.indicators]
249− shown: false
250− opacity: 1.0
251− showAnimation: StandardAnimation { property: "x"; duration: 350; to: 0; easing.type: Easing.OutCubic }
252− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: width; easing.type: Easing.OutCubic }
253
233
254− width: parent.width
234+ property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
255− height: parent.height
235+ property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
236+ property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
237+ property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
238+ property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
256
239
257− // close the stages when no focused application remains
240+ function show(focusApp) {
258− Connections {
241+ shown = true;
259− target: shell.applicationManager
242+ panel.indicators.hide();
260− onMainStageFocusedApplicationChanged: stages.closeIfNoApplications()
243+ if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
261− onSideStageFocusedApplicationChanged: stages.closeIfNoApplications()
244+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
262− ignoreUnknownSignals: true
263 }
245 }
246+ }
264
247
265− function closeIfNoApplications() {
248+ function hide() {
266− if (!shell.applicationManager.mainStageFocusedApplication
249+ shown = false;
267− && !shell.applicationManager.sideStageFocusedApplication
250+ if (ApplicationManager.focusedApplicationId) {
268− && shell.applicationManager.mainStageApplications.count == 0
251+ ApplicationManager.unfocusCurrentApplication();
269− && shell.applicationManager.sideStageApplications.count == 0) {
270− stages.hide();
271− }
272 }
252 }
253+ }
273
254
274− // show the stages when an application gets the focus
275− Connections {
255+ Connections {
276− target: shell.applicationManager
256+ target: ApplicationManager
277− onMainStageFocusedApplicationChanged: {
257+
278− if (shell.applicationManager.mainStageFocusedApplication) {
258+ onFocusRequested: {
279− mainStage.show();
259+ stages.show(true);
260+ }
261+
262+ onFocusedApplicationIdChanged: {
263+ if (ApplicationManager.focusedApplicationId.length > 0) {
280− stages.show();
264+ stages.show(false);
281− }
265+ } else {
282− }
266+ if (!stages.overlayMode) {
283− onSideStageFocusedApplicationChanged: {
284− if (shell.applicationManager.sideStageFocusedApplication) {
285− sideStage.show();
286− stages.show();
267+ stages.hide();
287 }
268 }
288 }
269 }
289− ignoreUnknownSignals: true
290− }
291
270
292− Stage {
271+ // If any app is focused when greeter is open, it's due to a user action
293− id: mainStage
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+ }
294
277
295− anchors.fill: parent
278+ onApplicationAdded: {
296− fullyShown: stages.fullyShown
297− fullyHidden: stages.fullyHidden
298− shouldUseScreenshots: !fullyShown
299− rightEdgeEnabled: !sideStage.enabled
300−
301− applicationManager: shell.applicationManager
302− rightEdgeDraggingAreaWidth: shell.edgeSize
303− normalApplicationY: shell.panelHeight
304−
305− shown: true
306− function show() {
307− stages.show();
279+ stages.show(false);
308− }
309− function hide() {
310− }
280+ }
311
281
312− // FIXME: workaround the fact that focusing a main stage application
282+ onApplicationRemoved: {
313− // raises its surface on top of all other surfaces including the ones
283+ if (ApplicationManager.focusedApplicationId.length == 0) {
314− // that belong to side stage applications.
284+ stages.hide();
315− onFocusedApplicationChanged: {
316− if (focusedApplication && sideStage.focusedApplication && sideStage.fullyShown) {
317− shell.applicationManager.focusApplication(sideStage.focusedApplication);
318− }
319 }
285 }
320 }
286 }
287+ }
321
288
322− SideStage {
289+ Loader {
323− id: sideStage
290+ id: applicationsDisplayLoader
324−
291+ anchors.fill: parent
325− applicationManager: shell.applicationManager
326− rightEdgeDraggingAreaWidth: shell.edgeSize
327− normalApplicationY: shell.panelHeight
328
292
329− onShownChanged: {
293+ source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
330− if (!shown && mainStage.applications.count == 0) {
331− stages.hide();
332− }
333− }
334− // FIXME: when hiding the side stage, refocus the main stage
335− // application so that it goes in front of the side stage
336− // application and hides it
337− onFullyShownChanged: {
338− if (!fullyShown && stages.fullyShown && sideStage.focusedApplication != null) {
339− shell.applicationManager.focusApplication(mainStage.focusedApplication);
340− }
341− }
342
294
343− enabled: shell.width >= units.gu(100)
295+ Binding {
344− visible: enabled
296+ target: applicationsDisplayLoader.item
345− fullyShown: stages.fullyShown && shown
297+ property: "moving"
346− && sideStage[sideStageRevealer.boundProperty] == sideStageRevealer.openedValue
298+ value: !stages.fullyShown
347− shouldUseScreenshots: !fullyShown || mainStage.usingScreenshots || sideStageRevealer.pressed
299+ }
348−
300+ Binding {
349− available: !greeter.shown && !lockscreen.shown && enabled
301+ target: applicationsDisplayLoader.item
350− hides: [launcher, panel.indicators]
302+ property: "shown"
351− shown: false
303+ value: stages.shown
352− showAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.openedValue; easing.type: Easing.OutQuint }
353− hideAnimation: StandardAnimation { property: "x"; duration: 350; to: sideStageRevealer.closedValue; easing.type: Easing.OutQuint }
354−
355− width: units.gu(40)
356− height: stages.height
357− handleExpanded: sideStageRevealer.pressed
358− }
304+ }
359−
305+ Binding {
360− Revealer {
306+ target: applicationsDisplayLoader.item
361− id: sideStageRevealer
307+ property: "dragAreaWidth"
362−
363− enabled: mainStage.applications.count > 0 && sideStage.applications.count > 0
364− && sideStage.available
365− direction: Qt.RightToLeft
366− openedValue: parent.width - sideStage.width
367− hintDisplacement: units.gu(3)
368− /* The size of the sidestage handle needs to be bigger than the
369− typical size used for edge detection otherwise it is really
370− hard to grab.
371− */
372− handleSize: sideStage.shown ? units.gu(4) : shell.edgeSize
373− closedValue: parent.width + sideStage.handleSizeCollapsed
374− target: sideStage
375− x: parent.width - width
376− width: sideStage.width + handleSize * 0.7
377− height: sideStage.height
378− orientation: Qt.Horizontal
379− }
380−
381− DragHandle {
382− id: stagesDragHandle
383−
384− anchors.top: parent.top
385− anchors.bottom: parent.bottom
386− anchors.right: parent.left
387−
388− width: shell.edgeSize
308+ value: shell.edgeSize
389− direction: Direction.Leftwards
390− enabled: greeter.showProgress == 0 && edgeDemo.dashEnabled
391− property bool haveApps: mainStage.applications.count > 0 || sideStage.applications.count > 0
392−
393− maxTotalDragDistance: haveApps ? parent.width : parent.width * 0.7
394− // Make autocompletion impossible when !haveApps
395− edgeDragEvaluator.minDragDistance: haveApps ? maxTotalDragDistance * 0.1 : Number.MAX_VALUE
396 }
309 }
397 }
310 }
398 }
311 }
@@ -469,26 +382,6 @@ FocusScope {
469
382
470 dragHandleWidth: shell.edgeSize
383 dragHandleWidth: shell.edgeSize
471
384
472− property var previousMainApp: null
473− property var previousSideApp: null
474−
475− function removeApplicationFocus() {
476− greeter.previousMainApp = applicationManager.mainStageFocusedApplication;
477− greeter.previousSideApp = applicationManager.sideStageFocusedApplication;
478− applicationManager.unfocusCurrentApplication();
479− }
480−
481− function restoreApplicationFocus() {
482− if (greeter.previousMainApp) {
483− applicationManager.focusApplication(greeter.previousMainApp);
484− greeter.previousMainApp = null;
485− }
486− if (greeter.previousSideApp) {
487− applicationManager.focusApplication(greeter.previousSideApp);
488− greeter.previousSideApp = null;
489− }
490− }
491−
492 onShownChanged: {
385 onShownChanged: {
493 if (shown) {
386 if (shown) {
494 lockscreen.reset();
387 lockscreen.reset();
@@ -498,9 +391,6 @@ FocusScope {
498 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
391 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
499 }
392 }
500 greeter.forceActiveFocus();
393 greeter.forceActiveFocus();
501− removeApplicationFocus();
502− } else {
503− restoreApplicationFocus();
504 }
394 }
505 }
395 }
506
396
@@ -518,33 +408,16 @@ FocusScope {
518 }
408 }
519 }
409 }
520
410
521− Connections {
411+ Binding {
522− target: applicationManager
412+ target: ApplicationManager
523− ignoreUnknownSignals: true
413+ property: "suspended"
524− // If any app is focused when greeter is open, it's due to a user action
414+ value: greeter.shown && greeter.showProgress == 1
525− // like a snap decision (say, an incoming call).
526− // TODO: these should be protected to only unlock for certain applications / certain usecases
527− // potentially only in connection with a notification.
528− onMainStageFocusedApplicationChanged: {
529− if (greeter.shown && applicationManager.mainStageFocusedApplication) {
530− greeter.previousMainApp = null // make way for new focused app
531− greeter.previousSideApp = null
532− greeter.hide()
533− }
534− }
535− onSideStageFocusedApplicationChanged: {
536− if (greeter.shown && applicationManager.sideStageFocusedApplication) {
537− greeter.previousMainApp = null // make way for new focused app
538− greeter.previousSideApp = null
539− greeter.hide()
540− }
541− }
542 }
415 }
543 }
416 }
544
417
545 InputFilterArea {
418 InputFilterArea {
546 anchors.fill: parent
419 anchors.fill: parent
547− blockInput: !applicationFocused || greeter.shown || lockscreen.shown || launcher.shown
420+ blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
548 || panel.indicators.shown || hud.shown
421 || panel.indicators.shown || hud.shown
549 }
422 }
550
423
@@ -571,7 +444,7 @@ FocusScope {
571 function showHome() {
444 function showHome() {
572 var animate = !greeter.shown && !stages.shown
445 var animate = !greeter.shown && !stages.shown
573 greeter.hide()
446 greeter.hide()
574− dash.setCurrentScope("home.scope", animate, false)
447+ dash.setCurrentScope("clickscope", animate, false)
575 stages.hide()
448 stages.hide()
576 }
449 }
577
450
@@ -593,8 +466,10 @@ FocusScope {
593 available: edgeDemo.panelEnabled
466 available: edgeDemo.panelEnabled
594 contentEnabled: edgeDemo.panelContentEnabled
467 contentEnabled: edgeDemo.panelContentEnabled
595 }
468 }
596− fullscreenMode: shell.fullscreenMode
469+ property string focusedAppId: ApplicationManager.focusedApplicationId
470+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
471+ fullscreenMode: focusedApplication && stages.fullscreen && !greeter.shown && !lockscreen.shown
597− searchVisible: !greeter.shown && !lockscreen.shown && dash.shown
472+ searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable
598
473
599 InputFilterArea {
474 InputFilterArea {
600 anchors {
475 anchors {
@@ -619,9 +494,8 @@ FocusScope {
619 hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
494 hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
620
495
621 Connections {
496 Connections {
622− target: shell.applicationManager
497+ target: ApplicationManager
623− onMainStageFocusedApplicationChanged: hud.hide()
498+ onFocusedApplicationIdChanged: hud.hide()
624− onSideStageFocusedApplicationChanged: hud.hide()
625 }
499 }
626 }
500 }
627
501
@@ -646,7 +520,7 @@ FocusScope {
646 theHud: hud
520 theHud: hud
647 anchors.fill: parent
521 anchors.fill: parent
648 enabled: hud.available
522 enabled: hud.available
649− applicationIsOnForeground: applicationFocused
523+ applicationIsOnForeground: ApplicationManager.focusedApplicationId
650 }
524 }
651
525
652 InputFilterArea {
526 InputFilterArea {
@@ -677,12 +551,14 @@ FocusScope {
677 showHome()
551 showHome()
678 }
552 }
679 onDash: {
553 onDash: {
680− if (stages.shown) {
554+ if (stages.shown && !stages.overlayMode) {
681− stages.hide();
555+ if (!stages.locked) {
556+ stages.hide();
682− launcher.hide();
557+ launcher.hide();
558+ }
683 }
559 }
684 }
560 }
685− onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("applications.scope", false, true)
561+ onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
686 onLauncherApplicationSelected:{
562 onLauncherApplicationSelected:{
687 if (edgeDemo.running)
563 if (edgeDemo.running)
688 return;
564 return;
@@ -772,14 +648,14 @@ FocusScope {
772 anchors.bottom: parent.bottom
648 anchors.bottom: parent.bottom
773 anchors.left: parent.left
649 anchors.left: parent.left
774 anchors.right: parent.right
650 anchors.right: parent.right
775− height: shell.applicationManager ? shell.applicationManager.keyboardHeight : 0
651+ height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
776
652
777− enabled: shell.applicationManager && shell.applicationManager.keyboardVisible
653+ enabled: ApplicationManager.keyboardVisible
778 }
654 }
779
655
780 Label {
656 Label {
781 anchors.centerIn: parent
657 anchors.centerIn: parent
782− visible: applicationManager.fake
658+ visible: ApplicationManager.fake ? ApplicationManager.fake : false
783 text: "EARLY ALPHA\nNOT READY FOR USE"
659 text: "EARLY ALPHA\nNOT READY FOR USE"
784 color: "lightgrey"
660 color: "lightgrey"
785 opacity: 0.2
661 opacity: 0.2
qml/SideStage/SideStage.qmldeleted−73
@@ -1,73 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Unity.Application 0.1
19−import Ubuntu.Components 0.1
20−import "../Components"
21−
22−Stage {
23− id: stage
24−
25− type: ApplicationInfo.SideStage
26− property real handleSizeCollapsed: units.gu(2.5)
27− property real handleSizeExpanded: units.gu(4)
28− property bool handleExpanded
29−
30− /* FIXME: workaround so that when a main stage app goes fullscreen
31− the sidestage's top is not transparent. Proper fix would be to
32− resize the side stage app.
33− */
34− Rectangle {
35− id: backgroundBeneathPanel
36− anchors {
37− top: parent.top
38− left: parent.left
39− right: parent.right
40− }
41− height: shell.panelHeight
42− color: background.color
43− z: -1
44− }
45−
46− Rectangle {
47− id: background
48− anchors.fill: parent
49− color: "#2c2924"
50− z: -1
51− visible: stage.usingScreenshots
52− }
53−
54− SidestageHandle {
55− id: handle
56− objectName: "sideStageHandle"
57−
58− anchors {
59− top: parent.top
60− bottom: parent.bottom
61− left: parent.left
62− leftMargin: -width
63− }
64− width: handleExpanded ? handleSizeExpanded : handleSizeCollapsed
65− Behavior on width { NumberAnimation { easing.type: Easing.OutQuart} }
66− z: -1
67− }
68−
69− InputFilterArea {
70− anchors.fill: handle
71− blockInput: visible
72− }
73−}
qml/Stages/PhoneStage.qmlnew file+499
@@ -0,0 +1,499 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import Ubuntu.Gestures 0.1
20+import Unity.Application 0.1
21+import Utils 0.1
22+import "../Components"
23+
24+Item {
25+ id: root
26+
27+ // Controls to be set from outside
28+ property bool shown: false
29+ property bool moving: false
30+ property int dragAreaWidth
31+
32+ // State information propagated to the outside
33+ readonly property bool painting: mainScreenshotImage.visible || fadeInScreenshotImage.visible || appSplash.visible || spreadView.visible
34+ property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
35+ property bool locked: spreadView.visible
36+
37+ // Not used for PhoneStage, only useful for SideStage and similar
38+ property bool overlayMode: false
39+ property int overlayWidth: 0
40+
41+ function select(appId) {
42+ spreadView.snapTo(priv.indexOf(appId))
43+ }
44+
45+ onMovingChanged: {
46+ if (moving) {
47+ if (ApplicationManager.focusedApplicationId) {
48+ priv.requestNewScreenshot();
49+ } else {
50+ mainScreenshotImage.anchors.leftMargin = 0;
51+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
52+ mainScreenshotImage.visible = true;
53+ }
54+ } else {
55+ mainScreenshotImage.visible = false;
56+ }
57+ }
58+
59+ Connections {
60+ target: ApplicationManager
61+
62+ onFocusRequested: {
63+ if (spreadView.visible) {
64+ spreadView.snapTo(priv.indexOf(appId));
65+ } else {
66+ priv.switchToApp(appId);
67+ }
68+ }
69+
70+ onFocusedApplicationIdChanged: {
71+ if (ApplicationManager.focusedApplicationId.length > 0) {
72+ if (priv.secondApplicationStarting || priv.applicationStarting) {
73+ appSplashTimer.restart();
74+ } else {
75+ var application = priv.focusedApplication;
76+ root.fullscreen = application.fullscreen;
77+ mainScreenshotImage.source = application.screenshot;
78+ }
79+ } else {
80+ spreadView.selectedIndex = -1;
81+ spreadView.phase = 0;
82+ spreadView.contentX = -spreadView.shift;
83+ }
84+ }
85+
86+ onApplicationAdded: {
87+ if (!priv.focusedApplication) {
88+ mainScreenshotImage.source = "";
89+ mainScreenshotImage.visible = false;
90+ priv.applicationStarting = true;
91+ } else {
92+ mainScreenshotImage.source = "";
93+ priv.newFocusedAppId = appId;
94+ priv.secondApplicationStarting = true;
95+ priv.requestNewScreenshot();
96+ }
97+
98+ if (spreadView.visible) {
99+ spreadView.snapTo(0);
100+ }
101+ }
102+
103+ onApplicationRemoved: {
104+ if (ApplicationManager.count == 0) {
105+ mainScreenshotImage.source = ""
106+ mainScreenshotImage.visible = false;
107+ } else {
108+ mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
109+ }
110+ }
111+ }
112+
113+ QtObject {
114+ id: priv
115+
116+ property string focusedAppId: ApplicationManager.focusedApplicationId
117+ property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
118+ property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
119+
120+ property bool waitingForScreenshot: false
121+
122+ property bool applicationStarting: false
123+ property bool secondApplicationStarting: false
124+
125+ property string newFocusedAppId
126+
127+ onFocusedScreenshotChanged: {
128+ if (root.moving && priv.waitingForScreenshot) {
129+ mainScreenshotImage.anchors.leftMargin = 0;
130+ mainScreenshotImage.source = priv.focusedScreenshot
131+ mainScreenshotImage.visible = true;
132+ } else if (priv.secondApplicationStarting && priv.waitingForScreenshot) {
133+ applicationSwitchingAnimation.start();
134+ }
135+ waitingForScreenshot = false;
136+ }
137+
138+ function requestNewScreenshot() {
139+ waitingForScreenshot = true;
140+ ApplicationManager.updateScreenshot(focusedAppId);
141+ }
142+
143+ function switchToApp(appId) {
144+ if (priv.focusedAppId) {
145+ priv.newFocusedAppId = appId;
146+ root.fullscreen = ApplicationManager.findApplication(appId).fullscreen;
147+ applicationSwitchingAnimation.start();
148+ } else {
149+ ApplicationManager.focusApplication(appId);
150+ }
151+ }
152+
153+ function indexOf(appId) {
154+ for (var i = 0; i < ApplicationManager.count; i++) {
155+ if (ApplicationManager.get(i).appId == appId) {
156+ return i;
157+ }
158+ }
159+ return -1;
160+ }
161+
162+ }
163+
164+ // FIXME: the signal connections seems to get lost.
165+ Connections {
166+ target: priv.focusedApplication
167+ onScreenshotChanged: priv.focusedScreenshot = priv.focusedApplication.screenshot
168+ }
169+ Binding {
170+ target: root
171+ property: "fullscreen"
172+ value: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
173+ }
174+
175+ Timer {
176+ id: appSplashTimer
177+ // FIXME: We really need to show something meaningful in the app surface instead of guessing
178+ // when it might be ready
179+ interval: 500
180+ repeat: false
181+ onTriggered: {
182+ priv.applicationStarting = false;
183+ priv.secondApplicationStarting = false;
184+ }
185+ }
186+
187+ SequentialAnimation {
188+ id: applicationSwitchingAnimation
189+ // setup
190+ PropertyAction { target: mainScreenshotImage; property: "anchors.leftMargin"; value: 0 }
191+ PropertyAction { target: mainScreenshotImage; property: "source"; value: priv.focusedScreenshot }
192+ PropertyAction { targets: [mainScreenshotImage, fadeInScreenshotImage]; property: "visible"; value: true }
193+ PropertyAction { target: fadeInScreenshotImage; property: "source"; value: {
194+ var newFocusedApp = ApplicationManager.findApplication(priv.newFocusedAppId);
195+ return newFocusedApp ? newFocusedApp.screenshot : "" }
196+ }
197+ PropertyAction { target: fadeInScreenshotImage; property: "opacity"; value: 0 }
198+ PropertyAction { target: fadeInScreenshotImage; property: "scale"; value: .8 }
199+
200+
201+ // The actual animation
202+ ParallelAnimation {
203+ UbuntuNumberAnimation { target: mainScreenshotImage; property: "anchors.leftMargin"; to: root.width; duration: UbuntuAnimation.SlowDuration }
204+ UbuntuNumberAnimation { target: fadeInScreenshotImage; properties: "opacity,scale"; to: 1; duration: UbuntuAnimation.SlowDuration }
205+ }
206+
207+ // restore stuff
208+ ScriptAction { script: ApplicationManager.focusApplication(priv.newFocusedAppId); }
209+ PropertyAction { target: fadeInScreenshotImage; property: "visible"; value: false }
210+ PropertyAction { target: mainScreenshotImage; property: "visible"; value: false }
211+ }
212+
213+ // FIXME: Drop this and make the imageprovider show a splashscreen instead
214+ Rectangle {
215+ id: appSplash2
216+ anchors.fill: parent
217+ color: "white"
218+ visible: priv.secondApplicationStarting
219+ }
220+ Image {
221+ id: fadeInScreenshotImage
222+ anchors { left: parent.left; bottom: parent.bottom }
223+ width: parent.width
224+ scale: .7
225+ visible: false
226+ }
227+
228+ Rectangle {
229+ id: appSplash
230+ anchors.fill: parent
231+ color: "white"
232+ visible: priv.applicationStarting
233+ }
234+ Image {
235+ id: mainScreenshotImage
236+ anchors { left: parent.left; bottom: parent.bottom }
237+ width: parent.width
238+ visible: false
239+ }
240+
241+ EdgeDragArea {
242+ id: spreadDragArea
243+ direction: Direction.Leftwards
244+ enabled: ApplicationManager.count > 1 && spreadView.phase != 2
245+
246+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
247+ width: root.dragAreaWidth
248+
249+ // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
250+ // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
251+ // spreadView and make the spreadView snap to positionMarker4.
252+ property bool attachedToView: true
253+
254+ property var gesturePoints: new Array()
255+
256+ onTouchXChanged: {
257+ if (!dragging && !priv.waitingForScreenshot) {
258+ // Initial touch. Let's update the screenshot and reset the spreadView to the starting position.
259+ priv.requestNewScreenshot();
260+ spreadView.phase = 0;
261+ spreadView.contentX = -spreadView.shift;
262+ }
263+ if (dragging && attachedToView) {
264+ // Gesture recognized. Let's move the spreadView with the finger
265+ spreadView.contentX = -touchX - spreadView.shift;
266+ }
267+ if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
268+ // We passed positionMarker3. Detach from spreadView and snap it.
269+ attachedToView = false;
270+ spreadView.snap();
271+ }
272+ gesturePoints.push(touchX);
273+ }
274+
275+ onStatusChanged: {
276+ if (status == DirectionalDragArea.Recognized) {
277+ attachedToView = true;
278+ }
279+ }
280+
281+ onDraggingChanged: {
282+ if (dragging) {
283+ // Gesture recognized. Start recording this gesture
284+ gesturePoints = [];
285+ return;
286+ }
287+
288+ // Ok. The user released. Find out if it was a one-way movement.
289+ var oneWayFlick = true;
290+ var smallestX = spreadDragArea.width;
291+ for (var i = 0; i < gesturePoints.length; i++) {
292+ if (gesturePoints[i] >= smallestX) {
293+ oneWayFlick = false;
294+ break;
295+ }
296+ smallestX = gesturePoints[i];
297+ }
298+ gesturePoints = [];
299+
300+ if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
301+ spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
302+ // If it was a short one-way movement, do the Alt+Tab switch
303+ // no matter if we didn't cross positionMarker1 yet.
304+ spreadView.snapTo(1);
305+ } else if (!dragging && attachedToView) {
306+ // otherwise snap to the closest snap position we can find
307+ // (might be back to start, to app 1 or to spread)
308+ spreadView.snap();
309+ }
310+ }
311+ }
312+
313+ Rectangle {
314+ id: coverFlipBackground
315+ anchors.fill: parent
316+ color: "black"
317+ visible: spreadView.visible
318+ }
319+
320+ InputFilterArea {
321+ anchors.fill: root
322+ blockInput: spreadView.visible
323+ }
324+
325+ Flickable {
326+ id: spreadView
327+ objectName: "spreadView"
328+ anchors.fill: parent
329+ visible: spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1 || snapAnimation.running
330+ contentWidth: spreadRow.width - shift
331+ contentX: -shift
332+
333+ // The flickable needs to fill the screen in order to get touch events all over.
334+ // However, we don't want to the user to be able to scroll back all the way. For
335+ // that, the beginning of the gesture starts with a negative value for contentX
336+ // so the flickable wants to pull it into the view already. "shift" tunes the
337+ // distance where to "lock" the content.
338+ property real shift: width / 2
339+ property real shiftedContentX: contentX + shift
340+
341+ property int tileDistance: width / 4
342+
343+ // Those markers mark the various positions in the spread (ratio to screen width from right to left):
344+ // 0 - 1: following finger, snap back to the beginning on release
345+ property real positionMarker1: 0.3
346+ // 1 - 2: curved snapping movement, snap to app 1 on release
347+ property real positionMarker2: 0.45
348+ // 2 - 3: movement follows finger, snaps back to app 1 on release
349+ property real positionMarker3: 0.6
350+ // passing 3, we detach movement from the finger and snap to 4
351+ property real positionMarker4: 0.9
352+
353+ // This is where the first app snaps to when bringing it in from the right edge.
354+ property real snapPosition: 0.75
355+
356+ // Phase of the animation:
357+ // 0: Starting from right edge, a new app (index 1) comes in from the right
358+ // 1: The app has reached the first snap position.
359+ // 2: The list is dragged further and snaps into the spread view when entering phase 2
360+ property int phase: 0
361+
362+ property int selectedIndex: -1
363+
364+ onShiftedContentXChanged: {
365+ switch (phase) {
366+ case 0:
367+ if (shiftedContentX > width * positionMarker2) {
368+ phase = 1;
369+ }
370+ break;
371+ case 1:
372+ if (shiftedContentX < width * positionMarker2) {
373+ phase = 0;
374+ } else if (shiftedContentX >= width * positionMarker4) {
375+ phase = 2;
376+ }
377+ break;
378+ }
379+ }
380+
381+ function snap() {
382+ if (shiftedContentX < positionMarker1 * width) {
383+ snapAnimation.targetContentX = -shift;
384+ snapAnimation.start();
385+ } else if (shiftedContentX < positionMarker2 * width) {
386+ snapTo(1)
387+ } else if (shiftedContentX < positionMarker3 * width) {
388+ snapTo(1)
389+ } else if (phase < 2){
390+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
391+ snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
392+ snapAnimation.start();
393+ }
394+ }
395+ function snapTo(index) {
396+ spreadView.selectedIndex = index;
397+ root.fullscreen = ApplicationManager.get(index).fullscreen;
398+ snapAnimation.targetContentX = -shift;
399+ snapAnimation.start();
400+ }
401+
402+ SequentialAnimation {
403+ id: snapAnimation
404+ property int targetContentX: -spreadView.shift
405+
406+ UbuntuNumberAnimation {
407+ target: spreadView
408+ property: "contentX"
409+ to: snapAnimation.targetContentX
410+ duration: UbuntuAnimation.FastDuration
411+ }
412+
413+ ScriptAction {
414+ script: {
415+ if (spreadView.selectedIndex >= 0) {
416+ ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
417+ spreadView.selectedIndex = -1
418+ spreadView.phase = 0;
419+ spreadView.contentX = -spreadView.shift;
420+ }
421+ }
422+ }
423+ }
424+
425+ Item {
426+ id: spreadRow
427+ // This width controls how much the spread can be flicked left/right. It's composed of:
428+ // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
429+ // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
430+ width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
431+
432+ x: spreadView.contentX
433+
434+ Repeater {
435+ id: spreadRepeater
436+ model: ApplicationManager
437+ delegate: TransformedSpreadDelegate {
438+ id: appDelegate
439+ objectName: "appDelegate" + index
440+ startAngle: 45
441+ endAngle: 5
442+ startScale: 1.1
443+ endScale: 0.7
444+ startDistance: spreadView.tileDistance
445+ endDistance: units.gu(.5)
446+ width: spreadView.width
447+ height: spreadView.height
448+ selected: spreadView.selectedIndex == index
449+ otherSelected: spreadView.selectedIndex >= 0 && !selected
450+
451+ z: index
452+ x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
453+
454+ // Each tile has a different progress value running from 0 to 1.
455+ // A progress value of 0 means the tile is at the right edge. 1 means the tile has reched the left edge.
456+ progress: {
457+ var tileProgress = (spreadView.shiftedContentX - index * spreadView.tileDistance) / spreadView.width;
458+ // Tile 1 needs to move directly from the beginning...
459+ if (index == 1 && spreadView.phase < 2) {
460+ tileProgress += spreadView.tileDistance / spreadView.width;
461+ }
462+ return tileProgress;
463+ }
464+
465+ // This mostly is the same as progress, just adds the snapping to phase 1 for tiles 0 and 1
466+ animatedProgress: {
467+ if (spreadView.phase == 0 && index < 2) {
468+ if (progress < spreadView.positionMarker1) {
469+ return progress;
470+ } else if (progress < spreadView.positionMarker1 + snappingCurve.period){
471+ return spreadView.positionMarker1 + snappingCurve.value * 3;
472+ } else {
473+ return spreadView.positionMarker2;
474+ }
475+ }
476+ return progress;
477+ }
478+
479+ EasingCurve {
480+ id: snappingCurve
481+ type: EasingCurve.OutQuad
482+ period: 0.05
483+ progress: appDelegate.progress - spreadView.positionMarker1
484+ }
485+
486+ onClicked: {
487+ if (spreadView.phase == 2) {
488+ if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
489+ spreadView.snapTo(index);
490+ } else {
491+ ApplicationManager.requestFocusApplication(ApplicationManager.get(index).appId);
492+ }
493+ }
494+ }
495+ }
496+ }
497+ }
498+ }
499+}
qml/SideStage/SidestageHandle.qml → qml/Stages/SidestageHandle.qmlrenamed

The content is the same.

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

Binary file not shown.

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

Binary file not shown.

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

The content is the same.

src/ApplicationArguments.h+2−2
@@ -29,8 +29,8 @@ class ApplicationArguments : public QObject
29 Q_OBJECT
29 Q_OBJECT
30public:
30public:
31 ApplicationArguments(const QStringList& args) {
31 ApplicationArguments(const QStringList& args) {
32− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
32+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
33− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
33+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
34 if (geometryArg.size() == 2) {
34 if (geometryArg.size() == 2) {
35 m_size.rwidth() = geometryArg.at(0).toInt();
35 m_size.rwidth() = geometryArg.at(0).toInt();
36 m_size.rheight() = geometryArg.at(1).toInt();
36 m_size.rheight() = geometryArg.at(1).toInt();
src/Panel/Indicators/client/indicatorsclient.cpp+2−2
@@ -49,8 +49,8 @@ IndicatorsClient::IndicatorsClient(int &argc, char **argv)
49
49
50 m_view->setSource(QUrl("IndicatorsClient.qml"));
50 m_view->setSource(QUrl("IndicatorsClient.qml"));
51 m_view->setResizeMode(QQuickView::SizeRootObjectToView);
51 m_view->setResizeMode(QQuickView::SizeRootObjectToView);
52− if (args.contains(QLatin1String("-geometry")) && args.size() > args.indexOf(QLatin1String("-geometry")) + 1) {
52+ if (args.contains(QLatin1String("-windowgeometry")) && args.size() > args.indexOf(QLatin1String("-windowgeometry")) + 1) {
53− QStringList geometryArg = args.at(args.indexOf(QLatin1String("-geometry")) + 1).split('x');
53+ QStringList geometryArg = args.at(args.indexOf(QLatin1String("-windowgeometry")) + 1).split('x');
54 if (geometryArg.size() == 2) {
54 if (geometryArg.size() == 2) {
55 m_view->resize(geometryArg.at(0).toInt(), geometryArg.at(1).toInt());
55 m_view->resize(geometryArg.at(0).toInt(), geometryArg.at(1).toInt());
56 }
56 }
src/main.cpp+3−6
@@ -117,13 +117,10 @@ int startShell(int argc, const char** argv, void* server)
117
117
118 QUrl source(::qmlDirectory()+"Shell.qml");
118 QUrl source(::qmlDirectory()+"Shell.qml");
119 prependImportPaths(view->engine(), ::overrideImportPaths());
119 prependImportPaths(view->engine(), ::overrideImportPaths());
120− appendImportPaths(view->engine(), ::fallbackImportPaths());
121−
122− if (isUbuntuMirServer) {
120+ if (!isUbuntuMirServer) {
123− QStringList importPaths = view->engine()->importPathList();
121+ prependImportPaths(view->engine(), ::nonMirImportPaths());
124− importPaths.replaceInStrings(QRegExp("qt5/imports$"), "qt5/imports/Unity-Mir");
125− view->engine()->setImportPathList(importPaths);
126 }
122 }
123+ appendImportPaths(view->engine(), ::fallbackImportPaths());
127
124
128 view->setSource(source);
125 view->setSource(source);
129 view->setColor("transparent");
126 view->setColor("transparent");
tests/CMakeLists.txt+2−2
@@ -1,7 +1,7 @@
1−# QML tests that do not require graphical capabitlies.
1+# QML tests that do not require graphical capabilities.
2add_custom_target(qmlunittests)
2add_custom_target(qmlunittests)
3
3
4−# QML tests that require graphical capabitlies.
4+# QML tests that require graphical capabilities.
5add_custom_target(qmluitests)
5add_custom_target(qmluitests)
6
6
7add_custom_target(qmltests)
7add_custom_target(qmltests)
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+5−40
@@ -20,12 +20,11 @@
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 tempfile
24
23
25from autopilot import platform
24from autopilot import platform
26from autopilot.matchers import Eventually
25from autopilot.matchers import Eventually
27from testtools.matchers import Equals
26from testtools.matchers import Equals
28−from ubuntuuitoolkit import base as toolkit_base
27+from ubuntuuitoolkit import fixture_setup
29
28
30from unity8 import process_helpers
29from unity8 import process_helpers
31from unity8.shell import tests
30from unity8.shell import tests
@@ -47,13 +46,6 @@ MainView {
47 text: 'Test application.'
46 text: 'Test application.'
48 }
47 }
49}
48}
50−""")
51−
52− desktop_file_contents = ("""[Desktop Entry]
53−Type=Application
54−Name=test
55−Exec={qmlscene} {qml_file_path}
56−Icon=Not important
57""")
49""")
58
50
59 def setUp(self):
51 def setUp(self):
@@ -66,37 +58,10 @@ Icon=Not important
66 process_helpers.unlock_unity(unity_proxy)
58 process_helpers.unlock_unity(unity_proxy)
67
59
68 def create_test_application(self):
60 def create_test_application(self):
69− # FIXME most of this code is duplicated in the toolkit. We should
61+ fake_application = fixture_setup.FakeApplication(self.test_qml)
70− # create a fixture on the toolkit for other projects to use.
62+ self.useFixture(fake_application)
71− # http://pad.lv/1277334 --elopio - 2014-02-06
72− qml_file_path = self._write_test_qml_file()
73− self.addCleanup(os.remove, qml_file_path)
74− desktop_file_path = self._write_test_desktop_file(qml_file_path)
75− self.addCleanup(os.remove, desktop_file_path)
76− return qml_file_path, desktop_file_path
77−
78− def _write_test_qml_file(self):
79− qml_file = tempfile.NamedTemporaryFile(suffix='.qml', delete=False)
80− qml_file.write(self.test_qml.encode('utf-8'))
81− qml_file.close()
82− return qml_file.name
83−
84− def _write_test_desktop_file(self, qml_file_path):
85− desktop_file_dir = self._get_local_desktop_file_directory()
86− if not os.path.exists(desktop_file_dir):
87− os.makedirs(desktop_file_dir)
88− desktop_file = tempfile.NamedTemporaryFile(
89− suffix='.desktop', dir=desktop_file_dir, delete=False)
90− contents = self.desktop_file_contents.format(
91− qmlscene=toolkit_base.get_qmlscene_launch_command(),
92− qml_file_path=qml_file_path)
93− desktop_file.write(contents.encode('utf-8'))
94− desktop_file.close()
95− return desktop_file.name
96−
97− def _get_local_desktop_file_directory(self):
98− return os.path.join(
63+ return (
99− os.environ.get('HOME'), '.local', 'share', 'applications')
64+ fake_application.qml_file_path, fake_application.desktop_file_path)
100
65
101 def test_swipe_out_application_started_by_url_dispatcher(self):
66 def test_swipe_out_application_started_by_url_dispatcher(self):
102 _, desktop_file_path = self.create_test_application()
67 _, desktop_file_path = self.create_test_application()
tests/autopilot/unity8/shell/emulators/dash.py+31−55
@@ -36,11 +36,9 @@ class Dash(emulators.UnityEmulatorBase):
36 self.dash_content_list = self.wait_select_single(
36 self.dash_content_list = self.wait_select_single(
37 'QQuickListView', objectName='dashContentList')
37 'QQuickListView', objectName='dashContentList')
38
38
39− def get_home_applications_grid(self):
39+ def get_applications_grid(self):
40− get_grid = self.get_scope('home').wait_select_single(
40+ get_grid = self.get_scope('clickscope').wait_select_single(
41− "GenericFilterGrid",
41+ 'CardFilterGrid', objectName='local')
42− objectName="applications.scope"
43− )
44 return get_grid
42 return get_grid
45
43
46 def get_application_icon(self, text):
44 def get_application_icon(self, text):
@@ -50,24 +48,22 @@ class Dash(emulators.UnityEmulatorBase):
50 :param text: String containing the text of the icon to search for.
48 :param text: String containing the text of the icon to search for.
51
49
52 """
50 """
53− app_grid = self.get_home_applications_grid()
51+ app_grid = self.get_applications_grid()
54 resp_grid = app_grid.wait_select_single('ResponsiveGridView')
52 resp_grid = app_grid.wait_select_single('ResponsiveGridView')
55 return resp_grid.select_single('Tile', text=text)
53 return resp_grid.select_single('Tile', text=text)
56
54
57− def get_scope(self, scope_name='home'):
55+ def get_scope(self, scope_name='clickscope'):
58− scope_id = "%s.scope" % scope_name
59 return self.dash_content_list.select_single(
56 return self.dash_content_list.select_single(
60− 'QQuickLoader', scopeId=scope_id)
57+ 'QQuickLoader', scopeId=scope_name)
61
58
62 @autopilot_logging.log_action(logger.info)
59 @autopilot_logging.log_action(logger.info)
63− def open_scope(self, scope_name):
60+ def open_scope(self, scope_id):
64 """Open a dash scope.
61 """Open a dash scope.
65
62
66− :parameter scope_name: The name of the scope.
63+ :parameter scope_id: The id of the scope.
67 :return: The scope.
64 :return: The scope.
68
65
69 """
66 """
70− scope_id = "%s.scope" % scope_name
71 scope_loader = self._get_scope_loader(scope_id)
67 scope_loader = self._get_scope_loader(scope_id)
72 if scope_loader.isCurrent:
68 if scope_loader.isCurrent:
73 logger.info('The scope is already open.')
69 logger.info('The scope is already open.')
@@ -84,10 +80,7 @@ class Dash(emulators.UnityEmulatorBase):
84 'No scope found with id {0}'.format(scope_id))
80 'No scope found with id {0}'.format(scope_id))
85
81
86 def _get_scope_from_loader(self, loader):
82 def _get_scope_from_loader(self, loader):
87− if loader.scopeId == 'applications.scope':
88− return loader.select_single(DashApps)
83+ return loader.get_children()[0]
89− else:
90− return loader.select_single(GenericScopeView)
91
84
92 def _open_scope_scrolling(self, scope_loader):
85 def _open_scope_scrolling(self, scope_loader):
93 scroll = self._get_scroll_direction(scope_loader)
86 scroll = self._get_scroll_direction(scope_loader)
@@ -115,7 +108,7 @@ class Dash(emulators.UnityEmulatorBase):
115 original_index = self.dash_content_list.currentIndex
108 original_index = self.dash_content_list.currentIndex
116 # Scroll on the border of the page header, because some scopes have
109 # Scroll on the border of the page header, because some scopes have
117 # contents that can be scrolled horizontally.
110 # contents that can be scrolled horizontally.
118− page_header = self.select_single('PageHeader')
111+ page_header = self._get_page_header()
119 border = page_header.select_single('QQuickBorderImage')
112 border = page_header.select_single('QQuickBorderImage')
120 start_x = border.width / 3
113 start_x = border.width / 3
121 stop_x = border.width / 3 * 2
114 stop_x = border.width / 3 * 2
@@ -123,12 +116,15 @@ class Dash(emulators.UnityEmulatorBase):
123 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
116 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
124 self.dash_content_list.currentIndex.wait_for(original_index - 1)
117 self.dash_content_list.currentIndex.wait_for(original_index - 1)
125
118
119+ def _get_page_header(self):
120+ return self.select_single('PageHeader', objectName='pageHeader')
121+
126 @autopilot_logging.log_action(logger.info)
122 @autopilot_logging.log_action(logger.info)
127 def _scroll_to_right_scope(self):
123 def _scroll_to_right_scope(self):
128 original_index = self.dash_content_list.currentIndex
124 original_index = self.dash_content_list.currentIndex
129 # Scroll on the border of the page header, because some scopes have
125 # Scroll on the border of the page header, because some scopes have
130 # contents that can be scrolled horizontally.
126 # contents that can be scrolled horizontally.
131− page_header = self.select_single('PageHeader')
127+ page_header = self._get_page_header()
132 border = page_header.select_single('QQuickBorderImage')
128 border = page_header.select_single('QQuickBorderImage')
133 start_x = border.width / 3 * 2
129 start_x = border.width / 3 * 2
134 stop_x = border.width / 3
130 stop_x = border.width / 3
@@ -137,42 +133,29 @@ class Dash(emulators.UnityEmulatorBase):
137 self.dash_content_list.currentIndex.wait_for(original_index + 1)
133 self.dash_content_list.currentIndex.wait_for(original_index + 1)
138
134
139
135
140−class DashPreview(emulators.UnityEmulatorBase):
141− """Autopilot emulator for the generic preview."""
142−
143− def get_details(self):
144− """Return the details of the open preview."""
145− title = self.select_single('Label', objectName='titleLabel').text
146− subtitle = self.select_single(
147− 'Label', objectName='subtitleLabel').text
148− description = self.select_single(
149− 'Label', objectName='descriptionLabel').text
150− return dict(title=title, subtitle=subtitle, description=description)
151−
152−
153class GenericScopeView(emulators.UnityEmulatorBase):
136class GenericScopeView(emulators.UnityEmulatorBase):
154 """Autopilot emulator for generic scopes."""
137 """Autopilot emulator for generic scopes."""
155
138
156− preview_class = DashPreview
157−
158 @autopilot_logging.log_action(logger.info)
139 @autopilot_logging.log_action(logger.info)
159 def open_preview(self, category, app_name):
140 def open_preview(self, category, app_name):
160 """Open the preview of an application.
141 """Open the preview of an application.
161
142
162 :parameter category: The name of the category where the application is.
143 :parameter category: The name of the category where the application is.
163 :app_name: The name of the application.
144 :app_name: The name of the application.
145+ :return: The opened preview.
164
146
165 """
147 """
166 category_element = self._get_category_element(category)
148 category_element = self._get_category_element(category)
167− icon = category_element.select_single('Tile', text=app_name)
149+ icon = category_element.select_single('Card', title=app_name)
168 # FIXME some categories need a long press in order to see the preview.
150 # FIXME some categories need a long press in order to see the preview.
169 # Some categories do not show previews, like recent apps.
151 # Some categories do not show previews, like recent apps.
170 # --elopio - 2014-1-14
152 # --elopio - 2014-1-14
171 self.pointing_device.click_object(icon)
153 self.pointing_device.click_object(icon)
172− preview = self.get_root_instance().wait_select_single(
154+ preview_list = self.get_root_instance().wait_select_single(
173− self.preview_class, isCurrent=True)
155+ 'PreviewListView', objectName='dashContentPreviewList')
174− preview.showProcessingAction.wait_for(False)
156+ preview_list.x.wait_for(0)
175− return preview
157+ return preview_list.select_single(
158+ Preview, objectName='preview{}'.format(preview_list.currentIndex))
176
159
177 def _get_category_element(self, category):
160 def _get_category_element(self, category):
178 try:
161 try:
@@ -183,24 +166,9 @@ class GenericScopeView(emulators.UnityEmulatorBase):
183 'No category found with name {}'.format(category))
166 'No category found with name {}'.format(category))
184
167
185
168
186−class AppPreview(DashPreview):
187− """Autopilot emulator for the application preview."""
188−
189− def get_details(self):
190− """Return the details of the application showed in its preview."""
191− details = super(AppPreview, self).get_details()
192− # TODO return screenshots, icon, rating and reviews.
193− # --elopio - 2014-1-15
194− return dict(
195− title=details.get('title'), publisher=details.get('subtitle'),
196− description=details.get('description'))
197−
198−
199class DashApps(GenericScopeView):
169class DashApps(GenericScopeView):
200 """Autopilot emulator for the applications scope."""
170 """Autopilot emulator for the applications scope."""
201
171
202− preview_class = AppPreview
203−
204 def get_applications(self, category):
172 def get_applications(self, category):
205 """Return the list of applications on a category.
173 """Return the list of applications on a category.
206
174
@@ -208,7 +176,15 @@ class DashApps(GenericScopeView):
208
176
209 """
177 """
210 category_element = self._get_category_element(category)
178 category_element = self._get_category_element(category)
211− application_tiles = category_element.select_many('Tile')
179+ application_tiles = category_element.select_many('Card')
212 # TODO return them on the same order they are displayed.
180 # TODO return them on the same order they are displayed.
213 # --elopio - 2014-1-15
181 # --elopio - 2014-1-15
182+ result = []
214− return [tile.text for tile in application_tiles]
183+ for card in application_tiles:
184+ if card.objectName != 'cardToolCard':
185+ result.append(card)
186+ return result
187+
188+
189+class Preview(emulators.UnityEmulatorBase):
190+ """Autopilot custom proxy object for generic previews."""
tests/autopilot/unity8/shell/emulators/main_window.py+1−5
@@ -42,10 +42,6 @@ class QQuickView(emulators.UnityEmulatorBase):
42 objectName="greeterContentLoader"
42 objectName="greeterContentLoader"
43 )
43 )
44
44
45− def get_greeter_background(self):
46− return self.select_single(
47− "CrossFadeImage", objectName="greeterBackground")
48−
49 def get_login_loader(self):
45 def get_login_loader(self):
50 return self.select_single("QQuickLoader", objectName="loginLoader")
46 return self.select_single("QQuickLoader", objectName="loginLoader")
51
47
@@ -116,4 +112,4 @@ class QQuickView(emulators.UnityEmulatorBase):
116
112
117 def get_current_focused_app_id(self):
113 def get_current_focused_app_id(self):
118 """Return the id of the focused application."""
114 """Return the id of the focused application."""
119− return self.select_single('Shell').currentFocusedAppId
115+ return self.select_single('Shell').focusedApplicationId
tests/autopilot/unity8/shell/tests/__init__.py+2−2
@@ -181,7 +181,7 @@ class UnityTestCase(AutopilotTestCase):
181 )
181 )
182 geo_string = "%dx%d" % (width, height)
182 geo_string = "%dx%d" % (width, height)
183 self.unity_geometry_args = [
183 self.unity_geometry_args = [
184− '-geometry',
184+ '-windowgeometry',
185 geo_string,
185 geo_string,
186 '-frameless',
186 '-frameless',
187 '-mousetouch'
187 '-mousetouch'
@@ -376,7 +376,7 @@ class UnityTestCase(AutopilotTestCase):
376
376
377 def assertUnityReady(self):
377 def assertUnityReady(self):
378 dash = self.get_dash()
378 dash = self.get_dash()
379− home_scope = dash.get_scope('home')
379+ home_scope = dash.get_scope('clickscope')
380
380
381 # FIXME! There is a huge timeout here for when we're doing CI on
381 # FIXME! There is a huge timeout here for when we're doing CI on
382 # VMs. See lp:1203715
382 # VMs. See lp:1203715
tests/autopilot/unity8/shell/tests/test_emulators.py+29−53
@@ -60,14 +60,13 @@ class DashEmulatorTestCase(DashBaseTestCase):
60 self.dash.open_scope, scope_name)
60 self.dash.open_scope, scope_name)
61
61
62 self.assertEqual(
62 self.assertEqual(
63− 'No scope found with id unexisting.scope', str(exception))
63+ 'No scope found with id unexisting', str(exception))
64 self.assertFalse(mock_pointer.called)
64 self.assertFalse(mock_pointer.called)
65
65
66 def test_open_already_opened_scope(self):
66 def test_open_already_opened_scope(self):
67 scope_id = self._get_current_scope_id()
67 scope_id = self._get_current_scope_id()
68 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
68 with mock.patch.object(self.dash, 'pointing_device') as mock_pointer:
69− scope = self.dash.open_scope(self._get_scope_name_from_id(
69+ scope = self.dash.open_scope(scope_id)
70− scope_id))
71
70
72 self.assertFalse(mock_pointer.called)
71 self.assertFalse(mock_pointer.called)
73 self._assert_scope_is_opened(scope, scope_id)
72 self._assert_scope_is_opened(scope, scope_id)
@@ -83,12 +82,11 @@ class DashEmulatorTestCase(DashBaseTestCase):
83 return scope.scopeId
82 return scope.scopeId
84
83
85 def test_open_scope_to_the_right(self):
84 def test_open_scope_to_the_right(self):
86− leftmost_scope = self._get_scope_name_from_id(
87− self._get_leftmost_scope_id())
85+ leftmost_scope = self._get_leftmost_scope_id()
88 self.dash.open_scope(leftmost_scope)
86 self.dash.open_scope(leftmost_scope)
89
87
90 scope_id = self._get_rightmost_scope_id()
88 scope_id = self._get_rightmost_scope_id()
91− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
89+ scope = self.dash.open_scope(scope_id)
92 self._assert_scope_is_opened(scope, scope_id)
90 self._assert_scope_is_opened(scope, scope_id)
93
91
94 def _get_leftmost_scope_id(self):
92 def _get_leftmost_scope_id(self):
@@ -104,10 +102,6 @@ class DashEmulatorTestCase(DashBaseTestCase):
104 'QQuickItem')[0]
102 'QQuickItem')[0]
105 return item.get_children_by_type('QQuickLoader')
103 return item.get_children_by_type('QQuickLoader')
106
104
107− def _get_scope_name_from_id(self, scope_id):
108− if scope_id.endswith('.scope'):
109− return scope_id[:-6]
110−
111 def _get_rightmost_scope_id(self):
105 def _get_rightmost_scope_id(self):
112 scope_loaders = self._get_scope_loaders()
106 scope_loaders = self._get_scope_loaders()
113 rightmost_scope_loader = scope_loaders[0]
107 rightmost_scope_loader = scope_loaders[0]
@@ -117,23 +111,22 @@ class DashEmulatorTestCase(DashBaseTestCase):
117 return rightmost_scope_loader.scopeId
111 return rightmost_scope_loader.scopeId
118
112
119 def test_open_scope_to_the_left(self):
113 def test_open_scope_to_the_left(self):
120− rightmost_scope = self._get_scope_name_from_id(
121− self._get_rightmost_scope_id())
114+ rightmost_scope = self._get_rightmost_scope_id()
122 self.dash.open_scope(rightmost_scope)
115 self.dash.open_scope(rightmost_scope)
123
116
124 scope_id = self._get_leftmost_scope_id()
117 scope_id = self._get_leftmost_scope_id()
125− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
118+ scope = self.dash.open_scope(scope_id)
126 self._assert_scope_is_opened(scope, scope_id)
119 self._assert_scope_is_opened(scope, scope_id)
127
120
128 def test_open_generic_scope(self):
121 def test_open_generic_scope(self):
129− scope_id = 'home.scope'
122+ scope_id = 'scopes'
130− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
123+ scope = self.dash.open_scope(scope_id)
131 self._assert_scope_is_opened(scope, scope_id)
124 self._assert_scope_is_opened(scope, scope_id)
132 self.assertIsInstance(scope, dash_emulators.GenericScopeView)
125 self.assertIsInstance(scope, dash_emulators.GenericScopeView)
133
126
134 def test_open_applications_scope(self):
127 def test_open_applications_scope(self):
135− scope_id = 'applications.scope'
128+ scope_id = 'clickscope'
136− scope = self.dash.open_scope(self._get_scope_name_from_id(scope_id))
129+ scope = self.dash.open_scope(scope_id)
137 self._assert_scope_is_opened(scope, scope_id)
130 self._assert_scope_is_opened(scope, scope_id)
138 self.assertIsInstance(scope, dash_emulators.DashApps)
131 self.assertIsInstance(scope, dash_emulators.DashApps)
139
132
@@ -144,36 +137,26 @@ class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
144 # Set up the fake scopes before launching unity.
137 # Set up the fake scopes before launching unity.
145 self.useFixture(fixture_setup.FakeScopes())
138 self.useFixture(fixture_setup.FakeScopes())
146 super(GenericScopeViewEmulatorTestCase, self).setUp()
139 super(GenericScopeViewEmulatorTestCase, self).setUp()
147− self.home_scope = self.dash.open_scope('home')
140+ self.generic_scope = self.dash.open_scope('MockScope1')
148
141
149 def test_open_preview(self):
142 def test_open_preview(self):
150− preview = self.home_scope.open_preview('0', 'Title.0')
143+ preview = self.generic_scope.open_preview('0', 'Title.0.0')
151− self.assertIsInstance(preview, dash_emulators.DashPreview)
144+ self.assertIsInstance(preview, dash_emulators.Preview)
152 self.assertTrue(preview.isCurrent)
145 self.assertTrue(preview.isCurrent)
153− self.assertFalse(preview.showProcessingAction)
154−
155− def test_get_details(self):
156− expected_details = dict(
157− title='Title', subtitle='Subtitle', description='Description')
158−
159− preview = self.home_scope.open_preview('0', 'Title.0')
160− details = preview.get_details()
161−
162− self.assertEqual(expected_details, details)
163
146
164
147
165class DashAppsEmulatorTestCase(DashBaseTestCase):
148class DashAppsEmulatorTestCase(DashBaseTestCase):
166
149
167 available_applications = [
150 available_applications = [
168− 'Title.1', 'Title.21', 'Title.41', 'Title.61', 'Title.81',
151+ 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
169− 'Title.101', 'Title.121', 'Title.141', 'Title.161', 'Title.181',
152+ 'Title.2.5', 'Title.2.6', 'Title.2.7', 'Title.2.8', 'Title.2.9',
170− 'Title.201', 'Title.221', 'Title.241', 'Title.261', 'Title.281']
153+ 'Title.2.9', 'Title.2.10', 'Title.2.11']
171
154
172 def setUp(self):
155 def setUp(self):
173 # Set up the fake scopes before launching unity.
156 # Set up the fake scopes before launching unity.
174 self.useFixture(fixture_setup.FakeScopes())
157 self.useFixture(fixture_setup.FakeScopes())
175 super(DashAppsEmulatorTestCase, self).setUp()
158 super(DashAppsEmulatorTestCase, self).setUp()
176− self.applications_scope = self.dash.open_scope('applications')
159+ self.applications_scope = self.dash.open_scope('clickscope')
177
160
178 def test_get_applications_with_unexisting_category(self):
161 def test_get_applications_with_unexisting_category(self):
179 exception = self.assertRaises(
162 exception = self.assertRaises(
@@ -185,34 +168,27 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
185 'No category found with name unexisting category', str(exception))
168 'No category found with name unexisting category', str(exception))
186
169
187 def test_get_applications_should_return_list_with_names(self):
170 def test_get_applications_should_return_list_with_names(self):
188− category = 'installed'
171+ category = '2'
189 expected_apps_count = self._get_number_of_application_slots(category)
172 expected_apps_count = self._get_number_of_application_slots(category)
190 expected_applications = self.available_applications[
173 expected_applications = self.available_applications[
191 :expected_apps_count]
174 :expected_apps_count]
192
175
193 applications = self.applications_scope.get_applications(category)
176 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)
194
181
195 self.assertThat(applications, HasLength(expected_apps_count))
182 self.assertThat(applications, HasLength(expected_apps_count))
196 for expected in expected_applications:
183 for expected in expected_applications:
197− self.assertThat(applications, Contains(expected))
184+ self.assertThat(applications_titles, Contains(expected))
198
185
199 def _get_number_of_application_slots(self, category):
186 def _get_number_of_application_slots(self, category):
200 category_element = self.applications_scope._get_category_element(
187 category_element = self.applications_scope._get_category_element(
201 category)
188 category)
202− grid = category_element.select_single('GenericFilterGrid')
189+ grid = category_element.select_single('CardFilterGrid')
203− return grid.columns * grid.rows
190+ filtergrid = grid.select_single('FilterGrid')
204−
191+ if (grid.filter):
205− def test_open_preview(self):
192+ return filtergrid.collapsedRowCount * filtergrid.columns
206− preview = self.applications_scope.open_preview('installed', 'Title.1')
193+ else:
207− self.assertIsInstance(preview, dash_emulators.AppPreview)
194+ return filtergrid.uncollapsedRowCount * filtergrid.columns
208− self.assertTrue(preview.isCurrent)
209− self.assertFalse(preview.showProcessingAction)
210−
211− def test_get_details(self):
212− expected_details = dict(
213− title='Title', publisher='', description='Description')
214−
215− preview = self.applications_scope.open_preview('installed', 'Title.1')
216− details = preview.get_details()
217−
218− self.assertEqual(expected_details, details)
tests/autopilot/unity8/shell/tests/test_greeter.pydeleted−38
@@ -1,38 +0,0 @@
1−# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2−#
3−# Unity Autopilot Test Suite
4−# Copyright (C) 2012-2013 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 unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
21−
22−from testtools.matchers import Equals
23−
24−class TestGreeter(UnityTestCase):
25−
26− """Tests the Shell Greeter."""
27−
28− scenarios = _get_device_emulation_scenarios()
29−
30− def test_greeter_background(self):
31− """Test that the background of the greeter and the background of the shell are placed correctly
32−
33− """
34− self.launch_unity()
35− self.main_window.get_greeter()
36− greeter_background = self.main_window.get_greeter_background()
37− shell_background = self.main_window.get_shell_background()
38− self.assertThat(greeter_background.globalRect, Equals(shell_background.globalRect))
tests/autopilot/unity8/shell/tests/test_notifications.py+1−1
@@ -194,7 +194,7 @@ class InteractiveNotificationBase(NotificationsBase):
194
194
195 notify_list = self._get_notifications_list()
195 notify_list = self._get_notifications_list()
196 get_notification = lambda: notify_list.wait_select_single(
196 get_notification = lambda: notify_list.wait_select_single(
197− 'Notification', objectName='notification0')
197+ 'Notification', objectName='notification1')
198 notification = get_notification()
198 notification = get_notification()
199 self._assert_notification(notification, None, None, True, True, 1.0)
199 self._assert_notification(notification, None, None, True, True, 1.0)
200 initial_height = notification.height
200 initial_height = notification.height
tests/autopilot/unity8/shell/tests/test_system_integration.py+2−1
@@ -22,6 +22,7 @@
22import subprocess
22import subprocess
23import unittest
23import unittest
24
24
25+from autopilot import platform
25from unity8.shell.emulators import UnityEmulatorBase
26from unity8.shell.emulators import UnityEmulatorBase
26from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
27from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
27
28
@@ -31,7 +32,7 @@ class SystemIntegrationTests(UnityTestCase):
31
32
32 scenarios = _get_device_emulation_scenarios()
33 scenarios = _get_device_emulation_scenarios()
33
34
34− @unittest.skip("Disabled until we can investigate jenkins failure")
35+ @unittest.skipIf(platform.model() == "Desktop", "Test is broken on otto, see bug 1281634.")
35 def test_networkmanager_integration(self):
36 def test_networkmanager_integration(self):
36 self.launch_unity()
37 self.launch_unity()
37
38
tests/mocks/Ubuntu/CMakeLists.txt+1
@@ -1 +1,2 @@
1add_subdirectory(DownloadDaemonListener)
1add_subdirectory(DownloadDaemonListener)
2+add_subdirectory(Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/CMakeLists.txtnew file+7
@@ -0,0 +1,7 @@
1+# copy files into build directory for shadow builds
2+add_custom_target(UbuntuThumbnailerQmlDirFile ALL
3+ COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
4+ DEPENDS qmldir
5+)
6+
7+install(FILES qmldir DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Thumbnailer)
tests/mocks/Ubuntu/Thumbnailer/qmldirnew file+2
@@ -0,0 +1,2 @@
1+module Ubuntu.Thumbnailer
2+Dummy 0.1 Dummy.qml
tests/mocks/Unity/Application/ApplicationInfo.cpp+9
@@ -20,6 +20,7 @@
20#include <QQuickItem>
20#include <QQuickItem>
21#include <QQuickView>
21#include <QQuickView>
22#include <QQmlComponent>
22#include <QQmlComponent>
23+#include <QTimer>
23
24
24ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
25ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
25 : ApplicationInfoInterface(appId, parent)
26 : ApplicationInfoInterface(appId, parent)
@@ -32,6 +33,7 @@ ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
32 ,m_windowComponent(0)
33 ,m_windowComponent(0)
33 ,m_parentItem(0)
34 ,m_parentItem(0)
34{
35{
36+ QTimer::singleShot(300, this, SLOT(setRunning()));
35}
37}
36
38
37ApplicationInfo::ApplicationInfo(QObject *parent)
39ApplicationInfo::ApplicationInfo(QObject *parent)
@@ -44,6 +46,7 @@ ApplicationInfo::ApplicationInfo(QObject *parent)
44 ,m_windowComponent(0)
46 ,m_windowComponent(0)
45 ,m_parentItem(0)
47 ,m_parentItem(0)
46{
48{
49+ QTimer::singleShot(300, this, SLOT(setRunning()));
47}
50}
48
51
49void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
52void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
@@ -52,6 +55,12 @@ void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status statu
52 doCreateWindowItem();
55 doCreateWindowItem();
53}
56}
54
57
58+void ApplicationInfo::setRunning()
59+{
60+ m_state = Running;
61+ Q_EMIT stateChanged();
62+}
63+
55void ApplicationInfo::createWindowComponent()
64void ApplicationInfo::createWindowComponent()
56{
65{
57 // The assumptions I make here really should hold.
66 // The assumptions I make here really should hold.
tests/mocks/Unity/Application/ApplicationInfo.h+2
@@ -74,6 +74,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
74 IMPLEMENT_PROPERTY(fullscreen, Fullscreen, bool)
74 IMPLEMENT_PROPERTY(fullscreen, Fullscreen, bool)
75 IMPLEMENT_PROPERTY(imageQml, ImageQml, QString)
75 IMPLEMENT_PROPERTY(imageQml, ImageQml, QString)
76 IMPLEMENT_PROPERTY(windowQml, WindowQml, QString)
76 IMPLEMENT_PROPERTY(windowQml, WindowQml, QString)
77+ IMPLEMENT_PROPERTY(screenshot, Screenshot, QUrl)
77
78
78 #undef IMPLEMENT_PROPERTY
79 #undef IMPLEMENT_PROPERTY
79
80
@@ -83,6 +84,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
83
84
84 private Q_SLOTS:
85 private Q_SLOTS:
85 void onWindowComponentStatusChanged(QQmlComponent::Status status);
86 void onWindowComponentStatusChanged(QQmlComponent::Status status);
87+ void setRunning();
86
88
87 private:
89 private:
88 void createWindowItem();
90 void createWindowItem();
tests/mocks/Unity/Application/ApplicationManager.cpp+109−3
@@ -24,13 +24,17 @@
24#include <QQuickItem>
24#include <QQuickItem>
25#include <QQuickView>
25#include <QQuickView>
26#include <QQmlComponent>
26#include <QQmlComponent>
27+#include <QTimer>
28+#include <QDateTime>
27
29
28ApplicationManager::ApplicationManager(QObject *parent)
30ApplicationManager::ApplicationManager(QObject *parent)
29 : ApplicationManagerInterface(parent)
31 : ApplicationManagerInterface(parent)
32+ , m_suspended(false)
30 , m_mainStageComponent(0)
33 , m_mainStageComponent(0)
31 , m_mainStage(0)
34 , m_mainStage(0)
32 , m_sideStageComponent(0)
35 , m_sideStageComponent(0)
33 , m_sideStage(0)
36 , m_sideStage(0)
37+ , m_rightMargin(0)
34{
38{
35 buildListOfAvailableApplications();
39 buildListOfAvailableApplications();
36}
40}
@@ -63,6 +67,8 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
63 return app->state();
67 return app->state();
64 case RoleFocused:
68 case RoleFocused:
65 return app->focused();
69 return app->focused();
70+ case RoleScreenshot:
71+ return app->screenshot();
66 default:
72 default:
67 return QVariant();
73 return QVariant();
68 }
74 }
@@ -84,13 +90,16 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
84}
90}
85
91
86void ApplicationManager::add(ApplicationInfo *application) {
92void ApplicationManager::add(ApplicationInfo *application) {
87− if (!application)
93+ if (!application) {
88 return;
94 return;
95+ }
89
96
90 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
97 beginInsertRows(QModelIndex(), m_runningApplications.size(), m_runningApplications.size());
91 m_runningApplications.append(application);
98 m_runningApplications.append(application);
92 endInsertRows();
99 endInsertRows();
100+ Q_EMIT applicationAdded(application->appId());
93 Q_EMIT countChanged();
101 Q_EMIT countChanged();
102+ Q_EMIT focusRequested(application->appId());
94}
103}
95
104
96void ApplicationManager::remove(ApplicationInfo *application) {
105void ApplicationManager::remove(ApplicationInfo *application) {
@@ -99,6 +108,7 @@ void ApplicationManager::remove(ApplicationInfo *application) {
99 beginRemoveRows(QModelIndex(), i, i);
108 beginRemoveRows(QModelIndex(), i, i);
100 m_runningApplications.removeAt(i);
109 m_runningApplications.removeAt(i);
101 endRemoveRows();
110 endRemoveRows();
111+ Q_EMIT applicationRemoved(application->appId());
102 Q_EMIT countChanged();
112 Q_EMIT countChanged();
103 }
113 }
104}
114}
@@ -171,6 +181,8 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
171 }
181 }
172 add(application);
182 add(application);
173
183
184+ QMetaObject::invokeMethod(this, "focusApplication", Qt::QueuedConnection, Q_ARG(QString, appId));
185+
174 return application;
186 return application;
175}
187}
176
188
@@ -180,8 +192,32 @@ bool ApplicationManager::stopApplication(const QString &appId)
180 if (application == nullptr)
192 if (application == nullptr)
181 return false;
193 return false;
182
194
195+ if (application->appId() == focusedApplicationId()) {
196+ unfocusCurrentApplication();
197+ }
183 remove(application);
198 remove(application);
184− Q_EMIT focusedApplicationIdChanged();
199+ return true;
200+}
201+
202+bool ApplicationManager::updateScreenshot(const QString &appId)
203+{
204+ int idx = -1;
205+ ApplicationInfo *application = nullptr;
206+ for (int i = 0; i < m_availableApplications.count(); ++i) {
207+ application = m_availableApplications.at(i);
208+ if (application->appId() == appId) {
209+ idx = i;
210+ break;
211+ }
212+ }
213+
214+ if (idx == -1) {
215+ return false;
216+ }
217+
218+ application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
219+ QModelIndex appIndex = index(idx);
220+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
185 return true;
221 return true;
186}
222}
187
223
@@ -194,6 +230,25 @@ QString ApplicationManager::focusedApplicationId() const {
194 return QString();
230 return QString();
195}
231}
196
232
233+bool ApplicationManager::suspended() const
234+{
235+ return m_suspended;
236+}
237+
238+void ApplicationManager::setSuspended(bool suspended)
239+{
240+ ApplicationInfo *focusedApp = findApplication(focusedApplicationId());
241+ if (focusedApp) {
242+ if (suspended) {
243+ focusedApp->setState(ApplicationInfo::Suspended);
244+ } else {
245+ focusedApp->setState(ApplicationInfo::Running);
246+ }
247+ }
248+ m_suspended = suspended;
249+ Q_EMIT suspendedChanged();
250+}
251+
197bool ApplicationManager::focusApplication(const QString &appId)
252bool ApplicationManager::focusApplication(const QString &appId)
198{
253{
199 ApplicationInfo *application = findApplication(appId);
254 ApplicationInfo *application = findApplication(appId);
@@ -242,6 +297,15 @@ bool ApplicationManager::focusApplication(const QString &appId)
242 return true;
297 return true;
243}
298}
244
299
300+bool ApplicationManager::requestFocusApplication(const QString &appId)
301+{
302+ if (appId != focusedApplicationId()) {
303+ QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
304+ return true;
305+ }
306+ return false;
307+}
308+
245void ApplicationManager::unfocusCurrentApplication()
309void ApplicationManager::unfocusCurrentApplication()
246{
310{
247 for (ApplicationInfo *app : m_runningApplications) {
311 for (ApplicationInfo *app : m_runningApplications) {
@@ -270,10 +334,12 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
270 "Image {\n"
334 "Image {\n"
271 " anchors.fill: parent\n"
335 " anchors.fill: parent\n"
272 " anchors.topMargin: %1\n"
336 " anchors.topMargin: %1\n"
337+ " anchors.rightMargin: %2\n"
273− " source: \"file://%2/Dash/graphics/phone/screenshots/%3.png\"\n"
338+ " source: \"file://%3/Dash/graphics/phone/screenshots/%4.png\"\n"
274 " smooth: true\n"
339 " smooth: true\n"
275 " fillMode: Image.PreserveAspectCrop\n"
340 " fillMode: Image.PreserveAspectCrop\n"
276 "}").arg(topMargin)
341 "}").arg(topMargin)
342+ .arg(m_rightMargin)
277 .arg(qmlDirectory())
343 .arg(qmlDirectory())
278 .arg(application->icon().toString());
344 .arg(application->icon().toString());
279 application->setWindowQml(windowQml);
345 application->setWindowQml(windowQml);
@@ -299,6 +365,7 @@ void ApplicationManager::buildListOfAvailableApplications()
299 application->setName("Phone");
365 application->setName("Phone");
300 application->setIcon(QUrl("phone"));
366 application->setIcon(QUrl("phone"));
301 application->setStage(ApplicationInfo::SideStage);
367 application->setStage(ApplicationInfo::SideStage);
368+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
302 generateQmlStrings(application);
369 generateQmlStrings(application);
303 m_availableApplications.append(application);
370 m_availableApplications.append(application);
304
371
@@ -307,6 +374,7 @@ void ApplicationManager::buildListOfAvailableApplications()
307 application->setName("Camera");
374 application->setName("Camera");
308 application->setIcon(QUrl("camera"));
375 application->setIcon(QUrl("camera"));
309 application->setFullscreen(true);
376 application->setFullscreen(true);
377+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
310 generateQmlStrings(application);
378 generateQmlStrings(application);
311 m_availableApplications.append(application);
379 m_availableApplications.append(application);
312
380
@@ -314,6 +382,7 @@ void ApplicationManager::buildListOfAvailableApplications()
314 application->setAppId("gallery-app");
382 application->setAppId("gallery-app");
315 application->setName("Gallery");
383 application->setName("Gallery");
316 application->setIcon(QUrl("gallery"));
384 application->setIcon(QUrl("gallery"));
385+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
317 generateQmlStrings(application);
386 generateQmlStrings(application);
318 m_availableApplications.append(application);
387 m_availableApplications.append(application);
319
388
@@ -322,13 +391,16 @@ void ApplicationManager::buildListOfAvailableApplications()
322 application->setName("Facebook");
391 application->setName("Facebook");
323 application->setIcon(QUrl("facebook"));
392 application->setIcon(QUrl("facebook"));
324 application->setStage(ApplicationInfo::SideStage);
393 application->setStage(ApplicationInfo::SideStage);
394+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
325 generateQmlStrings(application);
395 generateQmlStrings(application);
326 m_availableApplications.append(application);
396 m_availableApplications.append(application);
327
397
328 application = new ApplicationInfo(this);
398 application = new ApplicationInfo(this);
329 application->setAppId("webbrowser-app");
399 application->setAppId("webbrowser-app");
400+ application->setFullscreen(true);
330 application->setName("Browser");
401 application->setName("Browser");
331 application->setIcon(QUrl("browser"));
402 application->setIcon(QUrl("browser"));
403+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
332 generateQmlStrings(application);
404 generateQmlStrings(application);
333 m_availableApplications.append(application);
405 m_availableApplications.append(application);
334
406
@@ -337,6 +409,7 @@ void ApplicationManager::buildListOfAvailableApplications()
337 application->setName("Twitter");
409 application->setName("Twitter");
338 application->setIcon(QUrl("twitter"));
410 application->setIcon(QUrl("twitter"));
339 application->setStage(ApplicationInfo::SideStage);
411 application->setStage(ApplicationInfo::SideStage);
412+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
340 generateQmlStrings(application);
413 generateQmlStrings(application);
341 m_availableApplications.append(application);
414 m_availableApplications.append(application);
342
415
@@ -344,6 +417,7 @@ void ApplicationManager::buildListOfAvailableApplications()
344 application->setAppId("gmail-webapp");
417 application->setAppId("gmail-webapp");
345 application->setName("GMail");
418 application->setName("GMail");
346 application->setIcon(QUrl("gmail"));
419 application->setIcon(QUrl("gmail"));
420+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
347 m_availableApplications.append(application);
421 m_availableApplications.append(application);
348
422
349 application = new ApplicationInfo(this);
423 application = new ApplicationInfo(this);
@@ -351,6 +425,7 @@ void ApplicationManager::buildListOfAvailableApplications()
351 application->setName("Weather");
425 application->setName("Weather");
352 application->setIcon(QUrl("weather"));
426 application->setIcon(QUrl("weather"));
353 application->setStage(ApplicationInfo::SideStage);
427 application->setStage(ApplicationInfo::SideStage);
428+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
354 generateQmlStrings(application);
429 generateQmlStrings(application);
355 m_availableApplications.append(application);
430 m_availableApplications.append(application);
356
431
@@ -359,6 +434,7 @@ void ApplicationManager::buildListOfAvailableApplications()
359 application->setName("Notepad");
434 application->setName("Notepad");
360 application->setIcon(QUrl("notepad"));
435 application->setIcon(QUrl("notepad"));
361 application->setStage(ApplicationInfo::SideStage);
436 application->setStage(ApplicationInfo::SideStage);
437+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
362 m_availableApplications.append(application);
438 m_availableApplications.append(application);
363
439
364 application = new ApplicationInfo(this);
440 application = new ApplicationInfo(this);
@@ -366,6 +442,7 @@ void ApplicationManager::buildListOfAvailableApplications()
366 application->setName("Calendar");
442 application->setName("Calendar");
367 application->setIcon(QUrl("calendar"));
443 application->setIcon(QUrl("calendar"));
368 application->setStage(ApplicationInfo::SideStage);
444 application->setStage(ApplicationInfo::SideStage);
445+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
369 m_availableApplications.append(application);
446 m_availableApplications.append(application);
370
447
371 application = new ApplicationInfo(this);
448 application = new ApplicationInfo(this);
@@ -373,18 +450,21 @@ void ApplicationManager::buildListOfAvailableApplications()
373 application->setName("Media Player");
450 application->setName("Media Player");
374 application->setIcon(QUrl("mediaplayer-app"));
451 application->setIcon(QUrl("mediaplayer-app"));
375 application->setFullscreen(true);
452 application->setFullscreen(true);
453+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
376 m_availableApplications.append(application);
454 m_availableApplications.append(application);
377
455
378 application = new ApplicationInfo(this);
456 application = new ApplicationInfo(this);
379 application->setAppId("evernote");
457 application->setAppId("evernote");
380 application->setName("Evernote");
458 application->setName("Evernote");
381 application->setIcon(QUrl("evernote"));
459 application->setIcon(QUrl("evernote"));
460+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
382 m_availableApplications.append(application);
461 m_availableApplications.append(application);
383
462
384 application = new ApplicationInfo(this);
463 application = new ApplicationInfo(this);
385 application->setAppId("map");
464 application->setAppId("map");
386 application->setName("Map");
465 application->setName("Map");
387 application->setIcon(QUrl("map"));
466 application->setIcon(QUrl("map"));
467+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
388 generateQmlStrings(application);
468 generateQmlStrings(application);
389 m_availableApplications.append(application);
469 m_availableApplications.append(application);
390
470
@@ -392,24 +472,28 @@ void ApplicationManager::buildListOfAvailableApplications()
392 application->setAppId("pinterest");
472 application->setAppId("pinterest");
393 application->setName("Pinterest");
473 application->setName("Pinterest");
394 application->setIcon(QUrl("pinterest"));
474 application->setIcon(QUrl("pinterest"));
475+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
395 m_availableApplications.append(application);
476 m_availableApplications.append(application);
396
477
397 application = new ApplicationInfo(this);
478 application = new ApplicationInfo(this);
398 application->setAppId("soundcloud");
479 application->setAppId("soundcloud");
399 application->setName("SoundCloud");
480 application->setName("SoundCloud");
400 application->setIcon(QUrl("soundcloud"));
481 application->setIcon(QUrl("soundcloud"));
482+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
401 m_availableApplications.append(application);
483 m_availableApplications.append(application);
402
484
403 application = new ApplicationInfo(this);
485 application = new ApplicationInfo(this);
404 application->setAppId("wikipedia");
486 application->setAppId("wikipedia");
405 application->setName("Wikipedia");
487 application->setName("Wikipedia");
406 application->setIcon(QUrl("wikipedia"));
488 application->setIcon(QUrl("wikipedia"));
489+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
407 m_availableApplications.append(application);
490 m_availableApplications.append(application);
408
491
409 application = new ApplicationInfo(this);
492 application = new ApplicationInfo(this);
410 application->setAppId("youtube");
493 application->setAppId("youtube");
411 application->setName("YouTube");
494 application->setName("YouTube");
412 application->setIcon(QUrl("youtube"));
495 application->setIcon(QUrl("youtube"));
496+ application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
413 m_availableApplications.append(application);
497 m_availableApplications.append(application);
414}
498}
415
499
@@ -484,3 +568,25 @@ void ApplicationManager::createSideStage()
484 m_sideStage->setParentItem(shell);
568 m_sideStage->setParentItem(shell);
485 m_sideStage->setFlag(QQuickItem::ItemHasContents, false);
569 m_sideStage->setFlag(QQuickItem::ItemHasContents, false);
486}
570}
571+
572+QStringList ApplicationManager::availableApplications()
573+{
574+ QStringList appIds;
575+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
576+ appIds << app->appId();
577+ }
578+ return appIds;
579+}
580+
581+int ApplicationManager::rightMargin() const
582+{
583+ return m_rightMargin;
584+}
585+
586+void ApplicationManager::setRightMargin(int rightMargin)
587+{
588+ m_rightMargin = rightMargin;
589+ Q_FOREACH(ApplicationInfo *app, m_availableApplications) {
590+ generateQmlStrings(app);
591+ }
592+}
tests/mocks/Unity/Application/ApplicationManager.h+16
@@ -45,6 +45,10 @@ class ApplicationManager : public ApplicationManagerInterface {
45
45
46 Q_PROPERTY(bool fake READ fake CONSTANT)
46 Q_PROPERTY(bool fake READ fake CONSTANT)
47
47
48+ // Only for testing
49+ // This can be used to place some controls to right, like make tryPhoneStage for example
50+ Q_PROPERTY(int rightMargin READ rightMargin WRITE setRightMargin)
51+
48 public:
52 public:
49 ApplicationManager(QObject *parent = NULL);
53 ApplicationManager(QObject *parent = NULL);
50 virtual ~ApplicationManager();
54 virtual ~ApplicationManager();
@@ -87,13 +91,22 @@ class ApplicationManager : public ApplicationManagerInterface {
87 Q_INVOKABLE void move(int from, int to);
91 Q_INVOKABLE void move(int from, int to);
88
92
89 // Application control methods
93 // Application control methods
94+ Q_INVOKABLE bool requestFocusApplication(const QString &appId) override;
90 Q_INVOKABLE bool focusApplication(const QString &appId) override;
95 Q_INVOKABLE bool focusApplication(const QString &appId) override;
91 Q_INVOKABLE void unfocusCurrentApplication() override;
96 Q_INVOKABLE void unfocusCurrentApplication() override;
92 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
97 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, const QStringList &arguments = QStringList()) override;
93 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, ExecFlags flags, const QStringList &arguments = QStringList());
98 Q_INVOKABLE ApplicationInfo *startApplication(const QString &appId, ExecFlags flags, const QStringList &arguments = QStringList());
94 Q_INVOKABLE bool stopApplication(const QString &appId) override;
99 Q_INVOKABLE bool stopApplication(const QString &appId) override;
100+ Q_INVOKABLE bool updateScreenshot(const QString &appId) override;
95
101
96 QString focusedApplicationId() const override;
102 QString focusedApplicationId() const override;
103+ bool suspended() const;
104+ void setSuspended(bool suspended);
105+
106+ // Only for testing
107+ Q_INVOKABLE QStringList availableApplications();
108+ int rightMargin() const;
109+ void setRightMargin(int rightMargin);
97
110
98 Q_SIGNALS:
111 Q_SIGNALS:
99 void keyboardHeightChanged();
112 void keyboardHeightChanged();
@@ -113,12 +126,15 @@ class ApplicationManager : public ApplicationManagerInterface {
113 void createSideStage();
126 void createSideStage();
114 int m_keyboardHeight;
127 int m_keyboardHeight;
115 bool m_keyboardVisible;
128 bool m_keyboardVisible;
129+ bool m_suspended;
116 QList<ApplicationInfo*> m_runningApplications;
130 QList<ApplicationInfo*> m_runningApplications;
117 QList<ApplicationInfo*> m_availableApplications;
131 QList<ApplicationInfo*> m_availableApplications;
118 QQmlComponent *m_mainStageComponent;
132 QQmlComponent *m_mainStageComponent;
119 QQuickItem *m_mainStage;
133 QQuickItem *m_mainStage;
120 QQmlComponent *m_sideStageComponent;
134 QQmlComponent *m_sideStageComponent;
121 QQuickItem *m_sideStage;
135 QQuickItem *m_sideStage;
136+
137+ int m_rightMargin;
122};
138};
123
139
124Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
140Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
tests/mocks/Unity/Application/ApplicationScreenshotProvider.cppnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ApplicationScreenshotProvider.h"
18+#include "ApplicationManager.h"
19+#include "ApplicationInfo.h"
20+
21+#include "paths.h"
22+
23+#include <QDebug>
24+#include <QGuiApplication>
25+#include <QWindow>
26+#include <QQuickWindow>
27+
28+ApplicationScreenshotProvider::ApplicationScreenshotProvider(ApplicationManager *appManager)
29+ : QQuickImageProvider(QQuickImageProvider::Image)
30+ , m_appManager(appManager)
31+{
32+}
33+
34+QImage ApplicationScreenshotProvider::requestImage(const QString &imageId, QSize * size,
35+ const QSize &requestedSize)
36+{
37+ // We ignore requestedSize here intentionally to avoid keeping scaled copies around
38+ Q_UNUSED(requestedSize)
39+
40+ QString appId = imageId.split('/').first();
41+
42+ ApplicationInfo* app = static_cast<ApplicationInfo*>(m_appManager->findApplication(appId));
43+ if (app == nullptr) {
44+ return QImage();
45+ }
46+
47+ QString filePath = QString("%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory()).arg(app->icon().toString());
48+
49+ QImage image;
50+ if (!image.load(filePath)) {
51+ qWarning() << "failed loading app image" << filePath;
52+ }
53+
54+
55+ if (app->stage() == ApplicationInfo::SideStage) {
56+ QByteArray gus = qgetenv("GRID_UNIT_PX");
57+ if (gus.isEmpty() || gus.toInt() == 0) {
58+ gus = "8";
59+ }
60+ image = image.scaledToWidth(gus.toInt() * 48);
61+ } else {
62+ // Lets scale main stage applications to be the size of the screen/window.
63+ QGuiApplication *unity = qobject_cast<QGuiApplication*>(qApp);
64+ Q_FOREACH (QWindow *win, unity->allWindows()) {
65+ QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
66+ if (quickWin) {
67+ image = image.scaledToWidth(quickWin->width() - m_appManager->rightMargin());
68+ break;
69+ }
70+ }
71+ }
72+
73+ size->setWidth(image.width());
74+ size->setHeight(image.height());
75+
76+ return image;
77+}
tests/mocks/Unity/Application/ApplicationScreenshotProvider.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 201 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify it under
5+ * the terms of the GNU Lesser General Public License version 3, as published by
6+ * the Free Software Foundation.
7+ *
8+ * This program is distributed in the hope that it will be useful, but WITHOUT
9+ * ANY WARRANTY; without even the implied warranties of MERCHANTABILITY,
10+ * SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11+ * Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef APPLICATIONSCREENSHOTPROVIDER_H
18+#define APPLICATIONSCREENSHOTPROVIDER_H
19+
20+#include <QQuickImageProvider>
21+
22+class ApplicationManager;
23+class ApplicationScreenshotProvider : public QQuickImageProvider
24+{
25+public:
26+ explicit ApplicationScreenshotProvider(ApplicationManager *appManager);
27+
28+ QImage requestImage(const QString &appId, QSize *size, const QSize &requestedSize) override;
29+
30+private:
31+ ApplicationManager* m_appManager;
32+};
33+
34+#endif // APPLICATIONSCREENSHOTPROVIDER_H
tests/mocks/Unity/Application/CMakeLists.txt+15
@@ -5,6 +5,7 @@ set(FakeUnityApplicationQml_SOURCES
5 ApplicationInfo.cpp
5 ApplicationInfo.cpp
6 ApplicationImage.cpp
6 ApplicationImage.cpp
7 ApplicationManager.cpp
7 ApplicationManager.cpp
8+ ApplicationScreenshotProvider.cpp
8 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
10 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
10)
11)
@@ -34,3 +35,17 @@ install(TARGETS FakeUnityApplicationQml
34install(FILES qmldir InputFilterArea.qml OSKController.qml
35install(FILES qmldir InputFilterArea.qml OSKController.qml
35 DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
36 DESTINATION ${SHELL_INSTALL_QML}/mocks/Unity/Application
36 )
37 )
38+
39+# Duplicate the mock to nonmirplugins
40+# In shadow builds we just link it, in real installs we also install it to the other path
41+add_custom_target(OSKControllerQmlFile2 ALL
42+ COMMAND mkdir -p ${CMAKE_BINARY_DIR}/nonmirplugins/Unity && rm -f ${CMAKE_BINARY_DIR}/nonmirplugins/Unity/Application && ln -s ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_BINARY_DIR}/nonmirplugins/Unity
43+ DEPENDS qmldir
44+)
45+install(TARGETS FakeUnityApplicationQml
46+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
47+ )
48+
49+install(FILES qmldir InputFilterArea.qml OSKController.qml
50+ DESTINATION ${SHELL_INSTALL_QML}/nonmirplugins/Unity/Application
51+ )
tests/mocks/Unity/Application/plugin.cpp+18−3
@@ -18,13 +18,20 @@
18#include "ApplicationInfo.h"
18#include "ApplicationInfo.h"
19#include "ApplicationImage.h"
19#include "ApplicationImage.h"
20#include "ApplicationManager.h"
20#include "ApplicationManager.h"
21+#include "ApplicationScreenshotProvider.h"
21
22
22#include <qqml.h>
23#include <qqml.h>
24+#include <QQmlEngine>
25+
26+ApplicationManager *s_appManager = 0;
23
27
24static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
28static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
25− Q_UNUSED(engine);
29+ Q_UNUSED(engine);
26− Q_UNUSED(scriptEngine);
30+ Q_UNUSED(scriptEngine);
31+ if (!s_appManager) {
27− return new ApplicationManager();
32+ s_appManager = new ApplicationManager();
33+ }
34+ return s_appManager;
28}
35}
29
36
30void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
37void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
@@ -37,3 +44,11 @@ void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
37
44
38 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
45 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
39}
46}
47+
48+void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
49+{
50+ QQmlExtensionPlugin::initializeEngine(engine, uri);
51+
52+ ApplicationManager* appManager = static_cast<ApplicationManager*>(applicationManagerSingleton(engine, NULL));
53+ engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(appManager));
54+}
tests/mocks/Unity/Application/plugin.h+1
@@ -25,6 +25,7 @@ class FakeUnityApplicationQmlPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26public:
26public:
27 void registerTypes(const char *uri);
27 void registerTypes(const char *uri);
28+ void initializeEngine(QQmlEngine *engine, const char *uri);
28};
29};
29
30
30#endif
31#endif
tests/mocks/Unity/CMakeLists.txt+4−4
@@ -18,14 +18,14 @@ include_directories(
18add_definitions(-DQT_NO_KEYWORDS)
18add_definitions(-DQT_NO_KEYWORDS)
19
19
20set(UnityQML_SOURCES
20set(UnityQML_SOURCES
21− categoryresults.cpp
22 iconutils.cpp
21 iconutils.cpp
23− fake_applications_scope.cpp
24− fake_preview.cpp
25 fake_scope.cpp
22 fake_scope.cpp
26 fake_scopes.cpp
23 fake_scopes.cpp
27 fake_categories.cpp
24 fake_categories.cpp
28− scopes-ng/fake_preview_model.cpp
25+ fake_resultsmodel.cpp
26+ fake_previewmodel.cpp
27+ fake_previewstack.cpp
28+ fake_previewwidgetmodel.cpp
29 fake_unity_plugin.cpp
29 fake_unity_plugin.cpp
30)
30)
31
31
tests/mocks/Unity/categoryresults.cppdeleted−121
@@ -1,121 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * Authors:
5− * Michal Hruby <michal.hruby@canonical.com>
6− *
7− * This program is free software; you can redistribute it and/or modify
8− * it under the terms of the GNU General Public License as published by
9− * the Free Software Foundation; version 3.
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−// self
21−#include "categoryresults.h"
22−#include "iconutils.h"
23−
24−// TODO: use something from libunity once it's public
25−enum ResultsColumn {
26− URI,
27− ICON_HINT,
28− CATEGORY,
29− RESULT_TYPE,
30− MIMETYPE,
31− TITLE,
32− COMMENT,
33− DND_URI,
34− METADATA
35−};
36−
37−CategoryResults::CategoryResults(QObject* parent)
38− : DeeListModel(parent)
39− , m_categoryIndex(-1)
40−{
41− m_roles[CategoryResults::RoleUri] = "uri";
42− m_roles[CategoryResults::RoleIconHint] = "icon";
43− m_roles[CategoryResults::RoleCategory] = "category";
44− m_roles[CategoryResults::RoleMimetype] = "mimetype";
45− m_roles[CategoryResults::RoleTitle] = "title";
46− m_roles[CategoryResults::RoleComment] = "comment";
47− m_roles[CategoryResults::RoleDndUri] = "dndUri";
48− m_roles[CategoryResults::RoleMetadata] = "metadata";
49− m_roles[CategoryResults::RoleRendererHints] = "rendererHints";
50−}
51−
52−int CategoryResults::categoryIndex() const
53−{
54− return m_categoryIndex;
55−}
56−
57−void CategoryResults::setCategoryIndex(int index)
58−{
59− if (m_categoryIndex != index) {
60− m_categoryIndex = index;
61− Q_EMIT categoryIndexChanged(m_categoryIndex);
62− }
63−}
64−
65−QHash<int, QByteArray>
66−CategoryResults::roleNames() const
67−{
68− return m_roles;
69−}
70−
71−QVariant
72−CategoryResults::data(const QModelIndex& index, int role) const
73−{
74− if (!index.isValid()) {
75− return QVariant();
76− }
77−
78− switch (role) {
79− case RoleUri:
80− return DeeListModel::data(index, ResultsColumn::URI);
81− case RoleIconHint: {
82− QString giconString(DeeListModel::data(index, ResultsColumn::ICON_HINT).toString());
83− if (giconString.isEmpty()) {
84− QString mimetype(DeeListModel::data(index, ResultsColumn::MIMETYPE).toString());
85− QString uri(DeeListModel::data(index, ResultsColumn::URI).toString());
86− QString thumbnailerUri(uriToThumbnailerProviderString(uri, mimetype, DeeListModel::data(index, ResultsColumn::METADATA).toHash()));
87− if (!thumbnailerUri.isNull()) {
88− return QVariant::fromValue(thumbnailerUri);
89− }
90− }
91− return QVariant::fromValue(gIconToDeclarativeImageProviderString(giconString));
92− }
93− case RoleCategory:
94− return DeeListModel::data(index, ResultsColumn::CATEGORY);
95− case RoleMimetype:
96− return DeeListModel::data(index, ResultsColumn::MIMETYPE);
97− case RoleTitle:
98− return DeeListModel::data(index, ResultsColumn::TITLE);
99− case RoleComment:
100− return DeeListModel::data(index, ResultsColumn::COMMENT);
101− case RoleDndUri:
102− return DeeListModel::data(index, ResultsColumn::DND_URI);
103− case RoleMetadata:
104− return DeeListModel::data(index, ResultsColumn::METADATA);
105− case RoleRendererHints:
106− {
107− QVariantHash hash(DeeListModel::data(index, ResultsColumn::METADATA).toHash());
108− if (hash.contains("content")) {
109− QVariantMap hints;
110− QVariantHash innerHash(hash["content"].toHash());
111− if (innerHash.contains("scope_disabled")) {
112− hints["scope_disabled"] = innerHash["scope_disabled"];
113− }
114− return hints.empty() ? QVariant() : QVariant::fromValue(hints);
115− }
116− return QVariant();
117− }
118− default:
119− return QVariant();
120− }
121−}
tests/mocks/Unity/categoryresults.hdeleted−68
@@ -1,68 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * Authors:
5− * Michal Hruby <michal.hruby@canonical.com>
6− *
7− * This program is free software; you can redistribute it and/or modify
8− * it under the terms of the GNU General Public License as published by
9− * the Free Software Foundation; version 3.
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−
21−#ifndef CATEGORY_RESULTS_H
22−#define CATEGORY_RESULTS_H
23−
24−// dee-qt
25−#include "deelistmodel.h"
26−
27−class Q_DECL_EXPORT CategoryResults : public DeeListModel
28−{
29− Q_OBJECT
30−
31− Q_ENUMS(Roles)
32−
33− Q_PROPERTY(int categoryIndex READ categoryIndex WRITE setCategoryIndex NOTIFY categoryIndexChanged)
34−
35−public:
36− explicit CategoryResults(QObject* parent = 0);
37−
38− enum Roles {
39− RoleUri,
40− RoleIconHint,
41− RoleCategory,
42− RoleMimetype,
43− RoleTitle,
44− RoleComment,
45− RoleDndUri,
46− RoleMetadata,
47− RoleRendererHints
48− };
49−
50− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
51−
52− QHash<int, QByteArray> roleNames() const;
53−
54− /* getters */
55− int categoryIndex() const;
56−
57− /* setters */
58− void setCategoryIndex(int index);
59−
60−Q_SIGNALS:
61− void categoryIndexChanged(int index);
62−
63−private:
64− QHash<int, QByteArray> m_roles;
65− int m_categoryIndex;
66−};
67−
68−#endif // CATEGORY_RESULTS_H
tests/mocks/Unity/fake_applications_scope.cppdeleted−76
@@ -1,76 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "fake_applications_scope.h"
18−
19−static const gchar * categories_model_schema[] = {
20− "s", //ID
21− "s", // DISPLAY_NAME
22− "s", // ICON_HINT
23− "s", // RENDERER_NAME
24− "a{sv}" // HINTS
25−};
26−
27−ApplicationsScope::ApplicationsScope(bool visible, QObject* parent)
28− : Scope(parent)
29−{
30− m_id = "applications.scope";
31− m_name = "Applications";
32− m_visible = visible;
33− m_previewRendererName = "preview-application";
34− m_categories->setModel(createCategoriesModel());
35−}
36−
37−DeeModel* ApplicationsScope::createCategoriesModel()
38−{
39− DeeModel* category_model = dee_sequence_model_new();
40− dee_model_set_schema_full(category_model, categories_model_schema, G_N_ELEMENTS(categories_model_schema));
41− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
42−
43− GVariant* children[1];
44− children[0] = g_variant_new_dict_entry(g_variant_new_string("content-type"),
45− g_variant_new_variant(g_variant_new_string("apps")));
46− GVariant* recentHints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), children, 1);
47− dee_model_append(category_model,
48− "recent",
49− "Recent",
50− "gtk-apply",
51− "special",
52− recentHints);
53−
54− dee_model_append(category_model,
55− "installed",
56− "Installed",
57− "gtk-apply",
58− "grid",
59− hints);
60−
61− dee_model_append(category_model,
62− "suggested",
63− "Suggested",
64− "gtk-apply",
65− "grid",
66− hints);
67−
68− dee_model_append(category_model,
69− "outdated",
70− "Outdaded",
71− "gtk-apply",
72− "grid",
73− hints);
74−
75− return category_model;
76−}
tests/mocks/Unity/fake_applications_scope.hdeleted−33
@@ -1,33 +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−#ifndef FAKE_APPLICATIONS_SCOPE_H
18−#define FAKE_APPLICATIONS_SCOPE_H
19−
20−#include "fake_scope.h"
21−
22−class ApplicationsScope : public Scope
23−{
24− Q_OBJECT
25−
26−public:
27− ApplicationsScope(bool visible, QObject* parent = 0);
28−
29−private:
30− DeeModel* createCategoriesModel();
31−};
32−
33−#endif // FAKE_APPLICATIONS_SCOPE_H
tests/mocks/Unity/fake_categories.cpp+109−194
@@ -19,100 +19,21 @@
19// self
19// self
20#include "fake_categories.h"
20#include "fake_categories.h"
21
21
22−// local
22+#include "fake_resultsmodel.h"
23−#include "categoryresults.h"
24
23
25−#define CATEGORY_COLUMN 2
26−
27−// TODO: use something from libunity once it's public
28−enum CategoryColumn {
29− ID,
30− DISPLAY_NAME,
31− ICON_HINT,
32− RENDERER_NAME,
33− HINTS
34−};
35−
36−Categories::Categories(QObject* parent)
24+Categories::Categories(int category_count, QObject* parent)
37− : DeeListModel(parent)
25+ : QAbstractListModel(parent)
26+ , m_category_count(category_count)
38{
27{
39− // FIXME: need to clean up unused filters on countChanged
40 m_roles[Categories::RoleCategoryId] = "categoryId";
28 m_roles[Categories::RoleCategoryId] = "categoryId";
41 m_roles[Categories::RoleName] = "name";
29 m_roles[Categories::RoleName] = "name";
42 m_roles[Categories::RoleIcon] = "icon";
30 m_roles[Categories::RoleIcon] = "icon";
31+ m_roles[Categories::RoleRawRendererTemplate] = "rawRendererTemplate";
43 m_roles[Categories::RoleRenderer] = "renderer";
32 m_roles[Categories::RoleRenderer] = "renderer";
44− m_roles[Categories::RoleContentType] = "contentType";
33+ m_roles[Categories::RoleComponents] = "components";
45− m_roles[Categories::RoleRendererHint] = "rendererHint";
46− m_roles[Categories::RoleHints] = "hints";
34+ m_roles[Categories::RoleProgressSource] = "progressSource";
47 m_roles[Categories::RoleResults] = "results";
35 m_roles[Categories::RoleResults] = "results";
48 m_roles[Categories::RoleCount] = "count";
36 m_roles[Categories::RoleCount] = "count";
49−
50− // TODO This should not be needed but accumulatting the count changes
51− // makes the visualization more stable and also makes crashes on fast
52− // change of the search term harder to reproduce
53− m_timer.setSingleShot(true);
54− m_timer.setInterval(50);
55− connect(&m_timer, SIGNAL(timeout()), this, SLOT(onEmitCountChanged()));
56−}
57−
58−DeeListModel*
59−Categories::getFilter(int index) const
60−{
61− if (!m_filters.contains(index)) {
62− auto results = new CategoryResults ();
63− results->setCategoryIndex(index);
64− connect(results, SIGNAL(countChanged()), this, SLOT(onCountChanged()));
65−
66− unsigned cat_index = static_cast<unsigned>(index);
67− auto model = getResultsForCategory(cat_index);
68− results->setModel(model);
69−
70− m_filters.insert(index, results);
71− }
72−
73− return m_filters[index];
74−}
75−
76−void
77−Categories::onCountChanged()
78−{
79− DeeListModel* filter = qobject_cast<DeeListModel*>(sender());
80− if (filter) {
81− m_timerFilters << filter;
82− m_timer.start();
83− }
84−}
85−
86−void Categories::onRowCountChanged()
87−{
88− QAbstractItemModel* model = qobject_cast<QAbstractItemModel*>(sender());
89− // find the corresponding category index
90− for (auto iter = m_overriddenCategories.begin(); iter != m_overriddenCategories.end(); ++iter) {
91− if (iter.value() == model) {
92− for (int i = 0; i < rowCount(); i++) {
93− auto id = data(index(i), RoleCategoryId).toString();
94− if (id != iter.key()) continue;
95− QVector<int> roles;
96− roles.append(RoleCount);
97− QModelIndex changedIndex = index(i);
98− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
99− break;
100− }
101− }
102− }
103−}
104−
105−void
106−Categories::onEmitCountChanged()
107−{
108− QVector<int> roles;
109− roles.append(Categories::RoleCount);
110− Q_FOREACH(DeeListModel* results, m_timerFilters) {
111− auto cat_results = qobject_cast<CategoryResults*>(results);
112− QModelIndex changedIndex = index(cat_results->categoryIndex());
113− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
114− }
115− m_timerFilters.clear();
116}
37}
117
38
118QHash<int, QByteArray>
39QHash<int, QByteArray>
@@ -121,94 +42,46 @@ Categories::roleNames() const
121 return m_roles;
42 return m_roles;
122}
43}
123
44
124−void Categories::onOverrideModelDestroyed()
45+int Categories::rowCount(const QModelIndex& /*parent*/) const
125{
46{
126− QObject* model = sender();
47+ return m_category_count + m_specialCategories.count();
127− auto iter = m_overriddenCategories.begin();
128− while (iter != m_overriddenCategories.end()) {
129− if (iter.value() == model) {
130− iter = m_overriddenCategories.erase(iter);
131− continue;
132− }
133− ++iter;
134− }
135}
48}
136
49
137−void Categories::overrideResults(const QString& categoryId, QAbstractItemModel* model)
50+void Categories::addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject)
138{
51{
139− m_overriddenCategories[categoryId] = model;
52+ CategoryData catData;
140− // watch the model
53+ catData.categoryId = categoryId;
141− connect(model, &QObject::destroyed, this, &Categories::onOverrideModelDestroyed);
54+ catData.name = name;
142− connect(model, &QAbstractItemModel::rowsInserted, this, &Categories::onRowCountChanged);
55+ catData.icon = icon;
143− connect(model, &QAbstractItemModel::rowsRemoved, this, &Categories::onRowCountChanged);
56+ catData.rawTemplate = rawTemplate;
144− connect(model, &QAbstractItemModel::modelReset, this, &Categories::onRowCountChanged);
57+ catData.countObject = countObject;
145−
58+
146− // emit the dataChanged signal if the category is already in the model
59+ beginInsertRows(QModelIndex(), 0, 0);
147− for (int i = 0; i < rowCount(); i++) {
60+ m_specialCategories.prepend(catData);
148− auto id = data(index(i), RoleCategoryId).toString();
61+ endInsertRows();
149− if (id != categoryId) continue;
62+
150− QVector<int> roles;
63+ if (countObject) {
151− roles.append(RoleCount);
64+ connect(countObject, SIGNAL(countChanged()), this, SLOT(countChanged()));
152− roles.append(RoleResults);
153− QModelIndex changedIndex = index(i);
154− Q_EMIT dataChanged(changedIndex, changedIndex, roles);
155− break;
156 }
65 }
157}
66}
158
67
159−void Categories::setResultModel(DeeModel* model)
68+void Categories::countChanged()
160{
69{
161− // FIXME: should ref it
70+ QObject* countObject = sender();
162− m_dee_results = model;
163−}
164−
165
71
166−static void category_filter_map_func (DeeModel* orig_model,
72+ for (int i = 0; i < m_specialCategories.count(); ++i) {
167− DeeFilterModel* filter_model,
73+ const CategoryData &catData = m_specialCategories.at(i);
168− gpointer user_data)
74+ if (catData.countObject == countObject) {
169−{
75+ QVector<int> roles;
170− DeeModelIter* iter;
76+ roles.append(RoleCount);
171− DeeModelIter* end;
172− unsigned index = GPOINTER_TO_UINT(user_data);
173
77
174− iter = dee_model_get_first_iter(orig_model);
78+ QModelIndex changedIndex(index(i));
175− end = dee_model_get_last_iter(orig_model);
79+ dataChanged(changedIndex, changedIndex, roles);
176− while (iter != end) {
80+ break;
177− unsigned category_index = dee_model_get_uint32(orig_model, iter, CATEGORY_COLUMN);
178− if (index == category_index) {
179− dee_filter_model_append_iter(filter_model, iter);
180 }
81 }
181− iter = dee_model_next(orig_model, iter);
182 }
82 }
183}
83}
184
84
185−static gboolean category_filter_notify_func (DeeModel* orig_model,
186− DeeModelIter* orig_iter,
187− DeeFilterModel* filter_model,
188− gpointer user_data)
189−{
190− unsigned index = GPOINTER_TO_UINT(user_data);
191− unsigned category_index = dee_model_get_uint32(orig_model, orig_iter, CATEGORY_COLUMN);
192−
193− if (index != category_index)
194− return FALSE;
195−
196− dee_filter_model_insert_iter_with_original_order(filter_model, orig_iter);
197− return TRUE;
198−}
199−
200−DeeModel* Categories::getResultsForCategory(unsigned cat_index) const
201−{
202− DeeFilter filter;
203− filter.map_func = category_filter_map_func;
204− filter.map_notify = category_filter_notify_func;
205− filter.destroy = nullptr;
206− filter.userdata = GUINT_TO_POINTER(cat_index);
207−
208− DeeModel* filtered_model = dee_filter_model_new(m_dee_results, &filter);
209− return filtered_model;
210−}
211−
212QVariant
85QVariant
213Categories::data(const QModelIndex& index, int role) const
86Categories::data(const QModelIndex& index, int role) const
214{
87{
@@ -216,44 +89,86 @@ Categories::data(const QModelIndex& index, int role) const
216 return QVariant();
89 return QVariant();
217 }
90 }
218
91
92+ ResultsModel *resultsModel = m_resultsModels[index.row()];
93+ if (!resultsModel) {
94+ resultsModel = new ResultsModel(15, index.row());
95+ m_resultsModels[index.row()] = resultsModel;
96+ }
97+ if (index.row() < m_specialCategories.count()) {
98+ const CategoryData &catData = m_specialCategories.at(index.row());
219− switch (role) {
99+ switch (role) {
220− case RoleCategoryId:
100+ case RoleCategoryId:
221− return DeeListModel::data(index, CategoryColumn::ID);
101+ return catData.categoryId;
222− case RoleName:
102+ case RoleName:
223− return DeeListModel::data(index, CategoryColumn::DISPLAY_NAME);
103+ return catData.name;
224− case RoleIcon:
104+ case RoleIcon:
225− return DeeListModel::data(index, CategoryColumn::ICON_HINT);
105+ return catData.icon;
106+ case RoleRawRendererTemplate:
107+ return catData.rawTemplate;
226− case RoleRenderer:
108+ case RoleRenderer:
227− return DeeListModel::data(index, CategoryColumn::RENDERER_NAME);
109+ {
228− case RoleContentType:
110+ QVariantMap map;
111+ map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
112+ map["card-size"] = "small";
113+ return map;
114+ }
115+ case RoleComponents:
229− {
116+ {
230− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
117+ QVariantMap map, artMap;
231− return hints.contains("content-type") ? hints["content-type"] : QVariant(QString("default"));
118+ artMap["aspect-ratio"] = "1.0";
232− }
119+ artMap["field"] = "art";
233− case RoleRendererHint:
120+ map["art"] = artMap;
234− {
121+ map["title"] = "HOLA";
235− auto hints = DeeListModel::data(index, CategoryColumn::HINTS).toHash();
122+ return map;
236− return hints.contains("renderer-hint") ? hints["renderer-hint"] : QVariant(QString());
123+ }
124+ case RoleProgressSource:
125+ qFatal("Using un-implemented RoleProgressSource Categories role");
126+ return QVariant();
127+ case RoleResults:
128+ return QVariant();
129+ case RoleCount:
130+ return catData.countObject->property("count");
131+ default:
132+ qFatal("Using un-implemented Categories role");
133+ return QVariant();
237 }
134 }
238− case RoleHints:
135+ } else {
239− return DeeListModel::data(index, CategoryColumn::HINTS);
136+ switch (role) {
240− case RoleResults:
137+ case RoleCategoryId:
241− if (m_overriddenCategories.size() > 0)
138+ return QString("%1").arg(index.row());
139+ case RoleName:
140+ return QString("Category %1").arg(index.row());
141+ case RoleIcon:
142+ return "gtk-apply";
143+ case RoleRawRendererTemplate:
144+ qFatal("Using un-implemented RoleRawRendererTemplate Categories role");
145+ return QVariant();
146+ case RoleRenderer:
242 {
147 {
243− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
148+ QVariantMap map;
244− if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
149+ map["category-layout"] = index.row() % 2 == 0 ? "grid" : "carousel";
245− return QVariant::fromValue(m_overriddenCategories[id]);
150+ map["card-size"] = "small";
151+ return map;
246 }
152 }
247− return QVariant::fromValue(getFilter(index.row()));
153+ case RoleComponents:
248− case RoleCount:
249− if (m_overriddenCategories.size() > 0)
250 {
154 {
251− auto id = DeeListModel::data(index, CategoryColumn::ID).toString();
155+ QVariantMap map, artMap;
252− if (m_overriddenCategories.find(id) != m_overriddenCategories.end())
156+ artMap["aspect-ratio"] = "1.0";
253− return QVariant::fromValue(m_overriddenCategories[id]->rowCount());
157+ artMap["field"] = "art";
158+ map["art"] = artMap;
159+ map["title"] = "HOLA";
160+ return map;
254 }
161 }
162+ case RoleProgressSource:
163+ qFatal("Using un-implemented RoleProgressSource Categories role");
164+ return QVariant();
165+ case RoleResults:
255− return QVariant::fromValue(getFilter(index.row())->rowCount());
166+ return QVariant::fromValue(resultsModel);
167+ case RoleCount:
168+ return resultsModel->rowCount();
256− default:
169+ default:
170+ qFatal("Using un-implemented Categories role");
257− return QVariant();
171+ return QVariant();
172+ }
258 }
173 }
259}
174}
tests/mocks/Unity/fake_categories.h+25−29
@@ -18,58 +18,54 @@
18#define FAKE_CATEGORIES_H
18#define FAKE_CATEGORIES_H
19
19
20// Qt
20// Qt
21−#include <QObject>
21+#include <QAbstractListModel>
22−#include <QSet>
23−#include <QTimer>
22+#include <QList>
24
23
25−#include <dee.h>
24+class ResultsModel;
26−#include <deelistmodel.h>
27
25
28−class Categories : public DeeListModel
26+class Categories : public QAbstractListModel
29{
27{
30 Q_OBJECT
28 Q_OBJECT
31
29
32 Q_ENUMS(Roles)
30 Q_ENUMS(Roles)
33
31
34public:
32public:
35− Categories(QObject* parent = 0);
33+ Categories(int category_count, QObject* parent = 0);
36 enum Roles {
34 enum Roles {
37 RoleCategoryId,
35 RoleCategoryId,
38 RoleName,
36 RoleName,
39 RoleIcon,
37 RoleIcon,
38+ RoleRawRendererTemplate,
40 RoleRenderer,
39 RoleRenderer,
41− RoleContentType,
40+ RoleComponents,
42− RoleRendererHint,
41+ RoleProgressSource, // maybe
43− RoleHints,
44 RoleResults,
42 RoleResults,
45 RoleCount
43 RoleCount
46 };
44 };
47
45
48− Q_INVOKABLE void overrideResults(const QString& categoryId, QAbstractItemModel* model);
46+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
47+ QHash<int, QByteArray> roleNames() const override;
48+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
49
49
50− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
50+ Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject);
51−
52− QHash<int, QByteArray> roleNames() const;
53−
54− /* setters */
55− void setResultModel(DeeModel* model);
56
51
57private Q_SLOTS:
52private Q_SLOTS:
58− void onCountChanged();
53+ void countChanged();
59− void onRowCountChanged();
60− void onEmitCountChanged();
61− void onOverrideModelDestroyed();
62
54
63private:
55private:
64− DeeModel* getResultsForCategory(unsigned index) const;
56+ mutable QHash<int, ResultsModel*> m_resultsModels;
65− DeeListModel* getFilter(int index) const;
66−
67− DeeModel* m_dee_results;
68− QTimer m_timer;
69− QSet<DeeListModel*> m_timerFilters;
70 QHash<int, QByteArray> m_roles;
57 QHash<int, QByteArray> m_roles;
71− QMap<QString, QAbstractItemModel*> m_overriddenCategories;
58+ int m_category_count;
72− mutable QMap<int, DeeListModel*> m_filters;
59+
60+ struct CategoryData {
61+ QString categoryId;
62+ QString name;
63+ QString icon;
64+ QString rawTemplate;
65+ QObject* countObject;
66+ };
67+
68+ QList<CategoryData> m_specialCategories;
73};
69};
74
70
75#endif // FAKE_CATEGORIES_H
71#endif // FAKE_CATEGORIES_H
tests/mocks/Unity/fake_preview.cppdeleted−73
@@ -1,73 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "fake_preview.h"
18−
19−Preview::Preview(const QString &rendererName, QObject *parent):
20− QObject(parent),
21− m_rendererName(rendererName)
22−{
23−}
24−
25−QString Preview::rendererName() const
26−{
27− return m_rendererName;
28−}
29−
30−QString Preview::title() const
31−{
32− return "Title";
33−}
34−
35−QString Preview::subtitle() const
36−{
37− return "Subtitle";
38−}
39−
40−QString Preview::description() const
41−{
42− return "Description";
43−}
44−
45−QVariant Preview::actions()
46−{
47− return QVariant();
48−}
49−
50−QVariant Preview::infoHints()
51−{
52− return QVariant();
53−}
54−
55−QVariantMap Preview::infoHintsHash() const
56−{
57− return QVariantMap();
58−}
59−
60−QString Preview::image() const
61−{
62− return "";
63−}
64−
65−void Preview::execute(const QString& actionId, const QHash<QString, QVariant>& hints)
66−{
67− Q_UNUSED(actionId);
68− Q_UNUSED(hints);
69−}
70−
71−void Preview::cancelAction()
72−{
73−}
tests/mocks/Unity/fake_preview.hdeleted−65
@@ -1,65 +0,0 @@
1−/*
2− * Copyright (C) 2013, 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef FAKE_PREVIEW_H
18−#define FAKE_PREVIEW_H
19−
20−// Qt
21−#include <QObject>
22−#include <QString>
23−#include <QMetaType>
24−#include <QList>
25−#include <QVariantMap>
26−
27−class Q_DECL_EXPORT Preview : public QObject
28−{
29− Q_OBJECT
30−
31− Q_PROPERTY(QString rendererName READ rendererName NOTIFY previewChanged)
32− Q_PROPERTY(QString title READ title NOTIFY previewChanged)
33− Q_PROPERTY(QString subtitle READ subtitle NOTIFY previewChanged)
34− Q_PROPERTY(QString description READ description NOTIFY previewChanged)
35− Q_PROPERTY(QVariant actions READ actions NOTIFY previewChanged)
36− Q_PROPERTY(QVariant infoHints READ infoHints NOTIFY previewChanged)
37− Q_PROPERTY(QVariantMap infoMap READ infoHintsHash NOTIFY previewChanged)
38− Q_PROPERTY(QString image READ image NOTIFY previewChanged)
39−
40−public:
41− explicit Preview(const QString &rendererName, QObject *parent = 0);
42−
43− QString rendererName() const;
44− QString title() const;
45− QString subtitle() const;
46− QString description() const;
47− QVariant actions();
48− QVariant infoHints();
49− QVariantMap infoHintsHash() const;
50− QString image() const;
51−
52− Q_INVOKABLE void execute(const QString& actionId, const QHash<QString, QVariant>& hints);
53−
54− Q_INVOKABLE void cancelAction();
55−
56−Q_SIGNALS:
57− void previewChanged();
58−
59−private:
60− QString m_rendererName;
61−};
62−
63−Q_DECLARE_METATYPE(Preview *)
64−
65−#endif // FAKE_PREVIEW_H
tests/mocks/Unity/fake_previewmodel.cppnew file+86
@@ -0,0 +1,86 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michał Sawicz <michal.sawicz@canonical.com>
6+ * Michal Hruby <michal.hruby@canonical.com>
7+ *
8+ * This program is free software; you can redistribute it and/or modify
9+ * it under the terms of the GNU General Public License as published by
10+ * the Free Software Foundation; version 3.
11+ *
12+ * This program is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+ * GNU General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU General Public License
18+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
19+ */
20+
21+// self
22+#include "fake_previewmodel.h"
23+
24+// local
25+#include "fake_previewwidgetmodel.h"
26+
27+// Qt
28+#include <QDebug>
29+
30+PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
31+{
32+ // we have one column by default
33+ PreviewWidgetModel* columnModel = new PreviewWidgetModel(this);
34+ m_previewWidgetModels.append(columnModel);
35+}
36+
37+QHash<int, QByteArray> PreviewModel::roleNames() const
38+{
39+ QHash<int, QByteArray> roles;
40+
41+ roles[Roles::RoleColumnModel] = "columnModel";
42+
43+ return roles;
44+}
45+
46+void PreviewModel::setWidgetColumnCount(int count)
47+{
48+ if (count != 1) {
49+ qWarning("PreviewModel::setWidgetColumnCount != 1 not implemented");
50+ }
51+}
52+
53+int PreviewModel::widgetColumnCount() const
54+{
55+ return 1;
56+}
57+
58+bool PreviewModel::loaded() const
59+{
60+ return true;
61+}
62+
63+bool PreviewModel::processingAction() const
64+{
65+ return false;
66+}
67+
68+void PreviewModel::setProcessingAction(bool /*processing*/)
69+{
70+ qFatal("PreviewModel::setProcessingAction not implemented");
71+}
72+
73+int PreviewModel::rowCount(const QModelIndex&) const
74+{
75+ return m_previewWidgetModels.size();
76+}
77+
78+QVariant PreviewModel::data(const QModelIndex& index, int role) const
79+{
80+ switch (role) {
81+ case RoleColumnModel:
82+ return QVariant::fromValue(m_previewWidgetModels.at(index.row()));
83+ default:
84+ return QVariant();
85+ }
86+}
tests/mocks/Unity/fake_previewmodel.hnew file+67
@@ -0,0 +1,67 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+
18+#ifndef FAKE_PREVIEWMODEL_H
19+#define FAKE_PREVIEWMODEL_H
20+
21+#include <QAbstractListModel>
22+#include <QSharedPointer>
23+#include <QVariantMap>
24+
25+class PreviewWidgetModel;
26+
27+class PreviewModel : public QAbstractListModel
28+{
29+ Q_OBJECT
30+
31+ Q_ENUMS(Roles)
32+
33+ Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34+ Q_PROPERTY(bool loaded READ loaded NOTIFY loadedChanged)
35+ Q_PROPERTY(bool processingAction READ processingAction NOTIFY processingActionChanged)
36+
37+public:
38+ explicit PreviewModel(QObject* parent = 0);
39+
40+ enum Roles {
41+ RoleColumnModel
42+ };
43+
44+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
45+ QHash<int, QByteArray> roleNames() const override;
46+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
47+
48+ void setWidgetColumnCount(int count);
49+ int widgetColumnCount() const;
50+ bool loaded() const;
51+ bool processingAction() const;
52+ void setProcessingAction(bool processing);
53+
54+Q_SIGNALS:
55+ void widgetColumnCountChanged();
56+ void loadedChanged();
57+ void processingActionChanged();
58+ void triggered(QString const&, QString const&, QVariantMap const&);
59+
60+private:
61+ QHash<int, QByteArray> m_roles;
62+ QList<PreviewWidgetModel*> m_previewWidgetModels;
63+};
64+
65+Q_DECLARE_METATYPE(PreviewModel*)
66+
67+#endif // FAKE_PREVIEWMODEL_H
tests/mocks/Unity/fake_previewstack.cppnew file+76
@@ -0,0 +1,76 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+// self
18+#include "fake_previewstack.h"
19+
20+// local
21+#include "fake_previewmodel.h"
22+#include "fake_scope.h"
23+
24+PreviewStack::PreviewStack(QObject* parent) : QAbstractListModel(parent)
25+{
26+ m_previews << new PreviewModel(this);
27+}
28+
29+PreviewStack::~PreviewStack()
30+{
31+}
32+
33+QHash<int, QByteArray> PreviewStack::roleNames() const
34+{
35+ QHash<int, QByteArray> roles;
36+
37+ roles[Roles::RolePreviewModel] = "previewModel";
38+
39+ return roles;
40+}
41+
42+void PreviewStack::setWidgetColumnCount(int columnCount)
43+{
44+ if (columnCount != 1) {
45+ qFatal("PreviewStack::setWidgetColumnCount != 1 not implemented");
46+ }
47+}
48+
49+int PreviewStack::widgetColumnCount() const
50+{
51+ return 1;
52+}
53+
54+int PreviewStack::rowCount(const QModelIndex&) const
55+{
56+ return m_previews.size();
57+}
58+
59+PreviewModel* PreviewStack::get(int index) const
60+{
61+ if (index >= m_previews.size()) {
62+ return nullptr;
63+ }
64+
65+ return m_previews.at(index);
66+}
67+
68+QVariant PreviewStack::data(const QModelIndex& index, int role) const
69+{
70+ switch (role) {
71+ case RolePreviewModel:
72+ return QVariant::fromValue(m_previews.at(index.row()));
73+ default:
74+ return QVariant();
75+ }
76+}
tests/mocks/Unity/fake_previewstack.hnew file+61
@@ -0,0 +1,61 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+
18+#ifndef FAKE_PREVIEWSTACK_H
19+#define FAKE_PREVIEWSTACK_H
20+
21+#include <QAbstractListModel>
22+#include <QSharedPointer>
23+#include <QVariantMap>
24+
25+class PreviewModel;
26+
27+class PreviewStack : public QAbstractListModel
28+{
29+ Q_OBJECT
30+
31+ Q_ENUMS(Roles)
32+
33+ Q_PROPERTY(int widgetColumnCount READ widgetColumnCount WRITE setWidgetColumnCount NOTIFY widgetColumnCountChanged)
34+
35+public:
36+ explicit PreviewStack(QObject* parent = 0);
37+ virtual ~PreviewStack();
38+
39+ enum Roles {
40+ RolePreviewModel
41+ };
42+
43+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
44+ QHash<int, QByteArray> roleNames() const override;
45+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
46+
47+ Q_INVOKABLE PreviewModel* get(int index) const;
48+
49+ void setWidgetColumnCount(int columnCount);
50+ int widgetColumnCount() const;
51+
52+Q_SIGNALS:
53+ void widgetColumnCountChanged();
54+
55+private:
56+ QList<PreviewModel*> m_previews;
57+};
58+
59+Q_DECLARE_METATYPE(PreviewStack*)
60+
61+#endif // FAKE_PREVIEWSTACK_H
tests/mocks/Unity/scopes-ng/fake_preview_model.cpp → tests/mocks/Unity/fake_previewwidgetmodel.cpprenamed+6−16
@@ -19,14 +19,11 @@
19 */
19 */
20
20
21// self
21// self
22−#include "fake_preview_model.h"
22+#include "fake_previewwidgetmodel.h"
23
23
24// Qt
24// Qt
25#include <QVariantMap>
25#include <QVariantMap>
26
26
27−namespace scopes_ng
28−{
29−
30struct PreviewData
27struct PreviewData
31{
28{
32 QString id;
29 QString id;
@@ -38,7 +35,7 @@ struct PreviewData
38 }
35 }
39};
36};
40
37
41−PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
38+PreviewWidgetModel::PreviewWidgetModel(QObject* parent) : QAbstractListModel(parent)
42{
39{
43 m_roles[Roles::RoleWidgetId] = "widgetId";
40 m_roles[Roles::RoleWidgetId] = "widgetId";
44 m_roles[Roles::RoleType] = "type";
41 m_roles[Roles::RoleType] = "type";
@@ -47,7 +44,7 @@ PreviewModel::PreviewModel(QObject* parent) : QAbstractListModel(parent)
47 populateWidgets();
44 populateWidgets();
48}
45}
49
46
50−void PreviewModel::populateWidgets()
47+void PreviewWidgetModel::populateWidgets()
51{
48{
52 beginResetModel();
49 beginResetModel();
53 m_previewWidgets.clear();
50 m_previewWidgets.clear();
@@ -63,22 +60,17 @@ void PreviewModel::populateWidgets()
63
60
64}
61}
65
62
66−void PreviewModel::triggered(QString widgetId, QString actionId, QVariantMap data)
67−{
68− Q_EMIT actionTriggered(widgetId, actionId, data);
69−}
70−
71−QHash<int, QByteArray> PreviewModel::roleNames() const
63+QHash<int, QByteArray> PreviewWidgetModel::roleNames() const
72{
64{
73 return m_roles;
65 return m_roles;
74}
66}
75
67
76−int PreviewModel::rowCount(const QModelIndex&) const
68+int PreviewWidgetModel::rowCount(const QModelIndex&) const
77{
69{
78 return m_previewWidgets.size();
70 return m_previewWidgets.size();
79}
71}
80
72
81−QVariant PreviewModel::data(const QModelIndex& index, int role) const
73+QVariant PreviewWidgetModel::data(const QModelIndex& index, int role) const
82{
74{
83 auto widget_data = m_previewWidgets.at(index.row());
75 auto widget_data = m_previewWidgets.at(index.row());
84 switch (role) {
76 switch (role) {
@@ -92,5 +84,3 @@ QVariant PreviewModel::data(const QModelIndex& index, int role) const
92 return QVariant();
84 return QVariant();
93 }
85 }
94}
86}
95−
96−} // namespace scopes_ng
tests/mocks/Unity/scopes-ng/fake_preview_model.h → tests/mocks/Unity/fake_previewwidgetmodel.hrenamed+6−18
@@ -15,26 +15,23 @@
15 */
15 */
16
16
17
17
18−#ifndef NG_FAKE_PREVIEW_H
18+#ifndef FAKE_PREVIEWWIDGETMODEL_H
19−#define NG_FAKE_PREVIEW_H
19+#define FAKE_PREVIEWWIDGETMODEL_H
20
20
21#include <QAbstractListModel>
21#include <QAbstractListModel>
22#include <QSharedPointer>
22#include <QSharedPointer>
23#include <QVariantMap>
23#include <QVariantMap>
24
24
25−namespace scopes_ng
26−{
27−
28class PreviewData;
25class PreviewData;
29
26
30−class Q_DECL_EXPORT PreviewModel : public QAbstractListModel
27+class PreviewWidgetModel : public QAbstractListModel
31{
28{
32 Q_OBJECT
29 Q_OBJECT
33
30
34 Q_ENUMS(Roles)
31 Q_ENUMS(Roles)
35
32
36public:
33public:
37− explicit PreviewModel(QObject* parent = 0);
34+ explicit PreviewWidgetModel(QObject* parent = 0);
38
35
39 enum Roles {
36 enum Roles {
40 RoleWidgetId,
37 RoleWidgetId,
@@ -46,12 +43,6 @@ public:
46 QHash<int, QByteArray> roleNames() const override;
43 QHash<int, QByteArray> roleNames() const override;
47 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
44 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
48
45
49−Q_SIGNALS:
50− void actionTriggered(QString widgetId, QString actionId, QVariantMap data);
51−
52−public Q_SLOTS:
53− void triggered(QString widgetId, QString actionId, QVariantMap data);
54−
55private:
46private:
56 QHash<int, QByteArray> m_roles;
47 QHash<int, QByteArray> m_roles;
57 QList<QSharedPointer<PreviewData>> m_previewWidgets;
48 QList<QSharedPointer<PreviewData>> m_previewWidgets;
@@ -60,9 +51,6 @@ private:
60
51
61};
52};
62
53
63−} // namespace scopes_ng
64−
65−
66−Q_DECLARE_METATYPE(scopes_ng::PreviewModel*)
54+Q_DECLARE_METATYPE(PreviewWidgetModel*)
67
55
68−#endif // NG_FAKE_PREVIW_H
56+#endif // FAKE_PREVIEWWIDGETMODEL_H
tests/mocks/Unity/fake_resultsmodel.cppnew file+117
@@ -0,0 +1,117 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michal Hruby <michal.hruby@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
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+// self
21+#include "fake_resultsmodel.h"
22+
23+#include <paths.h>
24+
25+ResultsModel::ResultsModel(int result_count, int categoryId, QObject* parent)
26+ : QAbstractListModel(parent)
27+ , m_result_count(result_count)
28+ , m_categoryId(categoryId)
29+{
30+ m_roles[ResultsModel::RoleUri] = "uri";
31+ m_roles[ResultsModel::RoleCategoryId] = "categoryId";
32+ m_roles[ResultsModel::RoleDndUri] = "dndUri";
33+ m_roles[ResultsModel::RoleResult] = "result";
34+ m_roles[ResultsModel::RoleTitle] = "title";
35+ m_roles[ResultsModel::RoleArt] = "art";
36+ m_roles[ResultsModel::RoleSubtitle] = "subtitle";
37+ m_roles[ResultsModel::RoleMascot] = "mascot";
38+ m_roles[ResultsModel::RoleEmblem] = "emblem";
39+ m_roles[ResultsModel::RoleOldPrice] = "oldPrice";
40+ m_roles[ResultsModel::RolePrice] = "price";
41+ m_roles[ResultsModel::RoleAltPrice] = "altPrice";
42+ m_roles[ResultsModel::RoleRating] = "rating";
43+ m_roles[ResultsModel::RoleAltRating] = "altRating";
44+ m_roles[ResultsModel::RoleSummary] = "summary";
45+}
46+
47+QString ResultsModel::categoryId() const
48+{
49+ return QString::number(m_categoryId);
50+}
51+
52+void ResultsModel::setCategoryId(QString const& /*id*/)
53+{
54+ qFatal("Calling un-implemented ResultsModel::setCategoryId");
55+}
56+
57+QHash<int, QByteArray>
58+ResultsModel::roleNames() const
59+{
60+ return m_roles;
61+}
62+
63+int ResultsModel::rowCount(const QModelIndex& parent) const
64+{
65+ Q_UNUSED(parent);
66+
67+ return m_result_count;
68+}
69+
70+int ResultsModel::count() const
71+{
72+ return rowCount();
73+}
74+
75+QVariant ResultsModel::get(int row) const
76+{
77+ if (row >= m_result_count || row < 0) return QVariantMap();
78+
79+ QVariantMap result;
80+ QModelIndex modelIndex(index(row));
81+ QHashIterator<int, QByteArray> it(roleNames());
82+ while (it.hasNext()) {
83+ it.next();
84+ QVariant val(data(modelIndex, it.key()));
85+ if (val.isNull()) continue;
86+ result[it.value()] = val;
87+ }
88+
89+ return result;
90+}
91+
92+QVariant
93+ResultsModel::data(const QModelIndex& index, int role) const
94+{
95+ switch (role) {
96+ case RoleUri:
97+ case RoleCategoryId:
98+ case RoleDndUri:
99+ case RoleResult:
100+ return QString();
101+ case RoleTitle:
102+ return QString("Title.%1.%2").arg(m_categoryId).arg(index.row());
103+ case RoleArt:
104+ return qmlDirectory() + "graphics/applicationIcons/dash.png";
105+ case RoleSubtitle:
106+ case RoleMascot:
107+ case RoleEmblem:
108+ case RoleOldPrice:
109+ case RolePrice:
110+ case RoleAltPrice:
111+ case RoleRating:
112+ case RoleAltRating:
113+ case RoleSummary:
114+ default:
115+ return QVariant();
116+ }
117+}
tests/mocks/Unity/fake_resultsmodel.hnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright (C) 2013 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michal Hruby <michal.hruby@canonical.com>
6+ *
7+ * This program is free software; you can redistribute it and/or modify
8+ * it under the terms of the GNU General Public License as published by
9+ * the Free Software Foundation; version 3.
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+
21+#ifndef FAKE_RESULTS_MODEL_H
22+#define FAKE_RESULTS_MODEL_H
23+
24+#include <QAbstractListModel>
25+
26+class ResultsModel : public QAbstractListModel
27+{
28+ Q_OBJECT
29+
30+ Q_ENUMS(Roles)
31+
32+ Q_PROPERTY(QString categoryId READ categoryId WRITE setCategoryId NOTIFY categoryIdChanged)
33+ Q_PROPERTY(int count READ count NOTIFY countChanged)
34+
35+public:
36+ explicit ResultsModel(int result_count, int categoryId, QObject* parent = 0);
37+
38+ enum Roles {
39+ RoleUri,
40+ RoleCategoryId,
41+ RoleDndUri,
42+ RoleResult,
43+ // card components
44+ RoleTitle,
45+ RoleArt,
46+ RoleSubtitle,
47+ RoleMascot,
48+ RoleEmblem,
49+ RoleOldPrice,
50+ RolePrice,
51+ RoleAltPrice,
52+ RoleRating,
53+ RoleAltRating,
54+ RoleSummary
55+ };
56+
57+ int rowCount(const QModelIndex& parent = QModelIndex()) const override;
58+ QHash<int, QByteArray> roleNames() const override;
59+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
60+
61+ Q_INVOKABLE QVariant get(int row) const;
62+
63+ /* getters */
64+ QString categoryId() const;
65+ int count() const;
66+
67+ /* setters */
68+ void setCategoryId(QString const& id);
69+
70+Q_SIGNALS:
71+ void categoryIdChanged();
72+ void countChanged();
73+
74+private:
75+ QHash<int, QByteArray> m_roles;
76+ int m_result_count;
77+ int m_categoryId;
78+};
79+
80+#endif // FAKE_RESULTS_MODEL_H
tests/mocks/Unity/fake_scope.cpp+18−118
@@ -15,15 +15,7 @@
15 */
15 */
16
16
17#include "fake_scope.h"
17#include "fake_scope.h"
18−#include "fake_preview.h"
18+#include "fake_resultsmodel.h"
19−#include <paths.h>
20−
21−#include <dee.h>
22−
23−static DeeModel* create_categories_model(unsigned category_count);
24−static DeeModel* create_results_model(unsigned category_count, unsigned result_count);
25−
26−// TODO: Implement remaining pieces
27
19
28Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
20Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
29{
21{
@@ -37,20 +29,8 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
37 , m_searching(false)
29 , m_searching(false)
38 , m_isActive(false)
30 , m_isActive(false)
39 , m_previewRendererName("preview-generic")
31 , m_previewRendererName("preview-generic")
40− , m_categories(new Categories(this))
32+ , m_categories(new Categories(20, this))
41− , m_results(new DeeListModel(this))
42{
33{
43− DeeModel* results_model = create_results_model(20, 300);
44− m_categories->setResultModel(results_model);
45− m_categories->setModel(create_categories_model(20));
46− m_results->setModel(results_model);
47−
48− m_timer.setInterval(1000);
49− m_timer.setSingleShot(true);
50− connect(&m_timer, &QTimer::timeout, [this]() {
51− Preview *p = new Preview(m_previewRendererName, this);
52− Q_EMIT previewReady(p);
53− });
54}
34}
55
35
56QString Scope::id() const {
36QString Scope::id() const {
@@ -133,7 +113,7 @@ void Scope::setFormFactor(const QString &str) {
133void Scope::setActive(const bool active) {
113void Scope::setActive(const bool active) {
134 if (active != m_isActive) {
114 if (active != m_isActive) {
135 m_isActive = active;
115 m_isActive = active;
136− Q_EMIT isActiveChanged();
116+ Q_EMIT isActiveChanged(active);
137 }
117 }
138}
118}
139
119
@@ -151,105 +131,25 @@ void Scope::setNoResultsHint(const QString& str) {
151 }
131 }
152}
132}
153
133
154−void Scope::activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
134+void Scope::activate(QVariant const& result)
155− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
156− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
157{
135{
158− Q_UNUSED(icon_hint);
136+ Q_UNUSED(result);
159− Q_UNUSED(category);
160− Q_UNUSED(result_type);
161− Q_UNUSED(mimetype);
162− Q_UNUSED(title);
163− Q_UNUSED(comment);
164− Q_UNUSED(dnd_uri);
165− Q_UNUSED(metadata);
166−
167− if (uri != "uri://result.2")
168− m_timer.start();
169−}
137+}
170−
138+
171−void Scope::preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
139+PreviewStack* Scope::preview(QVariant const& result)
172− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
173− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata)
174{
140{
175− Q_UNUSED(uri);
141+ Q_UNUSED(result);
176− Q_UNUSED(icon_hint);
142+
177− Q_UNUSED(category);
143+ // This probably leaks, do we don't care
178− Q_UNUSED(result_type);
144+ // it's a test after all
179− Q_UNUSED(mimetype);
145+ return new PreviewStack;
180− Q_UNUSED(title);
181− Q_UNUSED(comment);
182− Q_UNUSED(dnd_uri);
183− Q_UNUSED(metadata);
184−
185− m_timer.start();
186−}
187−
188−static const gchar * categories_model_schema[] = {
189− "s", //ID
190− "s", // DISPLAY_NAME
191− "s", // ICON_HINT
192− "s", // RENDERER_NAME
193− "a{sv}" // HINTS
194−};
195−
196−
197−DeeModel* create_categories_model(unsigned category_count) {
198− DeeModel* category_model = dee_sequence_model_new();
199− dee_model_set_schema_full(category_model, categories_model_schema, G_N_ELEMENTS(categories_model_schema));
200− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
201−
202− for(unsigned i = 0; i < category_count; ++i)
203− {
204− dee_model_append(category_model,
205− (i == 2) ? "applications.scope" : std::to_string(i).c_str(),
206− ("Category "+std::to_string(i)).c_str(),
207− "gtk-apply",
208− i % 2 == 0 ? "grid" : "carousel",
209− hints);
210− }
211− return category_model;
212−}
213−
214−
215−/* Schema that is used in the DeeModel representing
216− the results */
217−static const gchar * results_model_schema[] = {
218− "s", // URI
219− "s", // ICON_HINT
220− "u", // CATEGORY
221− "u", // RESULT_TYPE
222− "s", // MIMETYPE
223− "s", // TITLE
224− "s", // COMMENT
225− "s", // DND_URI
226− "a{sv}" // METADATA
227−};
228−
229−DeeModel* create_results_model(unsigned category_count, unsigned result_count) {
230− DeeModel* results_model = dee_sequence_model_new();
231− dee_model_set_schema_full(results_model, results_model_schema, G_N_ELEMENTS(results_model_schema));
232− GVariant* hints = g_variant_new_array(g_variant_type_element(G_VARIANT_TYPE_VARDICT), NULL, 0);
233−
234− for(unsigned i = 0; i < result_count; ++i)
235− {
236− unsigned category = i % category_count;
237−
238− dee_model_append(results_model,
239− ("uri://result."+std::to_string(i)).c_str(),
240− (qmlDirectory() + "graphics/applicationIcons/dash.png").toLatin1().data(),
241− category,
242− 0,
243− "application/x-desktop",
244− ("Title."+std::to_string(i)).c_str(),
245− ("Comment."+std::to_string(i)).c_str(),
246− ("uri://result."+std::to_string(i)).c_str(),
247− hints);
248− }
249− return results_model;
250}
146}
251
147
252void Scope::cancelActivation()
148void Scope::cancelActivation()
253{
149{
254− m_timer.stop();
150+}
151+
152+void Scope::closeScope(Scope* /*scope*/)
153+{
154+ qFatal("Scope::closeScope is not implemented");
255}
155}
tests/mocks/Unity/fake_scope.h+17−18
@@ -18,9 +18,10 @@
18#define FAKE_SCOPE_H
18#define FAKE_SCOPE_H
19
19
20#include "fake_categories.h"
20#include "fake_categories.h"
21+#include "fake_previewstack.h"
21
22
22#include <QObject>
23#include <QObject>
23−#include <QDebug>
24+#include <QTimer>
24
25
25class Preview;
26class Preview;
26
27
@@ -33,12 +34,12 @@ class Scope : public QObject
33 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
34 Q_PROPERTY(QString iconHint READ iconHint NOTIFY iconHintChanged)
34 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
35 Q_PROPERTY(QString description READ description NOTIFY descriptionChanged)
35 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
36 Q_PROPERTY(QString searchHint READ searchHint NOTIFY searchHintChanged)
37+ Q_PROPERTY(bool searchInProgress READ searchInProgress WRITE setSearchInProgress NOTIFY searchInProgressChanged)
36 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
38 Q_PROPERTY(bool visible READ visible NOTIFY visibleChanged)
37 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
39 Q_PROPERTY(QString shortcut READ shortcut NOTIFY shortcutChanged)
38− Q_PROPERTY(bool connected READ connected NOTIFY connectedChanged)
39 Q_PROPERTY(Categories* categories READ categories NOTIFY categoriesChanged)
40 Q_PROPERTY(Categories* categories READ categories NOTIFY categoriesChanged)
41+ //Q_PROPERTY(Filters* filters READ filters NOTIFY filtersChanged)
40
42
41− Q_PROPERTY(bool searchInProgress READ searchInProgress WRITE setSearchInProgress NOTIFY searchInProgressChanged)
42 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
43 Q_PROPERTY(QString searchQuery READ searchQuery WRITE setSearchQuery NOTIFY searchQueryChanged)
43 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
44 Q_PROPERTY(QString noResultsHint READ noResultsHint WRITE setNoResultsHint NOTIFY noResultsHintChanged)
44 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
45 Q_PROPERTY(QString formFactor READ formFactor WRITE setFormFactor NOTIFY formFactorChanged)
@@ -72,17 +73,13 @@ public:
72 void setActive(const bool);
73 void setActive(const bool);
73 void setSearchInProgress(const bool inProg);
74 void setSearchInProgress(const bool inProg);
74
75
75− Q_INVOKABLE void activate(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
76+ Q_INVOKABLE void activate(QVariant const& result);
76− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
77− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
78− Q_INVOKABLE void preview(const QVariant &uri, const QVariant &icon_hint, const QVariant &category,
77+ Q_INVOKABLE PreviewStack* preview(QVariant const& result);
79− const QVariant &result_type, const QVariant &mimetype, const QVariant &title,
80− const QVariant &comment, const QVariant &dnd_uri, const QVariant &metadata);
81−
82 Q_INVOKABLE void cancelActivation();
78 Q_INVOKABLE void cancelActivation();
79+ Q_INVOKABLE void closeScope(Scope* scope);
83
80
84Q_SIGNALS:
81Q_SIGNALS:
85− void idChanged(const QString&);
82+ void idChanged();
86 void nameChanged(const QString&);
83 void nameChanged(const QString&);
87 void iconHintChanged(const QString&);
84 void iconHintChanged(const QString&);
88 void descriptionChanged(const QString&);
85 void descriptionChanged(const QString&);
@@ -90,18 +87,23 @@ Q_SIGNALS:
90 void searchInProgressChanged();
87 void searchInProgressChanged();
91 void visibleChanged(bool);
88 void visibleChanged(bool);
92 void shortcutChanged(const QString&);
89 void shortcutChanged(const QString&);
93− void connectedChanged(bool);
94 void categoriesChanged();
90 void categoriesChanged();
91+ //void filtersChanged();
95 void searchQueryChanged();
92 void searchQueryChanged();
96 void noResultsHintChanged();
93 void noResultsHintChanged();
97 void formFactorChanged();
94 void formFactorChanged();
98− void isActiveChanged();
95+ void isActiveChanged(bool);
99
96
100 // signals triggered by activate(..) or preview(..) requests.
97 // signals triggered by activate(..) or preview(..) requests.
101− void previewReady(Preview *preview);
102− void activateApplication(const QString &desktop);
103 void showDash();
98 void showDash();
104 void hideDash();
99 void hideDash();
100+ void gotoUri(const QString &uri);
101+ void activated();
102+ void previewRequested(QVariant const& result);
103+ void gotoScope(QString const& scopeId);
104+ void openScope(Scope* scope);
105+
106+ void activateApplication(const QString &desktop);
105
107
106protected:
108protected:
107
109
@@ -119,9 +121,6 @@ protected:
119 QString m_previewRendererName;
121 QString m_previewRendererName;
120
122
121 Categories* m_categories;
123 Categories* m_categories;
122− DeeListModel* m_results;
123−
124− QTimer m_timer;
125};
124};
126
125
127#endif // FAKE_SCOPE_H
126#endif // FAKE_SCOPE_H
tests/mocks/Unity/fake_scopes.cpp+1−5
@@ -19,9 +19,6 @@
19// Self
19// Self
20#include "fake_scopes.h"
20#include "fake_scopes.h"
21
21
22−// Local
23−#include "fake_applications_scope.h"
24−
25// TODO: Implement remaining pieces, like Categories (i.e. LensView now gives warnings)
22// TODO: Implement remaining pieces, like Categories (i.e. LensView now gives warnings)
26
23
27// Qt
24// Qt
@@ -56,8 +53,7 @@ void Scopes::updateScopes()
56 clear();
53 clear();
57 addScope(new Scope("MockScope1", "People", true, this));
54 addScope(new Scope("MockScope1", "People", true, this));
58 addScope(new Scope("MockScope2", "Music", false, this));
55 addScope(new Scope("MockScope2", "Music", false, this));
59− addScope(new Scope("home.scope", "Home", true, this));
56+ addScope(new Scope("clickscope", "Apps", true, this));
60− addScope(new ApplicationsScope(true, this));
61 addScope(new Scope("MockScope5", "Videos", true, this));
57 addScope(new Scope("MockScope5", "Videos", true, this));
62
58
63 if (!m_loaded) {
59 if (!m_loaded) {
tests/mocks/Unity/fake_unity_plugin.cpp+10−13
@@ -22,11 +22,9 @@
22// local
22// local
23#include "fake_scopes.h"
23#include "fake_scopes.h"
24#include "fake_categories.h"
24#include "fake_categories.h"
25−#include "fake_preview.h"
25+#include "fake_previewmodel.h"
26−#include "categoryresults.h"
26+#include "fake_previewwidgetmodel.h"
27−
27+#include "fake_resultsmodel.h"
28−// scopes-ng
29−#include "scopes-ng/fake_preview_model.h"
30
28
31// External
29// External
32#include <glib-object.h>
30#include <glib-object.h>
@@ -41,12 +39,11 @@ void FakeUnityPlugin::registerTypes(const char *uri)
41
39
42 Q_ASSERT(uri == QLatin1String("Unity"));
40 Q_ASSERT(uri == QLatin1String("Unity"));
43
41
44− qmlRegisterUncreatableType<Preview>(uri, 0, 1, "Preview", "Can't create Preview object in QML.");
45− qmlRegisterType<Scopes>(uri, 0, 1, "Scopes");
42+ qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
46− qmlRegisterType<Scope>(uri, 0, 1, "Scope");
43+ qmlRegisterType<Scope>(uri, 0, 2, "Scope");
47− qmlRegisterType<Categories>(uri, 0, 1, "Categories");
44+ qmlRegisterUncreatableType<Categories>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
48− qmlRegisterUncreatableType<CategoryResults>(uri, 0, 1, "CategoryResults", "Can't create");
45+ qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
49− qmlRegisterType<DeeListModel>(uri, 0, 1, "DeeListModel");
50−
51− qmlRegisterType<scopes_ng::PreviewModel>(uri, 0, 1, "FakePreviewModel");
46+ qmlRegisterType<PreviewModel>(uri, 0, 2, "FakePreviewModel");
47+ qmlRegisterUncreatableType<PreviewWidgetModel>(uri, 0, 2, "PreviewWidgetModel", "Can't create new PreviewWidgetModel in QML. Get them from PreviewModel instance.");
48+ qmlRegisterUncreatableType<PreviewStack>(uri, 0, 2, "PreviewStack", "Can't create new PreviewStack in QML. Get them from Scope instance.");
52}
49}
tests/plugins/DashViews/listviewwithpageheadertest.cpp+24−7
@@ -32,6 +32,10 @@
32#include <private/qquickitem_p.h>
32#include <private/qquickitem_p.h>
33#pragma GCC diagnostic pop
33#pragma GCC diagnostic pop
34
34
35+// TODO Think on how doing a test for lost items
36+// particullary making sure that lost items are culled
37+// and then removed in the next updatePolish cycle
38+
35class ListViewWithPageHeaderTest : public QObject
39class ListViewWithPageHeaderTest : public QObject
36{
40{
37 Q_OBJECT
41 Q_OBJECT
@@ -1281,9 +1285,6 @@ private Q_SLOTS:
1281
1285
1282 void testShowHeaderHalfShown()
1286 void testShowHeaderHalfShown()
1283 {
1287 {
1284−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1285− QSKIP("This test is extremely unstable in 5.0.x");
1286−#endif
1287 changeContentY(20);
1288 changeContentY(20);
1288
1289
1289 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
1290 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
@@ -1854,15 +1855,11 @@ private Q_SLOTS:
1854 scrollToBottom();
1855 scrollToBottom();
1855 lvwph->showHeader();
1856 lvwph->showHeader();
1856 QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning());
1857 QTRY_VERIFY(!lvwph->m_contentYAnimation->isRunning());
1857− QTest::qWait(100); // Make sure stuff is stable
1858 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100));
1858 QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 100));
1859 model->setProperty(3, "size", 10);
1859 model->setProperty(3, "size", 10);
1860 model->setProperty(4, "size", 10);
1860 model->setProperty(4, "size", 10);
1861 model->setProperty(5, "size", 10);
1861 model->setProperty(5, "size", 10);
1862 model->setProperty(6, "size", 10);
1862 model->setProperty(6, "size", 10);
1863−#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 3))
1864− QTRY_COMPARE(lvwph->m_minYExtent, 210.);
1865−#endif
1866 QTRY_COMPARE(lvwph->m_headerItem->y(), -lvwph->m_minYExtent);
1863 QTRY_COMPARE(lvwph->m_headerItem->y(), -lvwph->m_minYExtent);
1867 }
1864 }
1868
1865
@@ -1893,6 +1890,26 @@ private Q_SLOTS:
1893 QTRY_COMPARE(lvwph->m_visibleItems.count(), 1);
1890 QTRY_COMPARE(lvwph->m_visibleItems.count(), 1);
1894 }
1891 }
1895
1892
1893+ void testResizeScrolledBigItem()
1894+ {
1895+ QMetaObject::invokeMethod(model, "removeItems", Q_ARG(QVariant, 0), Q_ARG(QVariant, 6));
1896+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 0);
1897+
1898+ QMetaObject::invokeMethod(model, "insertItem", Q_ARG(QVariant, 0), Q_ARG(QVariant, 10000));
1899+ changeContentY(8000);
1900+
1901+ // Pretend the list is busy requesting some other index
1902+ lvwph->m_asyncRequestedIndex = 4;
1903+
1904+ lvwph->m_visibleItems[0]->m_item->setHeight(100);
1905+ // This resize makes the item go outside the viewport so its deleted
1906+ QCOMPARE(lvwph->m_visibleItems.count(), 0);
1907+ QCOMPARE(lvwph->m_firstVisibleIndex, -1);
1908+ // On the next polish the item will be readded
1909+ QTRY_COMPARE(lvwph->m_visibleItems.count(), 1);
1910+ QTRY_COMPARE(lvwph->m_firstVisibleIndex, 0);
1911+ }
1912+
1896private:
1913private:
1897 QQuickView *view;
1914 QQuickView *view;
1898 ListViewWithPageHeader *lvwph;
1915 ListViewWithPageHeader *lvwph;
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp+3−6
@@ -1486,9 +1486,6 @@ private Q_SLOTS:
1486
1486
1487 void testShowHeaderHalfShown()
1487 void testShowHeaderHalfShown()
1488 {
1488 {
1489−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1490− QSKIP("This test is extremely unstable in 5.0.x");
1491−#endif
1492 changeContentY(20);
1489 changeContentY(20);
1493
1490
1494 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
1491 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
@@ -1683,12 +1680,11 @@ private Q_SLOTS:
1683 verifyItem(18, 700, 50., false, QString(), true);
1680 verifyItem(18, 700, 50., false, QString(), true);
1684 verifyItem(19, 750, 50., false, QString(), true);
1681 verifyItem(19, 750, 50., false, QString(), true);
1685 verifyItem(20, 800, 50., false, QString(), true);
1682 verifyItem(20, 800, 50., false, QString(), true);
1683+ QCOMPARE(lvwph->m_clipItem->y(), lvwph->contentY());
1686− QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - 1970 + 50);
1684+ QCOMPARE(lvwph->m_minYExtent, 5 * 1510./21. + 660 - lvwph->contentY() + 50);
1687− QCOMPARE(lvwph->m_clipItem->y(), 1970.);
1688 QCOMPARE(lvwph->m_clipItem->clip(), false);
1685 QCOMPARE(lvwph->m_clipItem->clip(), false);
1689 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1686 QCOMPARE(lvwph->m_headerItem->y(), 0.);
1690 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1687 QCOMPARE(lvwph->m_headerItem->height(), 50.);
1691− QCOMPARE(lvwph->contentY(), 1970.);
1692 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1688 QCOMPARE(lvwph->m_headerItemShownHeight, 0.);
1693 }
1689 }
1694
1690
@@ -2111,6 +2107,7 @@ private Q_SLOTS:
2111 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
2107 QVERIFY(QQuickItemPrivate::get(lvwph->m_topSectionItem)->culled);
2112
2108
2113 QTest::qWait(1);
2109 QTest::qWait(1);
2110+ QCoreApplication::instance()->processEvents();
2114
2111
2115 changeContentY(-15);
2112 changeContentY(-15);
2116
2113
tests/plugins/DashViews/organicgridtest.cpp+2−1
@@ -134,11 +134,12 @@ private Q_SLOTS:
134 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
134 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
135
135
136 view->show();
136 view->show();
137− view->resize(470, 400);
138 QTest::qWaitForWindowExposed(view);
137 QTest::qWaitForWindowExposed(view);
138+ view->resize(470, 400);
139
139
140 grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid"));
140 grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid"));
141 grid->setModel(model);
141 grid->setModel(model);
142+ QTRY_COMPARE(grid->width(), 470.);
142
143
143 checkInitialPositions();
144 checkInitialPositions();
144 }
145 }
tests/plugins/DashViews/verticaljournaltest.cpp+2−1
@@ -135,11 +135,12 @@ private Q_SLOTS:
135 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
135 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
136
136
137 view->show();
137 view->show();
138− view->resize(470, 400);
139 QTest::qWaitForWindowExposed(view);
138 QTest::qWaitForWindowExposed(view);
139+ view->resize(470, 400);
140
140
141 vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj"));
141 vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj"));
142 vj->setModel(model);
142 vj->setModel(model);
143+ QTRY_COMPARE(vj->width(), 470.);
143
144
144 checkInitialPositions();
145 checkInitialPositions();
145 }
146 }
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−11
@@ -15,20 +15,11 @@ add_custom_target(UbuntuGesturesTestQmlFiles ALL
15add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
15add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
16
16
17macro(add_gesture_ui_test CLASSNAME)
17macro(add_gesture_ui_test CLASSNAME)
18− set(testCommand
19− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
20− ${CMAKE_CURRENT_BINARY_DIR}/${CLASSNAME}TestExec
21− -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
22− -o -,txt)
23−
24− add_custom_target(test${CLASSNAME} ${testCommand})
25− add_dependencies(qmluitests test${CLASSNAME})
26− add_dependencies(test${CLASSNAME} ${CLASSNAME}TestExec UbuntuGesturesTestQmlFiles)
27−
28 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
18 add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
29 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
19 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
30 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
20 target_link_libraries(${CLASSNAME}TestExec UbuntuGestureQml)
21+
31− add_manual_qml_test(. ${CLASSNAME} IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
22+ add_binary_qml_test(${CLASSNAME} ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures UbuntuGesturesTestQmlFiles)
32endmacro(add_gesture_ui_test)
23endmacro(add_gesture_ui_test)
33
24
34macro(add_gesture_test CLASSNAME)
25macro(add_gesture_test CLASSNAME)
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+8
@@ -103,6 +103,14 @@ void tst_DirectionalDragArea::init()
103{
103{
104 GestureTest::init();
104 GestureTest::init();
105
105
106+ // We shouldn't need the three lines below, but a compiz/unity7
107+ // regression means we don't pass the test without them because
108+ // the window doesn't have the proper size. Can be removed in the
109+ // future if the regression is fixed and tests pass again
110+ m_view->resize(m_view->rootObject()->width(), m_view->rootObject()->height());
111+ QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
112+ QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
113+
106 fakeTimeSource.reset(new FakeTimeSource);
114 fakeTimeSource.reset(new FakeTimeSource);
107 fakeTimer = new FakeTimer(fakeTimeSource);
115 fakeTimer = new FakeTimer(fakeTimeSource);
108}
116}
tests/plugins/Unity/Launcher/launchermodeltest.cpp+5
@@ -39,6 +39,7 @@ public:
39 ApplicationInfoInterface::Stage stage() const { return ApplicationInfoInterface::MainStage; }
39 ApplicationInfoInterface::Stage stage() const { return ApplicationInfoInterface::MainStage; }
40 ApplicationInfoInterface::State state() const { return ApplicationInfoInterface::Running; }
40 ApplicationInfoInterface::State state() const { return ApplicationInfoInterface::Running; }
41 bool focused() const { return m_focused; }
41 bool focused() const { return m_focused; }
42+ QUrl screenshot() const { return QUrl(); }
42
43
43 // Methods used for mocking (not in the interface)
44 // Methods used for mocking (not in the interface)
44 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
45 void setFocused(bool focused) { m_focused = focused; Q_EMIT focusedChanged(focused); }
@@ -92,6 +93,10 @@ public:
92 m_list.takeAt(index)->deleteLater();
93 m_list.takeAt(index)->deleteLater();
93 endRemoveRows();
94 endRemoveRows();
94 }
95 }
96+ bool updateScreenshot(const QString &appId) { Q_UNUSED(appId); return true; }
97+ bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
98+ bool suspended() const { return false; }
99+ void setSuspended(bool) {}
95
100
96private:
101private:
97 QList<MockApp*> m_list;
102 QList<MockApp*> m_list;
tests/qmltests/CMakeLists.txt+3−16
@@ -12,9 +12,6 @@ set(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")
14add_qml_test(Components AnimationControllerWithSignals)
14add_qml_test(Components AnimationControllerWithSignals)
15−add_qml_test(Components Carousel)
16−add_qml_test(Components OpenEffect)
17−add_qml_test(Components RatingStars)
18add_qml_test(Panel IndicatorItem)
15add_qml_test(Panel IndicatorItem)
19add_qml_test(utils/Unity/Test UnityTest)
16add_qml_test(utils/Unity/Test UnityTest)
20
17
@@ -24,7 +21,7 @@ set(qmltest_DEFAULT_PROPERTIES "")
24
21
25add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
22add_qml_test(. Shell IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks
26 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
23 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
27−add_manual_qml_test(Components DragHandle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
24+add_qml_test(Components Carousel)
28add_qml_test(Components DraggingArea)
25add_qml_test(Components DraggingArea)
29add_qml_test(Components EdgeDemoOverlay)
26add_qml_test(Components EdgeDemoOverlay)
30add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
27add_qml_test(Components FilterGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
@@ -35,27 +32,16 @@ add_qml_test(Components ResponsiveGridView)
35add_qml_test(Components Revealer)
32add_qml_test(Components Revealer)
36add_qml_test(Components SeeMore)
33add_qml_test(Components SeeMore)
37add_qml_test(Components Showable)
34add_qml_test(Components Showable)
38−add_qml_test(Components Stage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
39− ${CMAKE_BINARY_DIR}/tests/mocks
40− ${CMAKE_BINARY_DIR}/plugins)
41−add_qml_test(Components Tile)
42add_qml_test(Components PageHeaderLabel)
35add_qml_test(Components PageHeaderLabel)
43add_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})
44add_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})
45−add_qml_test(Dash DashPreview)
46−add_qml_test(Dash GenericPreview)
47add_qml_test(Dash Card)
38add_qml_test(Dash Card)
48add_qml_test(Dash CardHeader)
39add_qml_test(Dash CardHeader)
49add_qml_test(Dash CardTool)
40add_qml_test(Dash CardTool)
50add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
41add_qml_test(Dash GenericScopeView IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
51−add_qml_test(Dash FilterGrids IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins ${CMAKE_CURRENT_SOURCE_DIR}/plugins
52− ${CMAKE_BINARY_DIR}/tests/mocks)
53add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
42add_qml_test(Dash/Apps RunningApplicationsGrid IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
54 ${CMAKE_BINARY_DIR}/tests/mocks
43 ${CMAKE_BINARY_DIR}/tests/mocks
55 ${CMAKE_BINARY_DIR}/plugins)
44 ${CMAKE_BINARY_DIR}/plugins)
56−add_qml_test(Dash/Apps AppPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
57−add_qml_test(Dash/Movie MoviePreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
58−add_qml_test(Dash/Music MusicPreview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
59add_qml_test(Dash/Previews Preview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
45add_qml_test(Dash/Previews Preview IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
60add_qml_test(Dash/Previews PreviewActions IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
46add_qml_test(Dash/Previews PreviewActions IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
61add_qml_test(Dash/Previews PreviewAudioPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
47add_qml_test(Dash/Previews PreviewAudioPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
@@ -82,6 +68,7 @@ add_qml_test(Hud Hud)
82add_qml_test(Hud Result)
68add_qml_test(Hud Result)
83add_qml_test(Launcher Launcher IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
69add_qml_test(Launcher Launcher IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
84add_qml_test(Notifications Notifications IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
70add_qml_test(Notifications Notifications IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
71+add_qml_test(Notifications VisualSnapDecisionsQueue IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
85add_qml_test(Panel IndicatorRow)
72add_qml_test(Panel IndicatorRow)
86add_qml_test(Panel Indicators IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
73add_qml_test(Panel Indicators IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
87add_qml_test(Panel MenuContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
74add_qml_test(Panel MenuContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS})
@@ -93,6 +80,6 @@ add_qml_test(Panel/Indicators DefaultIndicatorPage IMPORT_PATHS ${CMAKE_BINARY_D
93 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
80 ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/QMenuModel")
94add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
81add_qml_test(Panel/Indicators MenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
95add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
82add_qml_test(Panel/Indicators MessageMenuItemFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/plugins)
96−add_qml_test(SideStage SideStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
83+add_qml_test(Stages PhoneStage IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS}
97 ${CMAKE_BINARY_DIR}/tests/mocks
84 ${CMAKE_BINARY_DIR}/tests/mocks
98 ${CMAKE_BINARY_DIR}/plugins)
85 ${CMAKE_BINARY_DIR}/plugins)
tests/qmltests/Components/CMakeLists.txt+2−10
@@ -6,19 +6,11 @@ include_directories(
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
6 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7 )
7 )
8
8
9−set(testCommand
10− LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures
11− ${CMAKE_CURRENT_BINARY_DIR}/DragHandleTestExec
12− -o ${CMAKE_BINARY_DIR}/DragHandleTest.xml,xunitxml
13− -o -,txt)
14−
15−add_custom_target(testDragHandle ${testCommand})
16−add_dependencies(qmluitests testDragHandle)
17−add_dependencies(testDragHandle DragHandleTestExec)
18−
19add_executable(DragHandleTestExec tst_DragHandle.cpp)
9add_executable(DragHandleTestExec tst_DragHandle.cpp)
20qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
10qt5_use_modules(DragHandleTestExec Test Core Qml Gui Quick)
21target_link_libraries(DragHandleTestExec UbuntuGestureQml)
11target_link_libraries(DragHandleTestExec UbuntuGestureQml)
22
12
13+add_binary_qml_test(DragHandle ${CMAKE_BINARY_DIR}/plugins/Ubuntu/Gestures "")
14+
23add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
15add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
24add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
16add_definitions(-DTEST_DIR="${CMAKE_CURRENT_LIST_DIR}")
tests/qmltests/Components/tst_Carousel.qml+194−168
@@ -16,179 +16,205 @@
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18import QtTest 1.0
18import QtTest 1.0
19+import "../../../qml/Components/"
19import "../../../qml/Components/carousel.js" as Carousel
20import "../../../qml/Components/carousel.js" as Carousel
20
21
21−TestCase {
22+Item {
22− id: root
23+ width: 700
23− name: "Carousel"
24+ height: 400
24−
25− property real carouselWidth
26− property int itemCount
27− property real tileWidth
28−
29− property real contentWidth: itemCount * tileWidth
30− // following variables are copied from Carousel.qml
31− // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
32− property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
33− property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
34− property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
35− property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
36− property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
37−
38− // test for the getContinuousIndex() function
39− function test_getContinuousIndex_data() {
40− // testing for 10 items of size 100 pixel
41− return [ {tag:"at start",
42− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
43− {tag:"in startup",
44− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
45− {tag:"in the middle",
46− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
47− {tag:"at end",
48− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
49− ]
50− }
51
25
52− function test_getContinuousIndex(data) {
26+ Carousel {
53− root.carouselWidth = data.carouselWidth
27+ anchors.fill: parent
54− root.tileWidth = data.tileWidth
28+ id: carousel
55− root.itemCount = data.itemCount
29+ model: 40
56
30
57− var index = Carousel.getContinuousIndex(data.x,
31+ property int createdDelegates: 0
58− data.tileWidth,
32+ property int destroyedDelegates: 0
59− gapToMiddlePhase,
60− gapToEndPhase,
61− kGapEnd,
62− kMiddleIndex,
63− kXBeginningEnd)
64− compare(index, data.result)
65− }
66−
67− // test for the getXFromContinuousIndex() function
68− function test_getXFromContinuousIndex_data() {
69− return [ {tag:"at start",
70− index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
71− {tag:"in startup",
72− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
73− {tag:"in startup with drawBuffer",
74− index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
75− {tag:"in the middle",
76− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
77− {tag:"in the middle with drawBuffer",
78− index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
79− {tag:"at end",
80− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
81− {tag:"at end with drawBuffer",
82− index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
83− ]
84− }
85−
86− function test_getXFromContinuousIndex(data) {
87− root.carouselWidth = data.carouselWidth
88− root.tileWidth = data.tileWidth
89− root.itemCount = data.itemCount
90−
91− var x = Carousel.getXFromContinuousIndex(data.index,
92− data.carouselWidth,
93− contentWidth,
94− data.tileWidth,
95− gapToMiddlePhase,
96− gapToEndPhase,
97− data.drawBuffer)
98− compare(x, data.result)
99− }
100−
101− // test for the getViewTranslation() function
102− function test_getViewTranslation_data() {
103− return [ {tag:"at start - viewfactor 1",
104− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
105− {tag:"at start - viewfactor 2",
106− x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
107− {tag:"in startup",
108− x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
109− {tag:"in the middle",
110− x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
111− {tag:"at end",
112− x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
113− ]
114− }
115
33
116− function test_getViewTranslation(data) {
34+ itemComponent: Rectangle {
117− root.carouselWidth = data.carouselWidth
35+ color: "red"
118− root.tileWidth = data.tileWidth
36+ Component.onCompleted: carousel.createdDelegates++
119− root.itemCount = data.itemCount
37+ Component.onDestruction: carousel.destroyedDelegates++
120−
38+ }
121− var x = Carousel.getViewTranslation(data.x,
122− data.tileWidth,
123− root.gapToMiddlePhase,
124− root.gapToEndPhase,
125− data.translationXViewFactor)
126− compare(x, data.result)
127 }
39 }
128−
40+ TestCase {
41+ id: root
42+ name: "Carousel"
43+ when: windowShown
44+
45+ property real carouselWidth
46+ property int itemCount
47+ property real tileWidth
48+
49+ property real contentWidth: itemCount * tileWidth
50+ // following variables are copied from Carousel.qml
51+ // I'm not using the variables directly from there, as then tileWidth and others would be affected as well
52+ property real gapToMiddlePhase: Math.min(carouselWidth / 2 - tileWidth / 2, (contentWidth - carouselWidth) / 2)
53+ property real gapToEndPhase: contentWidth - carouselWidth - gapToMiddlePhase
54+ property real kMiddleIndex: (carouselWidth / 2) / tileWidth - 0.5
55+ property real kGapEnd: kMiddleIndex * (1 - gapToEndPhase / gapToMiddlePhase)
56+ property real kXBeginningEnd: 1 / tileWidth + kMiddleIndex / gapToMiddlePhase
57+
58+ function test_onlyNeededItemsCreated() {
59+ compare(carousel.createdDelegates, 10);
60+ compare(carousel.destroyedDelegates, 0);
61+ }
62+
63+ // test for the getContinuousIndex() function
64+ function test_getContinuousIndex_data() {
65+ // testing for 10 items of size 100 pixel
66+ return [ {tag:"at start",
67+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, result: 0},
68+ {tag:"in startup",
69+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, result: 2},
70+ {tag:"in the middle",
71+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, result: 5},
72+ {tag:"at end",
73+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, result: 9},
74+ ]
75+ }
76+
77+ function test_getContinuousIndex(data) {
78+ root.carouselWidth = data.carouselWidth
79+ root.tileWidth = data.tileWidth
80+ root.itemCount = data.itemCount
81+
82+ var index = Carousel.getContinuousIndex(data.x,
83+ data.tileWidth,
84+ gapToMiddlePhase,
85+ gapToEndPhase,
86+ kGapEnd,
87+ kMiddleIndex,
88+ kXBeginningEnd)
89+ compare(index, data.result)
90+ }
91+
92+ // test for the getXFromContinuousIndex() function
93+ function test_getXFromContinuousIndex_data() {
94+ return [ {tag:"at start",
95+ index: 0, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 0},
96+ {tag:"in startup",
97+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 100},
98+ {tag:"in startup with drawBuffer",
99+ index: 2, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 0},
100+ {tag:"in the middle",
101+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 350},
102+ {tag:"in the middle with drawBuffer",
103+ index: 5, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 250},
104+ {tag:"at end",
105+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:0, result: 600},
106+ {tag:"at end with drawBuffer",
107+ index: 9, carouselWidth:400, tileWidth:100, itemCount:10, drawBuffer:100, result: 500},
108+ ]
109+ }
110+
111+ function test_getXFromContinuousIndex(data) {
112+ root.carouselWidth = data.carouselWidth
113+ root.tileWidth = data.tileWidth
114+ root.itemCount = data.itemCount
115+
116+ var x = Carousel.getXFromContinuousIndex(data.index,
117+ data.carouselWidth,
118+ contentWidth,
119+ data.tileWidth,
120+ gapToMiddlePhase,
121+ gapToEndPhase,
122+ data.drawBuffer)
123+ compare(x, data.result)
124+ }
125+
126+ // test for the getViewTranslation() function
127+ function test_getViewTranslation_data() {
128+ return [ {tag:"at start - viewfactor 1",
129+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 150},
130+ {tag:"at start - viewfactor 2",
131+ x: 0, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:2, result: 300},
132+ {tag:"in startup",
133+ x: 100, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 50},
134+ {tag:"in the middle",
135+ x: 350, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: 0},
136+ {tag:"at end",
137+ x: 600, carouselWidth:400, tileWidth:100, itemCount:10, translationXViewFactor:1, result: -150},
138+ ]
139+ }
140+
141+ function test_getViewTranslation(data) {
142+ root.carouselWidth = data.carouselWidth
143+ root.tileWidth = data.tileWidth
144+ root.itemCount = data.itemCount
145+
146+ var x = Carousel.getViewTranslation(data.x,
147+ data.tileWidth,
148+ root.gapToMiddlePhase,
149+ root.gapToEndPhase,
150+ data.translationXViewFactor)
151+ compare(x, data.result)
152+ }
153+
129− // test for the getItemScale() function
154+ // test for the getItemScale() function
130− function test_getItemScale_data() {
155+ function test_getItemScale_data() {
131− return [ // tests for distance
156+ return [ // tests for distance
132− {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
157+ {distance: 0, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 1},
133− {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
158+ {distance: 9, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
134− {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
159+ {distance: 999, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.01},
135− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
160+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
136− {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
161+ {distance: 3, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.688230855}, // = 1 - (3^2.5 / 50)
137− // tests for continuousIndex
162+ // tests for continuousIndex
138− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
163+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
139− {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
164+ {distance: 1, continuousIndex: 97, numberOfItems: 100, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
140− // tests for numberOfItems
165+ // tests for numberOfItems
141− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
166+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
142− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
167+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
143− // tests for scaleFactor
168+ // tests for scaleFactor
144− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
169+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 1, result: 0.98}, // = 1 - (1 / 50)
145− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
170+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 2, result: 0.99}, // = 1 - (1 / 100)
146− {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
171+ {distance: 1, continuousIndex: 50, numberOfItems: 100, scaleFactor: 0.5, result: 0.96}, // = 1 - (1 / 25)
147− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
172+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 1, result: 0.99}, // = 1 - (1 / 100) - distanceToBounds is used
148− {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
173+ {distance: 1, continuousIndex: 50, numberOfItems: 53, scaleFactor: 2, result: 0.996666666}, // = 1 - (1 / 300) - distanceToBounds is used
149− ]
174+ ]
150− }
175+ }
151−
176+
152− function test_getItemScale(data) {
177+ function test_getItemScale(data) {
153− var scale = Carousel.getItemScale(data.distance,
178+ var scale = Carousel.getItemScale(data.distance,
154− data.continuousIndex,
179+ data.continuousIndex,
155− data.numberOfItems,
180+ data.numberOfItems,
156− data.scaleFactor)
181+ data.scaleFactor)
157− compare(scale, data.result)
182+ compare(scale, data.result)
158− }
183+ }
159−
184+
160− // test for the getItemTranslation() function
185+ // test for the getItemTranslation() function
161− function test_getItemTranslation_data() {
186+ function test_getItemTranslation_data() {
162− return [ // tests for index and selectedIndex
187+ return [ // tests for index and selectedIndex
163− {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
188+ {index: 1, selectedIndex: 1, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
164− // tests if distance only affects the sign
189+ // tests if distance only affects the sign
165− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
190+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
166− {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
191+ {index: 1, selectedIndex: 2, distance: 99, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
167− {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
192+ {index: 1, selectedIndex: 2, distance: -1, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
168− {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
193+ {index: 1, selectedIndex: 2, distance: -99, scale: 0, maxScale: 1, maxTranslation: 10, result: -10},
169− // tests for the scale
194+ // tests for the scale
170− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
195+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 10, result: 0},
171− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
196+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
172− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
197+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 1, maxTranslation: 10, result: 5},
173− // tests for maxScale
198+ // tests for maxScale
174− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
199+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 0.98, maxTranslation: 10, result: 9.8},
175− {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
200+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.5, maxScale: 0.95, maxTranslation: 10, result: 4.5},
176− {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
201+ {index: 1, selectedIndex: 2, distance: 1, scale: 0.8, maxScale: 0.93, maxTranslation: 10, result: 1.3},
177− // test for maxTranslation
202+ // test for maxTranslation
178− {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
203+ {index: 1, selectedIndex: 2, distance: 1, scale: 1, maxScale: 1, maxTranslation: 1, result: 0},
179− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
204+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 1, result: 1},
180− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
205+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 10, result: 10},
181− {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
206+ {index: 1, selectedIndex: 2, distance: 1, scale: 0, maxScale: 1, maxTranslation: 0, result: 0},
182− ]
207+ ]
183− }
208+ }
184−
209+
185− function test_getItemTranslation(data) {
210+ function test_getItemTranslation(data) {
186− var scale = Carousel.getItemTranslation(data.index,
211+ var scale = Carousel.getItemTranslation(data.index,
187− data.selectedIndex,
212+ data.selectedIndex,
188− data.distance,
213+ data.distance,
189− data.scale,
214+ data.scale,
190− data.maxScale,
215+ data.maxScale,
191− data.maxTranslation)
216+ data.maxTranslation)
192− compare(scale, data.result)
217+ compare(scale, data.result)
218+ }
193 }
219 }
194}
220}
tests/qmltests/Components/tst_DragHandle.cpp−1
@@ -126,7 +126,6 @@ QQuickView *tst_DragHandle::createView()
126{
126{
127 QQuickView *window = new QQuickView(0);
127 QQuickView *window = new QQuickView(0);
128 window->setResizeMode(QQuickView::SizeRootObjectToView);
128 window->setResizeMode(QQuickView::SizeRootObjectToView);
129− window->resize(600, 600);
130 window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
129 window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
131 window->engine()->addImportPath(QLatin1String(TEST_DIR));
130 window->engine()->addImportPath(QLatin1String(TEST_DIR));
132
131
tests/qmltests/Components/tst_LazyImage.qml+8−1
@@ -152,10 +152,11 @@ Rectangle {
152
152
153 function test_lazyimage(data) {
153 function test_lazyimage(data) {
154 data.func();
154 data.func();
155+ waitForRendering(baseRect);
155
156
156 if (data.transition) {
157 if (data.transition) {
157 // wait for the transition to complete
158 // wait for the transition to complete
158− var transition = findInvisibleChild(data.image, data.transition);
159+ var transition = findChildIn(data.image, "transitions", data.transition);
159 tryCompare(transition, "running", true);
160 tryCompare(transition, "running", true);
160 tryCompare(transition, "running", false);
161 tryCompare(transition, "running", false);
161 }
162 }
@@ -168,6 +169,12 @@ Rectangle {
168 compare(data.image.initialHeight, data.initialHeight);
169 compare(data.image.initialHeight, data.initialHeight);
169 compare(data.image.initialWidth, data.initialWidth);
170 compare(data.image.initialWidth, data.initialWidth);
170
171
172+ // check the sourceSize
173+ var sourceHeight = (data.image.scaleTo === "height" || (data.image.scaleTo === "fit" && data.height <= data.width)) ? data.height : 0
174+ var sourceWidth = (data.image.scaleTo === "width" || (data.image.scaleTo === "fit" && data.width <= data.height)) ? data.width : 0
175+ compare(data.image.sourceSize.height, sourceHeight);
176+ compare(data.image.sourceSize.width, sourceWidth);
177+
171 // check the shape dimensions
178 // check the shape dimensions
172 var shape = findChild(data.image, "shape");
179 var shape = findChild(data.image, "shape");
173 compare(shape.width, data.imageWidth);
180 compare(shape.width, data.imageWidth);
tests/qmltests/Components/tst_OpenEffect.qmldeleted−71
@@ -1,71 +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− name: "OpenEffectTest"
23−
24− function test_openeffect_enabled() {
25− compare(openEffect1.enabled, true, "OpenEffect should be enabled if gap is greather than 0.0")
26− }
27−
28− function test_openeffect_shadereffectsource() {
29− compare(openEffect1.source.hideSource, true, "OpenEffect ShaderEffectSource is incorrect")
30− compare(openEffect1.source.sourceItem, rectangle2, "OpenEffect ShaderEffectSource is incorrect")
31− compare(openEffect1.source.live, false, "OpenEffect ShaderEffectSource is incorrect")
32− compare(openEffect1.source.sourceRect.x, 0, "OpenEffect ShaderEffectSource is incorrect")
33− compare(openEffect1.source.sourceRect.y, 0, "OpenEffect ShaderEffectSource is incorrect")
34− compare(openEffect1.source.sourceRect.width, 50, "OpenEffect ShaderEffectSource is incorrect")
35− compare(openEffect1.source.sourceRect.height, 71, "OpenEffect ShaderEffectSource is incorrect")
36− openEffect1.gap=2.0
37− compare(openEffect1.source.sourceRect.x, 0, "OpenEffect ShaderEffectSource is incorrect")
38− compare(openEffect1.source.sourceRect.y, 0, "OpenEffect ShaderEffectSource is incorrect")
39− compare(openEffect1.source.sourceRect.width, 50, "OpenEffect ShaderEffectSource is incorrect")
40− compare(openEffect1.source.sourceRect.height, 72, "OpenEffect ShaderEffectSource is incorrect")
41− }
42−
43− Rectangle {
44− id: rectangle1
45−
46− width: 100; height: 100
47−
48− Rectangle {
49− id: rectangle2
50− width: 50; height: 50
51− }
52−
53− OpenEffect {
54− id: openEffect1
55− anchors {
56− fill: parent
57− }
58−
59− property real gap: 1.0
60−
61− topGapPx: (1 - gap) * positionPx
62− topOpacity: (1 - gap * 1.2)
63− bottomGapPx: positionPx + gap * 10
64− bottomOverflow: 20 + gap
65− bottomOpacity: 1 - (gap * 0.8)
66−
67− positionPx: gap
68− sourceItem: rectangle2
69− }
70− }
71−}
tests/qmltests/Components/tst_PageHeaderLabel.qml+1−1
@@ -19,7 +19,7 @@ import QtTest 1.0
19import ".."
19import ".."
20import "../../../qml/Components"
20import "../../../qml/Components"
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22−import Unity 0.1
22+import Unity 0.2
23import Unity.Test 0.1 as UT
23import Unity.Test 0.1 as UT
24
24
25Item {
25Item {
tests/qmltests/Components/tst_RatingStars.qmldeleted−62

This diff is too big to show here.

tests/qmltests/Components/tst_ResponsiveFlowView.qml+1−2

This diff is too big to show here.

tests/qmltests/Components/tst_Stage.qmldeleted−278

This diff is too big to show here.

tests/qmltests/Components/tst_Stage/AppControl.qmldeleted−42

This diff is too big to show here.

tests/qmltests/Components/tst_Stage/FakeApplicationScreenshot.qmldeleted−53

This diff is too big to show here.

tests/qmltests/Components/tst_Tile.qmldeleted−71

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_AppPreview.qmldeleted−276

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+50−117

This diff is too big to show here.

tests/qmltests/Dash/Movie/tst_MoviePreview.qmldeleted−86

This diff is too big to show here.

tests/qmltests/Dash/Music/tst_MusicPreview.qmldeleted−174

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_Preview.qml+4−18

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−6

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+3−4

This diff is too big to show here.

tests/qmltests/Dash/qml/FakeScopeView.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView1.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView2.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/qml/fake_scopeView3.qml+1−1

This diff is too big to show here.

tests/qmltests/Dash/tst_Card.qml+49

This diff is too big to show here.

tests/qmltests/Dash/tst_CardHeader.qml+1−28

This diff is too big to show here.

tests/qmltests/Dash/tst_CardTool.qml+21−1

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+14−6

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+117−35

This diff is too big to show here.

tests/qmltests/Dash/tst_DashPreview.qmldeleted−202

This diff is too big to show here.

tests/qmltests/Dash/tst_FilterGrids.qmldeleted−143

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericPreview.qmldeleted−125

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+36−246

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+6−4

This diff is too big to show here.

tests/qmltests/Notifications/tst_Notifications.qml+27−13

This diff is too big to show here.

tests/qmltests/Notifications/tst_VisualSnapDecisionsQueue.qmlnew file+238

This diff is too big to show here.

tests/qmltests/Panel/Indicators/tst_MenuItemFactory.qml+47−6

This diff is too big to show here.

tests/qmltests/SideStage/tst_SideStage.qmldeleted−52

This diff is too big to show here.

tests/qmltests/Stages/tst_PhoneStage.qmlnew file+288

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+40−35

This diff is too big to show here.

tests/uqmlscene/main.cpp+13

This diff is too big to show here.

tests/utils/modules/Unity/Test/UnityTestCase.qml+10−16

This diff is too big to show here.

tools/registry-tracker.cpp+19−4

This diff is too big to show here.

tools/registry-tracker.h+7−2

This diff is too big to show here.

tools/scopetool.cpp+28−8

This diff is too big to show here.