on xenial help sign in
Merged with trunk. Updated to work with dash as app.
5017345Leo Arias
tests/autopilot/.project → .projectrenamed+1−1
@@ -1,6 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
1<?xml version="1.0" encoding="UTF-8"?>
2<projectDescription>
2<projectDescription>
3− <name>Unity8 Autopilot</name>
3+ <name>Unity8</name>
4 <comment></comment>
4 <comment></comment>
5 <projects>
5 <projects>
6 </projects>
6 </projects>
tests/autopilot/.pydevproject → .pydevprojectrenamed+3−1
@@ -1,7 +1,9 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<?eclipse-pydev version="1.0"?><pydev_project>
2<?eclipse-pydev version="1.0"?><pydev_project>
3<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
3<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
4−<path>/Unity8 Autopilot</path>
4+<path>/Unity8/tests/autopilot</path>
5+<path>/Unity8/.bazaar</path>
6+<path>/Unity8/tests/whitespace</path>
5</pydev_pathproperty>
7</pydev_pathproperty>
6<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
8<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
7<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
9<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
.settings/Autopilot List.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<stringAttribute key="bad_container_name" value="/Unity8/.pyd"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
5+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
6+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="list unity8"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
.settings/Autopilot Run.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
5+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
6+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="run ${string_prompt:the test suite to run:unity8}"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
CMakeLists.txt+1
@@ -96,6 +96,7 @@ include(autopilot)
96declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
96declare_autopilot_test(shell unity8.shell ${CMAKE_SOURCE_DIR}/tests/autopilot/)
97
97
98set(SHELL_APP unity8)
98set(SHELL_APP unity8)
99+set(DASH_APP unity8-dash)
99set(SCOPE_TOOL unity-scope-tool)
100set(SCOPE_TOOL unity-scope-tool)
100
101
101include_directories(
102include_directories(
cmake/modules/QmlTest.cmake+2−2
@@ -135,7 +135,7 @@ macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
135 set(testCommand
135 set(testCommand
136 LD_LIBRARY_PATH=${LD_PATH}
136 LD_LIBRARY_PATH=${LD_PATH}
137 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
137 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
138− -o ${CMAKE_BINARY_DIR}/${CLASSNAME}Test.xml,xunitxml
138+ -o ${CMAKE_BINARY_DIR}/test${CLASS_NAME}.xml,xunitxml
139 -o -,txt)
139 -o -,txt)
140
140
141 add_qmltest_target(test${CLASS_NAME} "${testCommand}" FALSE TRUE)
141 add_qmltest_target(test${CLASS_NAME} "${testCommand}" FALSE TRUE)
@@ -151,7 +151,7 @@ macro(add_binary_qml_test CLASS_NAME LD_PATH DEPS)
151 LD_LIBRARY_PATH=${LD_PATH}
151 LD_LIBRARY_PATH=${LD_PATH}
152 xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
152 xvfb-run --server-args "-screen 0 1024x768x24" --auto-servernum
153 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
153 ${CMAKE_CURRENT_BINARY_DIR}/${CLASS_NAME}TestExec
154− -o ${CMAKE_BINARY_DIR}/${CLASS_NAME}Test.xml,xunitxml
154+ -o ${CMAKE_BINARY_DIR}/test${CLASS_NAME}.xml,xunitxml
155 -o -,txt)
155 -o -,txt)
156
156
157 add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
157 add_qmltest_target(xvfbtest${CLASS_NAME} "${xvfbtestCommand}" FALSE TRUE)
data/CMakeLists.txt+5−2
@@ -1,7 +1,10 @@
1−# generate desktop file
1+# generate desktop files
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
2configure_file(${SHELL_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop @ONLY)
3+configure_file(${DASH_APP}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop @ONLY)
3
4
4# install desktop files
5# install desktop files
6+install(FILES
5−install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
7+ ${CMAKE_CURRENT_BINARY_DIR}/${SHELL_APP}.desktop
8+ ${CMAKE_CURRENT_BINARY_DIR}/${DASH_APP}.desktop
6 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
9 DESTINATION ${CMAKE_INSTALL_DATADIR}/applications
7 )
10 )
data/unity8-dash.confnew file+22
@@ -0,0 +1,22 @@
1+description "Unity Shell v8 Dash"
2+author "Michael Zanetti <michael.zanetti@canonical.com>"
3+
4+emits scope-ui-starting
5+
6+start on started unity8
7+stop on stopping unity8
8+
9+kill timeout 120
10+
11+respawn
12+
13+pre-start script
14+ if [ -z "$UNITY_SCOPES_LIST" ]; then
15+ # FIXME: remove once we have this in dconf
16+ initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator"
17+ fi
18+
19+ initctl emit scope-ui-starting
20+end script
21+
22+exec ${BINARY:-unity8-dash} $ARGS --desktop_file_hint=/usr/share/applications/unity8-dash.desktop
data/unity8-dash.desktop.innew file+9
@@ -0,0 +1,9 @@
1+[Desktop Entry]
2+Type=Application
3+Name=Unity 8 Dash
4+Comment=The converged Unity shell dash
5+Exec=@CMAKE_INSTALL_PREFIX@/@CMAKE_INSTALL_BINDIR@/unity8-dash
6+Terminal=false
7+Icon=unity8
8+NoDisplay=true
9+X-Ubuntu-Touch=true
data/unity8.conf+1−7
@@ -1,7 +1,7 @@
1description "Unity Shell v8"
1description "Unity Shell v8"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
2author "Ricardo Mendoza <ricmm@ubuntu.com>"
3
3
4−emits scope-ui-starting indicator-services-start
4+emits indicator-services-start
5
5
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
6start on ((xsession SESSION=ubuntu-touch) or (xsession SESSION=ubuntu-touch-surfaceflinger)) and started dbus
7stop on desktop-end
7stop on desktop-end
@@ -34,11 +34,6 @@ pre-start script
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
34 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
35 fi
35 fi
36
36
37− if [ -z "$UNITY_SCOPES_LIST" ]; then
38− # FIXME: remove once we have this in dconf
39− initctl set-env UNITY_SCOPES_LIST="scopes;clickscope;musicaggregator;videoaggregator"
40− fi
41−
42 # Remove the socket if still there
37 # Remove the socket if still there
43 if [ -S "$MIR_SERVER_FILE" ]; then
38 if [ -S "$MIR_SERVER_FILE" ]; then
44 rm "$MIR_SERVER_FILE"
39 rm "$MIR_SERVER_FILE"
@@ -46,7 +41,6 @@ pre-start script
46
41
47 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
42 initctl set-env --global MIR_SERVER_PROMPT_FILE=1
48
43
49− initctl emit scope-ui-starting
50 initctl emit --no-wait indicator-services-start
44 initctl emit --no-wait indicator-services-start
51end script
45end script
52
46
debian/changelog+218
@@ -1,3 +1,221 @@
1+unity8 (8.00+14.10.20140808-0ubuntu1) utopic; urgency=low
2+
3+ [ CI bot ]
4+ * Resync trunk
5+
6+ [ Nick Dedekind ]
7+ * Added application prompt surfaces to allow prompting application
8+ which have not yet created a surface.
9+
10+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 08 Aug 2014 12:15:05 +0000
11+
12+unity8 (8.00+14.10.20140806.1-0ubuntu1) utopic; urgency=low
13+
14+ [ Michal Hruby ]
15+ * Work with the scopes-v4 branch + departments->navigation renaming
16+
17+ [ Michał Sawicz ]
18+ * Hardcode art shape size for click scope local and predefined
19+ categories While at it, drop the fillmode of cards
20+ * Use the correct API in PageHeader. (LP: #1353048)
21+ * Refactor dash activity indicator. (LP: #1351539)
22+
23+ [ Albert Astals ]
24+ * Dash Departments fixes Update maxHeight manually since it depends on
25+ the position of the item and its parents and it can't know when the
26+ binding has to be updated Make parent stuff non interactive when the
27+ department list is shown
28+ * PageHeader: when on search clip y-coordinates otherwise the
29+ background spills out when on search (LP: #1350398)
30+ * Dash: Implement OverlayColor support in Cards
31+ * Hardcode art shape size for click scope local and predefined
32+ categories While at it, drop the fillmode of cards
33+ * Make test_departments test more stable There's various
34+ DashDepartments on the dash, make sure we're working over the one
35+ that is on screen, otherwise clicks don't end up where they should
36+ * Work with the scopes-v4 branch + departments->navigation renaming
37+ * Fixes for dash as app Load i18n catalog Process command line options
38+ Add the posibility to have a mouse touch adaptor (LP: #1353351)
39+ * Implement the Expandable Preview Widget Now TextSummary is not
40+ expandable by itself anymore, you have to use it inside an
41+ Expandable to get the behaviour
42+ * Add test prefix to xml output, seems CI needs it
43+
44+ [ Antti Kaijanmäki ]
45+ * Indicators: Adds new ModemInfoItem to be used with indicator-network
46+ (LP: #1329204)
47+
48+ [ Michael Terry ]
49+ * When the edge demo is running, don't show the greeter if the screen
50+ is turned off. This avoids an odd interaction where parts of the
51+ greeter are disabled but the edge demo isn't visible until you slide
52+ the greeter away. (LP: #1283425)
53+ * Don't hardcode the phablet password in our testing script.
54+
55+ [ Ying-Chun Liu ]
56+ * Add divider dots.
57+
58+ [ Mirco Müller ]
59+ * Make sure the TextField of a snap-decision notification has the
60+ active focus upon creation, thus the osk shows up right away. (LP:
61+ #1346867)
62+
63+ [ Andrea Cimitan ]
64+ * Add touchdown effect to dash cards.
65+ * Import Ubuntu.Components for preview image gallery to pick up
66+ default flicking speeds.
67+
68+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 06 Aug 2014 19:40:05 +0000
69+
70+unity8 (8.00+14.10.20140805-0ubuntu1) utopic; urgency=low
71+
72+ [ Michael Zanetti ]
73+ * Split the dash from the shell into a separate app (LP: #1232687)
74+
75+ [ Leo Arias ]
76+ * Update the autopilot tests to work with the new dash app.
77+
78+ [ Daniel d'Andrada ]
79+ * Split the dash from the shell into a separate app (LP: #1232687)
80+
81+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 05 Aug 2014 12:06:31 +0000
82+
83+unity8 (8.00+14.10.20140731.1-0ubuntu1) utopic; urgency=low
84+
85+ [ Gerry Boland ]
86+ * Fix the run.sh script - pretend to be running with qtmir and emit
87+ SIGSTOP at the right time
88+
89+ [ Ying-Chun Liu ]
90+ * Implement Attribute UI. (LP: #1282460)
91+
92+ [ Albert Astals ]
93+ * Hide search history popup as soon as you start typing As discussed
94+ with Mike and Saviq
95+ * Compile with for scopes-v3 unity-api
96+ * PageHeader: Unfocus search field when search entry is selected
97+ * Show search field if the search query changes
98+ * Test: Add a condition for art.height being > 0 means stuff has
99+ already been layouted a bit without it it can happen that we get 0
100+ for everything at startup and tests still pass
101+ * Remove leftover in test of an old headerless implementation
102+
103+ [ Michael Zanetti ]
104+ * Drop Recent apps category from Dash (LP: #1281092)
105+ * update launcher count emblems to match new spec (LP: #1338984)
106+
107+ [ Bill Filler ]
108+ * disable predictive text for dash search field (LP: #1340409)
109+
110+ [ CI bot ]
111+ * Resync trunk
112+
113+ [ Antti Kaijanmäki ]
114+ * DefaultIndicatorPage: use Loader status to determine the visible
115+ property. (LP: #1350555)
116+
117+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 31 Jul 2014 16:51:01 +0000
118+
119+unity8 (8.00+14.10.20140729.1-0ubuntu1) utopic; urgency=low
120+
121+ [ Michael Terry ]
122+ * Check user's pin/password using PAM, instead of a plaintext keyfile.
123+ New build dependency: libpam0g-dev for phone unlock with PAM (LP:
124+ #1234983)
125+
126+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 23:36:30 +0000
127+
128+unity8 (8.00+14.10.20140729-0ubuntu1) utopic; urgency=medium
129+
130+ [ Gerry Boland ]
131+ [ Daniel d'Andrada ]
132+ * Re-architecture unity8 to use the QtMirCompositor library so that
133+ the Qt scenegraph renderer is used as the Mir compositor, and
134+ application surfaces are added to the QML scene as items.
135+
136+ [ Michael Zanetti ]
137+ * Port phone right-edge spread code to use QtCompositor
138+ * Add right-edge spread animation for tablet
139+
140+ [ Ubuntu daily release ]
141+ * New rebuild forced
142+
143+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 15:07:32 +0000
144+
145+unity8 (7.90+14.10.20140725-0ubuntu1) utopic; urgency=low
146+
147+ [ CI bot ]
148+ * Resync trunk
149+
150+ [ Michał Sawicz ]
151+ * Fix the ap test for applications.
152+
153+ [ Albert Astals ]
154+ * Use deleteLater instead of a direct delete We are seeing a crash in
155+ QQuickWindowPrivate::polishItems because LVWPH is deleting items to
156+ polish from it's updatePolish which means the set in
157+ QQuickWindowPrivate::polishItems may end up with some yet-to-
158+ process-but-now-deleted items. Switching to deleteLater fixes this
159+
160+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 25 Jul 2014 10:47:34 +0000
161+
162+unity8 (7.90+14.10.20140724.1-0ubuntu1) utopic; urgency=low
163+
164+ [ Michael Zanetti ]
165+ * properly parent launcher items (LP: #1347902)
166+
167+ [ Michał Sawicz ]
168+ * Move the PyDev project files to the root, supporting .py scripts
169+ outside of tests/autopilot. Add Autopilot Run and List launch
170+ configurations to easily support debugging in Eclipse. Use
171+ add_unity8_mock macro in the Telephony plugin.
172+ * Drop FilterGrid and refactor height animations in GenericScopeView.
173+ Also implement forced category expansion. (LP: #1326470)
174+ * Move expansion button from section header to category footer. (LP:
175+ #1261300)
176+ * Fix expect-sigstop enviroment variable name. (LP: #1346819)
177+ * Make headerless categories easier Instead of having no header
178+ category (which is a bit confusing since the LVWPH code was designed
179+ so that when a category has no header it is because it shares the
180+ category with the previous one) what we have for headerless
181+ categories is a header of height 0, this way everything works as it
182+ should and results in cleaner code in the LVWPH and in
183+ GenericScopeView
184+ * Add support for header links.
185+ * Add dash PageHeader styling.
186+
187+ [ Albert Astals ]
188+ * Make headerless categories easier Instead of having no header
189+ category (which is a bit confusing since the LVWPH code was designed
190+ so that when a category has no header it is because it shares the
191+ category with the previous one) what we have for headerless
192+ categories is a header of height 0, this way everything works as it
193+ should and results in cleaner code in the LVWPH and in
194+ GenericScopeView
195+
196+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 24 Jul 2014 20:41:29 +0000
197+
198+unity8 (7.90+14.10.20140723.4-0ubuntu1) utopic; urgency=low
199+
200+ [ thomas-voss ]
201+ * Explicitly select gcc version.
202+
203+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Wed, 23 Jul 2014 15:32:41 +0000
204+
205+unity8 (7.90+14.10.20140721.1-0ubuntu1) utopic; urgency=low
206+
207+ [ Michael Terry ]
208+ * Allow running the dialer-app in emergency mode when the screen is
209+ locked.
210+
211+ [ Michał Sawicz ]
212+ * Add missing nameOwner property to mock UnityMenuModel.
213+
214+ [ Albert Astals ]
215+ * Fix name, There's nothing called pageHeader in this file
216+
217+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Mon, 21 Jul 2014 14:57:08 +0000
218+
1unity8 (7.90+14.10.20140717.3-0ubuntu1) utopic; urgency=low
219unity8 (7.90+14.10.20140717.3-0ubuntu1) utopic; urgency=low
2
220
3 [ Nick Dedekind ]
221 [ Nick Dedekind ]
debian/control+9−5
@@ -7,6 +7,10 @@ Build-Depends: cmake,
7 debhelper (>= 9),
7 debhelper (>= 9),
8 doxyqml,
8 doxyqml,
9 graphviz,
9 graphviz,
10+# We rely on C++11 features, and to prevent from ABI breaks
11+# in libstdc++ causing us issues, we explicitly select a G++
12+# version.
13+ g++-4.9,
10 libdee-qt5-dev (>= 3.2),
14 libdee-qt5-dev (>= 3.2),
11 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
15 libgl1-mesa-dev[!armhf] | libgl-dev[!armhf],
12 libgl1-mesa-dri,
16 libgl1-mesa-dri,
@@ -15,12 +19,12 @@ Build-Depends: cmake,
15 libgsettings-qt-dev,
19 libgsettings-qt-dev,
16 libhardware-dev,
20 libhardware-dev,
17 libhud-client2-dev,
21 libhud-client2-dev,
18− libpay1-dev,
22+ libpam0g-dev,
23+ libpay2-dev,
19 libpulse-dev,
24 libpulse-dev,
20 libqmenumodel-dev (>= 0.2.8),
25 libqmenumodel-dev (>= 0.2.8),
21 libqt5xmlpatterns5-dev,
26 libqt5xmlpatterns5-dev,
22− libunity-api-dev (>= 7.85),
27+ libunity-api-dev (>= 7.88),
23− libunity-mir-dev,
24 libusermetricsoutput1-dev,
28 libusermetricsoutput1-dev,
25 libxcb1-dev,
29 libxcb1-dev,
26 pkg-config,
30 pkg-config,
@@ -76,10 +80,10 @@ Provides: indicator-renderer,
76Depends: gsettings-desktop-schemas,
80Depends: gsettings-desktop-schemas,
77 libcap2-bin,
81 libcap2-bin,
78 libglib2.0-bin,
82 libglib2.0-bin,
79− libunity-mir1 (>= 0.4),
80 qmenumodel-qml (>= 0.2.8),
83 qmenumodel-qml (>= 0.2.8),
81 qml-module-qtquick-xmllistmodel,
84 qml-module-qtquick-xmllistmodel,
82 qtdeclarative5-gsettings1.0,
85 qtdeclarative5-gsettings1.0,
86+ qtdeclarative5-qtmir-plugin (>= 0.4.1),
83 qtdeclarative5-ubuntu-settings-components (>= 0.3),
87 qtdeclarative5-ubuntu-settings-components (>= 0.3),
84 qtdeclarative5-ubuntu-telephony0.1,
88 qtdeclarative5-ubuntu-telephony0.1,
85 unity-launcher-impl-3,
89 unity-launcher-impl-3,
@@ -108,7 +112,7 @@ Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
108 unity-application-impl-2,
112 unity-application-impl-2,
109 unity-notifications-impl-3,
113 unity-notifications-impl-3,
110 unity-plugin-scopes | unity-scopes-impl,
114 unity-plugin-scopes | unity-scopes-impl,
111− unity-scopes-impl-0,
115+ unity-scopes-impl-4,
112 unity8-fake-env | unity-application-impl,
116 unity8-fake-env | unity-application-impl,
113 ${misc:Depends},
117 ${misc:Depends},
114Breaks: unity8 (<< 7.86),
118Breaks: unity8 (<< 7.86),
debian/rules+7
@@ -1,11 +1,18 @@
1#!/usr/bin/make -f
1#!/usr/bin/make -f
2# -*- makefile -*-
2# -*- makefile -*-
3
3
4+include /usr/share/dpkg/default.mk
5+
4# Uncomment this to turn on verbose mode.
6# Uncomment this to turn on verbose mode.
5#export DH_VERBOSE=1
7#export DH_VERBOSE=1
6export DPKG_GENSYMBOLS_CHECK_LEVEL=4
8export DPKG_GENSYMBOLS_CHECK_LEVEL=4
7export NO_PNG_PKG_MANGLE=1
9export NO_PNG_PKG_MANGLE=1
8
10
11+# Explicitly selecting a G{CC,++}-version here to avoid accidental
12+# ABI breaks introduced by toolchain updates.
13+export CC=$(DEB_HOST_GNU_TYPE)-gcc-4.9
14+export CXX=$(DEB_HOST_GNU_TYPE)-g++-4.9
15+
9%:
16%:
10 dh $@ --parallel --fail-missing --with python2,python3
17 dh $@ --parallel --fail-missing --with python2,python3
11
18
debian/unity8.install+3
@@ -1,6 +1,9 @@
1data/unity8.conf usr/share/upstart/sessions/
1data/unity8.conf usr/share/upstart/sessions/
2+data/unity8-dash.conf usr/share/upstart/sessions/
2usr/bin/unity8
3usr/bin/unity8
4+usr/bin/unity8-dash
3usr/share/applications/unity8.desktop
5usr/share/applications/unity8.desktop
6+usr/share/applications/unity8-dash.desktop
4usr/share/unity8/Greeter
7usr/share/unity8/Greeter
5usr/share/unity8/Hud
8usr/share/unity8/Hud
6usr/share/unity8/Launcher
9usr/share/unity8/Launcher
plugins/AccountsService/AccountsService.cpp+21−1
@@ -26,7 +26,8 @@ AccountsService::AccountsService(QObject* parent)
26 m_service(new AccountsServiceDBusAdaptor(this)),
26 m_service(new AccountsServiceDBusAdaptor(this)),
27 m_user(qgetenv("USER")),
27 m_user(qgetenv("USER")),
28 m_demoEdges(false),
28 m_demoEdges(false),
29− m_statsWelcomeScreen(false)
29+ m_statsWelcomeScreen(false),
30+ m_passwordDisplayHint(Keyboard)
30{
31{
31 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
32 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
32 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
33 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
@@ -47,6 +48,7 @@ void AccountsService::setUser(const QString &user)
47 updateDemoEdges();
48 updateDemoEdges();
48 updateBackgroundFile();
49 updateBackgroundFile();
49 updateStatsWelcomeScreen();
50 updateStatsWelcomeScreen();
51+ updatePasswordDisplayHint();
50}
52}
51
53
52bool AccountsService::demoEdges() const
54bool AccountsService::demoEdges() const
@@ -70,6 +72,11 @@ bool AccountsService::statsWelcomeScreen() const
70 return m_statsWelcomeScreen;
72 return m_statsWelcomeScreen;
71}
73}
72
74
75+AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
76+{
77+ return m_passwordDisplayHint;
78+}
79+
73void AccountsService::updateDemoEdges()
80void AccountsService::updateDemoEdges()
74{
81{
75 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
82 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
@@ -97,6 +104,15 @@ void AccountsService::updateStatsWelcomeScreen()
97 }
104 }
98}
105}
99
106
107+void AccountsService::updatePasswordDisplayHint()
108+{
109+ PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "PasswordDisplayHint").toInt();
110+ if (m_passwordDisplayHint != passwordDisplayHint) {
111+ m_passwordDisplayHint = passwordDisplayHint;
112+ Q_EMIT passwordDisplayHintChanged();
113+ }
114+}
115+
100void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
116void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
101{
117{
102 if (m_user != user) {
118 if (m_user != user) {
@@ -111,6 +127,10 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
111 if (changed.contains("StatsWelcomeScreen")) {
127 if (changed.contains("StatsWelcomeScreen")) {
112 updateStatsWelcomeScreen();
128 updateStatsWelcomeScreen();
113 }
129 }
130+ } else if (interface == "com.ubuntu.AccountsService.SecurityPrivacy") {
131+ if (changed.contains("PasswordDisplayHint")) {
132+ updatePasswordDisplayHint();
133+ }
114 }
134 }
115}
135}
116
136
plugins/AccountsService/AccountsService.h+13
@@ -27,6 +27,7 @@ class AccountsServiceDBusAdaptor;
27class AccountsService: public QObject
27class AccountsService: public QObject
28{
28{
29 Q_OBJECT
29 Q_OBJECT
30+ Q_ENUMS(PasswordDisplayHint)
30 Q_PROPERTY (QString user
31 Q_PROPERTY (QString user
31 READ user
32 READ user
32 WRITE setUser
33 WRITE setUser
@@ -41,8 +42,16 @@ class AccountsService: public QObject
41 Q_PROPERTY (bool statsWelcomeScreen
42 Q_PROPERTY (bool statsWelcomeScreen
42 READ statsWelcomeScreen
43 READ statsWelcomeScreen
43 NOTIFY statsWelcomeScreenChanged)
44 NOTIFY statsWelcomeScreenChanged)
45+ Q_PROPERTY (PasswordDisplayHint passwordDisplayHint
46+ READ passwordDisplayHint
47+ NOTIFY passwordDisplayHintChanged)
44
48
45public:
49public:
50+ enum PasswordDisplayHint {
51+ Keyboard,
52+ Numeric,
53+ };
54+
46 explicit AccountsService(QObject *parent = 0);
55 explicit AccountsService(QObject *parent = 0);
47
56
48 QString user() const;
57 QString user() const;
@@ -51,12 +60,14 @@ public:
51 void setDemoEdges(bool demoEdges);
60 void setDemoEdges(bool demoEdges);
52 QString backgroundFile() const;
61 QString backgroundFile() const;
53 bool statsWelcomeScreen() const;
62 bool statsWelcomeScreen() const;
63+ PasswordDisplayHint passwordDisplayHint() const;
54
64
55Q_SIGNALS:
65Q_SIGNALS:
56 void userChanged();
66 void userChanged();
57 void demoEdgesChanged();
67 void demoEdgesChanged();
58 void backgroundFileChanged();
68 void backgroundFileChanged();
59 void statsWelcomeScreenChanged();
69 void statsWelcomeScreenChanged();
70+ void passwordDisplayHintChanged();
60
71
61private Q_SLOTS:
72private Q_SLOTS:
62 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
73 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -66,12 +77,14 @@ private:
66 void updateDemoEdges();
77 void updateDemoEdges();
67 void updateBackgroundFile();
78 void updateBackgroundFile();
68 void updateStatsWelcomeScreen();
79 void updateStatsWelcomeScreen();
80+ void updatePasswordDisplayHint();
69
81
70 AccountsServiceDBusAdaptor *m_service;
82 AccountsServiceDBusAdaptor *m_service;
71 QString m_user;
83 QString m_user;
72 bool m_demoEdges;
84 bool m_demoEdges;
73 QString m_backgroundFile;
85 QString m_backgroundFile;
74 bool m_statsWelcomeScreen;
86 bool m_statsWelcomeScreen;
87+ PasswordDisplayHint m_passwordDisplayHint;
75};
88};
76
89
77#endif
90#endif
plugins/AccountsService/plugin.cpp+1
@@ -33,5 +33,6 @@ void AccountsServicePlugin::registerTypes(const char *uri)
33{
33{
34 Q_ASSERT(uri == QLatin1String("AccountsService"));
34 Q_ASSERT(uri == QLatin1String("AccountsService"));
35 qDBusRegisterMetaType<QList<QVariantMap>>();
35 qDBusRegisterMetaType<QList<QVariantMap>>();
36+ qRegisterMetaType<AccountsService::PasswordDisplayHint>("AccountsService::PasswordDisplayHint");
36 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
37 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
37}
38}
plugins/Dash/CardAttributes.qmlnew file+65
@@ -0,0 +1,65 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.2
18+import QtQuick.Layouts 1.1
19+import Ubuntu.Components 1.1
20+import Ubuntu.Settings.Components 0.1
21+
22+GridLayout {
23+ id: grid
24+ anchors {
25+ left: parent.left;
26+ right: parent.right;
27+ }
28+ columns: 2 + repeater.count % 2
29+ property alias model: repeater.model
30+ property var color
31+
32+ Repeater {
33+ id: repeater
34+ delegate: Row {
35+ spacing: units.gu(0.5)
36+ readonly property int column: index % grid.columns;
37+ Layout.alignment: {
38+ if (column == 0) return Qt.AlignLeft;
39+ if (column == grid.columns - 1 || index == repeater.count - 1) return Qt.AlignRight;
40+ if (column == 1) return Qt.AlignHCenter;
41+ }
42+ Layout.columnSpan: index == repeater.count - 1 && grid.columns == 3 && column == 1 ? 2 : 1
43+ Layout.maximumWidth: Math.max(icon.width, label.x + label.implicitWidth)
44+ Layout.fillWidth: true
45+ StatusIcon {
46+ id: icon
47+ height: units.gu(2)
48+ sets: ["actions", "status", "apps"]
49+ source: "icon" in modelData ? modelData["icon"] : ""
50+ }
51+ Label {
52+ id: label
53+ width: parent.width - x
54+ anchors.verticalCenter: parent.verticalCenter
55+ text: "value" in modelData ? modelData["value"] : "";
56+ elide: Text.ElideRight
57+ maximumLineCount: 1
58+ font.weight: "style" in modelData && modelData["style"] == "highlighted" ? Font.DemiBold : Font.Light
59+ fontSize: "small"
60+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
61+ color: grid.color
62+ }
63+ }
64+ }
65+}
plugins/Dash/CardCreator.js+100−17
@@ -71,19 +71,14 @@ var kArtShapeHolderCode = 'Item { \n\
71 visible: image.status == Image.Ready; \n\
71 visible: image.status == Image.Ready; \n\
72 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
72 readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1; \n\
73 readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1; \n\
73 readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1; \n\
74− readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect; \n\
75 Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; } \n\
74 Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; } \n\
76− onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings(); \n\
77 Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); } \n\
75 Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); } \n\
78 function updateWidthHeightBindings() { \n\
76 function updateWidthHeightBindings() { \n\
79 if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) { \n\
77 if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) { \n\
80 width = root.fixedArtShapeSize.width; \n\
78 width = root.fixedArtShapeSize.width; \n\
81 height = root.fixedArtShapeSize.height; \n\
79 height = root.fixedArtShapeSize.height; \n\
82− } else if (aspectSmallerThanImageAspect) { \n\
83− width = Qt.binding(function() { return !visible ? 0 : image.width }); \n\
84− height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect }); \n\
85 } else { \n\
80 } else { \n\
86− width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect }); \n\
81+ width = Qt.binding(function() { return !visible ? 0 : image.width }); \n\
87 height = Qt.binding(function() { return !visible ? 0 : image.height }); \n\
82 height = Qt.binding(function() { return !visible ? 0 : image.height }); \n\
88 } \n\
83 } \n\
89 } \n\
84 } \n\
@@ -92,8 +87,7 @@ var kArtShapeHolderCode = 'Item { \n\
92 source: cardData && cardData["art"] || ""; \n\
87 source: cardData && cardData["art"] || ""; \n\
93 cache: true; \n\
88 cache: true; \n\
94 asynchronous: root.asynchronous; \n\
89 asynchronous: root.asynchronous; \n\
95− fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop; \n\
90+ fillMode: Image.PreserveAspectCrop; \n\
96− readonly property real aspect: implicitWidth / implicitHeight; \n\
97 width: %2; \n\
91 width: %2; \n\
98 height: %3; \n\
92 height: %3; \n\
99 } \n\
93 } \n\
@@ -114,7 +108,7 @@ var kOverlayLoaderCode = 'Loader { \n\
114 sourceComponent: ShaderEffect { \n\
108 sourceComponent: ShaderEffect { \n\
115 id: overlay; \n\
109 id: overlay; \n\
116 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
110 height: (fixedHeaderHeight > 0 ? fixedHeaderHeight : headerHeight) + units.gu(2); \n\
117− opacity: 0.6; \n\
111+ property color overlayColor: cardData && cardData["overlayColor"] || "#99000000"; \n\
118 property var source: ShaderEffectSource { \n\
112 property var source: ShaderEffectSource { \n\
119 id: shaderSource; \n\
113 id: shaderSource; \n\
120 sourceItem: artShapeLoader.item; \n\
114 sourceItem: artShapeLoader.item; \n\
@@ -135,9 +129,10 @@ var kOverlayLoaderCode = 'Loader { \n\
135 varying highp vec2 coord; \n\
129 varying highp vec2 coord; \n\
136 uniform sampler2D source; \n\
130 uniform sampler2D source; \n\
137 uniform lowp float qt_Opacity; \n\
131 uniform lowp float qt_Opacity; \n\
132+ uniform highp vec4 overlayColor; \n\
138 void main() { \n\
133 void main() { \n\
139 lowp vec4 tex = texture2D(source, coord); \n\
134 lowp vec4 tex = texture2D(source, coord); \n\
140− gl_FragColor = vec4(0, 0, 0, tex.a) * qt_Opacity; \n\
135+ gl_FragColor = vec4(overlayColor.r, overlayColor.g, overlayColor.b, 1) * qt_Opacity * overlayColor.a * tex.a; \n\
141 }"; \n\
136 }"; \n\
142 } \n\
137 } \n\
143 }\n';
138 }\n';
@@ -193,6 +188,21 @@ var kHeaderColumnCode = 'Column { \n\
193 ] \n\
188 ] \n\
194 }\n';
189 }\n';
195
190
191+// multiple column version of kHeaderColumnCode.
192+function kHeaderColumnCodeGenerator() {
193+ var headerColumnCodeTemplate = 'Column { \n\
194+ anchors.verticalCenter: parent.verticalCenter; \n\
195+ spacing: units.dp(2); \n\
196+ width: parent.width - x;\n\
197+ data: [ \n\
198+ %1 \n\
199+ ]\n\
200+ }\n';
201+ var args = Array.prototype.slice.call(arguments);
202+ var code = headerColumnCodeTemplate.arg(args.join(',\n'));
203+ return code;
204+}
205+
196// %1 is used as anchors of mascotShapeLoader
206// %1 is used as anchors of mascotShapeLoader
197var kMascotShapeLoaderCode = 'Loader { \n\
207var kMascotShapeLoaderCode = 'Loader { \n\
198 id: mascotShapeLoader; \n\
208 id: mascotShapeLoader; \n\
@@ -224,7 +234,7 @@ var kMascotImageCode = 'Image { \n\
224 }\n';
234 }\n';
225
235
226// %1 is used as anchors of titleLabel
236// %1 is used as anchors of titleLabel
227−// %1 is used as color of titleLabel
237+// %2 is used as color of titleLabel
228// %3 is used as extra condition for visible of titleLabel
238// %3 is used as extra condition for visible of titleLabel
229var kTitleLabelCode = 'Label { \n\
239var kTitleLabelCode = 'Label { \n\
230 id: titleLabel; \n\
240 id: titleLabel; \n\
@@ -242,6 +252,16 @@ var kTitleLabelCode = 'Label { \n\
242 horizontalAlignment: root.headerAlignment; \n\
252 horizontalAlignment: root.headerAlignment; \n\
243 }\n';
253 }\n';
244
254
255+// %1 is used as anchors of touchdown effect
256+var kTouchdownCode = 'UbuntuShape { \n\
257+ id: touchdown; \n\
258+ objectName: "touchdown"; \n\
259+ anchors { %1 } \n\
260+ visible: root.pressed; \n\
261+ radius: "medium"; \n\
262+ borderSource: "radius_pressed.sci" \n\
263+ }\n';
264+
245// %1 is used as anchors of subtitleLabel
265// %1 is used as anchors of subtitleLabel
246// %2 is used as color of subtitleLabel
266// %2 is used as color of subtitleLabel
247var kSubtitleLabelCode = 'Label { \n\
267var kSubtitleLabelCode = 'Label { \n\
@@ -258,6 +278,15 @@ var kSubtitleLabelCode = 'Label { \n\
258 horizontalAlignment: root.headerAlignment; \n\
278 horizontalAlignment: root.headerAlignment; \n\
259 }\n';
279 }\n';
260
280
281+// %1 is used as anchors of attributesRow
282+var kAttributesRowCode = 'CardAttributes { \n\
283+ id: attributesRow; \n\
284+ objectName: "attributesRow"; \n\
285+ anchors { %1 } \n\
286+ color: %2; \n\
287+ model: cardData["attributes"]; \n\
288+ }\n';
289+
261// %1 is used as top anchor of summary
290// %1 is used as top anchor of summary
262// %2 is used as topMargin anchor of summary
291// %2 is used as topMargin anchor of summary
263// %3 is used as color of summary
292// %3 is used as color of summary
@@ -308,6 +337,7 @@ function cardString(template, components) {
308 var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
337 var headerAsOverlay = hasArt && template && template["overlay"] === true && (hasTitle || hasMascot);
309 var hasSubtitle = hasTitle && components["subtitle"] || false;
338 var hasSubtitle = hasTitle && components["subtitle"] || false;
310 var hasHeaderRow = hasMascot && hasTitle;
339 var hasHeaderRow = hasMascot && hasTitle;
340+ var hasAttributes = hasTitle && components["attributes"] || false;
311
341
312 if (hasBackground) {
342 if (hasBackground) {
313 code += kBackgroundLoaderCode;
343 code += kBackgroundLoaderCode;
@@ -377,6 +407,14 @@ function cardString(template, components) {
377 code += 'readonly property int headerHeight: row.height;\n'
407 code += 'readonly property int headerHeight: row.height;\n'
378 } else if (hasMascot) {
408 } else if (hasMascot) {
379 code += 'readonly property int headerHeight: mascotImage.height;\n'
409 code += 'readonly property int headerHeight: mascotImage.height;\n'
410+ } else if (hasAttributes) {
411+ if (hasTitle && hasSubtitle) {
412+ code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin + attributesRow.height + attributesRow.anchors.topMargin;\n'
413+ } else if (hasTitle) {
414+ code += 'readonly property int headerHeight: titleLabel.height + attributesRow.height + attributesRow.anchors.topMargin;\n'
415+ } else {
416+ code += 'readonly property int headerHeight: attributesRow.height;\n'
417+ }
380 } else if (hasSubtitle) {
418 } else if (hasSubtitle) {
381 code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
419 code += 'readonly property int headerHeight: titleLabel.height + subtitleLabel.height + subtitleLabel.anchors.topMargin;\n'
382 } else if (hasTitle) {
420 } else if (hasTitle) {
@@ -425,10 +463,12 @@ function cardString(template, components) {
425
463
426 var titleAnchors;
464 var titleAnchors;
427 var subtitleAnchors;
465 var subtitleAnchors;
466+ var attributesAnchors;
428− if (hasMascot && hasSubtitle) {
467+ if (hasMascot && (hasSubtitle || hasAttributes)) {
429 // Using row + column
468 // Using row + column
430 titleAnchors = 'left: parent.left; right: parent.right';
469 titleAnchors = 'left: parent.left; right: parent.right';
431 subtitleAnchors = titleAnchors;
470 subtitleAnchors = titleAnchors;
471+ attributesAnchors = subtitleAnchors;
432 } else if (hasMascot) {
472 } else if (hasMascot) {
433 // Using row + label
473 // Using row + label
434 titleAnchors = 'verticalCenter: parent.verticalCenter;\n'
474 titleAnchors = 'verticalCenter: parent.verticalCenter;\n'
@@ -438,11 +478,13 @@ function cardString(template, components) {
438 titleAnchors = 'left: parent.left; \n\
478 titleAnchors = 'left: parent.left; \n\
439 leftMargin: units.gu(1); \n\
479 leftMargin: units.gu(1); \n\
440 right: parent.right; \n\
480 right: parent.right; \n\
481+ rightMargin: units.gu(1); \n\
441 top: overlayLoader.top; \n\
482 top: overlayLoader.top; \n\
442 topMargin: units.gu(1);\n';
483 topMargin: units.gu(1);\n';
443 } else {
484 } else {
444 // Using anchors to the mascot/parent
485 // Using anchors to the mascot/parent
445− titleAnchors = "right: parent.right;";
486+ titleAnchors = "right: parent.right;\n";
487+ titleAnchors += "rightMargin: units.gu(1);\n";
446 titleAnchors += headerLeftAnchor;
488 titleAnchors += headerLeftAnchor;
447 titleAnchors += headerVerticalAnchors;
489 titleAnchors += headerVerticalAnchors;
448 if (!headerLeftAnchorHasMargin) {
490 if (!headerLeftAnchorHasMargin) {
@@ -452,8 +494,19 @@ function cardString(template, components) {
452 subtitleAnchors = 'left: titleLabel.left; \n\
494 subtitleAnchors = 'left: titleLabel.left; \n\
453 leftMargin: titleLabel.leftMargin; \n\
495 leftMargin: titleLabel.leftMargin; \n\
454 right: titleLabel.right; \n\
496 right: titleLabel.right; \n\
497+ rightMargin: titleLabel.rightMargin; \n\
455 top: titleLabel.bottom; \n\
498 top: titleLabel.bottom; \n\
456 topMargin: units.dp(2);\n';
499 topMargin: units.dp(2);\n';
500+ if (hasSubtitle) {
501+ attributesAnchors = 'left: subtitleLabel.left; \n\
502+ leftMargin: subtitleLabel.leftMargin; \n\
503+ right: subtitleLabel.right; \n\
504+ rightMargin: subtitleLabel.rightMargin; \n\
505+ top: subtitleLabel.bottom; \n\
506+ topMargin: units.dp(2);\n';
507+ } else {
508+ attributesAnchors = subtitleAnchors;
509+ }
457 }
510 }
458
511
459 var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
512 var titleLabelVisibleExtra = (headerAsOverlay ? '&& overlayLoader.active': '');
@@ -463,11 +516,27 @@ function cardString(template, components) {
463 subtitleCode += kSubtitleLabelCode.arg(subtitleAnchors).arg(color);
516 subtitleCode += kSubtitleLabelCode.arg(subtitleAnchors).arg(color);
464 }
517 }
465
518
466− if (hasMascot && hasSubtitle) {
519+ if (hasMascot && (hasSubtitle || hasAttributes)) {
467 // If using row + column wrap the code in the column
520 // If using row + column wrap the code in the column
468 titleSubtitleCode = kHeaderColumnCode.arg(titleCode).arg(subtitleCode);
521 titleSubtitleCode = kHeaderColumnCode.arg(titleCode).arg(subtitleCode);
522+ if (hasSubtitle && hasAttributes) {
523+ var attributesCode = kAttributesRowCode.arg(attributesAnchors).arg(color);
524+ titleSubtitleCode = kHeaderColumnCodeGenerator(titleCode, subtitleCode, attributesCode);
525+ } else if (hasSubtitle) {
526+ titleSubtitleCode = kHeaderColumnCode.arg(titleCode).arg(subtitleCode);
527+ } else if (hasAttributes) {
528+ var attributesCode = kAttributesRowCode.arg(attributesAnchors).arg(color);
529+ titleSubtitleCode = kHeaderColumnCode.arg(titleCode).arg(attributesCode);
530+ }
469 } else {
531 } else {
470− titleSubtitleCode = titleCode + subtitleCode;
532+ titleSubtitleCode = titleCode;
533+ if (hasSubtitle) {
534+ titleSubtitleCode = titleSubtitleCode + subtitleCode;
535+ }
536+ if (hasAttributes) {
537+ var attributesCode = kAttributesRowCode.arg(attributesAnchors).arg(color);
538+ titleSubtitleCode = titleSubtitleCode + attributesCode;
539+ }
471 }
540 }
472 }
541 }
473
542
@@ -487,6 +556,7 @@ function cardString(template, components) {
487 else if (headerAsOverlay && hasArt) summaryTopAnchor = "artShapeHolder.bottom";
556 else if (headerAsOverlay && hasArt) summaryTopAnchor = "artShapeHolder.bottom";
488 else if (hasHeaderRow) summaryTopAnchor = "row.bottom";
557 else if (hasHeaderRow) summaryTopAnchor = "row.bottom";
489 else if (hasMascot) summaryTopAnchor = "mascotImage.bottom";
558 else if (hasMascot) summaryTopAnchor = "mascotImage.bottom";
559+ else if (hasAttributes) summaryTopAnchor = "attributesRow.bottom";
490 else if (hasSubtitle) summaryTopAnchor = "subtitleLabel.bottom";
560 else if (hasSubtitle) summaryTopAnchor = "subtitleLabel.bottom";
491 else if (hasTitle) summaryTopAnchor = "titleLabel.bottom";
561 else if (hasTitle) summaryTopAnchor = "titleLabel.bottom";
492 else if (hasArt) summaryTopAnchor = "artShapeHolder.bottom";
562 else if (hasArt) summaryTopAnchor = "artShapeHolder.bottom";
@@ -499,17 +569,29 @@ function cardString(template, components) {
499 color = 'root.scopeStyle ? root.scopeStyle.foreground : "grey"';
569 color = 'root.scopeStyle ? root.scopeStyle.foreground : "grey"';
500 }
570 }
501
571
502− var summaryTopMargin = (hasMascot || hasSubtitle ? 'anchors.margins' : '0');
572+ var summaryTopMargin = (hasMascot || hasSubtitle || hasAttributes ? 'anchors.margins' : '0');
503
573
504 code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(color);
574 code += kSummaryLabelCode.arg(summaryTopAnchor).arg(summaryTopMargin).arg(color);
505 }
575 }
506
576
577+ var touchdownAnchors;
578+ if (hasBackground) {
579+ touchdownAnchors = 'fill: backgroundLoader';
580+ } else if (hasArt && !hasMascot && !hasSummary) {
581+ touchdownAnchors = 'fill: artShapeHolder';
582+ } else {
583+ touchdownAnchors = 'fill: root'
584+ }
585+ code += kTouchdownCode.arg(touchdownAnchors);
586+
507 if (hasSummary) {
587 if (hasSummary) {
508 code += 'implicitHeight: summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
588 code += 'implicitHeight: summary.y + summary.height + (summary.text ? units.gu(1) : 0);\n';
509 } else if (hasHeaderRow) {
589 } else if (hasHeaderRow) {
510 code += 'implicitHeight: row.y + row.height + units.gu(1);\n';
590 code += 'implicitHeight: row.y + row.height + units.gu(1);\n';
511 } else if (hasMascot) {
591 } else if (hasMascot) {
512 code += 'implicitHeight: mascotImage.y + mascotImage.height;\n';
592 code += 'implicitHeight: mascotImage.y + mascotImage.height;\n';
593+ } else if (hasAttributes) {
594+ code += 'implicitHeight: attributesRow.y + attributesRow.height + units.gu(1);\n';
513 } else if (hasSubtitle) {
595 } else if (hasSubtitle) {
514 code += 'implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
596 code += 'implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);\n';
515 } else if (hasTitle) {
597 } else if (hasTitle) {
@@ -526,8 +608,9 @@ function cardString(template, components) {
526function createCardComponent(parent, template, components) {
608function createCardComponent(parent, template, components) {
527 var imports = 'import QtQuick 2.2; \n\
609 var imports = 'import QtQuick 2.2; \n\
528 import Ubuntu.Components 0.1; \n\
610 import Ubuntu.Components 0.1; \n\
529− import Ubuntu.Thumbnailer 0.1;\n';
611+ import Dash 0.1;\n';
530 var card = cardString(template, components);
612 var card = cardString(template, components);
531 var code = imports + 'Component {\n' + card + '}\n';
613 var code = imports + 'Component {\n' + card + '}\n';
614+
532 return Qt.createQmlObject(code, parent, "createCardComponent");
615 return Qt.createQmlObject(code, parent, "createCardComponent");
533}
616}
plugins/Dash/ScopeStyle.qml+17−8
@@ -38,14 +38,20 @@ QtObject {
38 /// Color used for text and symbolic icons
38 /// Color used for text and symbolic icons
39 readonly property color foreground: "foreground-color" in style ? style["foreground-color"] : d.defaultDark
39 readonly property color foreground: "foreground-color" in style ? style["foreground-color"] : d.defaultDark
40
40
41+ /// Luminance of the foreground color
42+ readonly property real foregroundLuminance: foreground ? luminance(foreground) : d.defaultForegroundLuminance
43+
41 /// Color used for the overall background
44 /// Color used for the overall background
42 readonly property color background: "background-color" in style ? style["background-color"] : "transparent"
45 readonly property color background: "background-color" in style ? style["background-color"] : "transparent"
43
46
47+ /// Luminance of the foreground color
48+ readonly property real backgroundLuminance: background ? luminance(background) : d.defaultBackgroundLuminance
49+
44 /*! \brief Luminance threshold for switching between fore and background color
50 /*! \brief Luminance threshold for switching between fore and background color
45
51
46 \note If background colour is not fully opaque, it's not taken into account.
52 \note If background colour is not fully opaque, it's not taken into account.
47 */
53 */
48− readonly property real threshold: background.a !== 1.0 ? d.foregroundLuminance : (d.foregroundLuminance + d.backgroundLuminance) / 2
54+ readonly property real threshold: background.a !== 1.0 ? foregroundLuminance : (foregroundLuminance + backgroundLuminance) / 2
49
55
50 /*! \brief The lighter of foreground and background colors
56 /*! \brief The lighter of foreground and background colors
51
57
@@ -53,8 +59,8 @@ QtObject {
53 and defaults to the theme-provided light color.
59 and defaults to the theme-provided light color.
54 */
60 */
55 readonly property color light: {
61 readonly property color light: {
56− if (background.a !== 1.0) return d.foregroundLuminance > d.defaultLightLuminance ? foreground : d.defaultLight;
62+ if (background.a !== 1.0) return foregroundLuminance > d.defaultLightLuminance ? foreground : d.defaultLight;
57− return d.foregroundLuminance > d.backgroundLuminance ? foreground : background;
63+ return foregroundLuminance > backgroundLuminance ? foreground : background;
58 }
64 }
59
65
60 /*! \brief The darker of foreground and background colors
66 /*! \brief The darker of foreground and background colors
@@ -63,18 +69,21 @@ QtObject {
63 and defaults to the theme-provided dark color.
69 and defaults to the theme-provided dark color.
64 */
70 */
65 readonly property color dark: {
71 readonly property color dark: {
66− if (background.a !== 1.0) return d.foregroundLuminance < d.defaultDarkLuminance ? foreground : d.defaultDark;
72+ if (background.a !== 1.0) return foregroundLuminance < d.defaultDarkLuminance ? foreground : d.defaultDark;
67− return d.foregroundLuminance < d.backgroundLuminance ? foreground : background;
73+ return foregroundLuminance < backgroundLuminance ? foreground : background;
68 }
74 }
69
75
70 /// Source of the logo image for the header
76 /// Source of the logo image for the header
71 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
77 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
72
78
79+ /// Background style for the header
80+ readonly property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : ""
81+
82+ /// Foreground color for the header
83+ readonly property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : foreground
84+
73 //! @cond
85 //! @cond
74 property var d: QtObject {
86 property var d: QtObject {
75− readonly property real foregroundLuminance: luminance(foreground)
76− readonly property real backgroundLuminance: luminance(background)
77−
78 // FIXME: should be taken from the theme
87 // FIXME: should be taken from the theme
79 readonly property color defaultLight: "white"
88 readonly property color defaultLight: "white"
80 readonly property color defaultDark: "grey"
89 readonly property color defaultDark: "grey"
plugins/Dash/listviewwithpageheader.cpp+1−6
@@ -141,8 +141,6 @@ void ListViewWithPageHeader::ListItem::setCulled(bool culled)
141void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
141void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
142{
142{
143 m_sectionItem = sectionItem;
143 m_sectionItem = sectionItem;
144− QQmlContext *context = QQmlEngine::contextForObject(m_item)->parentContext();
145− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(sectionItem != nullptr));
146}
144}
147
145
148ListViewWithPageHeader::ListViewWithPageHeader()
146ListViewWithPageHeader::ListViewWithPageHeader()
@@ -658,7 +656,7 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
658 if (flags & QQmlDelegateModel::Destroyed) {
656 if (flags & QQmlDelegateModel::Destroyed) {
659 item->setParentItem(nullptr);
657 item->setParentItem(nullptr);
660 }
658 }
661− delete listItem->sectionItem();
659+ listItem->sectionItem()->deleteLater();
662 delete listItem;
660 delete listItem;
663}
661}
664
662
@@ -685,8 +683,6 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
685 return nullptr;
683 return nullptr;
686
684
687 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
685 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
688− if (section.isEmpty())
689− return nullptr;
690
686
691 if (modelIndex > 0) {
687 if (modelIndex > 0) {
692 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
688 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
@@ -877,7 +873,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
877 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
873 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
878 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
874 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
879 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
875 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
880− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(false));
881 if (modelIndex == m_asyncRequestedIndex) {
876 if (modelIndex == m_asyncRequestedIndex) {
882 createItem(modelIndex, false);
877 createItem(modelIndex, false);
883 refill();
878 refill();
plugins/Dash/qmldir+1
@@ -3,3 +3,4 @@ plugin Dash-qml
3typeinfo Dash.qmltypes
3typeinfo Dash.qmltypes
4singleton CardCreatorCache 0.1 CardCreatorCache.qml
4singleton CardCreatorCache 0.1 CardCreatorCache.qml
5ScopeStyle 0.1 ScopeStyle.qml
5ScopeStyle 0.1 ScopeStyle.qml
6+CardAttributes 0.1 CardAttributes.qml
plugins/LightDM/plugin.cpp+2
@@ -69,6 +69,8 @@ void LightDMPlugin::registerTypes(const char *uri)
69 qmlRegisterType<UserMetricsOutput::ColorTheme>();
69 qmlRegisterType<UserMetricsOutput::ColorTheme>();
70
70
71 Q_ASSERT(uri == QLatin1String("LightDM"));
71 Q_ASSERT(uri == QLatin1String("LightDM"));
72+ qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
73+ qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
72 qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
74 qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
73 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
75 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
74 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", "Type is not instantiable");
76 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", "Type is not instantiable");
plugins/Ubuntu/Payments/CMakeLists.txt+1−1
@@ -14,7 +14,7 @@ qt5_use_modules(Payments Qml Quick DBus Core)
14
14
15add_unity8_plugin(Ubuntu.Payments 0.1 Ubuntu/Payments TARGETS Payments)
15add_unity8_plugin(Ubuntu.Payments 0.1 Ubuntu/Payments TARGETS Payments)
16
16
17−pkg_check_modules(LIBPAY REQUIRED pay-1)
17+pkg_check_modules(LIBPAY REQUIRED pay-2)
18add_definitions(${LIBPAY_CFLAGS} ${LIBPAY_CFLAGS_OTHER})
18add_definitions(${LIBPAY_CFLAGS} ${LIBPAY_CFLAGS_OTHER})
19
19
20target_link_libraries(Payments ${LIBPAY_LDFLAGS})
20target_link_libraries(Payments ${LIBPAY_LDFLAGS})
plugins/Unity/CMakeLists.txt+1
@@ -1,3 +1,4 @@
1add_subdirectory(Indicators)
1add_subdirectory(Indicators)
2add_subdirectory(Launcher)
2add_subdirectory(Launcher)
3add_subdirectory(Session)
3add_subdirectory(Session)
4+add_subdirectory(DashCommunicator)
plugins/Unity/DashCommunicator/CMakeLists.txtnew file+19
@@ -0,0 +1,19 @@
1+include_directories(
2+ ${CMAKE_CURRENT_SOURCE_DIR}
3+)
4+
5+set(QMLDASHCOMMUNICATORPLUGIN_SRC
6+ plugin.cpp
7+ dbusdashcommunicatorservice.cpp
8+ dashcommunicatorservice.cpp
9+ dashcommunicator.cpp
10+ )
11+
12+add_library(DashCommunicator-qml MODULE
13+ ${QMLDASHCOMMUNICATORPLUGIN_SRC}
14+ )
15+
16+qt5_use_modules(DashCommunicator-qml DBus Qml)
17+
18+# export the qmldir and qmltypes files
19+add_unity8_plugin(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS DashCommunicator-qml)
plugins/Unity/DashCommunicator/dashcommunicator.cppnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify 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 "dashcommunicator.h"
18+
19+#include <QObject>
20+#include <QDBusConnection>
21+#include <QDBusInterface>
22+#include <QDebug>
23+
24+DashCommunicator::DashCommunicator(QObject *parent):
25+ QObject(parent)
26+{
27+}
28+
29+DashCommunicator::~DashCommunicator()
30+{
31+}
32+
33+
34+void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool reset)
35+{
36+ QDBusConnection connection = QDBusConnection::sessionBus();
37+ QDBusInterface dashIface ("com.canonical.UnityDash",
38+ "/com/canonical/UnityDash",
39+ "",
40+ connection);
41+
42+ dashIface.call("SetCurrentScope", scopeId, animate, reset);
43+}
plugins/Unity/DashCommunicator/dashcommunicator.hnew file+35
@@ -0,0 +1,35 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify 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 DASHCOMMUNICATOR_H
18+#define DASHCOMMUNICATOR_H
19+
20+#include <QObject>
21+
22+class DashCommunicator: public QObject
23+{
24+ Q_OBJECT
25+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26+
27+public:
28+ DashCommunicator(QObject *parent = 0);
29+ ~DashCommunicator();
30+
31+public Q_SLOTS:
32+ void setCurrentScope(const QString &scopeId, bool animate, bool reset);
33+};
34+
35+#endif
plugins/Unity/DashCommunicator/dashcommunicatorservice.cppnew file+30
@@ -0,0 +1,30 @@
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 "dashcommunicatorservice.h"
18+
19+DashCommunicatorService::DashCommunicatorService(QObject *parent):
20+ QObject(parent),
21+ m_dbusService(new DBusDashCommunicatorService(this))
22+{
23+ connect(m_dbusService, &DBusDashCommunicatorService::setCurrentScopeRequested, this, &DashCommunicatorService::setCurrentScopeRequested);
24+}
25+
26+
27+DashCommunicatorService::~DashCommunicatorService()
28+{
29+
30+}
plugins/Unity/DashCommunicator/dashcommunicatorservice.hnew file+38
@@ -0,0 +1,38 @@
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+#ifndef DASHCOMMUNICATORSERVICE_H
18+#define DASHCOMMUNICATORSERVICE_H
19+
20+#include "dbusdashcommunicatorservice.h"
21+
22+#include <QObject>
23+
24+class DashCommunicatorService: public QObject
25+{
26+ Q_OBJECT
27+public:
28+ DashCommunicatorService(QObject *parent = 0);
29+ ~DashCommunicatorService();
30+
31+Q_SIGNALS:
32+ void setCurrentScopeRequested(const QString &scopeId, bool animate, bool reset);
33+
34+private:
35+ DBusDashCommunicatorService *m_dbusService;
36+};
37+
38+#endif // DBUSUNITYSESSIONSERVICE_H
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.cppnew file+39
@@ -0,0 +1,39 @@
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 "dbusdashcommunicatorservice.h"
18+
19+#include <QDBusConnection>
20+#include <QDBusInterface>
21+#include <QDebug>
22+
23+DBusDashCommunicatorService::DBusDashCommunicatorService(QObject *parent):
24+ QObject(parent)
25+{
26+ QDBusConnection connection = QDBusConnection::sessionBus();
27+
28+ connection.registerService("com.canonical.UnityDash");
29+ connection.registerObject("/com/canonical/UnityDash", this, QDBusConnection::ExportScriptableSlots);
30+}
31+
32+DBusDashCommunicatorService::~DBusDashCommunicatorService()
33+{
34+}
35+
36+void DBusDashCommunicatorService::SetCurrentScope(const QString &scopeId, bool animate, bool reset)
37+{
38+ Q_EMIT setCurrentScopeRequested(scopeId, animate, reset);
39+}
plugins/Unity/DashCommunicator/dbusdashcommunicatorservice.hnew file+39
@@ -0,0 +1,39 @@
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+#ifndef DBUSDASHCOMMUNICATORSERVICE_H
18+#define DBUSDASHCOMMUNICATORSERVICE_H
19+
20+#include <QObject>
21+
22+class DBusDashCommunicatorService: public QObject
23+{
24+ Q_OBJECT
25+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26+
27+public:
28+ DBusDashCommunicatorService(QObject *parent = 0);
29+ ~DBusDashCommunicatorService();
30+
31+Q_SIGNALS:
32+ void setCurrentScopeRequested(const QString &scopeId, bool animate, bool reset);
33+
34+public Q_SLOTS:
35+ Q_SCRIPTABLE void SetCurrentScope(const QString &scopeId, bool animate, bool reset);
36+
37+};
38+
39+#endif // DBUSUNITYSESSIONSERVICE_H
plugins/Unity/DashCommunicator/plugin.cppnew file+31
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#include "plugin.h"
20+#include "dashcommunicator.h"
21+#include "dashcommunicatorservice.h"
22+
23+#include <QDBusConnection>
24+#include <QtQml/qqml.h>
25+
26+void DashCommunicatorPlugin::registerTypes(const char *uri)
27+{
28+ Q_ASSERT(uri == QStringLiteral("Unity.DashCommunicator"));
29+ qmlRegisterType<DashCommunicatorService>(uri, 0, 1, "DashCommunicatorService");
30+ qmlRegisterType<DashCommunicator>(uri, 0, 1, "DashCommunicator");
31+}
plugins/Unity/DashCommunicator/plugin.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#ifndef DASHCOMMUNICATOR_PLUGIN_H
20+#define DASHCOMMUNICATOR_PLUGIN_H
21+
22+#include <QtQml/QQmlEngine>
23+#include <QtQml/QQmlExtensionPlugin>
24+
25+class DashCommunicatorPlugin : public QQmlExtensionPlugin
26+{
27+ Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29+
30+public:
31+ void registerTypes(const char *uri);
32+};
33+
34+#endif
plugins/Unity/DashCommunicator/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Unity.DashCommunicator
2+plugin DashCommunicator-qml
3+typeinfo DashCommunicator.qmltypes
plugins/Unity/Launcher/launchermodel.cpp+8−2
@@ -141,7 +141,8 @@ void LauncherModel::pin(const QString &appId, int index)
141 beginInsertRows(QModelIndex(), index, index);
141 beginInsertRows(QModelIndex(), index, index);
142 LauncherItem *item = new LauncherItem(appId,
142 LauncherItem *item = new LauncherItem(appId,
143 m_backend->displayName(appId),
143 m_backend->displayName(appId),
144− m_backend->icon(appId));
144+ m_backend->icon(appId),
145+ this);
145 item->setPinned(true);
146 item->setPinned(true);
146 m_list.insert(index, item);
147 m_list.insert(index, item);
147 endInsertRows();
148 endInsertRows();
@@ -316,6 +317,11 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
316 return;
317 return;
317 }
318 }
318
319
320+ if (app->appId() == "unity8-dash") {
321+ // Not adding the dash app
322+ return;
323+ }
324+
319 bool found = false;
325 bool found = false;
320 Q_FOREACH(LauncherItem *item, m_list) {
326 Q_FOREACH(LauncherItem *item, m_list) {
321 if (app->appId() == item->appId()) {
327 if (app->appId() == item->appId()) {
@@ -326,7 +332,7 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
326 if (found) {
332 if (found) {
327 // Shall we paint some running/recent app highlight? If yes, do it here.
333 // Shall we paint some running/recent app highlight? If yes, do it here.
328 } else {
334 } else {
329− LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
335+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
330 item->setRecent(true);
336 item->setRecent(true);
331 item->setFocused(app->focused());
337 item->setFocused(app->focused());
332
338
plugins/Utils/CMakeLists.txt+1
@@ -15,6 +15,7 @@ set(QMLPLUGIN_SRC
15 qsortfilterproxymodelqml.cpp
15 qsortfilterproxymodelqml.cpp
16 timeformatter.cpp
16 timeformatter.cpp
17 unitymenumodelpaths.cpp
17 unitymenumodelpaths.cpp
18+ windowkeysfilter.cpp
18 easingcurve.cpp
19 easingcurve.cpp
19 plugin.cpp
20 plugin.cpp
20 )
21 )
plugins/Utils/easingcurve.cpp+5−1
@@ -34,7 +34,11 @@ QEasingCurve::Type EasingCurve::type() const
34
34
35void EasingCurve::setType(const QEasingCurve::Type &type)
35void EasingCurve::setType(const QEasingCurve::Type &type)
36{
36{
37+ // FIXME: Working around bug https://bugreports.qt-project.org/browse/QTBUG-38686 here
38+ QEasingCurve newCurve;
37− m_easingCurve.setType(type);
39+ newCurve.setType(type);
40+ newCurve.setPeriod(m_easingCurve.period());
41+ m_easingCurve = newCurve;
38 Q_EMIT typeChanged();
42 Q_EMIT typeChanged();
39}
43}
40
44
plugins/Utils/plugin.cpp+2
@@ -30,6 +30,7 @@
30#include "qsortfilterproxymodelqml.h"
30#include "qsortfilterproxymodelqml.h"
31#include "timeformatter.h"
31#include "timeformatter.h"
32#include "unitymenumodelpaths.h"
32#include "unitymenumodelpaths.h"
33+#include "windowkeysfilter.h"
33#include "easingcurve.h"
34#include "easingcurve.h"
34
35
35void UtilsPlugin::registerTypes(const char *uri)
36void UtilsPlugin::registerTypes(const char *uri)
@@ -40,6 +41,7 @@ void UtilsPlugin::registerTypes(const char *uri)
40 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
41 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
41 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
42 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
42 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
43 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
44+ qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
43 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
45 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
44 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
46 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
45}
47}
plugins/Utils/windowkeysfilter.cppnew file+57
@@ -0,0 +1,57 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
17+ */
18+
19+#include "windowkeysfilter.h"
20+
21+#include <QQuickWindow>
22+
23+WindowKeysFilter::WindowKeysFilter(QQuickItem *parent)
24+ : QQuickItem(parent)
25+{
26+ connect(this, &QQuickItem::windowChanged,
27+ this, &WindowKeysFilter::setupFilterOnWindow);
28+}
29+
30+bool WindowKeysFilter::eventFilter(QObject *watched, QEvent *event)
31+{
32+ Q_ASSERT(!m_filteredWindow.isNull());
33+ Q_ASSERT(watched == static_cast<QObject*>(m_filteredWindow.data()));
34+
35+ if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
36+ // Let QML see this event and decide if it does not want it
37+ event->accept();
38+ QCoreApplication::sendEvent(this, event);
39+ return event->isAccepted();
40+ } else {
41+ // Not interested
42+ return false;
43+ }
44+}
45+
46+void WindowKeysFilter::setupFilterOnWindow(QQuickWindow *window)
47+{
48+ if (!m_filteredWindow.isNull()) {
49+ m_filteredWindow->removeEventFilter(this);
50+ m_filteredWindow.clear();
51+ }
52+
53+ if (window) {
54+ window->installEventFilter(this);
55+ m_filteredWindow = window;
56+ }
57+}
plugins/Utils/windowkeysfilter.hnew file+51
@@ -0,0 +1,51 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
17+ */
18+
19+#ifndef UNITY_WINDOWKEYSFILTER_H
20+#define UNITY_WINDOWKEYSFILTER_H
21+
22+#include <QQuickItem>
23+#include <QPointer>
24+
25+/*
26+ Receives all key events that arrive in the QQuickWindow where this item is placed.
27+
28+ Rejected key events will be allowed to be processed normally by the QQuickWindow whereas
29+ accepted ones will be filtered out. Events are accepted by default, so make sure you reject
30+ the keys you're not interested in.
31+
32+ If more than one WindowKeysFilter exist in the same QML scene (and thus in the same QQuickWindow)
33+ they will be called in the order of creation, which can be tricky to assess. So the best practice
34+ is to have at most one WindowKeysFilter per QML scene.
35+ */
36+class WindowKeysFilter : public QQuickItem
37+{
38+ Q_OBJECT
39+public:
40+ WindowKeysFilter(QQuickItem *parent = 0);
41+
42+ bool eventFilter(QObject *watched, QEvent *event);
43+
44+private Q_SLOTS:
45+ void setupFilterOnWindow(QQuickWindow *window);
46+
47+private:
48+ QPointer<QQuickWindow> m_filteredWindow;
49+};
50+
51+#endif // UNITY_WINDOWKEYSFILTER_H
po/am.po+30−22
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-20 18:16+0000\n"
11+"PO-Revision-Date: 2014-08-04 16:30+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-05 06:45+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17147)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +28,7 @@ msgstr "አቋራጭ መለያያ"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
31−msgstr ""
31+msgstr "መግቢያውን መዝለያ"
32
32
33#: qml/Components/EdgeDemo.qml:113
33#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
34msgid "Right edge"
@@ -36,7 +36,7 @@ msgstr "የቀኝ ጠርዝ"
36
36
37#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "ስልኩን ለመክፈት ከ ቀኝ ጠርዝ በኩል ወደ ግራ ይጥረጉ"
40
40
41#: qml/Components/EdgeDemo.qml:145
41#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
42msgid "Top edge"
@@ -44,7 +44,7 @@ msgstr "የላይ ጠርዝ"
44
44
45#: qml/Components/EdgeDemo.qml:146
45#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
46msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "ጠቋሚዎች ጋር ለመድረስ ከ ላይ ጠርዝ በኩል ወደ ታች ይጥረጉ"
48
48
49#: qml/Components/EdgeDemo.qml:171
49#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
50msgid "Close"
@@ -52,7 +52,7 @@ msgstr "መዝጊያ"
52
52
53#: qml/Components/EdgeDemo.qml:172
53#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
54msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "የማሰናጃውን መመልከቻ ለመዝጋት እንደገና ወደ ላይ ይጥረጉ"
56
56
57#: qml/Components/EdgeDemo.qml:199
57#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
58msgid "Left edge"
@@ -60,11 +60,11 @@ msgstr "የግራ ጠርዝ"
60
60
61#: qml/Components/EdgeDemo.qml:200
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "ከ ግራ በኩል ወደ ቀኝ ይጥረጉ በፍጥነት መተግበሪያዎች ጋር ለመድረስ እና ለማስጀመር"
64
64
65#: qml/Components/EdgeDemo.qml:227
65#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
66msgid "Well done"
67−msgstr ""
67+msgstr "ጥሩ አድረገዋል"
68
68
69#: qml/Components/EdgeDemo.qml:228
69#: qml/Components/EdgeDemo.qml:228
70msgid ""
70msgid ""
@@ -80,10 +80,6 @@ msgstr "የ ድንገተኛ ጥሪ"
80msgid "OK"
80msgid "OK"
81msgstr "እሺ"
81msgstr "እሺ"
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "በቅርብ የፈለጉዋቸው"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "ጨርሷል"
105msgid "See more"
101msgid "See more"
106msgstr "ተጨማሪ መመልከቻ"
102msgstr "ተጨማሪ መመልከቻ"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr "አነስተኛ መመልከቻ"
106msgstr "አነስተኛ መመልከቻ"
111
107
@@ -113,6 +109,10 @@ msgstr "አነስተኛ መመልከቻ"
113msgid "Recent"
109msgid "Recent"
114msgstr "የቅርብ ጊዜ"
110msgstr "የቅርብ ጊዜ"
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "ሁሉንም መመልከቻ"
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr "ተጨማሪ..."
118msgstr "ተጨማሪ..."
@@ -121,21 +121,21 @@ msgstr "ተጨማሪ..."
121msgid "Less..."
121msgid "Less..."
122msgstr "አነስተኛ..."
122msgstr "አነስተኛ..."
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126−msgstr ""
126+msgstr "ለዚህ ደረጃ ይስጡ"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130−msgstr ""
130+msgstr "ግምገማ መጨመሪያ"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "መላኪያ"
134msgstr "መላኪያ"
135
135
136#: qml/Greeter/Greeter.qml:157
136#: qml/Greeter/Greeter.qml:157
137msgid "Swipe to unlock"
137msgid "Swipe to unlock"
138−msgstr ""
138+msgstr "ለመክፈት ይጥረጉ"
139
139
140#: qml/Hud/HudParametrizedActionsPage.qml:132
140#: qml/Hud/HudParametrizedActionsPage.qml:132
141msgid "Confirm"
141msgid "Confirm"
@@ -165,9 +165,17 @@ msgstr "የመግቢያ ቃል ማሳያ"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "ስብሰባ"
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170−msgstr ""
178+msgstr "ወረፋ በመጠበቅ ላይ…"
171
179
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
181msgid "Downloading"
po/ar.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
11"PO-Revision-Date: 2014-05-22 08:22+0000\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
12"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
13"Language-Team: Arabic <ar@li.org>\n"
13"Language-Team: Arabic <ar@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "مكالمة طوارئ"
83msgid "OK"
83msgid "OK"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "عمليات البحث الأخيرة"
89−
90#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
91#, qt-format
87#, qt-format
92msgid "Hello %1"
88msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108msgid "See more"
104msgid "See more"
109msgstr "شاهد المزيد"
105msgstr "شاهد المزيد"
110
106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112msgid "See less"
108msgid "See less"
113msgstr "شاهد أقل"
109msgstr "شاهد أقل"
114
110
@@ -116,6 +112,10 @@ msgstr "شاهد أقل"
116msgid "Recent"
112msgid "Recent"
117msgstr "استُخدمت مؤخرًا"
113msgstr "استُخدمت مؤخرًا"
118
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120msgid "More..."
120msgid "More..."
121msgstr "المزيد..."
121msgstr "المزيد..."
@@ -124,15 +124,15 @@ msgstr "المزيد..."
124msgid "Less..."
124msgid "Less..."
125msgstr "أقل..."
125msgstr "أقل..."
126
126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128msgid "Rate this"
128msgid "Rate this"
129msgstr "قيّم ذلك"
129msgstr "قيّم ذلك"
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132msgid "Add a review"
132msgid "Add a review"
133msgstr "أضف تعليق"
133msgstr "أضف تعليق"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136msgid "Send"
136msgid "Send"
137msgstr "أرسل"
137msgstr "أرسل"
138
138
@@ -168,6 +168,14 @@ msgstr "عرض كلمة السر"
168msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
169msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة SIM"
169msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة SIM"
170
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172msgid "In queue…"
180msgid "In queue…"
173msgstr ""
181msgstr ""
po/ast.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-15 16:32+0000\n"
11+"PO-Revision-Date: 2014-07-25 16:51+0000\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
12"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Llamada d'emerxencia"
84msgid "OK"
84msgid "OK"
85msgstr "Aceutar"
85msgstr "Aceutar"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Busques recientes"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "FECHO"
109msgid "See more"
105msgid "See more"
110msgstr "Ver más"
106msgstr "Ver más"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Ver menos"
110msgstr "Ver menos"
115
111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117msgid "Recent"
113msgid "Recent"
118msgstr "Reciente"
114msgstr "Reciente"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ver too"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "Más…"
122msgstr "Más…"
@@ -125,15 +125,15 @@ msgstr "Más…"
125msgid "Less..."
125msgid "Less..."
126msgstr "Menos…"
126msgstr "Menos…"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Valorar esto"
130msgstr "Valorar esto"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Amestar una reseña"
134msgstr "Amestar una reseña"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Unviar"
138msgstr "Unviar"
139
139
@@ -169,6 +169,14 @@ msgstr "Amosar contraseña"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Escribi'l PIN de la SIM"
170msgstr "Escribi'l PIN de la SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Tocar pa tornar a la llamada..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Conferencia"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174msgstr "N'espera…"
182msgstr "N'espera…"
po/az.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-15 09:50+0000\n"
11"PO-Revision-Date: 2014-01-15 09:50+0000\n"
12"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
12"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
13"Language-Team: Azerbaijani <az@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -81,10 +81,6 @@ msgstr "Zərurət zəngi"
81msgid "OK"
81msgid "OK"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/PageHeader.qml:366
85−msgid "Recent searches"
86−msgstr "Son axtarışlar"
87−
88#: qml/Components/PassphraseLockscreen.qml:60
84#: qml/Components/PassphraseLockscreen.qml:60
89#, qt-format
85#, qt-format
90msgid "Hello %1"
86msgid "Hello %1"
@@ -106,7 +102,7 @@ msgstr ""
106msgid "See more"
102msgid "See more"
107msgstr ""
103msgstr ""
108
104
109−#: qml/Components/SeeMore.qml:58
105+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
110msgid "See less"
106msgid "See less"
111msgstr ""
107msgstr ""
112
108
@@ -114,6 +110,10 @@ msgstr ""
114msgid "Recent"
110msgid "Recent"
115msgstr ""
111msgstr ""
116
112
113+#: qml/Dash/GenericScopeView.qml:330
114+msgid "See all"
115+msgstr ""
116+
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
118msgid "More..."
118msgid "More..."
119msgstr ""
119msgstr ""
@@ -122,15 +122,15 @@ msgstr ""
122msgid "Less..."
122msgid "Less..."
123msgstr ""
123msgstr ""
124
124
125−#: qml/Dash/Previews/PreviewRatingInput.qml:82
125+#: qml/Dash/Previews/PreviewRatingInput.qml:81
126msgid "Rate this"
126msgid "Rate this"
127msgstr "Qiymət ver"
127msgstr "Qiymət ver"
128
128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:128
129+#: qml/Dash/Previews/PreviewRatingInput.qml:126
130msgid "Add a review"
130msgid "Add a review"
131msgstr "Rəy yaz"
131msgstr "Rəy yaz"
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:168
133+#: qml/Dash/Previews/PreviewRatingInput.qml:166
134msgid "Send"
134msgid "Send"
135msgstr "Göndər"
135msgstr "Göndər"
136
136
@@ -166,6 +166,14 @@ msgstr "Parolu göstər"
166msgid "Please enter SIM PIN"
166msgid "Please enter SIM PIN"
167msgstr ""
167msgstr ""
168
168
169+#: qml/Panel/ActiveCallHint.qml:77
170+msgid "Tap to return to call..."
171+msgstr ""
172+
173+#: qml/Panel/ActiveCallHint.qml:90
174+msgid "Conference"
175+msgstr ""
176+
169#: qml/Panel/Indicators/MenuItemFactory.qml:583
177#: qml/Panel/Indicators/MenuItemFactory.qml:583
170msgid "In queue…"
178msgid "In queue…"
171msgstr ""
179msgstr ""
po/bg.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
11"PO-Revision-Date: 2014-04-01 14:08+0000\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
12"Last-Translator: Atanas Kovachki <Unknown>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
13"Language-Team: Bulgarian <bg@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Спешно повикване"
87msgid "OK"
87msgid "OK"
88msgstr ""
88msgstr ""
89
89
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Последни търсения"
93−
94#: qml/Components/PassphraseLockscreen.qml:60
90#: qml/Components/PassphraseLockscreen.qml:60
95#, qt-format
91#, qt-format
96msgid "Hello %1"
92msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr ""
112msgid "See more"
108msgid "See more"
113msgstr ""
109msgstr ""
114
110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116msgid "See less"
112msgid "See less"
117msgstr ""
113msgstr ""
118
114
@@ -120,6 +116,10 @@ msgstr ""
120msgid "Recent"
116msgid "Recent"
121msgstr "Последни"
117msgstr "Последни"
122
118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr ""
122+
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124msgid "More..."
124msgid "More..."
125msgstr ""
125msgstr ""
@@ -128,15 +128,15 @@ msgstr ""
128msgid "Less..."
128msgid "Less..."
129msgstr "По-малко..."
129msgstr "По-малко..."
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132msgid "Rate this"
132msgid "Rate this"
133msgstr "Оценете това"
133msgstr "Оценете това"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136msgid "Add a review"
136msgid "Add a review"
137msgstr "Добави отзив"
137msgstr "Добави отзив"
138
138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140msgid "Send"
140msgid "Send"
141msgstr "Изпрати"
141msgstr "Изпрати"
142
142
@@ -172,6 +172,14 @@ msgstr "Покажи паролата"
172msgid "Please enter SIM PIN"
172msgid "Please enter SIM PIN"
173msgstr ""
173msgstr ""
174
174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr ""
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr ""
182+
175#: qml/Panel/Indicators/MenuItemFactory.qml:583
183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176msgid "In queue…"
184msgid "In queue…"
177msgstr ""
185msgstr ""
po/br.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-15 06:44+0000\n"
11+"PO-Revision-Date: 2014-07-28 06:44+0000\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
12"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
13"Language-Team: Breton <br@li.org>\n"
13"Language-Team: Breton <br@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-29 06:54+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Pellgomzadenn vallus"
87msgid "OK"
87msgid "OK"
88msgstr "Mat eo"
88msgstr "Mat eo"
89
89
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Enklaskoù graet nevez zo"
93−
94#: qml/Components/PassphraseLockscreen.qml:60
90#: qml/Components/PassphraseLockscreen.qml:60
95#, qt-format
91#, qt-format
96msgid "Hello %1"
92msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr "ECHU"
112msgid "See more"
108msgid "See more"
113msgstr "Gwelet muioc'h"
109msgstr "Gwelet muioc'h"
114
110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116msgid "See less"
112msgid "See less"
117msgstr "Gwelet nebeutoc'h"
113msgstr "Gwelet nebeutoc'h"
118
114
@@ -120,6 +116,10 @@ msgstr "Gwelet nebeutoc'h"
120msgid "Recent"
116msgid "Recent"
121msgstr "Nevez zo"
117msgstr "Nevez zo"
122
118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Gwelet pep tra"
122+
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124msgid "More..."
124msgid "More..."
125msgstr "Muioc'h..."
125msgstr "Muioc'h..."
@@ -128,15 +128,15 @@ msgstr "Muioc'h..."
128msgid "Less..."
128msgid "Less..."
129msgstr "Nebeutoc'h..."
129msgstr "Nebeutoc'h..."
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132msgid "Rate this"
132msgid "Rate this"
133msgstr "Priziit an dra-mañ"
133msgstr "Priziit an dra-mañ"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136msgid "Add a review"
136msgid "Add a review"
137msgstr "Ouzhpennañ un ali"
137msgstr "Ouzhpennañ un ali"
138
138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140msgid "Send"
140msgid "Send"
141msgstr "Kas"
141msgstr "Kas"
142
142
@@ -172,6 +172,14 @@ msgstr "Diskouez ar ger-tremen"
172msgid "Please enter SIM PIN"
172msgid "Please enter SIM PIN"
173msgstr "Ebarzhit kod PIN ho kartenn SIM, mar plij"
173msgstr "Ebarzhit kod PIN ho kartenn SIM, mar plij"
174
174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Kendiviz"
182+
175#: qml/Panel/Indicators/MenuItemFactory.qml:583
183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176msgid "In queue…"
184msgid "In queue…"
177msgstr "El lostennad..."
185msgstr "El lostennad..."
po/bs.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
11"PO-Revision-Date: 2014-01-16 22:33+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
13"Language-Team: Bosnian <bs@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/ca.po+28−20
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-06-13 07:47+0000\n"
11+"PO-Revision-Date: 2014-07-25 10:21+0000\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
12"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
13"Language-Team: Catalan <ca@li.org>\n"
13"Language-Team: Catalan <ca@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Enganxa la drecera"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Desenganxa la drecera"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -88,10 +88,6 @@ msgstr "Trucada d'emergència"
88msgid "OK"
88msgid "OK"
89msgstr "D'acord"
89msgstr "D'acord"
90
90
91−#: qml/Components/PageHeader.qml:366
92−msgid "Recent searches"
93−msgstr "Cerques recents"
94−
95#: qml/Components/PassphraseLockscreen.qml:60
91#: qml/Components/PassphraseLockscreen.qml:60
96#, qt-format
92#, qt-format
97msgid "Hello %1"
93msgid "Hello %1"
@@ -113,7 +109,7 @@ msgstr "Fet"
113msgid "See more"
109msgid "See more"
114msgstr "Mostra'n més"
110msgstr "Mostra'n més"
115
111
116−#: qml/Components/SeeMore.qml:58
112+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
117msgid "See less"
113msgid "See less"
118msgstr "Mostra'n menys"
114msgstr "Mostra'n menys"
119
115
@@ -121,6 +117,10 @@ msgstr "Mostra'n menys"
121msgid "Recent"
117msgid "Recent"
122msgstr "Recents"
118msgstr "Recents"
123
119
120+#: qml/Dash/GenericScopeView.qml:330
121+msgid "See all"
122+msgstr "Mostra-ho tot"
123+
124#: qml/Dash/Previews/PreviewActionCombo.qml:34
124#: qml/Dash/Previews/PreviewActionCombo.qml:34
125msgid "More..."
125msgid "More..."
126msgstr "Més..."
126msgstr "Més..."
@@ -129,15 +129,15 @@ msgstr "Més..."
129msgid "Less..."
129msgid "Less..."
130msgstr "Menys..."
130msgstr "Menys..."
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:82
132+#: qml/Dash/Previews/PreviewRatingInput.qml:81
133msgid "Rate this"
133msgid "Rate this"
134msgstr "Puntueu-ho"
134msgstr "Puntueu-ho"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:128
136+#: qml/Dash/Previews/PreviewRatingInput.qml:126
137msgid "Add a review"
137msgid "Add a review"
138msgstr "Afegiu una ressenya"
138msgstr "Afegiu una ressenya"
139
139
140−#: qml/Dash/Previews/PreviewRatingInput.qml:168
140+#: qml/Dash/Previews/PreviewRatingInput.qml:166
141msgid "Send"
141msgid "Send"
142msgstr "Envia"
142msgstr "Envia"
143
143
@@ -173,29 +173,37 @@ msgstr "Mostra la contrasenya"
173msgid "Please enter SIM PIN"
173msgid "Please enter SIM PIN"
174msgstr "Introduïu el PIN de la targeta SIM"
174msgstr "Introduïu el PIN de la targeta SIM"
175
175
176+#: qml/Panel/ActiveCallHint.qml:77
177+msgid "Tap to return to call..."
178+msgstr "Feu un toc per tornar a la trucada..."
179+
180+#: qml/Panel/ActiveCallHint.qml:90
181+msgid "Conference"
182+msgstr "Conferència"
183+
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
184#: qml/Panel/Indicators/MenuItemFactory.qml:583
177msgid "In queue…"
185msgid "In queue…"
178−msgstr ""
186+msgstr "A la cua..."
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:587
188#: qml/Panel/Indicators/MenuItemFactory.qml:587
181msgid "Downloading"
189msgid "Downloading"
182−msgstr ""
190+msgstr "S'està baixant"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:589
192#: qml/Panel/Indicators/MenuItemFactory.qml:589
185msgid "Paused, tap to resume"
193msgid "Paused, tap to resume"
186−msgstr ""
194+msgstr "En pausa, feu un toc per continuar"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:591
196#: qml/Panel/Indicators/MenuItemFactory.qml:591
189msgid "Canceled"
197msgid "Canceled"
190−msgstr ""
198+msgstr "S'ha cancel·lat"
191
199
192#: qml/Panel/Indicators/MenuItemFactory.qml:593
200#: qml/Panel/Indicators/MenuItemFactory.qml:593
193msgid "Finished"
201msgid "Finished"
194−msgstr ""
202+msgstr "S'ha finalitzat"
195
203
196#: qml/Panel/Indicators/MenuItemFactory.qml:595
204#: qml/Panel/Indicators/MenuItemFactory.qml:595
197msgid "Failed, tap to retry"
205msgid "Failed, tap to retry"
198−msgstr ""
206+msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
199
207
200#: qml/Panel/SearchIndicator.qml:27
208#: qml/Panel/SearchIndicator.qml:27
201msgid "Search"
209msgid "Search"
po/ckb.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
11"PO-Revision-Date: 2014-01-21 11:05+0000\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
12"Last-Translator: Aras <aras.noori@gmail.com>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
13"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "هێڵی فریاگوزاری"
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "دوایین گەڕانەکان"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "پلە دابنی بۆی"
126msgstr "پلە دابنی بۆی"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "پێداچوونەوە زۆر بکە"
130msgstr "پێداچوونەوە زۆر بکە"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "ناردن"
134msgstr "ناردن"
135
135
@@ -165,6 +165,14 @@ msgstr "تێپەڕەوشە پیشان بدە"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/cs.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
11"PO-Revision-Date: 2014-01-08 10:11+0000\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
12"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
13"Language-Team: Czech <cs@li.org>\n"
13"Language-Team: Czech <cs@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "Tísňové volání"
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Poslední vyhledávání"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "Ohodnoťte to"
126msgstr "Ohodnoťte to"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "Přidat recenzi"
130msgstr "Přidat recenzi"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "Odeslat"
134msgstr "Odeslat"
135
135
@@ -165,6 +165,14 @@ msgstr "Zobrazit heslo"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/da.po+68−57
@@ -1,199 +1,210 @@
1# Danish translation for unity8
1# Danish translation for unity8
2# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
2# Copyright (c) 2014 Rosetta Contributors and Canonical Ltd 2014
3# This file is distributed under the same license as the unity8 package.
3# This file is distributed under the same license as the unity8 package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
4+#
5+# Ask Hjorth Larsen <asklarsen@gmail.com>, 2014.
5#
6#
6msgid ""
7msgid ""
7msgstr ""
8msgstr ""
8"Project-Id-Version: unity8\n"
9"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-01-14 20:16+0000\n"
12+"PO-Revision-Date: 2014-07-30 12:37+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13+"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
13−"Language-Team: Danish <da@li.org>\n"
14+"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
14"MIME-Version: 1.0\n"
15"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
19+"X-Generator: Launchpad (build 17131)\n"
19
20
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
23msgid "Pin shortcut"
23−msgstr ""
24+msgstr "Fastgør genvej"
24
25
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
27msgid "Unpin shortcut"
27−msgstr ""
28+msgstr "Gør genvej flytbar"
28
29
29#: qml/Components/EdgeDemoOverlay.qml:151
30#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
31msgid "Skip intro"
31−msgstr ""
32+msgstr "Spring intro over"
32
33
33#: qml/Components/EdgeDemo.qml:113
34#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
35msgid "Right edge"
35−msgstr ""
36+msgstr "Højre kant"
36
37
37#: qml/Components/EdgeDemo.qml:114
38#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
39msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
40+msgstr "Prøv at stryge fra højre kant for at låse telefonen op"
40
41
41#: qml/Components/EdgeDemo.qml:145
42#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
43msgid "Top edge"
43−msgstr ""
44+msgstr "Øvre kant"
44
45
45#: qml/Components/EdgeDemo.qml:146
46#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
47msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
48+msgstr "Prøv at stryge fra den øvre kant for at tilgå indikatorerne"
48
49
49#: qml/Components/EdgeDemo.qml:171
50#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
51msgid "Close"
51−msgstr ""
52+msgstr "Luk"
52
53
53#: qml/Components/EdgeDemo.qml:172
54#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
55msgid "Swipe up again to close the settings screen"
55−msgstr ""
56+msgstr "Stryg op igen for at låse indstillingsskærmen"
56
57
57#: qml/Components/EdgeDemo.qml:199
58#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
59msgid "Left edge"
59−msgstr ""
60+msgstr "Venstre kant"
60
61
61#: qml/Components/EdgeDemo.qml:200
62#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
64+msgstr "Stryg fra venstre for at vise opstarteren med hurtig adgang til apps"
64
65
65#: qml/Components/EdgeDemo.qml:227
66#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
67msgid "Well done"
67−msgstr ""
68+msgstr "Godt gjort"
68
69
69#: qml/Components/EdgeDemo.qml:228
70#: qml/Components/EdgeDemo.qml:228
70msgid ""
71msgid ""
71"You have now mastered the edge gestures and can start using the "
72"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
73msgstr ""
74msgstr ""
75+"Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
76+"på skærmen for at starte"
74
77
75#: qml/Components/Lockscreen.qml:214
78#: qml/Components/Lockscreen.qml:214
76msgid "Emergency Call"
79msgid "Emergency Call"
77−msgstr ""
80+msgstr "Nødopkald"
78
81
79#: qml/Components/Lockscreen.qml:231
82#: qml/Components/Lockscreen.qml:231
80msgid "OK"
83msgid "OK"
81−msgstr ""
84+msgstr "O.k."
82−
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86
85
87#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
87#, qt-format
89msgid "Hello %1"
88msgid "Hello %1"
90−msgstr ""
89+msgstr "Hej %1"
91
90
92#: qml/Components/PassphraseLockscreen.qml:60
91#: qml/Components/PassphraseLockscreen.qml:60
93msgid "Hello"
92msgid "Hello"
94−msgstr ""
93+msgstr "Hej"
95
94
96#: qml/Components/PinLockscreen.qml:198
95#: qml/Components/PinLockscreen.qml:198
97msgid "CANCEL"
96msgid "CANCEL"
98−msgstr ""
97+msgstr "ANNULLÉR"
99
98
100#: qml/Components/PinLockscreen.qml:216
99#: qml/Components/PinLockscreen.qml:216
101msgid "DONE"
100msgid "DONE"
102−msgstr ""
101+msgstr "FÆRDIG"
103
102
104#: qml/Components/SeeMore.qml:35
103#: qml/Components/SeeMore.qml:35
105msgid "See more"
104msgid "See more"
106−msgstr ""
105+msgstr "Vis mere"
107
106
108−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
108msgid "See less"
110−msgstr ""
109+msgstr "Vis mindre"
111
110
112#: qml/Dash/DashApps.qml:37
111#: qml/Dash/DashApps.qml:37
113msgid "Recent"
112msgid "Recent"
114−msgstr ""
113+msgstr "Seneste"
114+
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Se alle"
115
118
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
120msgid "More..."
118−msgstr ""
121+msgstr "Mere..."
119
122
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "Less..."
124msgid "Less..."
122−msgstr ""
125+msgstr "Mindre..."
123
126
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
128msgid "Rate this"
126−msgstr ""
129+msgstr "Bedøm dette"
127
130
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
132msgid "Add a review"
130−msgstr ""
133+msgstr "Tilføj en forhåndsvisning"
131
134
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
136msgid "Send"
134−msgstr ""
137+msgstr "Send"
135
138
136#: qml/Greeter/Greeter.qml:157
139#: qml/Greeter/Greeter.qml:157
137msgid "Swipe to unlock"
140msgid "Swipe to unlock"
138−msgstr ""
141+msgstr "Stryg for at låse op"
139
142
140#: qml/Hud/HudParametrizedActionsPage.qml:132
143#: qml/Hud/HudParametrizedActionsPage.qml:132
141msgid "Confirm"
144msgid "Confirm"
142−msgstr ""
145+msgstr "Bekræft"
143
146
144#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
147#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
145msgid "Type or say a command"
148msgid "Type or say a command"
146−msgstr ""
149+msgstr "Skriv eller indtal en kommando"
147
150
148#: qml/Hud/Hud.qml:84
151#: qml/Hud/Hud.qml:84
149msgid "Loading. Please Wait..."
152msgid "Loading. Please Wait..."
150−msgstr ""
153+msgstr "Indlæser. Vent venligst..."
151
154
152#: qml/Hud/Hud.qml:89
155#: qml/Hud/Hud.qml:89
153msgid "Speak Now..."
156msgid "Speak Now..."
154−msgstr ""
157+msgstr "Tal nu..."
155
158
156#: qml/Hud/Hud.qml:94
159#: qml/Hud/Hud.qml:94
157msgid "Speaking..."
160msgid "Speaking..."
158−msgstr ""
161+msgstr "Taler..."
159
162
160#: qml/Notifications/NotificationMenuItemFactory.qml:91
163#: qml/Notifications/NotificationMenuItemFactory.qml:91
161msgid "Show password"
164msgid "Show password"
162−msgstr ""
165+msgstr "Vis adgangskode"
163
166
164#: qml/Notifications/NotificationMenuItemFactory.qml:103
167#: qml/Notifications/NotificationMenuItemFactory.qml:103
165msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
166−msgstr ""
169+msgstr "Indtast venligst PIN for SIM"
170+
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tryk for at besvare opkaldet..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Konference"
167
178
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
180msgid "In queue…"
170−msgstr ""
181+msgstr "I kø…"
171
182
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
183#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
184msgid "Downloading"
174−msgstr ""
185+msgstr "Henter"
175
186
176#: qml/Panel/Indicators/MenuItemFactory.qml:589
187#: qml/Panel/Indicators/MenuItemFactory.qml:589
177msgid "Paused, tap to resume"
188msgid "Paused, tap to resume"
178−msgstr ""
189+msgstr "På pause; tryk for at fortsætte"
179
190
180#: qml/Panel/Indicators/MenuItemFactory.qml:591
191#: qml/Panel/Indicators/MenuItemFactory.qml:591
181msgid "Canceled"
192msgid "Canceled"
182−msgstr ""
193+msgstr "Annulleret"
183
194
184#: qml/Panel/Indicators/MenuItemFactory.qml:593
195#: qml/Panel/Indicators/MenuItemFactory.qml:593
185msgid "Finished"
196msgid "Finished"
186−msgstr ""
197+msgstr "Færdig"
187
198
188#: qml/Panel/Indicators/MenuItemFactory.qml:595
199#: qml/Panel/Indicators/MenuItemFactory.qml:595
189msgid "Failed, tap to retry"
200msgid "Failed, tap to retry"
190−msgstr ""
201+msgstr "Mislykkedes; tryk for at prøve igen"
191
202
192#: qml/Panel/SearchIndicator.qml:27
203#: qml/Panel/SearchIndicator.qml:27
193msgid "Search"
204msgid "Search"
194−msgstr ""
205+msgstr "Søg"
195
206
196#: qml/Shell.qml:359
207#: qml/Shell.qml:359
197#, qt-format
208#, qt-format
198msgid "Please enter %1"
209msgid "Please enter %1"
199−msgstr ""
210+msgstr "Indtast venligst %1"
po/de.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-15 13:20+0000\n"
11+"PO-Revision-Date: 2014-08-08 08:58+0000\n"
12−"Last-Translator: Phillip Sz <Unknown>\n"
12+"Last-Translator: Martin Pitt <martin.pitt@ubuntu.com>\n"
13"Language-Team: German <de@li.org>\n"
13"Language-Team: German <de@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-09 05:48+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Notruf"
85msgid "OK"
85msgid "OK"
86msgstr "OK"
86msgstr "OK"
87
87
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Zuletzt verwendete Suchbegriffe"
91−
92#: qml/Components/PassphraseLockscreen.qml:60
88#: qml/Components/PassphraseLockscreen.qml:60
93#, qt-format
89#, qt-format
94msgid "Hello %1"
90msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "ERLEDIGT"
110msgid "See more"
106msgid "See more"
111msgstr "Mehr ansehen"
107msgstr "Mehr ansehen"
112
108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114msgid "See less"
110msgid "See less"
115msgstr "Weniger ansehen"
111msgstr "Weniger ansehen"
116
112
@@ -118,6 +114,10 @@ msgstr "Weniger ansehen"
118msgid "Recent"
114msgid "Recent"
119msgstr "Kürzlich"
115msgstr "Kürzlich"
120
116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Alle anzeigen"
120+
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122msgid "More..."
122msgid "More..."
123msgstr "Mehr …"
123msgstr "Mehr …"
@@ -126,15 +126,15 @@ msgstr "Mehr …"
126msgid "Less..."
126msgid "Less..."
127msgstr "Weniger …"
127msgstr "Weniger …"
128
128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130msgid "Rate this"
130msgid "Rate this"
131msgstr "Bewerten"
131msgstr "Bewerten"
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134msgid "Add a review"
134msgid "Add a review"
135msgstr "Bewertung hinzufügen"
135msgstr "Bewertung hinzufügen"
136
136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138msgid "Send"
138msgid "Send"
139msgstr "Senden"
139msgstr "Senden"
140
140
@@ -170,6 +170,14 @@ msgstr "Passwort anzeigen"
170msgid "Please enter SIM PIN"
170msgid "Please enter SIM PIN"
171msgstr "Bitte die PIN der SIM eingeben"
171msgstr "Bitte die PIN der SIM eingeben"
172
172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Tippen um zum Anruf zurückzugehen"
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Konferenz"
180+
173#: qml/Panel/Indicators/MenuItemFactory.qml:583
181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174msgid "In queue…"
182msgid "In queue…"
175msgstr "In Warteschlange …"
183msgstr "In Warteschlange …"
po/el.po+36−28
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-02-26 09:58+0000\n"
11+"PO-Revision-Date: 2014-08-08 13:03+0000\n"
12−"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
12+"Last-Translator: Simos Xenitellis <Unknown>\n"
13"Language-Team: Greek <el@li.org>\n"
13"Language-Team: Greek <el@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-09 05:48+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Καρφίτσωμα συντόμευσης"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Ξεκαρφίτσωμα συντόμευσης"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -82,11 +82,7 @@ msgstr "Κλήση έκτακτης ανάγκης"
82
82
83#: qml/Components/Lockscreen.qml:231
83#: qml/Components/Lockscreen.qml:231
84msgid "OK"
84msgid "OK"
85−msgstr ""
85+msgstr "OK"
86−
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Πρόσφατες αναζητήσεις"
90
86
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
@@ -99,47 +95,51 @@ msgstr "Γεια σας"
99
95
100#: qml/Components/PinLockscreen.qml:198
96#: qml/Components/PinLockscreen.qml:198
101msgid "CANCEL"
97msgid "CANCEL"
102−msgstr ""
98+msgstr "ΑΚΥΡΩΣΗ"
103
99
104#: qml/Components/PinLockscreen.qml:216
100#: qml/Components/PinLockscreen.qml:216
105msgid "DONE"
101msgid "DONE"
106−msgstr ""
102+msgstr "ΟΛΟΚΛΗΡΩΣΗ"
107
103
108#: qml/Components/SeeMore.qml:35
104#: qml/Components/SeeMore.qml:35
109msgid "See more"
105msgid "See more"
110msgstr "Περρισότερα"
106msgstr "Περρισότερα"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Λιγότερα"
110msgstr "Λιγότερα"
115
111
116#: qml/Dash/DashApps.qml:37
112#: qml/Dash/DashApps.qml:37
117msgid "Recent"
113msgid "Recent"
118−msgstr ""
114+msgstr "Πρόσφατα"
115+
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Εμφάνιση όλων"
119
119
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122−msgstr ""
122+msgstr "Περισσότερα..."
123
123
124#: qml/Dash/Previews/PreviewActionCombo.qml:34
124#: qml/Dash/Previews/PreviewActionCombo.qml:34
125msgid "Less..."
125msgid "Less..."
126−msgstr ""
126+msgstr "Λιγότερα..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Βαθμολογήστε το"
130msgstr "Βαθμολογήστε το"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Προσθέστε την αξιολόγησή σας"
134msgstr "Προσθέστε την αξιολόγησή σας"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Αποστολή"
138msgstr "Αποστολή"
139
139
140#: qml/Greeter/Greeter.qml:157
140#: qml/Greeter/Greeter.qml:157
141msgid "Swipe to unlock"
141msgid "Swipe to unlock"
142−msgstr ""
142+msgstr "Σύρετε για να ξεκλειδώσετε"
143
143
144#: qml/Hud/HudParametrizedActionsPage.qml:132
144#: qml/Hud/HudParametrizedActionsPage.qml:132
145msgid "Confirm"
145msgid "Confirm"
@@ -169,29 +169,37 @@ msgstr "Εμφάνιση κωδικού"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
170msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Πατήστε για να γυρίσετε στην κλήση..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Συνδιάσκεψη"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174−msgstr ""
182+msgstr "Στην ουρά..."
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
184#: qml/Panel/Indicators/MenuItemFactory.qml:587
177msgid "Downloading"
185msgid "Downloading"
178−msgstr ""
186+msgstr "Λήψη σε εξέλιξη"
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:589
188#: qml/Panel/Indicators/MenuItemFactory.qml:589
181msgid "Paused, tap to resume"
189msgid "Paused, tap to resume"
182−msgstr ""
190+msgstr "Σταματημένο, αγγίξτε για συνέχιση"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:591
192#: qml/Panel/Indicators/MenuItemFactory.qml:591
185msgid "Canceled"
193msgid "Canceled"
186−msgstr ""
194+msgstr "Ακυρώθηκε"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:593
196#: qml/Panel/Indicators/MenuItemFactory.qml:593
189msgid "Finished"
197msgid "Finished"
190−msgstr ""
198+msgstr "Ολοκληρώθηκε"
191
199
192#: qml/Panel/Indicators/MenuItemFactory.qml:595
200#: qml/Panel/Indicators/MenuItemFactory.qml:595
193msgid "Failed, tap to retry"
201msgid "Failed, tap to retry"
194−msgstr ""
202+msgstr "Αποτυχία, πατήστε για να ξαναπροσπαθήσετε"
195
203
196#: qml/Panel/SearchIndicator.qml:27
204#: qml/Panel/SearchIndicator.qml:27
197msgid "Search"
205msgid "Search"
po/en_AU.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-18 10:38+0000\n"
11+"PO-Revision-Date: 2014-07-27 12:14+0000\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
12"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
13"Language-Team: English (Australia) <en_AU@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Emergency Call"
82msgid "OK"
82msgid "OK"
83msgstr "OK"
83msgstr "OK"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recent searches"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "DONE"
107msgid "See more"
103msgid "See more"
108msgstr "See more"
104msgstr "See more"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "See less"
108msgstr "See less"
113
109
@@ -115,6 +111,10 @@ msgstr "See less"
115msgid "Recent"
111msgid "Recent"
116msgstr "Recent"
112msgstr "Recent"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "See all"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "More..."
120msgstr "More..."
@@ -123,15 +123,15 @@ msgstr "More..."
123msgid "Less..."
123msgid "Less..."
124msgstr "Less..."
124msgstr "Less..."
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "Rate this"
128msgstr "Rate this"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "Add a review"
132msgstr "Add a review"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "Send"
136msgstr "Send"
137
137
@@ -167,6 +167,14 @@ msgstr "Show password"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "Please enter SIM PIN"
168msgstr "Please enter SIM PIN"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tap to return to call..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Conference"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "In queue…"
180msgstr "In queue…"
po/en_GB.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-10 10:59+0000\n"
11+"PO-Revision-Date: 2014-07-27 14:09+0000\n"
12"Last-Translator: Alan Pope ㋛ <alan@ubuntu.com>\n"
12"Last-Translator: Alan Pope ㋛ <alan@ubuntu.com>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
13"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-11 06:15+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Emergency Call"
82msgid "OK"
82msgid "OK"
83msgstr "OK"
83msgstr "OK"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recent searches"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "DONE"
107msgid "See more"
103msgid "See more"
108msgstr "See more"
104msgstr "See more"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "See less"
108msgstr "See less"
113
109
@@ -115,6 +111,10 @@ msgstr "See less"
115msgid "Recent"
111msgid "Recent"
116msgstr "Recent"
112msgstr "Recent"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "See all"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "More..."
120msgstr "More..."
@@ -123,15 +123,15 @@ msgstr "More..."
123msgid "Less..."
123msgid "Less..."
124msgstr "Less..."
124msgstr "Less..."
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "Rate this"
128msgstr "Rate this"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "Add a review"
132msgstr "Add a review"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "Send"
136msgstr "Send"
137
137
@@ -167,6 +167,14 @@ msgstr "Show password"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "Please enter SIM PIN"
168msgstr "Please enter SIM PIN"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tap to return to call..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Conference"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "In queue…"
180msgstr "In queue…"
po/eo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/es.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-12 05:24+0000\n"
11+"PO-Revision-Date: 2014-08-06 15:24+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
12+"Last-Translator: Leo Arias <leo.arias@canonical.com>\n"
13"Language-Team: Spanish <es@li.org>\n"
13"Language-Team: Spanish <es@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-13 06:33+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-08 07:07+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Llamada de emergencia"
85msgid "OK"
85msgid "OK"
86msgstr "Aceptar"
86msgstr "Aceptar"
87
87
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Búsquedas recientes"
91−
92#: qml/Components/PassphraseLockscreen.qml:60
88#: qml/Components/PassphraseLockscreen.qml:60
93#, qt-format
89#, qt-format
94msgid "Hello %1"
90msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "HECHO"
110msgid "See more"
106msgid "See more"
111msgstr "Ver más"
107msgstr "Ver más"
112
108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114msgid "See less"
110msgid "See less"
115msgstr "Ver menos"
111msgstr "Ver menos"
116
112
@@ -118,6 +114,10 @@ msgstr "Ver menos"
118msgid "Recent"
114msgid "Recent"
119msgstr "Recientes"
115msgstr "Recientes"
120
116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Ver todas"
120+
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122msgid "More..."
122msgid "More..."
123msgstr "Más…"
123msgstr "Más…"
@@ -126,15 +126,15 @@ msgstr "Más…"
126msgid "Less..."
126msgid "Less..."
127msgstr "Menos…"
127msgstr "Menos…"
128
128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130msgid "Rate this"
130msgid "Rate this"
131msgstr "Valorar esto"
131msgstr "Valorar esto"
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134msgid "Add a review"
134msgid "Add a review"
135msgstr "Añadir una reseña"
135msgstr "Añadir una reseña"
136
136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138msgid "Send"
138msgid "Send"
139msgstr "Enviar"
139msgstr "Enviar"
140
140
@@ -170,6 +170,14 @@ msgstr "Mostrar contraseña"
170msgid "Please enter SIM PIN"
170msgid "Please enter SIM PIN"
171msgstr "Escriba el PIN de la SIM"
171msgstr "Escriba el PIN de la SIM"
172
172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Toque para volver a llamar..."
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Conferencia"
180+
173#: qml/Panel/Indicators/MenuItemFactory.qml:583
181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174msgid "In queue…"
182msgid "In queue…"
175msgstr "En espera…"
183msgstr "En espera…"
po/eu.po+24−15
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-16 18:11+0000\n"
11+"PO-Revision-Date: 2014-08-06 22:51+0000\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
12"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
13"Language-Team: Basque <eu@li.org>\n"
13"Language-Team: Basque <eu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-08 07:07+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -36,7 +36,8 @@ msgstr "Eskuineko ertza"
36
36
37#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
39+msgstr ""
39−msgstr "Probatu eskuineko ertzetik arrastatzen telefonoa desblokeatzeko"
40+"Pasatu hatza eskuineko ertzetik ezkerrerantz telefonoa desblokeatzeko"
40
41
41#: qml/Components/EdgeDemo.qml:145
42#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
43msgid "Top edge"
@@ -44,7 +45,7 @@ msgstr "Goiko ertza"
44
45
45#: qml/Components/EdgeDemo.qml:146
46#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
47msgid "Try swiping from the top edge to access the indicators"
47−msgstr "Probatu goiko ertzetik arrastatzen adierazleak ikusteko"
48+msgstr "Pasatu hatza goiko ertzetik beherantz adierazleak ikusteko"
48
49
49#: qml/Components/EdgeDemo.qml:171
50#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
51msgid "Close"
@@ -52,7 +53,7 @@ msgstr "Itxi"
52
53
53#: qml/Components/EdgeDemo.qml:172
54#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
55msgid "Swipe up again to close the settings screen"
55−msgstr "Pasatu hatza gora berriro ezarpenen leihoa ixteko"
56+msgstr "Pasatu hatza berriro gora ezarpenen leihoa ixteko"
56
57
57#: qml/Components/EdgeDemo.qml:199
58#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
59msgid "Left edge"
@@ -84,10 +85,6 @@ msgstr "Larrialdi-deia"
84msgid "OK"
85msgid "OK"
85msgstr "Ados"
86msgstr "Ados"
86
87
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Azken bilaketak"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
88#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
89#, qt-format
93msgid "Hello %1"
90msgid "Hello %1"
@@ -109,7 +106,7 @@ msgstr "EGINDA"
109msgid "See more"
106msgid "See more"
110msgstr "Ikusi gehiago"
107msgstr "Ikusi gehiago"
111
108
112−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
110msgid "See less"
114msgstr "Ikusi gutxiago"
111msgstr "Ikusi gutxiago"
115
112
@@ -117,6 +114,10 @@ msgstr "Ikusi gutxiago"
117msgid "Recent"
114msgid "Recent"
118msgstr "Azkenak"
115msgstr "Azkenak"
119
116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Ikusi guztiak"
120+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
122msgid "More..."
122msgstr "Gehiago..."
123msgstr "Gehiago..."
@@ -125,15 +126,15 @@ msgstr "Gehiago..."
125msgid "Less..."
126msgid "Less..."
126msgstr "Gutxiago..."
127msgstr "Gutxiago..."
127
128
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
130msgid "Rate this"
130msgstr "Puntuatu hau"
131msgstr "Puntuatu hau"
131
132
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
134msgid "Add a review"
134msgstr "Gehitu kritika"
135msgstr "Gehitu kritika"
135
136
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
138msgid "Send"
138msgstr "Bidali"
139msgstr "Bidali"
139
140
@@ -169,6 +170,14 @@ msgstr "Erakutsi pasahitza"
169msgid "Please enter SIM PIN"
170msgid "Please enter SIM PIN"
170msgstr "Sartu SIMaren PINa"
171msgstr "Sartu SIMaren PINa"
171
172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Sakatu deia itzultzeko..."
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Konferentzia"
180+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
181#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
182msgid "In queue…"
174msgstr "Ilaran..."
183msgstr "Ilaran..."
po/fa.po+65−55
@@ -7,193 +7,203 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2013-10-31 19:02+0000\n"
11+"PO-Revision-Date: 2014-08-03 13:00+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: Arash Badie Modiri <arashbm@gmail.com>\n"
13"Language-Team: Persian <fa@li.org>\n"
13"Language-Team: Persian <fa@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-04 06:32+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17147)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "سنجاق کردن میانبر"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "برداشتن سنجاق میانبر"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
31−msgstr ""
31+msgstr "پرش از مقدّمه"
32
32
33#: qml/Components/EdgeDemo.qml:113
33#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
34msgid "Right edge"
35−msgstr ""
35+msgstr "لبه‌ی راست"
36
36
37#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
39−msgstr ""
39+msgstr "برای باز کردن قفل تلفن، از لبه‌ی راست بکشید"
40
40
41#: qml/Components/EdgeDemo.qml:145
41#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
42msgid "Top edge"
43−msgstr ""
43+msgstr "لبه‌ی بالا"
44
44
45#: qml/Components/EdgeDemo.qml:146
45#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
46msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "برای دست‌رسی به نشانگرها، از لبه‌ی بالا بکشید"
48
48
49#: qml/Components/EdgeDemo.qml:171
49#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
50msgid "Close"
51−msgstr ""
51+msgstr "بستن"
52
52
53#: qml/Components/EdgeDemo.qml:172
53#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
54msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "برای بستن صفحه‌ی تنظیمات، دوباره به بالا بکشپد"
56
56
57#: qml/Components/EdgeDemo.qml:199
57#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
58msgid "Left edge"
59−msgstr ""
59+msgstr "لبه‌ی چپ"
60
60
61#: qml/Components/EdgeDemo.qml:200
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "برای آشکار شدن اجراگر به منظور دست‌رسی سریع به اپ‌ها از سمت چپ بکشید"
64
64
65#: qml/Components/EdgeDemo.qml:227
65#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
66msgid "Well done"
67−msgstr ""
67+msgstr "عالی بود"
68
68
69#: qml/Components/EdgeDemo.qml:228
69#: qml/Components/EdgeDemo.qml:228
70msgid ""
70msgid ""
71"You have now mastered the edge gestures and can start using the "
71"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"
72"phone<br><br>Tap on the screen to start"
73msgstr ""
73msgstr ""
74+"هم اکنون در استفاده از ژست های حرکتی مهارت لازم را دارید و می‌توانید استفاده "
75+"از تلفن را آغاز کنید<br><br>برای شروع صفحه را لمس کنید"
74
76
75#: qml/Components/Lockscreen.qml:214
77#: qml/Components/Lockscreen.qml:214
76msgid "Emergency Call"
78msgid "Emergency Call"
77−msgstr ""
79+msgstr "تماس اضطراری"
78
80
79#: qml/Components/Lockscreen.qml:231
81#: qml/Components/Lockscreen.qml:231
80msgid "OK"
82msgid "OK"
81−msgstr ""
83+msgstr "قبول"
82−
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86
84
87#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
86#, qt-format
89msgid "Hello %1"
87msgid "Hello %1"
90−msgstr ""
88+msgstr "سلام %1"
91
89
92#: qml/Components/PassphraseLockscreen.qml:60
90#: qml/Components/PassphraseLockscreen.qml:60
93msgid "Hello"
91msgid "Hello"
94−msgstr ""
92+msgstr "سلام"
95
93
96#: qml/Components/PinLockscreen.qml:198
94#: qml/Components/PinLockscreen.qml:198
97msgid "CANCEL"
95msgid "CANCEL"
98−msgstr ""
96+msgstr "لغو"
99
97
100#: qml/Components/PinLockscreen.qml:216
98#: qml/Components/PinLockscreen.qml:216
101msgid "DONE"
99msgid "DONE"
102−msgstr ""
100+msgstr "انجام شد"
103
101
104#: qml/Components/SeeMore.qml:35
102#: qml/Components/SeeMore.qml:35
105msgid "See more"
103msgid "See more"
106−msgstr ""
104+msgstr "بیش‌تر ببینید"
107
105
108−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
107msgid "See less"
110−msgstr ""
108+msgstr "کم‌تر ببینید"
111
109
112#: qml/Dash/DashApps.qml:37
110#: qml/Dash/DashApps.qml:37
113msgid "Recent"
111msgid "Recent"
114−msgstr ""
112+msgstr "موارد اخیر"
113+
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "دیدن همه"
115
117
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
119msgid "More..."
118−msgstr ""
120+msgstr "بیش‌تر…"
119
121
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
122#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "Less..."
123msgid "Less..."
122−msgstr ""
124+msgstr "کم‌تر…"
123
125
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
127msgid "Rate this"
126−msgstr ""
128+msgstr "امتیاز دادن"
127
129
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
131msgid "Add a review"
130−msgstr ""
132+msgstr "افزودن یک بازبینی"
131
133
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
135msgid "Send"
134−msgstr ""
136+msgstr "ارسال"
135
137
136#: qml/Greeter/Greeter.qml:157
138#: qml/Greeter/Greeter.qml:157
137msgid "Swipe to unlock"
139msgid "Swipe to unlock"
138−msgstr ""
140+msgstr "برای باز کردن قفل بکشد"
139
141
140#: qml/Hud/HudParametrizedActionsPage.qml:132
142#: qml/Hud/HudParametrizedActionsPage.qml:132
141msgid "Confirm"
143msgid "Confirm"
142−msgstr ""
144+msgstr "تأیید"
143
145
144#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
146#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
145msgid "Type or say a command"
147msgid "Type or say a command"
146−msgstr ""
148+msgstr "دستوری را بنویسید یا بگویید"
147
149
148#: qml/Hud/Hud.qml:84
150#: qml/Hud/Hud.qml:84
149msgid "Loading. Please Wait..."
151msgid "Loading. Please Wait..."
150−msgstr ""
152+msgstr "در حال بار کردن. لطفاً صبر کنید…"
151
153
152#: qml/Hud/Hud.qml:89
154#: qml/Hud/Hud.qml:89
153msgid "Speak Now..."
155msgid "Speak Now..."
154−msgstr ""
156+msgstr "اکنون صحبت کنید…"
155
157
156#: qml/Hud/Hud.qml:94
158#: qml/Hud/Hud.qml:94
157msgid "Speaking..."
159msgid "Speaking..."
158−msgstr ""
160+msgstr "در حال صحبت کردن…"
159
161
160#: qml/Notifications/NotificationMenuItemFactory.qml:91
162#: qml/Notifications/NotificationMenuItemFactory.qml:91
161msgid "Show password"
163msgid "Show password"
162−msgstr ""
164+msgstr "نمایش گذرواژه"
163
165
164#: qml/Notifications/NotificationMenuItemFactory.qml:103
166#: qml/Notifications/NotificationMenuItemFactory.qml:103
165msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
166−msgstr ""
168+msgstr "لطفاً PIN سیم‌کارت را وارد کنید"
169+
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "برای بازگشت به تماس ضربه بزنید…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "کنفرانس"
167
177
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
179msgid "In queue…"
170−msgstr ""
180+msgstr "در صف…"
171
181
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
182#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
183msgid "Downloading"
174−msgstr ""
184+msgstr "در حال بارگیری"
175
185
176#: qml/Panel/Indicators/MenuItemFactory.qml:589
186#: qml/Panel/Indicators/MenuItemFactory.qml:589
177msgid "Paused, tap to resume"
187msgid "Paused, tap to resume"
178−msgstr ""
188+msgstr "مکث شد، برای از سر گیری ضربه بزنید"
179
189
180#: qml/Panel/Indicators/MenuItemFactory.qml:591
190#: qml/Panel/Indicators/MenuItemFactory.qml:591
181msgid "Canceled"
191msgid "Canceled"
182−msgstr ""
192+msgstr "لغو شد"
183
193
184#: qml/Panel/Indicators/MenuItemFactory.qml:593
194#: qml/Panel/Indicators/MenuItemFactory.qml:593
185msgid "Finished"
195msgid "Finished"
186−msgstr ""
196+msgstr "پایان یافت"
187
197
188#: qml/Panel/Indicators/MenuItemFactory.qml:595
198#: qml/Panel/Indicators/MenuItemFactory.qml:595
189msgid "Failed, tap to retry"
199msgid "Failed, tap to retry"
190−msgstr ""
200+msgstr "شکست خورد، برای تلاش دوباره ضربه بزنید"
191
201
192#: qml/Panel/SearchIndicator.qml:27
202#: qml/Panel/SearchIndicator.qml:27
193msgid "Search"
203msgid "Search"
194−msgstr ""
204+msgstr "جست‌وجو"
195
205
196#: qml/Shell.qml:359
206#: qml/Shell.qml:359
197#, qt-format
207#, qt-format
198msgid "Please enter %1"
208msgid "Please enter %1"
199−msgstr ""
209+msgstr "لطفا %1 را وارد کنید"
po/fi.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-09 17:26+0000\n"
11+"PO-Revision-Date: 2014-07-25 16:07+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Hätäpuhelu"
82msgid "OK"
82msgid "OK"
83msgstr "OK"
83msgstr "OK"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Viimeisimmät haut"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "VALMIS"
107msgid "See more"
103msgid "See more"
108msgstr "Näytä lisää"
104msgstr "Näytä lisää"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "Näytä vähemmän"
108msgstr "Näytä vähemmän"
113
109
@@ -115,6 +111,10 @@ msgstr "Näytä vähemmän"
115msgid "Recent"
111msgid "Recent"
116msgstr "Viimeisimmät"
112msgstr "Viimeisimmät"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Näytä kaikki"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "Lisää..."
120msgstr "Lisää..."
@@ -123,15 +123,15 @@ msgstr "Lisää..."
123msgid "Less..."
123msgid "Less..."
124msgstr "Vähemmän..."
124msgstr "Vähemmän..."
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "Arvioi tämä"
128msgstr "Arvioi tämä"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "Lisää arvostelu"
132msgstr "Lisää arvostelu"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "Lähetä"
136msgstr "Lähetä"
137
137
@@ -167,6 +167,14 @@ msgstr "Näytä salasana"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "Anna SIM-kortin PIN-koodi"
168msgstr "Anna SIM-kortin PIN-koodi"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Napauta palataksesi puheluun..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Ryhmäpuhelu"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "Jonossa…"
180msgstr "Jonossa…"
po/fo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
11"PO-Revision-Date: 2014-01-14 20:08+0000\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
12"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
13"Language-Team: Faroese <fo@li.org>\n"
13"Language-Team: Faroese <fo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/fr.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-18 18:31+0000\n"
11+"PO-Revision-Date: 2014-07-26 20:52+0000\n"
12−"Last-Translator: Nicolas Delvaux <Unknown>\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
13"Language-Team: French <fr@li.org>\n"
13"Language-Team: French <fr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,10 +89,6 @@ msgstr "Appel d'urgence"
89msgid "OK"
89msgid "OK"
90msgstr "OK"
90msgstr "OK"
91
91
92−#: qml/Components/PageHeader.qml:366
93−msgid "Recent searches"
94−msgstr "Recherches récentes"
95−
96#: qml/Components/PassphraseLockscreen.qml:60
92#: qml/Components/PassphraseLockscreen.qml:60
97#, qt-format
93#, qt-format
98msgid "Hello %1"
94msgid "Hello %1"
@@ -114,7 +110,7 @@ msgstr "VALIDER"
114msgid "See more"
110msgid "See more"
115msgstr "Voir plus"
111msgstr "Voir plus"
116
112
117−#: qml/Components/SeeMore.qml:58
113+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
118msgid "See less"
114msgid "See less"
119msgstr "Voir moins"
115msgstr "Voir moins"
120
116
@@ -122,6 +118,10 @@ msgstr "Voir moins"
122msgid "Recent"
118msgid "Recent"
123msgstr "Récent"
119msgstr "Récent"
124
120
121+#: qml/Dash/GenericScopeView.qml:330
122+msgid "See all"
123+msgstr "Tout voir"
124+
125#: qml/Dash/Previews/PreviewActionCombo.qml:34
125#: qml/Dash/Previews/PreviewActionCombo.qml:34
126msgid "More..."
126msgid "More..."
127msgstr "Plus..."
127msgstr "Plus..."
@@ -130,15 +130,15 @@ msgstr "Plus..."
130msgid "Less..."
130msgid "Less..."
131msgstr "Moins..."
131msgstr "Moins..."
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:82
133+#: qml/Dash/Previews/PreviewRatingInput.qml:81
134msgid "Rate this"
134msgid "Rate this"
135msgstr "Evaluez ceci"
135msgstr "Evaluez ceci"
136
136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:128
137+#: qml/Dash/Previews/PreviewRatingInput.qml:126
138msgid "Add a review"
138msgid "Add a review"
139msgstr "Ajouter un avis"
139msgstr "Ajouter un avis"
140
140
141−#: qml/Dash/Previews/PreviewRatingInput.qml:168
141+#: qml/Dash/Previews/PreviewRatingInput.qml:166
142msgid "Send"
142msgid "Send"
143msgstr "Envoyer"
143msgstr "Envoyer"
144
144
@@ -174,6 +174,14 @@ msgstr "Afficher le mot de passe"
174msgid "Please enter SIM PIN"
174msgid "Please enter SIM PIN"
175msgstr "Entrez le code PIN"
175msgstr "Entrez le code PIN"
176
176
177+#: qml/Panel/ActiveCallHint.qml:77
178+msgid "Tap to return to call..."
179+msgstr "Appuyez pour revenir à l'appel…"
180+
181+#: qml/Panel/ActiveCallHint.qml:90
182+msgid "Conference"
183+msgstr "Conférence"
184+
177#: qml/Panel/Indicators/MenuItemFactory.qml:583
185#: qml/Panel/Indicators/MenuItemFactory.qml:583
178msgid "In queue…"
186msgid "In queue…"
179msgstr "Dans la file d'attente..."
187msgstr "Dans la file d'attente..."
po/gd.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-16 14:48+0000\n"
11+"PO-Revision-Date: 2014-07-25 22:02+0000\n"
12"Last-Translator: GunChleoc <Unknown>\n"
12"Last-Translator: GunChleoc <Unknown>\n"
13"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
13"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19"Language: gd\n"
19"Language: gd\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -87,11 +87,7 @@ msgstr "Gairm èiginn"
87
87
88#: qml/Components/Lockscreen.qml:231
88#: qml/Components/Lockscreen.qml:231
89msgid "OK"
89msgid "OK"
90−msgstr "Ceart ma-hà"
90+msgstr "Ceart ma-thà"
91−
92−#: qml/Components/PageHeader.qml:366
93−msgid "Recent searches"
94−msgstr "Na lorg thu o chionn goirid"
95
91
96#: qml/Components/PassphraseLockscreen.qml:60
92#: qml/Components/PassphraseLockscreen.qml:60
97#, qt-format
93#, qt-format
@@ -114,7 +110,7 @@ msgstr "DÈANTA"
114msgid "See more"
110msgid "See more"
115msgstr "Seall barrachd"
111msgstr "Seall barrachd"
116
112
117−#: qml/Components/SeeMore.qml:58
113+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
118msgid "See less"
114msgid "See less"
119msgstr "Seall nas lugha"
115msgstr "Seall nas lugha"
120
116
@@ -122,6 +118,10 @@ msgstr "Seall nas lugha"
122msgid "Recent"
118msgid "Recent"
123msgstr "O chionn goirid"
119msgstr "O chionn goirid"
124
120
121+#: qml/Dash/GenericScopeView.qml:330
122+msgid "See all"
123+msgstr "Seall na h-uile"
124+
125#: qml/Dash/Previews/PreviewActionCombo.qml:34
125#: qml/Dash/Previews/PreviewActionCombo.qml:34
126msgid "More..."
126msgid "More..."
127msgstr "Barrachd..."
127msgstr "Barrachd..."
@@ -130,15 +130,15 @@ msgstr "Barrachd..."
130msgid "Less..."
130msgid "Less..."
131msgstr "Nas lugha..."
131msgstr "Nas lugha..."
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:82
133+#: qml/Dash/Previews/PreviewRatingInput.qml:81
134msgid "Rate this"
134msgid "Rate this"
135msgstr "Rangaich seo"
135msgstr "Rangaich seo"
136
136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:128
137+#: qml/Dash/Previews/PreviewRatingInput.qml:126
138msgid "Add a review"
138msgid "Add a review"
139msgstr "Cuir lèirmheas ris"
139msgstr "Cuir lèirmheas ris"
140
140
141−#: qml/Dash/Previews/PreviewRatingInput.qml:168
141+#: qml/Dash/Previews/PreviewRatingInput.qml:166
142msgid "Send"
142msgid "Send"
143msgstr "Cuir"
143msgstr "Cuir"
144
144
@@ -174,6 +174,14 @@ msgstr "Seall am facal-faire"
174msgid "Please enter SIM PIN"
174msgid "Please enter SIM PIN"
175msgstr "Cuir a-steach SIM PIN"
175msgstr "Cuir a-steach SIM PIN"
176
176
177+#: qml/Panel/ActiveCallHint.qml:77
178+msgid "Tap to return to call..."
179+msgstr "Gnog gus tilleadh dhan ghairm..."
180+
181+#: qml/Panel/ActiveCallHint.qml:90
182+msgid "Conference"
183+msgstr "Gairm co-labhairt"
184+
177#: qml/Panel/Indicators/MenuItemFactory.qml:583
185#: qml/Panel/Indicators/MenuItemFactory.qml:583
178msgid "In queue…"
186msgid "In queue…"
179msgstr "Air a' chiudha…"
187msgstr "Air a' chiudha…"
po/gl.po+22−14
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-19 17:04+0000\n"
11+"PO-Revision-Date: 2014-07-25 17:22+0000\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
12"Last-Translator: Marcos Lans <Unknown>\n"
13"Language-Team: Galician <gl@li.org>\n"
13"Language-Team: Galician <gl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-20 06:18+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -61,12 +61,12 @@ msgstr "Bordo esquerdo"
61#: qml/Components/EdgeDemo.qml:200
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63msgstr ""
63msgstr ""
64−"Esvare o dedo desde a esquerda para mostrar o iniciador rápido aos "
64+"Esvare o dedo desde a esquerda para mostrar o iniciador rápido dos "
65"aplicativos"
65"aplicativos"
66
66
67#: qml/Components/EdgeDemo.qml:227
67#: qml/Components/EdgeDemo.qml:227
68msgid "Well done"
68msgid "Well done"
69−msgstr "Ben feito"
69+msgstr "Ben feito!"
70
70
71#: qml/Components/EdgeDemo.qml:228
71#: qml/Components/EdgeDemo.qml:228
72msgid ""
72msgid ""
@@ -84,10 +84,6 @@ msgstr "Chamada de emerxencia"
84msgid "OK"
84msgid "OK"
85msgstr "Aceptar"
85msgstr "Aceptar"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Buscas recentes"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "FEITO"
109msgid "See more"
105msgid "See more"
110msgstr "Ver máis"
106msgstr "Ver máis"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Ver menos"
110msgstr "Ver menos"
115
111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117msgid "Recent"
113msgid "Recent"
118msgstr "Recentes"
114msgstr "Recentes"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ver todo"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "Máis…"
122msgstr "Máis…"
@@ -125,15 +125,15 @@ msgstr "Máis…"
125msgid "Less..."
125msgid "Less..."
126msgstr "Menos..."
126msgstr "Menos..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Valore isto"
130msgstr "Valore isto"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Engadir unha opinión"
134msgstr "Engadir unha opinión"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Enviar"
138msgstr "Enviar"
139
139
@@ -169,6 +169,14 @@ msgstr "Mostrar contrasinal"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Introduza o PIN da SIM"
170msgstr "Introduza o PIN da SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Toque para volver a chamar..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Conferencia"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174msgstr "Na cola..."
182msgstr "Na cola..."
po/he.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-15 13:20+0000\n"
11+"PO-Revision-Date: 2014-07-25 16:26+0000\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
12"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
13"Language-Team: Hebrew <he@li.org>\n"
13"Language-Team: Hebrew <he@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "שיחת חירום"
82msgid "OK"
82msgid "OK"
83msgstr "אישור"
83msgstr "אישור"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "חיפושים אחרונים"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "בוצע"
107msgid "See more"
103msgid "See more"
108msgstr "לראות עוד"
104msgstr "לראות עוד"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "לראות פחות"
108msgstr "לראות פחות"
113
109
@@ -115,6 +111,10 @@ msgstr "לראות פחות"
115msgid "Recent"
111msgid "Recent"
116msgstr "בשימוש לאחרונה"
112msgstr "בשימוש לאחרונה"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "להציג הכול"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "עוד…"
120msgstr "עוד…"
@@ -123,15 +123,15 @@ msgstr "עוד…"
123msgid "Less..."
123msgid "Less..."
124msgstr "פחות…"
124msgstr "פחות…"
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "דירוג היישום"
128msgstr "דירוג היישום"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "הוספת סקירה"
132msgstr "הוספת סקירה"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "שליחה"
136msgstr "שליחה"
137
137
@@ -167,6 +167,14 @@ msgstr "הצגת הססמה"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "נא להזין את קוד ה־<U+200F>SIM"
168msgstr "נא להזין את קוד ה־<U+200F>SIM"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "יש לגעת כדי להחזיר שיחה…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "ועידה"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "בתור…"
180msgstr "בתור…"
po/hi.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
11"PO-Revision-Date: 2014-01-15 01:49+0000\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
12"Last-Translator: Siddhanathan S. <Unknown>\n"
13"Language-Team: Hindi <hi@li.org>\n"
13"Language-Team: Hindi <hi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "आपातकालीन कॉल"
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "पिछले खोजों"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "समीक्षा दे"
130msgstr "समीक्षा दे"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "भेजें"
134msgstr "भेजें"
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/hr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
11"PO-Revision-Date: 2013-06-27 04:14+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Croatian <hr@li.org>\n"
13"Language-Team: Croatian <hr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Nedavne pretrage"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/hu.po+45−35
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-01-14 23:02+0000\n"
11+"PO-Revision-Date: 2014-08-06 07:41+0000\n"
12−"Last-Translator: Kristóf Kiszel <Unknown>\n"
12+"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
13"Language-Team: Hungarian <hu@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-08 07:07+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Indító rögzítése"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Indító feloldása"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -44,7 +44,7 @@ msgstr "Felső szél"
44
44
45#: qml/Components/EdgeDemo.qml:146
45#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
46msgid "Try swiping from the top edge to access the indicators"
47−msgstr "A jelzők eléréséhez csúsztassa ujját a felső szélről"
47+msgstr "Az állapotmenük eléréséhez csúsztassa ujját a felső szélről"
48
48
49#: qml/Components/EdgeDemo.qml:171
49#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
50msgid "Close"
@@ -73,6 +73,8 @@ msgid ""
73"You have now mastered the edge gestures and can start using the "
73"You have now mastered the edge gestures and can start using the "
74"phone<br><br>Tap on the screen to start"
74"phone<br><br>Tap on the screen to start"
75msgstr ""
75msgstr ""
76+"Elsajátította a gesztusokat, és megkezdheti a telefon "
77+"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
76
78
77#: qml/Components/Lockscreen.qml:214
79#: qml/Components/Lockscreen.qml:214
78msgid "Emergency Call"
80msgid "Emergency Call"
@@ -80,64 +82,64 @@ msgstr "Vészhívás"
80
82
81#: qml/Components/Lockscreen.qml:231
83#: qml/Components/Lockscreen.qml:231
82msgid "OK"
84msgid "OK"
83−msgstr ""
85+msgstr "Ok"
84−
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Legutóbbi keresések"
88
86
89#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
88#, qt-format
91msgid "Hello %1"
89msgid "Hello %1"
92−msgstr "Szia %1"
90+msgstr "Üdv %1"
93
91
94#: qml/Components/PassphraseLockscreen.qml:60
92#: qml/Components/PassphraseLockscreen.qml:60
95msgid "Hello"
93msgid "Hello"
96−msgstr "Szia"
94+msgstr "Üdvözöljük"
97
95
98#: qml/Components/PinLockscreen.qml:198
96#: qml/Components/PinLockscreen.qml:198
99msgid "CANCEL"
97msgid "CANCEL"
100−msgstr ""
98+msgstr "MÉGSE"
101
99
102#: qml/Components/PinLockscreen.qml:216
100#: qml/Components/PinLockscreen.qml:216
103msgid "DONE"
101msgid "DONE"
104−msgstr ""
102+msgstr "KÉSZ"
105
103
106#: qml/Components/SeeMore.qml:35
104#: qml/Components/SeeMore.qml:35
107msgid "See more"
105msgid "See more"
108−msgstr ""
106+msgstr "Több"
109
107
110−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
109msgid "See less"
112−msgstr ""
110+msgstr "Kevesebb"
113
111
114#: qml/Dash/DashApps.qml:37
112#: qml/Dash/DashApps.qml:37
115msgid "Recent"
113msgid "Recent"
116−msgstr ""
114+msgstr "Legutóbbi"
115+
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Összes megtekintése"
117
119
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
121msgid "More..."
120−msgstr ""
122+msgstr "Több…"
121
123
122#: qml/Dash/Previews/PreviewActionCombo.qml:34
124#: qml/Dash/Previews/PreviewActionCombo.qml:34
123msgid "Less..."
125msgid "Less..."
124−msgstr ""
126+msgstr "Kevesebb…"
125
127
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
129msgid "Rate this"
128−msgstr "Osztályzás"
130+msgstr "Értékelje"
129
131
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
133msgid "Add a review"
132msgstr "Értékelés hozzáadása"
134msgstr "Értékelés hozzáadása"
133
135
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
137msgid "Send"
136msgstr "Küldés"
138msgstr "Küldés"
137
139
138#: qml/Greeter/Greeter.qml:157
140#: qml/Greeter/Greeter.qml:157
139msgid "Swipe to unlock"
141msgid "Swipe to unlock"
140−msgstr ""
142+msgstr "Csúsztasson a feloldáshoz"
141
143
142#: qml/Hud/HudParametrizedActionsPage.qml:132
144#: qml/Hud/HudParametrizedActionsPage.qml:132
143msgid "Confirm"
145msgid "Confirm"
@@ -165,31 +167,39 @@ msgstr "Jelszó megjelenítése"
165
167
166#: qml/Notifications/NotificationMenuItemFactory.qml:103
168#: qml/Notifications/NotificationMenuItemFactory.qml:103
167msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
168−msgstr ""
170+msgstr "Adja meg a SIM PIN kódját"
171+
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Érintse meg, hogy visszatérjen a híváshoz..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferencia"
169
179
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
181msgid "In queue…"
172−msgstr ""
182+msgstr "Sorban…"
173
183
174#: qml/Panel/Indicators/MenuItemFactory.qml:587
184#: qml/Panel/Indicators/MenuItemFactory.qml:587
175msgid "Downloading"
185msgid "Downloading"
176−msgstr ""
186+msgstr "Letöltés"
177
187
178#: qml/Panel/Indicators/MenuItemFactory.qml:589
188#: qml/Panel/Indicators/MenuItemFactory.qml:589
179msgid "Paused, tap to resume"
189msgid "Paused, tap to resume"
180−msgstr ""
190+msgstr "Szüneteltetve, koppintson a folytatáshoz"
181
191
182#: qml/Panel/Indicators/MenuItemFactory.qml:591
192#: qml/Panel/Indicators/MenuItemFactory.qml:591
183msgid "Canceled"
193msgid "Canceled"
184−msgstr ""
194+msgstr "Megszakítva"
185
195
186#: qml/Panel/Indicators/MenuItemFactory.qml:593
196#: qml/Panel/Indicators/MenuItemFactory.qml:593
187msgid "Finished"
197msgid "Finished"
188−msgstr ""
198+msgstr "Befejeződött"
189
199
190#: qml/Panel/Indicators/MenuItemFactory.qml:595
200#: qml/Panel/Indicators/MenuItemFactory.qml:595
191msgid "Failed, tap to retry"
201msgid "Failed, tap to retry"
192−msgstr ""
202+msgstr "Sikertelen, koppintson az újrapróbáláshoz"
193
203
194#: qml/Panel/SearchIndicator.qml:27
204#: qml/Panel/SearchIndicator.qml:27
195msgid "Search"
205msgid "Search"
po/hy.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
11"PO-Revision-Date: 2013-06-27 04:43+0000\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
12"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
13"Language-Team: Armenian <hy@li.org>\n"
13"Language-Team: Armenian <hy@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Վերջին որոնումներ"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/id.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11"PO-Revision-Date: 2013-06-26 22:35+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Indonesian <id@li.org>\n"
13"Language-Team: Indonesian <id@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/is.po+40−27
@@ -1,30 +1,33 @@
1+# translation of po_unity8-is.po to icelandic
1# Icelandic translation for unity8
2# Icelandic translation for unity8
2# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
3# This file is distributed under the same license as the unity8 package.
4# This file is distributed under the same license as the unity8 package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
5#
5#
6+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
7+# Sveinn í Felli <sv1@fellsnet.is>, 2014.
6msgid ""
8msgid ""
7msgstr ""
9msgstr ""
8−"Project-Id-Version: unity8\n"
10+"Project-Id-Version: po_unity8-is\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
12+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-18 11:20+0000\n"
13+"PO-Revision-Date: 2014-07-31 16:10+0000\n"
12"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
14"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
13−"Language-Team: Icelandic <is@li.org>\n"
15+"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
14"MIME-Version: 1.0\n"
16"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
17"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
18"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
19+"X-Launchpad-Export-Date: 2014-08-01 07:14+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
20+"X-Generator: Launchpad (build 17141)\n"
21+"Language: is\n"
19
22
20#: plugins/Unity/Launcher/launcheritem.cpp:43
23#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
24#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
25msgid "Pin shortcut"
23−msgstr ""
26+msgstr "Pinna flýtilykil"
24
27
25#: plugins/Unity/Launcher/launcheritem.cpp:73
28#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
29msgid "Unpin shortcut"
27−msgstr ""
30+msgstr "Losa flýtilykil"
28
31
29#: qml/Components/EdgeDemoOverlay.qml:151
32#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
33msgid "Skip intro"
@@ -37,7 +40,7 @@ msgstr "Hægri brún"
37#: qml/Components/EdgeDemo.qml:114
40#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
41msgid "Try swiping from the right edge to unlock the phone"
39msgstr ""
42msgstr ""
40−"Prufaðu að renna puttanum frá hægri brúninni til að aflæsa símanum þínum."
43+"Prófaðu að strjúka fingrinum frá hægri brúninni til að aflæsa símanum þínum."
41
44
42#: qml/Components/EdgeDemo.qml:145
45#: qml/Components/EdgeDemo.qml:145
43msgid "Top edge"
46msgid "Top edge"
@@ -45,7 +48,7 @@ msgstr "Efri brún"
45
48
46#: qml/Components/EdgeDemo.qml:146
49#: qml/Components/EdgeDemo.qml:146
47msgid "Try swiping from the top edge to access the indicators"
50msgid "Try swiping from the top edge to access the indicators"
48−msgstr "Reyndu að renna frá toppi til að fá aðgang að tilkynningum"
51+msgstr "Reyndu að strjúka frá toppi til að fá aðgang að tilkynningum"
49
52
50#: qml/Components/EdgeDemo.qml:171
53#: qml/Components/EdgeDemo.qml:171
51msgid "Close"
54msgid "Close"
@@ -53,7 +56,7 @@ msgstr "Loka"
53
56
54#: qml/Components/EdgeDemo.qml:172
57#: qml/Components/EdgeDemo.qml:172
55msgid "Swipe up again to close the settings screen"
58msgid "Swipe up again to close the settings screen"
56−msgstr "Renndu upp til að loka stillingum"
59+msgstr "Strjúktu upp til að loka stillingum"
57
60
58#: qml/Components/EdgeDemo.qml:199
61#: qml/Components/EdgeDemo.qml:199
59msgid "Left edge"
62msgid "Left edge"
@@ -61,7 +64,7 @@ msgstr "Vinstri brún"
61
64
62#: qml/Components/EdgeDemo.qml:200
65#: qml/Components/EdgeDemo.qml:200
63msgid "Swipe from the left to reveal the launcher for quick access to apps"
66msgid "Swipe from the left to reveal the launcher for quick access to apps"
64−msgstr "Renndu frá vinstri til að afhjúpa flýtiræsi forrita"
67+msgstr "Strjúktu frá vinstri til að afhjúpa flýtiræsi forrita"
65
68
66#: qml/Components/EdgeDemo.qml:227
69#: qml/Components/EdgeDemo.qml:227
67msgid "Well done"
70msgid "Well done"
@@ -72,6 +75,8 @@ msgid ""
72"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 "
73"phone<br><br>Tap on the screen to start"
76"phone<br><br>Tap on the screen to start"
74msgstr ""
77msgstr ""
78+"Þú ert núna með æfingu í að nota skjáhreyfingar og getur því farið að nota "
79+"símann<br><br>Sláðu létt á skjáinn til að byrja"
75
80
76#: qml/Components/Lockscreen.qml:214
81#: qml/Components/Lockscreen.qml:214
77msgid "Emergency Call"
82msgid "Emergency Call"
@@ -81,10 +86,6 @@ msgstr "Neyðarsímtal"
81msgid "OK"
86msgid "OK"
82msgstr "Í lagi"
87msgstr "Í lagi"
83
88
84−#: qml/Components/PageHeader.qml:366
85−msgid "Recent searches"
86−msgstr "Nýlegar leitir"
87−
88#: qml/Components/PassphraseLockscreen.qml:60
89#: qml/Components/PassphraseLockscreen.qml:60
89#, qt-format
90#, qt-format
90msgid "Hello %1"
91msgid "Hello %1"
@@ -106,7 +107,7 @@ msgstr "BÚIÐ"
106msgid "See more"
107msgid "See more"
107msgstr "Sjá meira"
108msgstr "Sjá meira"
108
109
109−#: qml/Components/SeeMore.qml:58
110+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
110msgid "See less"
111msgid "See less"
111msgstr "Sjá minna"
112msgstr "Sjá minna"
112
113
@@ -114,6 +115,10 @@ msgstr "Sjá minna"
114msgid "Recent"
115msgid "Recent"
115msgstr "Nýlegt"
116msgstr "Nýlegt"
116
117
118+#: qml/Dash/GenericScopeView.qml:330
119+msgid "See all"
120+msgstr "Sjá allt"
121+
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
122#: qml/Dash/Previews/PreviewActionCombo.qml:34
118msgid "More..."
123msgid "More..."
119msgstr "Meira..."
124msgstr "Meira..."
@@ -122,21 +127,21 @@ msgstr "Meira..."
122msgid "Less..."
127msgid "Less..."
123msgstr "Minna..."
128msgstr "Minna..."
124
129
125−#: qml/Dash/Previews/PreviewRatingInput.qml:82
130+#: qml/Dash/Previews/PreviewRatingInput.qml:81
126msgid "Rate this"
131msgid "Rate this"
127msgstr "Gefa þessu einkunn"
132msgstr "Gefa þessu einkunn"
128
133
129−#: qml/Dash/Previews/PreviewRatingInput.qml:128
134+#: qml/Dash/Previews/PreviewRatingInput.qml:126
130msgid "Add a review"
135msgid "Add a review"
131msgstr "Gefa umsögn"
136msgstr "Gefa umsögn"
132
137
133−#: qml/Dash/Previews/PreviewRatingInput.qml:168
138+#: qml/Dash/Previews/PreviewRatingInput.qml:166
134msgid "Send"
139msgid "Send"
135msgstr "Senda"
140msgstr "Senda"
136
141
137#: qml/Greeter/Greeter.qml:157
142#: qml/Greeter/Greeter.qml:157
138msgid "Swipe to unlock"
143msgid "Swipe to unlock"
139−msgstr "Strjóka til að aflæsa"
144+msgstr "Strjúka til að aflæsa"
140
145
141#: qml/Hud/HudParametrizedActionsPage.qml:132
146#: qml/Hud/HudParametrizedActionsPage.qml:132
142msgid "Confirm"
147msgid "Confirm"
@@ -144,15 +149,15 @@ msgstr "Staðfesta"
144
149
145#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
150#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
146msgid "Type or say a command"
151msgid "Type or say a command"
147−msgstr "Skrifaðu eða segðu eitthvað"
152+msgstr "Skrifaðu eða segðu skipun"
148
153
149#: qml/Hud/Hud.qml:84
154#: qml/Hud/Hud.qml:84
150msgid "Loading. Please Wait..."
155msgid "Loading. Please Wait..."
151−msgstr "Hleð. Vinsamlegast Bíðið..."
156+msgstr "Hleð. Bíddu aðeins..."
152
157
153#: qml/Hud/Hud.qml:89
158#: qml/Hud/Hud.qml:89
154msgid "Speak Now..."
159msgid "Speak Now..."
155−msgstr "Talaðu Núna..."
160+msgstr "Tala núna..."
156
161
157#: qml/Hud/Hud.qml:94
162#: qml/Hud/Hud.qml:94
158msgid "Speaking..."
163msgid "Speaking..."
@@ -166,6 +171,14 @@ msgstr "Birta lykilorð"
166msgid "Please enter SIM PIN"
171msgid "Please enter SIM PIN"
167msgstr "Settu inn PIN fyrir SIM"
172msgstr "Settu inn PIN fyrir SIM"
168
173
174+#: qml/Panel/ActiveCallHint.qml:77
175+msgid "Tap to return to call..."
176+msgstr "Slá til að svara símtali..."
177+
178+#: qml/Panel/ActiveCallHint.qml:90
179+msgid "Conference"
180+msgstr "Ráðstefna"
181+
169#: qml/Panel/Indicators/MenuItemFactory.qml:583
182#: qml/Panel/Indicators/MenuItemFactory.qml:583
170msgid "In queue…"
183msgid "In queue…"
171msgstr "Í biðröð..."
184msgstr "Í biðröð..."
@@ -176,7 +189,7 @@ msgstr "Sæki"
176
189
177#: qml/Panel/Indicators/MenuItemFactory.qml:589
190#: qml/Panel/Indicators/MenuItemFactory.qml:589
178msgid "Paused, tap to resume"
191msgid "Paused, tap to resume"
179−msgstr ""
192+msgstr "Í bið, sláðu létt til að halda áfram"
180
193
181#: qml/Panel/Indicators/MenuItemFactory.qml:591
194#: qml/Panel/Indicators/MenuItemFactory.qml:591
182msgid "Canceled"
195msgid "Canceled"
@@ -188,7 +201,7 @@ msgstr "Lokið"
188
201
189#: qml/Panel/Indicators/MenuItemFactory.qml:595
202#: qml/Panel/Indicators/MenuItemFactory.qml:595
190msgid "Failed, tap to retry"
203msgid "Failed, tap to retry"
191−msgstr ""
204+msgstr "Mistókst, sláðu létt til að reyna aftur"
192
205
193#: qml/Panel/SearchIndicator.qml:27
206#: qml/Panel/SearchIndicator.qml:27
194msgid "Search"
207msgid "Search"
po/it.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-09 07:07+0000\n"
11+"PO-Revision-Date: 2014-07-25 16:09+0000\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
12"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
13"Language-Team: Italian <it@li.org>\n"
13"Language-Team: Italian <it@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Chiamata di emergenza"
87msgid "OK"
87msgid "OK"
88msgstr "OK"
88msgstr "OK"
89
89
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Ricerche recenti"
93−
94#: qml/Components/PassphraseLockscreen.qml:60
90#: qml/Components/PassphraseLockscreen.qml:60
95#, qt-format
91#, qt-format
96msgid "Hello %1"
92msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr "Fatto"
112msgid "See more"
108msgid "See more"
113msgstr "Mostra di più"
109msgstr "Mostra di più"
114
110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116msgid "See less"
112msgid "See less"
117msgstr "Mostra meno"
113msgstr "Mostra meno"
118
114
@@ -120,6 +116,10 @@ msgstr "Mostra meno"
120msgid "Recent"
116msgid "Recent"
121msgstr "Recenti"
117msgstr "Recenti"
122
118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Mostra tutto"
122+
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124msgid "More..."
124msgid "More..."
125msgstr "Altro..."
125msgstr "Altro..."
@@ -128,15 +128,15 @@ msgstr "Altro..."
128msgid "Less..."
128msgid "Less..."
129msgstr "Meno..."
129msgstr "Meno..."
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132msgid "Rate this"
132msgid "Rate this"
133msgstr "Valuta"
133msgstr "Valuta"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136msgid "Add a review"
136msgid "Add a review"
137msgstr "Aggiungi una recensione"
137msgstr "Aggiungi una recensione"
138
138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140msgid "Send"
140msgid "Send"
141msgstr "Invia"
141msgstr "Invia"
142
142
@@ -172,6 +172,14 @@ msgstr "Mostra password"
172msgid "Please enter SIM PIN"
172msgid "Please enter SIM PIN"
173msgstr "Inserire il codice PIN"
173msgstr "Inserire il codice PIN"
174
174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr "Tocca per tornare alla chiamata..."
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Conferenza"
182+
175#: qml/Panel/Indicators/MenuItemFactory.qml:583
183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176msgid "In queue…"
184msgid "In queue…"
177msgstr "In coda..."
185msgstr "In coda..."
po/ja.po+32−24
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-01-18 07:01+0000\n"
11+"PO-Revision-Date: 2014-08-08 06:18+0000\n"
12−"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
12+"Last-Translator: Mitsuya Shibata <mty.shibata@gmail.com>\n"
13"Language-Team: Japanese <ja@li.org>\n"
13"Language-Team: Japanese <ja@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-09 05:48+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +28,7 @@ msgstr ""
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
31−msgstr ""
31+msgstr "導入ガイドをスキップ"
32
32
33#: qml/Components/EdgeDemo.qml:113
33#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
34msgid "Right edge"
@@ -44,7 +44,7 @@ msgstr "上端"
44
44
45#: qml/Components/EdgeDemo.qml:146
45#: qml/Components/EdgeDemo.qml:146
46msgid "Try swiping from the top edge to access the indicators"
46msgid "Try swiping from the top edge to access the indicators"
47−msgstr ""
47+msgstr "インジケーターにアクセスするには上端からスワイプしてみてください"
48
48
49#: qml/Components/EdgeDemo.qml:171
49#: qml/Components/EdgeDemo.qml:171
50msgid "Close"
50msgid "Close"
@@ -52,7 +52,7 @@ msgstr "閉じる"
52
52
53#: qml/Components/EdgeDemo.qml:172
53#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
54msgid "Swipe up again to close the settings screen"
55−msgstr ""
55+msgstr "設定画面を閉じるにはもう一度上にスワイプしてください"
56
56
57#: qml/Components/EdgeDemo.qml:199
57#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
58msgid "Left edge"
@@ -60,11 +60,11 @@ msgstr "左端"
60
60
61#: qml/Components/EdgeDemo.qml:200
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr ""
63+msgstr "アプリに素早くアクセスできるLauncherを表示するには左からスワイプしてください"
64
64
65#: qml/Components/EdgeDemo.qml:227
65#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
66msgid "Well done"
67−msgstr ""
67+msgstr "よくできました!"
68
68
69#: qml/Components/EdgeDemo.qml:228
69#: qml/Components/EdgeDemo.qml:228
70msgid ""
70msgid ""
@@ -74,20 +74,16 @@ msgstr ""
74
74
75#: qml/Components/Lockscreen.qml:214
75#: qml/Components/Lockscreen.qml:214
76msgid "Emergency Call"
76msgid "Emergency Call"
77−msgstr ""
77+msgstr "緊急通報"
78
78
79#: qml/Components/Lockscreen.qml:231
79#: qml/Components/Lockscreen.qml:231
80msgid "OK"
80msgid "OK"
81−msgstr ""
81+msgstr "OK"
82−
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近の検索"
86
82
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
90−msgstr ""
86+msgstr "こんにちは %1 さん"
91
87
92#: qml/Components/PassphraseLockscreen.qml:60
88#: qml/Components/PassphraseLockscreen.qml:60
93msgid "Hello"
89msgid "Hello"
@@ -103,9 +99,9 @@ msgstr ""
103
99
104#: qml/Components/SeeMore.qml:35
100#: qml/Components/SeeMore.qml:35
105msgid "See more"
101msgid "See more"
106−msgstr ""
102+msgstr "さらに表示する"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130−msgstr ""
130+msgstr "レビューを追加"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "送信"
134msgstr "送信"
135
135
@@ -155,7 +155,7 @@ msgstr "音声入力を開始..."
155
155
156#: qml/Hud/Hud.qml:94
156#: qml/Hud/Hud.qml:94
157msgid "Speaking..."
157msgid "Speaking..."
158−msgstr ""
158+msgstr "入力中..."
159
159
160#: qml/Notifications/NotificationMenuItemFactory.qml:91
160#: qml/Notifications/NotificationMenuItemFactory.qml:91
161msgid "Show password"
161msgid "Show password"
@@ -165,6 +165,14 @@ msgstr "パスワードを表示"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/km.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-16 01:37+0000\n"
11+"PO-Revision-Date: 2014-08-01 04:02+0000\n"
12−"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
12+"Last-Translator: Sok Sophea <sksophea@gmail.com>\n"
13"Language-Team: Khmer <km@li.org>\n"
13"Language-Team: Khmer <km@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-02 06:39+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17147)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "ការ​ហៅ​ពេល​អាសន្ន"
84msgid "OK"
84msgid "OK"
85msgstr "យល់ព្រម"
85msgstr "យល់ព្រម"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "ការ​ស្វែងរក​ថ្មី"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "រួចរាល់"
109msgid "See more"
105msgid "See more"
110msgstr "មើល​ច្រើន​ទៀត"
106msgstr "មើល​ច្រើន​ទៀត"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "មើល​តិច​ជាង"
110msgstr "មើល​តិច​ជាង"
115
111
@@ -117,6 +113,10 @@ msgstr "មើល​តិច​ជាង"
117msgid "Recent"
113msgid "Recent"
118msgstr "បច្ចុប្បន្ន"
114msgstr "បច្ចុប្បន្ន"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "មើល​ទាំងអស់"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "ច្រើនជាង​..."
122msgstr "ច្រើនជាង​..."
@@ -125,15 +125,15 @@ msgstr "ច្រើនជាង​..."
125msgid "Less..."
125msgid "Less..."
126msgstr "តិច​ជាង..."
126msgstr "តិច​ជាង..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "វាយតម្លៃ​វា"
130msgstr "វាយតម្លៃ​វា"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "បន្ថែម​ការ​ពិនិត្យ"
134msgstr "បន្ថែម​ការ​ពិនិត្យ"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "ផ្ញើ"
138msgstr "ផ្ញើ"
139
139
@@ -169,6 +169,14 @@ msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
170msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "ប៉ះ​ដើម្បី​ត្រឡប់​ទៅ​ការ​ហៅ..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "សន្និសីទ"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174msgstr "ក្នុងជួរ…"
182msgstr "ក្នុងជួរ…"
po/kn.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
11"PO-Revision-Date: 2013-06-27 05:43+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kannada <kn@li.org>\n"
13"Language-Team: Kannada <kn@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/ko.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-07-17 03:56+0000\n"
11"PO-Revision-Date: 2014-07-17 03:56+0000\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
12"Last-Translator: MinSik CHO <Unknown>\n"
13"Language-Team: Korean <ko@li.org>\n"
13"Language-Team: Korean <ko@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-18 05:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "긴급 통화"
82msgid "OK"
82msgid "OK"
83msgstr "확인"
83msgstr "확인"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "최근 검색"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "완료"
107msgid "See more"
103msgid "See more"
108msgstr "더 보기"
104msgstr "더 보기"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "간단히 표시하기"
108msgstr "간단히 표시하기"
113
109
@@ -115,6 +111,10 @@ msgstr "간단히 표시하기"
115msgid "Recent"
111msgid "Recent"
116msgstr "최근"
112msgstr "최근"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr ""
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "더 보기..."
120msgstr "더 보기..."
@@ -123,15 +123,15 @@ msgstr "더 보기..."
123msgid "Less..."
123msgid "Less..."
124msgstr "간단하게..."
124msgstr "간단하게..."
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "이 애플리케이션 평가하기"
128msgstr "이 애플리케이션 평가하기"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "평가 제출하기"
132msgstr "평가 제출하기"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "보내기"
136msgstr "보내기"
137
137
@@ -167,6 +167,14 @@ msgstr "비밀 번호 보기"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "심카드의 PIN 번호를 입력하세요."
168msgstr "심카드의 PIN 번호를 입력하세요."
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr ""
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr ""
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "재생 중..."
180msgstr "재생 중..."
po/ky.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
11"PO-Revision-Date: 2013-06-27 06:17+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
13"Language-Team: Kirghiz <ky@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Соңку издөөлөр"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/lo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
11"PO-Revision-Date: 2013-10-02 10:00+0000\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
12"Last-Translator: Anousak <anousak@gmail.com>\n"
13"Language-Team: Lao <lo@li.org>\n"
13"Language-Team: Lao <lo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "ສົ່ງ"
134msgstr "ສົ່ງ"
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/lt.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
11"PO-Revision-Date: 2014-05-19 17:15+0000\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
12"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
13"Language-Team: Lithuanian <lt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Pagalbos skambutis"
83msgid "OK"
83msgid "OK"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Paskiausios paieškos"
89−
90#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
91#, qt-format
87#, qt-format
92msgid "Hello %1"
88msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108msgid "See more"
104msgid "See more"
109msgstr ""
105msgstr ""
110
106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112msgid "See less"
108msgid "See less"
113msgstr ""
109msgstr ""
114
110
@@ -116,6 +112,10 @@ msgstr ""
116msgid "Recent"
112msgid "Recent"
117msgstr "Paskiausieji"
113msgstr "Paskiausieji"
118
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120msgid "More..."
120msgid "More..."
121msgstr "Daugiau..."
121msgstr "Daugiau..."
@@ -124,15 +124,15 @@ msgstr "Daugiau..."
124msgid "Less..."
124msgid "Less..."
125msgstr "Mažiau..."
125msgstr "Mažiau..."
126
126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128msgid "Rate this"
128msgid "Rate this"
129msgstr "Įvertinkite tai"
129msgstr "Įvertinkite tai"
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132msgid "Add a review"
132msgid "Add a review"
133msgstr "Pridėkite apžvalgą"
133msgstr "Pridėkite apžvalgą"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136msgid "Send"
136msgid "Send"
137msgstr "Siųsti"
137msgstr "Siųsti"
138
138
@@ -168,6 +168,14 @@ msgstr "Rodyti slaptažodį"
168msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
169msgstr "Įveskite SIM kortelės PIN kodą"
169msgstr "Įveskite SIM kortelės PIN kodą"
170
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172msgid "In queue…"
180msgid "In queue…"
173msgstr ""
181msgstr ""
po/lv.po+23−15
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-15 12:13+0000\n"
11+"PO-Revision-Date: 2014-07-26 16:21+0000\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
12"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
13"Language-Team: Latvian <lv@li.org>\n"
13"Language-Team: Latvian <lv@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "Neatliekamās Palīdzības zvans"
80msgid "OK"
80msgid "OK"
81msgstr "LABI"
81msgstr "LABI"
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Nesen veiktās meklēšanas"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "IZDARĪTS"
105msgid "See more"
101msgid "See more"
106msgstr "Redzēt vairāk"
102msgstr "Redzēt vairāk"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr "Redzēt mazāk"
106msgstr "Redzēt mazāk"
111
107
@@ -113,6 +109,10 @@ msgstr "Redzēt mazāk"
113msgid "Recent"
109msgid "Recent"
114msgstr "Nesens"
110msgstr "Nesens"
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "Skatīt visus"
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr "Vairāk..."
118msgstr "Vairāk..."
@@ -121,15 +121,15 @@ msgstr "Vairāk..."
121msgid "Less..."
121msgid "Less..."
122msgstr "Mazāk..."
122msgstr "Mazāk..."
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "Novērtēt šo"
126msgstr "Novērtēt šo"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "Komentēt"
130msgstr "Komentēt"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "Sūtīt"
134msgstr "Sūtīt"
135
135
@@ -165,13 +165,21 @@ msgstr "Rādīt paroli"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr "Lūdzu ievadiet SIM PIN"
166msgstr "Lūdzu ievadiet SIM PIN"
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "Konference"
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
171
179
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
181msgid "Downloading"
174−msgstr ""
182+msgstr "Lejupielādē"
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:589
184#: qml/Panel/Indicators/MenuItemFactory.qml:589
177msgid "Paused, tap to resume"
185msgid "Paused, tap to resume"
@@ -179,11 +187,11 @@ msgstr ""
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:591
188#: qml/Panel/Indicators/MenuItemFactory.qml:591
181msgid "Canceled"
189msgid "Canceled"
182−msgstr ""
190+msgstr "Atcelts"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:593
192#: qml/Panel/Indicators/MenuItemFactory.qml:593
185msgid "Finished"
193msgid "Finished"
186−msgstr ""
194+msgstr "Pabeigts"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:595
196#: qml/Panel/Indicators/MenuItemFactory.qml:595
189msgid "Failed, tap to retry"
197msgid "Failed, tap to retry"
po/ml.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\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 alfaZ <Unknown>\n"
12+"Last-Translator: ST Alfas <Unknown>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
13"Language-Team: Malayalam <ml@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "അടിയന്തിര വിളി"
82msgid "OK"
82msgid "OK"
83msgstr ""
83msgstr ""
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "സമീപകാല തിരയലുകള്‍"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr ""
107msgid "See more"
103msgid "See more"
108msgstr ""
104msgstr ""
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr ""
108msgstr ""
113
109
@@ -115,6 +111,10 @@ msgstr ""
115msgid "Recent"
111msgid "Recent"
116msgstr ""
112msgstr ""
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr ""
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr ""
120msgstr ""
@@ -123,15 +123,15 @@ msgstr ""
123msgid "Less..."
123msgid "Less..."
124msgstr ""
124msgstr ""
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "ഇത് അവലോകനം ചെയ്യുക"
128msgstr "ഇത് അവലോകനം ചെയ്യുക"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
132msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "അയയ്‌ക്കുക"
136msgstr "അയയ്‌ക്കുക"
137
137
@@ -167,6 +167,14 @@ msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr ""
168msgstr ""
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr ""
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr ""
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr ""
180msgstr ""
po/mr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
11"PO-Revision-Date: 2014-01-14 19:54+0000\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
12"Last-Translator: Rohan Deshmukh <Unknown>\n"
13"Language-Team: Marathi <mr@li.org>\n"
13"Language-Team: Marathi <mr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/ms.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
11"PO-Revision-Date: 2014-01-17 09:05+0000\n"
12"Last-Translator: abuyop <Unknown>\n"
12"Last-Translator: abuyop <Unknown>\n"
13"Language-Team: Malay <ms@li.org>\n"
13"Language-Team: Malay <ms@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "panggilan Kecemasan"
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Gelintar baru-baru ini"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "Kadar ini"
126msgstr "Kadar ini"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "Tambah ulasan"
130msgstr "Tambah ulasan"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "Hantar"
134msgstr "Hantar"
135
135
@@ -165,6 +165,14 @@ msgstr "Tunjuk kata laluan"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/my.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
11"PO-Revision-Date: 2013-12-12 11:12+0000\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
12"Last-Translator: Pyae Sone <Unknown>\n"
13"Language-Team: Burmese <my@li.org>\n"
13"Language-Team: Burmese <my@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "အရေးပေါ်ခေါ်မည်"
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
126msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "ပို့မည်"
134msgstr "ပို့မည်"
135
135
@@ -165,6 +165,14 @@ msgstr "စကားဝှက်ကိုပြ"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/nb.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-11 07:01+0000\n"
11+"PO-Revision-Date: 2014-07-26 12:05+0000\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
12"Last-Translator: Åka Sikrom <Unknown>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-12 06:58+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Nødanrop"
82msgid "OK"
82msgid "OK"
83msgstr "OK"
83msgstr "OK"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Nylige søk"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "FERDIG"
107msgid "See more"
103msgid "See more"
108msgstr "Vis mer"
104msgstr "Vis mer"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "Vis mindre"
108msgstr "Vis mindre"
113
109
@@ -115,6 +111,10 @@ msgstr "Vis mindre"
115msgid "Recent"
111msgid "Recent"
116msgstr "Nylig"
112msgstr "Nylig"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Vis alt"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "Mer …"
120msgstr "Mer …"
@@ -123,15 +123,15 @@ msgstr "Mer …"
123msgid "Less..."
123msgid "Less..."
124msgstr "Mindre …"
124msgstr "Mindre …"
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "Vurder dette"
128msgstr "Vurder dette"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "Skriv en anmeldelse"
132msgstr "Skriv en anmeldelse"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "Send"
136msgstr "Send"
137
137
@@ -167,6 +167,14 @@ msgstr "Vis passord"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "Skriv inn PIN-koden til SIM-kortet"
168msgstr "Skriv inn PIN-koden til SIM-kortet"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Trykk for å gå tilbake til anrop …"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Konferanse"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "I kø …"
180msgstr "I kø …"
po/nl.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-20 17:25+0000\n"
11+"PO-Revision-Date: 2014-07-27 19:12+0000\n"
12−"Last-Translator: Hannie Dumoleyn <Unknown>\n"
12+"Last-Translator: rob <linuxned@gmail.com>\n"
13"Language-Team: Dutch <nl@li.org>\n"
13"Language-Team: Dutch <nl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Noodoproep"
82msgid "OK"
82msgid "OK"
83msgstr "Ok"
83msgstr "Ok"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recente zoekopdrachten"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "KLAAR"
107msgid "See more"
103msgid "See more"
108msgstr "Meer zien"
104msgstr "Meer zien"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "Minder zien"
108msgstr "Minder zien"
113
109
@@ -115,6 +111,10 @@ msgstr "Minder zien"
115msgid "Recent"
111msgid "Recent"
116msgstr "Recent"
112msgstr "Recent"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Alles zien"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "Meer…"
120msgstr "Meer…"
@@ -123,15 +123,15 @@ msgstr "Meer…"
123msgid "Less..."
123msgid "Less..."
124msgstr "Minder…"
124msgstr "Minder…"
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "Beoordeel dit"
128msgstr "Beoordeel dit"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "Voeg recensie toe"
132msgstr "Voeg recensie toe"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "Versturen"
136msgstr "Versturen"
137
137
@@ -167,6 +167,14 @@ msgstr "Wachtwoord tonen"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "Voer SIM-pincode in"
168msgstr "Voer SIM-pincode in"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tik om terug te keren naar gesprek…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Groepsgesprek"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "In wachtrij…"
180msgstr "In wachtrij…"
po/pl.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-19 14:10+0000\n"
11+"PO-Revision-Date: 2014-07-31 13:51+0000\n"
12−"Last-Translator: GTriderXC <gtriderxc@yahoo.com>\n"
12+"Last-Translator: Michał Radwański <radwanski.michal@outlook.com>\n"
13"Language-Team: Polish <pl@li.org>\n"
13"Language-Team: Polish <pl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-20 06:18+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-01 07:14+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17141)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Telefon ratunkowy"
84msgid "OK"
84msgid "OK"
85msgstr "OK"
85msgstr "OK"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Ostatnie wyszukiwania"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "ZROBIONE"
109msgid "See more"
105msgid "See more"
110msgstr "Zobacz więcej"
106msgstr "Zobacz więcej"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Zobacz mniej"
110msgstr "Zobacz mniej"
115
111
@@ -117,6 +113,10 @@ msgstr "Zobacz mniej"
117msgid "Recent"
113msgid "Recent"
118msgstr "Ostatnio używane"
114msgstr "Ostatnio używane"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Zobacz wszystko"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "Więcej..."
122msgstr "Więcej..."
@@ -125,15 +125,15 @@ msgstr "Więcej..."
125msgid "Less..."
125msgid "Less..."
126msgstr "Mniej..."
126msgstr "Mniej..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Oceń to"
130msgstr "Oceń to"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Dodaj recenzję"
134msgstr "Dodaj recenzję"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Wyślij"
138msgstr "Wyślij"
139
139
@@ -169,6 +169,14 @@ msgstr "Wyświetl hasło"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Wprowadź kod PIN karty SIM"
170msgstr "Wprowadź kod PIN karty SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Dotknij aby powrócić do połączenia..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferencja"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174msgstr "W kolejce..."
182msgstr "W kolejce..."
po/pt.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-18 22:56+0000\n"
11+"PO-Revision-Date: 2014-07-25 12:04+0000\n"
12−"Last-Translator: Hugo Cardoso <hugocardoso94@gmail.com>\n"
12+"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Chamada de emergência"
83msgid "OK"
83msgid "OK"
84msgstr "OK"
84msgstr "OK"
85
85
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Pesquisas recentes"
89−
90#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
91#, qt-format
87#, qt-format
92msgid "Hello %1"
88msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr "FEITO"
108msgid "See more"
104msgid "See more"
109msgstr "Ver mais"
105msgstr "Ver mais"
110
106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112msgid "See less"
108msgid "See less"
113msgstr "Ver menos"
109msgstr "Ver menos"
114
110
@@ -116,6 +112,10 @@ msgstr "Ver menos"
116msgid "Recent"
112msgid "Recent"
117msgstr "Recentes"
113msgstr "Recentes"
118
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Ver todos"
118+
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120msgid "More..."
120msgid "More..."
121msgstr "Mais..."
121msgstr "Mais..."
@@ -124,15 +124,15 @@ msgstr "Mais..."
124msgid "Less..."
124msgid "Less..."
125msgstr "Menos..."
125msgstr "Menos..."
126
126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128msgid "Rate this"
128msgid "Rate this"
129msgstr "Classifique isto"
129msgstr "Classifique isto"
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132msgid "Add a review"
132msgid "Add a review"
133msgstr "Adicione uma crítica"
133msgstr "Adicione uma crítica"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136msgid "Send"
136msgid "Send"
137msgstr "Enviar"
137msgstr "Enviar"
138
138
@@ -168,6 +168,14 @@ msgstr "Mostrar palavra-passe"
168msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
169msgstr "Por favor insira o PIN"
169msgstr "Por favor insira o PIN"
170
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tocar para ligar de volta..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Conferência"
178+
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172msgid "In queue…"
180msgid "In queue…"
173msgstr "Em fila..."
181msgstr "Em fila..."
po/pt_BR.po+28−20
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-17 05:46+0000\n"
11+"PO-Revision-Date: 2014-08-07 12:34+0000\n"
12−"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
12+"Last-Translator: Salomão Carneiro de Brito <salomaocar@gmail.com>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
13"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-18 05:28+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-08 07:07+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Fixar atalho"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Desafixar atalho"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -84,10 +84,6 @@ msgstr "Chamada de emergência"
84msgid "OK"
84msgid "OK"
85msgstr "OK"
85msgstr "OK"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Pesquisas recentes"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -103,13 +99,13 @@ msgstr "CANCELAR"
103
99
104#: qml/Components/PinLockscreen.qml:216
100#: qml/Components/PinLockscreen.qml:216
105msgid "DONE"
101msgid "DONE"
106−msgstr ""
102+msgstr "FEITO"
107
103
108#: qml/Components/SeeMore.qml:35
104#: qml/Components/SeeMore.qml:35
109msgid "See more"
105msgid "See more"
110msgstr "Ver mais"
106msgstr "Ver mais"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Ver menos"
110msgstr "Ver menos"
115
111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117msgid "Recent"
113msgid "Recent"
118msgstr "Recentes"
114msgstr "Recentes"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ver todos"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "Mais..."
122msgstr "Mais..."
@@ -125,15 +125,15 @@ msgstr "Mais..."
125msgid "Less..."
125msgid "Less..."
126msgstr "Menos..."
126msgstr "Menos..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Avaliar isto"
130msgstr "Avaliar isto"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Adicionar uma análise"
134msgstr "Adicionar uma análise"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Enviar"
138msgstr "Enviar"
139
139
@@ -169,9 +169,17 @@ msgstr "Exibir senha"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Por favor, digite o PIN do cartão SIM"
170msgstr "Por favor, digite o PIN do cartão SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Toque para retornar para a chamada..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Conferência"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174−msgstr ""
182+msgstr "Em fila..."
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
184#: qml/Panel/Indicators/MenuItemFactory.qml:587
177msgid "Downloading"
185msgid "Downloading"
@@ -179,7 +187,7 @@ msgstr "Baixando"
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:589
188#: qml/Panel/Indicators/MenuItemFactory.qml:589
181msgid "Paused, tap to resume"
189msgid "Paused, tap to resume"
182−msgstr ""
190+msgstr "Em pausa, toque para continuar"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:591
192#: qml/Panel/Indicators/MenuItemFactory.qml:591
185msgid "Canceled"
193msgid "Canceled"
@@ -187,11 +195,11 @@ msgstr "Cancelado"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:593
196#: qml/Panel/Indicators/MenuItemFactory.qml:593
189msgid "Finished"
197msgid "Finished"
190−msgstr ""
198+msgstr "Finalizado"
191
199
192#: qml/Panel/Indicators/MenuItemFactory.qml:595
200#: qml/Panel/Indicators/MenuItemFactory.qml:595
193msgid "Failed, tap to retry"
201msgid "Failed, tap to retry"
194−msgstr ""
202+msgstr "Falhou, toque para tentar novamente"
195
203
196#: qml/Panel/SearchIndicator.qml:27
204#: qml/Panel/SearchIndicator.qml:27
197msgid "Search"
205msgid "Search"
po/ro.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 07:53+0000\n"
11"PO-Revision-Date: 2013-06-27 07:53+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Romanian <ro@li.org>\n"
13"Language-Team: Romanian <ro@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Căutări recente"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/ru.po+32−24
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-05-15 12:57+0000\n"
11+"PO-Revision-Date: 2014-07-31 09:39+0000\n"
12−"Last-Translator: Zonov Roman <Unknown>\n"
12+"Last-Translator: Jay ZDLin <Unknown>\n"
13"Language-Team: Russian <ru@li.org>\n"
13"Language-Team: Russian <ru@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-01 07:14+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17141)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Закрепить ярлык"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Изъять ярлык"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -85,11 +85,7 @@ msgstr "Экстренный вызов"
85
85
86#: qml/Components/Lockscreen.qml:231
86#: qml/Components/Lockscreen.qml:231
87msgid "OK"
87msgid "OK"
88−msgstr ""
88+msgstr "ОК"
89−
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Последние поисковые запросы"
93
89
94#: qml/Components/PassphraseLockscreen.qml:60
90#: qml/Components/PassphraseLockscreen.qml:60
95#, qt-format
91#, qt-format
@@ -102,17 +98,17 @@ msgstr "Привет"
102
98
103#: qml/Components/PinLockscreen.qml:198
99#: qml/Components/PinLockscreen.qml:198
104msgid "CANCEL"
100msgid "CANCEL"
105−msgstr ""
101+msgstr "ОТМЕНИТЬ"
106
102
107#: qml/Components/PinLockscreen.qml:216
103#: qml/Components/PinLockscreen.qml:216
108msgid "DONE"
104msgid "DONE"
109−msgstr ""
105+msgstr "ГОТОВО"
110
106
111#: qml/Components/SeeMore.qml:35
107#: qml/Components/SeeMore.qml:35
112msgid "See more"
108msgid "See more"
113msgstr "Подробнее"
109msgstr "Подробнее"
114
110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116msgid "See less"
112msgid "See less"
117msgstr "Вкратце"
113msgstr "Вкратце"
118
114
@@ -120,6 +116,10 @@ msgstr "Вкратце"
120msgid "Recent"
116msgid "Recent"
121msgstr "Недавние"
117msgstr "Недавние"
122
118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Показать всё"
122+
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124msgid "More..."
124msgid "More..."
125msgstr "Ещё..."
125msgstr "Ещё..."
@@ -128,15 +128,15 @@ msgstr "Ещё..."
128msgid "Less..."
128msgid "Less..."
129msgstr "Меньше..."
129msgstr "Меньше..."
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132msgid "Rate this"
132msgid "Rate this"
133msgstr "Оцените это"
133msgstr "Оцените это"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136msgid "Add a review"
136msgid "Add a review"
137msgstr "Добавьте отзыв"
137msgstr "Добавьте отзыв"
138
138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140msgid "Send"
140msgid "Send"
141msgstr "Отправить"
141msgstr "Отправить"
142
142
@@ -172,29 +172,37 @@ msgstr "Показать пароль"
172msgid "Please enter SIM PIN"
172msgid "Please enter SIM PIN"
173msgstr "Введите PIN код"
173msgstr "Введите PIN код"
174
174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr "Коснитесь для возврата к вызову..."
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Конференция"
182+
175#: qml/Panel/Indicators/MenuItemFactory.qml:583
183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176msgid "In queue…"
184msgid "In queue…"
177−msgstr ""
185+msgstr "В очереди..."
178
186
179#: qml/Panel/Indicators/MenuItemFactory.qml:587
187#: qml/Panel/Indicators/MenuItemFactory.qml:587
180msgid "Downloading"
188msgid "Downloading"
181−msgstr ""
189+msgstr "Загрузка"
182
190
183#: qml/Panel/Indicators/MenuItemFactory.qml:589
191#: qml/Panel/Indicators/MenuItemFactory.qml:589
184msgid "Paused, tap to resume"
192msgid "Paused, tap to resume"
185−msgstr ""
193+msgstr "Приостановлено, коснитесь для возобновления"
186
194
187#: qml/Panel/Indicators/MenuItemFactory.qml:591
195#: qml/Panel/Indicators/MenuItemFactory.qml:591
188msgid "Canceled"
196msgid "Canceled"
189−msgstr ""
197+msgstr "Отменено"
190
198
191#: qml/Panel/Indicators/MenuItemFactory.qml:593
199#: qml/Panel/Indicators/MenuItemFactory.qml:593
192msgid "Finished"
200msgid "Finished"
193−msgstr ""
201+msgstr "Завершено"
194
202
195#: qml/Panel/Indicators/MenuItemFactory.qml:595
203#: qml/Panel/Indicators/MenuItemFactory.qml:595
196msgid "Failed, tap to retry"
204msgid "Failed, tap to retry"
197−msgstr ""
205+msgstr "Сбой, коснитесь для повтора"
198
206
199#: qml/Panel/SearchIndicator.qml:27
207#: qml/Panel/SearchIndicator.qml:27
200msgid "Search"
208msgid "Search"
po/shn.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
11"PO-Revision-Date: 2013-10-07 11:46+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Shan <shn@li.org>\n"
13"Language-Team: Shan <shn@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/si.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
11"PO-Revision-Date: 2013-06-26 22:36+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
13"Language-Team: Sinhalese <si@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/sl.po+28−20
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-06-23 09:29+0000\n"
11+"PO-Revision-Date: 2014-08-06 06:11+0000\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
12"Last-Translator: Damir Jerovšek <Unknown>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-08 07:07+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Pripni bližnjico"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Odpni bližnjico"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -84,10 +84,6 @@ msgstr "Klic v sili"
84msgid "OK"
84msgid "OK"
85msgstr "V REDU"
85msgstr "V REDU"
86
86
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Nedavna iskanja"
90−
91#: qml/Components/PassphraseLockscreen.qml:60
87#: qml/Components/PassphraseLockscreen.qml:60
92#, qt-format
88#, qt-format
93msgid "Hello %1"
89msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "KONČANO"
109msgid "See more"
105msgid "See more"
110msgstr "Pokaži več"
106msgstr "Pokaži več"
111
107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113msgid "See less"
109msgid "See less"
114msgstr "Pokaži manj"
110msgstr "Pokaži manj"
115
111
@@ -117,6 +113,10 @@ msgstr "Pokaži manj"
117msgid "Recent"
113msgid "Recent"
118msgstr "Nedavno"
114msgstr "Nedavno"
119
115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ogled vsega"
119+
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "More..."
121msgid "More..."
122msgstr "Več ..."
122msgstr "Več ..."
@@ -125,15 +125,15 @@ msgstr "Več ..."
125msgid "Less..."
125msgid "Less..."
126msgstr "Manj ..."
126msgstr "Manj ..."
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129msgid "Rate this"
129msgid "Rate this"
130msgstr "Ocenite"
130msgstr "Ocenite"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133msgid "Add a review"
133msgid "Add a review"
134msgstr "Dodaj oceno"
134msgstr "Dodaj oceno"
135
135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137msgid "Send"
137msgid "Send"
138msgstr "Pošlji"
138msgstr "Pošlji"
139
139
@@ -169,29 +169,37 @@ msgstr "Pokaži geslo"
169msgid "Please enter SIM PIN"
169msgid "Please enter SIM PIN"
170msgstr "Vnesite PIN kartice SIM"
170msgstr "Vnesite PIN kartice SIM"
171
171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Tapnite za vrnitev v klic ..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferenca"
179+
172#: qml/Panel/Indicators/MenuItemFactory.qml:583
180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173msgid "In queue…"
181msgid "In queue…"
174−msgstr ""
182+msgstr "V vrsti ..."
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:587
184#: qml/Panel/Indicators/MenuItemFactory.qml:587
177msgid "Downloading"
185msgid "Downloading"
178−msgstr ""
186+msgstr "Prejemanje"
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:589
188#: qml/Panel/Indicators/MenuItemFactory.qml:589
181msgid "Paused, tap to resume"
189msgid "Paused, tap to resume"
182−msgstr ""
190+msgstr "Premor, tapnite za nadaljevanje"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:591
192#: qml/Panel/Indicators/MenuItemFactory.qml:591
185msgid "Canceled"
193msgid "Canceled"
186−msgstr ""
194+msgstr "Preklicano"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:593
196#: qml/Panel/Indicators/MenuItemFactory.qml:593
189msgid "Finished"
197msgid "Finished"
190−msgstr ""
198+msgstr "Končano"
191
199
192#: qml/Panel/Indicators/MenuItemFactory.qml:595
200#: qml/Panel/Indicators/MenuItemFactory.qml:595
193msgid "Failed, tap to retry"
201msgid "Failed, tap to retry"
194−msgstr ""
202+msgstr "Spodletelo, tapnite za ponovni poskus"
195
203
196#: qml/Panel/SearchIndicator.qml:27
204#: qml/Panel/SearchIndicator.qml:27
197msgid "Search"
205msgid "Search"
po/sq.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
11"PO-Revision-Date: 2014-01-15 13:51+0000\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
12"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
13"Language-Team: Albanian <sq@li.org>\n"
13"Language-Team: Albanian <sq@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -81,10 +81,6 @@ msgstr ""
81msgid "OK"
81msgid "OK"
82msgstr ""
82msgstr ""
83
83
84−#: qml/Components/PageHeader.qml:366
85−msgid "Recent searches"
86−msgstr ""
87−
88#: qml/Components/PassphraseLockscreen.qml:60
84#: qml/Components/PassphraseLockscreen.qml:60
89#, qt-format
85#, qt-format
90msgid "Hello %1"
86msgid "Hello %1"
@@ -106,7 +102,7 @@ msgstr ""
106msgid "See more"
102msgid "See more"
107msgstr ""
103msgstr ""
108
104
109−#: qml/Components/SeeMore.qml:58
105+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
110msgid "See less"
106msgid "See less"
111msgstr ""
107msgstr ""
112
108
@@ -114,6 +110,10 @@ msgstr ""
114msgid "Recent"
110msgid "Recent"
115msgstr ""
111msgstr ""
116
112
113+#: qml/Dash/GenericScopeView.qml:330
114+msgid "See all"
115+msgstr ""
116+
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
117#: qml/Dash/Previews/PreviewActionCombo.qml:34
118msgid "More..."
118msgid "More..."
119msgstr ""
119msgstr ""
@@ -122,15 +122,15 @@ msgstr ""
122msgid "Less..."
122msgid "Less..."
123msgstr ""
123msgstr ""
124
124
125−#: qml/Dash/Previews/PreviewRatingInput.qml:82
125+#: qml/Dash/Previews/PreviewRatingInput.qml:81
126msgid "Rate this"
126msgid "Rate this"
127msgstr "Vlerësoje këtë"
127msgstr "Vlerësoje këtë"
128
128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:128
129+#: qml/Dash/Previews/PreviewRatingInput.qml:126
130msgid "Add a review"
130msgid "Add a review"
131msgstr "Shto një rishikim"
131msgstr "Shto një rishikim"
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:168
133+#: qml/Dash/Previews/PreviewRatingInput.qml:166
134msgid "Send"
134msgid "Send"
135msgstr ""
135msgstr ""
136
136
@@ -166,6 +166,14 @@ msgstr ""
166msgid "Please enter SIM PIN"
166msgid "Please enter SIM PIN"
167msgstr ""
167msgstr ""
168
168
169+#: qml/Panel/ActiveCallHint.qml:77
170+msgid "Tap to return to call..."
171+msgstr ""
172+
173+#: qml/Panel/ActiveCallHint.qml:90
174+msgid "Conference"
175+msgstr ""
176+
169#: qml/Panel/Indicators/MenuItemFactory.qml:583
177#: qml/Panel/Indicators/MenuItemFactory.qml:583
170msgid "In queue…"
178msgid "In queue…"
171msgstr ""
179msgstr ""
po/sr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-06-27 09:19+0000\n"
11"PO-Revision-Date: 2013-06-27 09:19+0000\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
12"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
13"Language-Team: Serbian <sr@li.org>\n"
13"Language-Team: Serbian <sr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Скорашње претраге"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/sv.po+39−30
@@ -1,21 +1,22 @@
1# Swedish translation for unity
1# Swedish translation for unity
2−# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
2+# Copyright © 2013-2014 Rosetta Contributors and Canonical Ltd 2013-2014
3# This file is distributed under the same license as the unity package.
3# This file is distributed under the same license as the unity package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
4+# Josef Andersson <josef.andersson@fripost.org>, 2014.
5#
5#
6msgid ""
6msgid ""
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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-20 19:14+0000\n"
11+"PO-Revision-Date: 2014-07-31 08:10+0000\n"
12−"Last-Translator: Gunnar Hjalmarsson <Unknown>\n"
12+"Last-Translator: Peter Hultqvist <phq@silentorbit.com>\n"
13−"Language-Team: Swedish <sv@li.org>\n"
13+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-01 07:14+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17141)\n"
19+"Language: sv\n"
19
20
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +29,7 @@ msgstr "Släpp genväg"
28
29
29#: qml/Components/EdgeDemoOverlay.qml:151
30#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
31msgid "Skip intro"
31−msgstr "Skippa intro"
32+msgstr "Hoppa över introduktion"
32
33
33#: qml/Components/EdgeDemo.qml:113
34#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
35msgid "Right edge"
@@ -36,7 +37,7 @@ msgstr "Högerkant"
36
37
37#: qml/Components/EdgeDemo.qml:114
38#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
39msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "Dra med fingret från höger för att låsa upp telefonen"
40+msgstr "Svep från höger för att låsa upp telefonen"
40
41
41#: qml/Components/EdgeDemo.qml:145
42#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
43msgid "Top edge"
@@ -71,8 +72,8 @@ msgid ""
71"You have now mastered the edge gestures and can start using the "
72"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"
73"phone<br><br>Tap on the screen to start"
73msgstr ""
74msgstr ""
74−"Du har nu bemästrat kantgesterna och kan börja använda telefonen<br><br>Peka "
75+"Du har nu bemästrat kantgesterna och kan börja använda "
75−"på skärmen för att starta"
76+"telefonen<br><br>Tryck på skärmen för att starta"
76
77
77#: qml/Components/Lockscreen.qml:214
78#: qml/Components/Lockscreen.qml:214
78msgid "Emergency Call"
79msgid "Emergency Call"
@@ -82,10 +83,6 @@ msgstr "Nödsamtal"
82msgid "OK"
83msgid "OK"
83msgstr "Ok"
84msgstr "Ok"
84
85
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Senaste sökningar"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
87#, qt-format
91msgid "Hello %1"
88msgid "Hello %1"
@@ -105,33 +102,37 @@ msgstr "KLAR"
105
102
106#: qml/Components/SeeMore.qml:35
103#: qml/Components/SeeMore.qml:35
107msgid "See more"
104msgid "See more"
108−msgstr "Se mer"
105+msgstr "Visa mer"
109
106
110−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
108msgid "See less"
112−msgstr "Se mindre"
109+msgstr "Visa mindre"
113
110
114#: qml/Dash/DashApps.qml:37
111#: qml/Dash/DashApps.qml:37
115msgid "Recent"
112msgid "Recent"
116msgstr "Senaste"
113msgstr "Senaste"
117
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Visa alla"
118+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
120msgid "More..."
120−msgstr "Mer..."
121+msgstr "Mer…"
121
122
122#: qml/Dash/Previews/PreviewActionCombo.qml:34
123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123msgid "Less..."
124msgid "Less..."
124−msgstr "Mindre..."
125+msgstr "Mindre…"
125
126
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
128msgid "Rate this"
128msgstr "Betygsätt detta"
129msgstr "Betygsätt detta"
129
130
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
132msgid "Add a review"
132msgstr "Lägg till en recension"
133msgstr "Lägg till en recension"
133
134
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
136msgid "Send"
136msgstr "Skicka"
137msgstr "Skicka"
137
138
@@ -149,15 +150,15 @@ msgstr "Skriv eller tala in ett kommando"
149
150
150#: qml/Hud/Hud.qml:84
151#: qml/Hud/Hud.qml:84
151msgid "Loading. Please Wait..."
152msgid "Loading. Please Wait..."
152−msgstr "Laddar. Var god vänta..."
153+msgstr "Läser in. Var god vänta…"
153
154
154#: qml/Hud/Hud.qml:89
155#: qml/Hud/Hud.qml:89
155msgid "Speak Now..."
156msgid "Speak Now..."
156−msgstr "Tala nu..."
157+msgstr "Tala nu…"
157
158
158#: qml/Hud/Hud.qml:94
159#: qml/Hud/Hud.qml:94
159msgid "Speaking..."
160msgid "Speaking..."
160−msgstr "Talar..."
161+msgstr "Talar…"
161
162
162#: qml/Notifications/NotificationMenuItemFactory.qml:91
163#: qml/Notifications/NotificationMenuItemFactory.qml:91
163msgid "Show password"
164msgid "Show password"
@@ -167,9 +168,17 @@ msgstr "Visa lösenord"
167msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
168msgstr "Ange SIM PIN-kod"
169msgstr "Ange SIM PIN-kod"
169
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tryck för att återgå till samtal..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Konferens"
178+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
180msgid "In queue…"
172−msgstr "I kö..."
181+msgstr "I kö…"
173
182
174#: qml/Panel/Indicators/MenuItemFactory.qml:587
183#: qml/Panel/Indicators/MenuItemFactory.qml:587
175msgid "Downloading"
184msgid "Downloading"
@@ -177,7 +186,7 @@ msgstr "Hämtar"
177
186
178#: qml/Panel/Indicators/MenuItemFactory.qml:589
187#: qml/Panel/Indicators/MenuItemFactory.qml:589
179msgid "Paused, tap to resume"
188msgid "Paused, tap to resume"
180−msgstr "Pausad, peka för att fortsätta"
189+msgstr "Pausad, tryck för att fortsätta"
181
190
182#: qml/Panel/Indicators/MenuItemFactory.qml:591
191#: qml/Panel/Indicators/MenuItemFactory.qml:591
183msgid "Canceled"
192msgid "Canceled"
@@ -189,7 +198,7 @@ msgstr "Klart"
189
198
190#: qml/Panel/Indicators/MenuItemFactory.qml:595
199#: qml/Panel/Indicators/MenuItemFactory.qml:595
191msgid "Failed, tap to retry"
200msgid "Failed, tap to retry"
192−msgstr "Misslyckades, peka för att försöka igen"
201+msgstr "Misslyckades, tryck för att försöka igen"
193
202
194#: qml/Panel/SearchIndicator.qml:27
203#: qml/Panel/SearchIndicator.qml:27
195msgid "Search"
204msgid "Search"
po/sw.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\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 <Unknown>\n"
12"Last-Translator: Damas <Unknown>\n"
13"Language-Team: Swahili <sw@li.org>\n"
13"Language-Team: Swahili <sw@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "Tuma"
134msgstr "Tuma"
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/ta.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
11"PO-Revision-Date: 2013-10-24 11:36+0000\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
12"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
13"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19"Language: ta\n"
19"Language: ta\n"
20
20
21#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -83,10 +83,6 @@ msgstr "அவசர அழைப்பு"
83msgid "OK"
83msgid "OK"
84msgstr ""
84msgstr ""
85
85
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "கடையாக தேடப்பட்டவைகள்"
89−
90#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
91#, qt-format
87#, qt-format
92msgid "Hello %1"
88msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108msgid "See more"
104msgid "See more"
109msgstr ""
105msgstr ""
110
106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112msgid "See less"
108msgid "See less"
113msgstr ""
109msgstr ""
114
110
@@ -116,6 +112,10 @@ msgstr ""
116msgid "Recent"
112msgid "Recent"
117msgstr ""
113msgstr ""
118
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120msgid "More..."
120msgid "More..."
121msgstr ""
121msgstr ""
@@ -124,15 +124,15 @@ msgstr ""
124msgid "Less..."
124msgid "Less..."
125msgstr ""
125msgstr ""
126
126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128msgid "Rate this"
128msgid "Rate this"
129msgstr "இதை மதிப்பிடு"
129msgstr "இதை மதிப்பிடு"
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132msgid "Add a review"
132msgid "Add a review"
133msgstr "ஒரு பரிசீலனையை சேர்"
133msgstr "ஒரு பரிசீலனையை சேர்"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136msgid "Send"
136msgid "Send"
137msgstr "அனுப்பு"
137msgstr "அனுப்பு"
138
138
@@ -168,6 +168,14 @@ msgstr ""
168msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
169msgstr ""
169msgstr ""
170
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172msgid "In queue…"
180msgid "In queue…"
173msgstr ""
181msgstr ""
po/te.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
11"PO-Revision-Date: 2014-07-19 10:04+0000\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
12"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
13"Language-Team: Telugu <te@li.org>\n"
13"Language-Team: Telugu <te@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-20 06:18+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "అత్యవసర పిలుపు"
80msgid "OK"
80msgid "OK"
81msgstr "సరే"
81msgstr "సరే"
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "ఇటీవలి వెతుకులాటలు"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "పూర్తయ్యింది"
105msgid "See more"
101msgid "See more"
106msgstr "మరింత చూడండి"
102msgstr "మరింత చూడండి"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr "ఇటీవలివి"
110msgstr "ఇటీవలివి"
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr "మరిన్ని..."
118msgstr "మరిన్ని..."
@@ -121,15 +121,15 @@ msgstr "మరిన్ని..."
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "ఒక సమీక్షను వ్రాయండి"
130msgstr "ఒక సమీక్షను వ్రాయండి"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "పంపు"
134msgstr "పంపు"
135
135
@@ -165,6 +165,14 @@ msgstr "సంకేతపదాన్ని చూపించు"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr "దయచేసి సిమ్ పిన్ ఇవ్వండి"
166msgstr "దయచేసి సిమ్ పిన్ ఇవ్వండి"
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/tr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
11"PO-Revision-Date: 2014-07-16 17:58+0000\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
12"Last-Translator: Volkan Gezer <Unknown>\n"
13"Language-Team: Turkish <tr@li.org>\n"
13"Language-Team: Turkish <tr@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Acil Arama"
83msgid "OK"
83msgid "OK"
84msgstr "Tamam"
84msgstr "Tamam"
85
85
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Son aramalar"
89−
90#: qml/Components/PassphraseLockscreen.qml:60
86#: qml/Components/PassphraseLockscreen.qml:60
91#, qt-format
87#, qt-format
92msgid "Hello %1"
88msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr "BİTTİ"
108msgid "See more"
104msgid "See more"
109msgstr "Daha fazlası"
105msgstr "Daha fazlası"
110
106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112msgid "See less"
108msgid "See less"
113msgstr "Daha azını gör"
109msgstr "Daha azını gör"
114
110
@@ -116,6 +112,10 @@ msgstr "Daha azını gör"
116msgid "Recent"
112msgid "Recent"
117msgstr "En son"
113msgstr "En son"
118
114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120msgid "More..."
120msgid "More..."
121msgstr "Daha fazlası..."
121msgstr "Daha fazlası..."
@@ -124,15 +124,15 @@ msgstr "Daha fazlası..."
124msgid "Less..."
124msgid "Less..."
125msgstr "Daha az.."
125msgstr "Daha az.."
126
126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128msgid "Rate this"
128msgid "Rate this"
129msgstr "Oyla"
129msgstr "Oyla"
130
130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132msgid "Add a review"
132msgid "Add a review"
133msgstr "Bir inceleme ekle"
133msgstr "Bir inceleme ekle"
134
134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136msgid "Send"
136msgid "Send"
137msgstr "Gönder"
137msgstr "Gönder"
138
138
@@ -168,6 +168,14 @@ msgstr "Parolayı göster"
168msgid "Please enter SIM PIN"
168msgid "Please enter SIM PIN"
169msgstr "Lütfen SIM PIN'inizi girin"
169msgstr "Lütfen SIM PIN'inizi girin"
170
170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171#: qml/Panel/Indicators/MenuItemFactory.qml:583
179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172msgid "In queue…"
180msgid "In queue…"
173msgstr "Beklemede..."
181msgstr "Beklemede..."
po/ug.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-21 02:30+0000\n"
11+"PO-Revision-Date: 2014-07-29 04:06+0000\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
12"Last-Translator: Gheyret T.Kenji <Unknown>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
13"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "جىددىي تېلېفون"
82msgid "OK"
82msgid "OK"
83msgstr "تامام"
83msgstr "تامام"
84
84
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "يېقىنقى ئىزدەشلەر"
88−
89#: qml/Components/PassphraseLockscreen.qml:60
85#: qml/Components/PassphraseLockscreen.qml:60
90#, qt-format
86#, qt-format
91msgid "Hello %1"
87msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "تامام"
107msgid "See more"
103msgid "See more"
108msgstr "جىقراق كۆرۈش"
104msgstr "جىقراق كۆرۈش"
109
105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111msgid "See less"
107msgid "See less"
112msgstr "ئازراق كۆرۈش"
108msgstr "ئازراق كۆرۈش"
113
109
@@ -115,6 +111,10 @@ msgstr "ئازراق كۆرۈش"
115msgid "Recent"
111msgid "Recent"
116msgstr "يېقىنقى"
112msgstr "يېقىنقى"
117
113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "ھەممىنى كۆرۈش…"
117+
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119msgid "More..."
119msgid "More..."
120msgstr "تېخىمۇ كۆپ…"
120msgstr "تېخىمۇ كۆپ…"
@@ -123,15 +123,15 @@ msgstr "تېخىمۇ كۆپ…"
123msgid "Less..."
123msgid "Less..."
124msgstr "ئازراق..."
124msgstr "ئازراق..."
125
125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127msgid "Rate this"
127msgid "Rate this"
128msgstr "بۇنى باھالاڭ"
128msgstr "بۇنى باھالاڭ"
129
129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131msgid "Add a review"
131msgid "Add a review"
132msgstr "باھا قوشۇش"
132msgstr "باھا قوشۇش"
133
133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135msgid "Send"
135msgid "Send"
136msgstr "ئەۋەت"
136msgstr "ئەۋەت"
137
137
@@ -167,6 +167,14 @@ msgstr "ئىم كۆرسەت"
167msgid "Please enter SIM PIN"
167msgid "Please enter SIM PIN"
168msgstr "سىم(SIM) كارتىڭىزنىڭ PIN نومۇرىنى كىرگۈزۈڭ"
168msgstr "سىم(SIM) كارتىڭىزنىڭ PIN نومۇرىنى كىرگۈزۈڭ"
169
169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "سۆزلىشىشكە قايتىش ئۈچۈن چېكىڭ…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "يىغىن"
177+
170#: qml/Panel/Indicators/MenuItemFactory.qml:583
178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171msgid "In queue…"
179msgid "In queue…"
172msgstr "قاتاردا…"
180msgstr "قاتاردا…"
po/uk.po+20−12
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-13 17:03+0000\n"
11+"PO-Revision-Date: 2014-07-29 07:53+0000\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
12"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
13"Language-Team: Ukrainian <uk@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-14 07:10+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Терміновий виклик"
85msgid "OK"
85msgid "OK"
86msgstr "Гаразд"
86msgstr "Гаразд"
87
87
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Нещодавні пошуки"
91−
92#: qml/Components/PassphraseLockscreen.qml:60
88#: qml/Components/PassphraseLockscreen.qml:60
93#, qt-format
89#, qt-format
94msgid "Hello %1"
90msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "Виконано"
110msgid "See more"
106msgid "See more"
111msgstr "Докладніше"
107msgstr "Докладніше"
112
108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114msgid "See less"
110msgid "See less"
115msgstr "Стисліше"
111msgstr "Стисліше"
116
112
@@ -118,6 +114,10 @@ msgstr "Стисліше"
118msgid "Recent"
114msgid "Recent"
119msgstr "Нещодавні"
115msgstr "Нещодавні"
120
116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Детальніше"
120+
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122msgid "More..."
122msgid "More..."
123msgstr "Більше…"
123msgstr "Більше…"
@@ -126,15 +126,15 @@ msgstr "Більше…"
126msgid "Less..."
126msgid "Less..."
127msgstr "Менше..."
127msgstr "Менше..."
128
128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130msgid "Rate this"
130msgid "Rate this"
131msgstr "Оцінити"
131msgstr "Оцінити"
132
132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134msgid "Add a review"
134msgid "Add a review"
135msgstr "Додати рецензію"
135msgstr "Додати рецензію"
136
136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138msgid "Send"
138msgid "Send"
139msgstr "Надіслати"
139msgstr "Надіслати"
140
140
@@ -170,6 +170,14 @@ msgstr "Показати пароль"
170msgid "Please enter SIM PIN"
170msgid "Please enter SIM PIN"
171msgstr "Введіть PIN-код SIM-картки"
171msgstr "Введіть PIN-код SIM-картки"
172
172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Торкніться, щоб повернутися до дзвінка…"
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Конференція"
180+
173#: qml/Panel/Indicators/MenuItemFactory.qml:583
181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174msgid "In queue…"
182msgid "In queue…"
175msgstr "У черзі…"
183msgstr "У черзі…"
po/unity8.pot+17−9
@@ -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-07-07 12:15+0100\n"
11+"POT-Creation-Date: 2014-07-11 14:59+0200\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"
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/vi.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
11"PO-Revision-Date: 2014-01-15 01:19+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
13"Language-Team: Vietnamese <vi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/xh.po+19−11
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
11"PO-Revision-Date: 2013-09-28 13:20+0000\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
13"Language-Team: Xhosa <xh@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
80msgid "OK"
80msgid "OK"
81msgstr ""
81msgstr ""
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105msgid "See more"
101msgid "See more"
106msgstr ""
102msgstr ""
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr ""
106msgstr ""
111
107
@@ -113,6 +109,10 @@ msgstr ""
113msgid "Recent"
109msgid "Recent"
114msgstr ""
110msgstr ""
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr ""
118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121msgid "Less..."
121msgid "Less..."
122msgstr ""
122msgstr ""
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr ""
126msgstr ""
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr ""
130msgstr ""
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr ""
134msgstr ""
135
135
@@ -165,6 +165,14 @@ msgstr ""
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr ""
166msgstr ""
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr ""
178msgstr ""
po/zh_CN.po+29−21
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-06-12 08:55+0000\n"
11+"PO-Revision-Date: 2014-07-29 02:48+0000\n"
12−"Last-Translator: Shengjing Zhu <Unknown>\n"
12+"Last-Translator: Luo Lei <luolei@ubuntukylin.com>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
13"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "固定快捷方式"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "取消固定快捷方式"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -80,10 +80,6 @@ msgstr "紧急电话"
80msgid "OK"
80msgid "OK"
81msgstr "确定"
81msgstr "确定"
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "近期搜索"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "完成"
105msgid "See more"
101msgid "See more"
106msgstr "了解更多"
102msgstr "了解更多"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr "显示更少"
106msgstr "显示更少"
111
107
@@ -113,6 +109,10 @@ msgstr "显示更少"
113msgid "Recent"
109msgid "Recent"
114msgstr "最近使用过的"
110msgstr "最近使用过的"
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "查看全部"
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr "更多..."
118msgstr "更多..."
@@ -121,15 +121,15 @@ msgstr "更多..."
121msgid "Less..."
121msgid "Less..."
122msgstr "更少..."
122msgstr "更少..."
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "评分"
126msgstr "评分"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "添加评论"
130msgstr "添加评论"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "发送"
134msgstr "发送"
135
135
@@ -165,29 +165,37 @@ msgstr "显示密码"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr "请输入 SIM PIN"
166msgstr "请输入 SIM PIN"
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr "点击回到通话..."
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "会议"
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170−msgstr ""
178+msgstr "排队中..."
171
179
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
181msgid "Downloading"
174−msgstr ""
182+msgstr "正在下载"
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:589
184#: qml/Panel/Indicators/MenuItemFactory.qml:589
177msgid "Paused, tap to resume"
185msgid "Paused, tap to resume"
178−msgstr ""
186+msgstr "已暂停,点击继续"
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:591
188#: qml/Panel/Indicators/MenuItemFactory.qml:591
181msgid "Canceled"
189msgid "Canceled"
182−msgstr ""
190+msgstr "已取消"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:593
192#: qml/Panel/Indicators/MenuItemFactory.qml:593
185msgid "Finished"
193msgid "Finished"
186−msgstr ""
194+msgstr "已完成"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:595
196#: qml/Panel/Indicators/MenuItemFactory.qml:595
189msgid "Failed, tap to retry"
197msgid "Failed, tap to retry"
190−msgstr ""
198+msgstr "下载失败,请点击重试"
191
199
192#: qml/Panel/SearchIndicator.qml:27
200#: qml/Panel/SearchIndicator.qml:27
193msgid "Search"
201msgid "Search"
po/zh_HK.po+47−39
@@ -7,24 +7,24 @@ 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-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-01-25 13:32+0000\n"
11+"PO-Revision-Date: 2014-08-10 11:45+0000\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
12"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
13"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
17+"X-Launchpad-Export-Date: 2014-08-11 06:34+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
18+"X-Generator: Launchpad (build 17156)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
22msgid "Pin shortcut"
22msgid "Pin shortcut"
23−msgstr ""
23+msgstr "釘住捷徑"
24
24
25#: plugins/Unity/Launcher/launcheritem.cpp:73
25#: plugins/Unity/Launcher/launcheritem.cpp:73
26msgid "Unpin shortcut"
26msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "取消捷徑釘選"
28
28
29#: qml/Components/EdgeDemoOverlay.qml:151
29#: qml/Components/EdgeDemoOverlay.qml:151
30msgid "Skip intro"
30msgid "Skip intro"
@@ -32,11 +32,11 @@ msgstr "跳過介紹"
32
32
33#: qml/Components/EdgeDemo.qml:113
33#: qml/Components/EdgeDemo.qml:113
34msgid "Right edge"
34msgid "Right edge"
35−msgstr "右邊緣"
35+msgstr "右側邊緣"
36
36
37#: qml/Components/EdgeDemo.qml:114
37#: qml/Components/EdgeDemo.qml:114
38msgid "Try swiping from the right edge to unlock the phone"
38msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "試從右邊緣輕掃解鎖手機"
39+msgstr "試從右邊緣向左滑動解鎖手機"
40
40
41#: qml/Components/EdgeDemo.qml:145
41#: qml/Components/EdgeDemo.qml:145
42msgid "Top edge"
42msgid "Top edge"
@@ -52,15 +52,15 @@ msgstr "關閉"
52
52
53#: qml/Components/EdgeDemo.qml:172
53#: qml/Components/EdgeDemo.qml:172
54msgid "Swipe up again to close the settings screen"
54msgid "Swipe up again to close the settings screen"
55−msgstr "再向上掃一次以關閉設定畫面"
55+msgstr "再向上滑動一次以關閉設定畫面"
56
56
57#: qml/Components/EdgeDemo.qml:199
57#: qml/Components/EdgeDemo.qml:199
58msgid "Left edge"
58msgid "Left edge"
59−msgstr "左邊緣"
59+msgstr "左側邊緣"
60
60
61#: qml/Components/EdgeDemo.qml:200
61#: qml/Components/EdgeDemo.qml:200
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
62msgid "Swipe from the left to reveal the launcher for quick access to apps"
63−msgstr "從左邊緣輕掃以顯示啟動器快速訪問應用"
63+msgstr "從左側邊緣滑動以顯示啟動器快速查看應用"
64
64
65#: qml/Components/EdgeDemo.qml:227
65#: qml/Components/EdgeDemo.qml:227
66msgid "Well done"
66msgid "Well done"
@@ -70,7 +70,7 @@ msgstr "做得好"
70msgid ""
70msgid ""
71"You have now mastered the edge gestures and can start using the "
71"You have now mastered the edge gestures and can start using the "
72"phone<br><br>Tap on the screen to start"
72"phone<br><br>Tap on the screen to start"
73−msgstr ""
73+msgstr "您現在已熟練邊緣手勢,可以開始使用手機了<br><br>輕觸螢幕開始使用"
74
74
75#: qml/Components/Lockscreen.qml:214
75#: qml/Components/Lockscreen.qml:214
76msgid "Emergency Call"
76msgid "Emergency Call"
@@ -78,11 +78,7 @@ msgstr "緊急電話"
78
78
79#: qml/Components/Lockscreen.qml:231
79#: qml/Components/Lockscreen.qml:231
80msgid "OK"
80msgid "OK"
81−msgstr ""
81+msgstr "確定"
82−
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近的搜尋"
86
82
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
@@ -95,47 +91,51 @@ msgstr "您好"
95
91
96#: qml/Components/PinLockscreen.qml:198
92#: qml/Components/PinLockscreen.qml:198
97msgid "CANCEL"
93msgid "CANCEL"
98−msgstr ""
94+msgstr "取消"
99
95
100#: qml/Components/PinLockscreen.qml:216
96#: qml/Components/PinLockscreen.qml:216
101msgid "DONE"
97msgid "DONE"
102−msgstr ""
98+msgstr "完成"
103
99
104#: qml/Components/SeeMore.qml:35
100#: qml/Components/SeeMore.qml:35
105msgid "See more"
101msgid "See more"
106−msgstr ""
102+msgstr "查看更多"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110−msgstr ""
106+msgstr "縮減查看"
111
107
112#: qml/Dash/DashApps.qml:37
108#: qml/Dash/DashApps.qml:37
113msgid "Recent"
109msgid "Recent"
114−msgstr ""
110+msgstr "最近"
111+
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "查看全部"
115
115
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118−msgstr ""
118+msgstr "更多..."
119
119
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121msgid "Less..."
121msgid "Less..."
122−msgstr ""
122+msgstr "縮減…"
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126−msgstr "評價"
126+msgstr "評分"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "新增評論"
130msgstr "新增評論"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "傳送"
134msgstr "傳送"
135
135
136#: qml/Greeter/Greeter.qml:157
136#: qml/Greeter/Greeter.qml:157
137msgid "Swipe to unlock"
137msgid "Swipe to unlock"
138−msgstr ""
138+msgstr "滑動解除鎖定"
139
139
140#: qml/Hud/HudParametrizedActionsPage.qml:132
140#: qml/Hud/HudParametrizedActionsPage.qml:132
141msgid "Confirm"
141msgid "Confirm"
@@ -147,11 +147,11 @@ msgstr "輸入或說出指令"
147
147
148#: qml/Hud/Hud.qml:84
148#: qml/Hud/Hud.qml:84
149msgid "Loading. Please Wait..."
149msgid "Loading. Please Wait..."
150−msgstr "正載入。請稍候..."
150+msgstr "載入中。請稍候..."
151
151
152#: qml/Hud/Hud.qml:89
152#: qml/Hud/Hud.qml:89
153msgid "Speak Now..."
153msgid "Speak Now..."
154−msgstr "馬上講..."
154+msgstr "請講..."
155
155
156#: qml/Hud/Hud.qml:94
156#: qml/Hud/Hud.qml:94
157msgid "Speaking..."
157msgid "Speaking..."
@@ -163,31 +163,39 @@ msgstr "顯示密碼"
163
163
164#: qml/Notifications/NotificationMenuItemFactory.qml:103
164#: qml/Notifications/NotificationMenuItemFactory.qml:103
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166−msgstr ""
166+msgstr "請輸入 SIM 卡 PIN 碼"
167+
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr "輕觸可返回通話…"
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "會議"
167
175
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170−msgstr ""
178+msgstr "佇列中…"
171
179
172#: qml/Panel/Indicators/MenuItemFactory.qml:587
180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173msgid "Downloading"
181msgid "Downloading"
174−msgstr ""
182+msgstr "下載中"
175
183
176#: qml/Panel/Indicators/MenuItemFactory.qml:589
184#: qml/Panel/Indicators/MenuItemFactory.qml:589
177msgid "Paused, tap to resume"
185msgid "Paused, tap to resume"
178−msgstr ""
186+msgstr "已暫停,輕觸以繼續"
179
187
180#: qml/Panel/Indicators/MenuItemFactory.qml:591
188#: qml/Panel/Indicators/MenuItemFactory.qml:591
181msgid "Canceled"
189msgid "Canceled"
182−msgstr ""
190+msgstr "已取消"
183
191
184#: qml/Panel/Indicators/MenuItemFactory.qml:593
192#: qml/Panel/Indicators/MenuItemFactory.qml:593
185msgid "Finished"
193msgid "Finished"
186−msgstr ""
194+msgstr "已完成"
187
195
188#: qml/Panel/Indicators/MenuItemFactory.qml:595
196#: qml/Panel/Indicators/MenuItemFactory.qml:595
189msgid "Failed, tap to retry"
197msgid "Failed, tap to retry"
190−msgstr ""
198+msgstr "失敗,輕觸以重試"
191
199
192#: qml/Panel/SearchIndicator.qml:27
200#: qml/Panel/SearchIndicator.qml:27
193msgid "Search"
201msgid "Search"
po/zh_TW.po+21−13
@@ -7,15 +7,15 @@ msgid ""
7msgstr ""
7msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11−"PO-Revision-Date: 2014-07-18 10:14+0000\n"
11+"PO-Revision-Date: 2014-07-26 16:21+0000\n"
12−"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
12+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
13"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
18+"X-Generator: Launchpad (build 17131)\n"
19
19
20#: plugins/Unity/Launcher/launcheritem.cpp:43
20#: plugins/Unity/Launcher/launcheritem.cpp:43
21#: plugins/Unity/Launcher/launcheritem.cpp:73
21#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "緊急通話"
80msgid "OK"
80msgid "OK"
81msgstr "確定"
81msgstr "確定"
82
82
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近搜尋"
86−
87#: qml/Components/PassphraseLockscreen.qml:60
83#: qml/Components/PassphraseLockscreen.qml:60
88#, qt-format
84#, qt-format
89msgid "Hello %1"
85msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "完成"
105msgid "See more"
101msgid "See more"
106msgstr "查看更多"
102msgstr "查看更多"
107
103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109msgid "See less"
105msgid "See less"
110msgstr "縮減查看"
106msgstr "縮減查看"
111
107
@@ -113,6 +109,10 @@ msgstr "縮減查看"
113msgid "Recent"
109msgid "Recent"
114msgstr "最近"
110msgstr "最近"
115
111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "查看全部"
115+
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117msgid "More..."
117msgid "More..."
118msgstr "更多…"
118msgstr "更多…"
@@ -121,15 +121,15 @@ msgstr "更多…"
121msgid "Less..."
121msgid "Less..."
122msgstr "縮減…"
122msgstr "縮減…"
123
123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125msgid "Rate this"
125msgid "Rate this"
126msgstr "給予評等"
126msgstr "給予評等"
127
127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129msgid "Add a review"
129msgid "Add a review"
130msgstr "新增評論"
130msgstr "新增評論"
131
131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133msgid "Send"
133msgid "Send"
134msgstr "發送"
134msgstr "發送"
135
135
@@ -165,6 +165,14 @@ msgstr "顯示密碼"
165msgid "Please enter SIM PIN"
165msgid "Please enter SIM PIN"
166msgstr "請輸入 SIM 卡 PIN 碼"
166msgstr "請輸入 SIM 卡 PIN 碼"
167
167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr "輕觸可返回通話…"
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "會議"
175+
168#: qml/Panel/Indicators/MenuItemFactory.qml:583
176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169msgid "In queue…"
177msgid "In queue…"
170msgstr "佇列中…"
178msgstr "佇列中…"
qml/Components/Background.qmlnew 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
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+Loader {
20+ id: root
21+ anchors.fill: parent
22+
23+ property url style
24+ readonly property var parsedStyle: String(style)
25+ .match(/^(color|gradient):\/\/\/(?:(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))(?:\/(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))?\/?$/i)
26+
27+ sourceComponent: {
28+ if (style == "") return null;
29+ if (!parsedStyle) return image;
30+ if (parsedStyle[1] === "color") return solid
31+ if (parsedStyle[1] === "gradient") return gradient
32+ }
33+
34+ onLoaded: if (item.hasOwnProperty("parsedStyle")) {
35+ item.parsedStyle = Qt.binding(function() { return root.parsedStyle } );
36+ }
37+
38+ Component {
39+ id: solid
40+
41+ Rectangle {
42+ objectName: "solid"
43+
44+ property var parsedStyle
45+
46+ color: parsedStyle ? parsedStyle[2] : "#ffffff"
47+ }
48+ }
49+
50+ Component {
51+ id: gradient
52+
53+ Rectangle {
54+ objectName: "gradient"
55+
56+ property var parsedStyle
57+
58+ gradient: Gradient {
59+ GradientStop { position: 0; color: parsedStyle ? parsedStyle[2] : "#000000" }
60+ GradientStop { position: 1; color: parsedStyle ? parsedStyle[3] : "#000000" }
61+ }
62+ }
63+ }
64+
65+ Component {
66+ id: image
67+
68+ Image {
69+ objectName: "image"
70+
71+ source: width > 0 && height > 0 && root.style
72+
73+ sourceSize.width: width
74+ sourceSize.height: height
75+ }
76+ }
77+}
qml/Components/Dialogs.qmlnew file+217
@@ -0,0 +1,217 @@
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+
19+import Unity.Application 0.1
20+import Unity.Session 0.1
21+import Ubuntu.Components 0.1
22+import Ubuntu.Components.Popups 0.1
23+
24+Item {
25+ id: root
26+
27+ function onPowerKeyPressed() {
28+ if (!powerKeyTimer.running) {
29+ powerKeyTimer.start();
30+ }
31+ }
32+
33+ function onPowerKeyReleased() {
34+ powerKeyTimer.stop();
35+ }
36+
37+ signal powerOffClicked();
38+
39+ QtObject {
40+ id: d // private stuff
41+
42+ property bool dialogShown: false
43+
44+ function showPowerDialog() {
45+ if (!d.dialogShown) {
46+ d.dialogShown = true;
47+ PopupUtils.open(powerDialog, root, {"z": root.z});
48+ }
49+ }
50+ }
51+
52+ Timer {
53+ id: powerKeyTimer
54+ interval: 2000
55+ repeat: false
56+ triggeredOnStart: false
57+
58+ onTriggered: {
59+ d.showPowerDialog();
60+ }
61+ }
62+
63+ Component {
64+ id: logoutDialog
65+ Dialog {
66+ id: dialogueLogout
67+ title: "Logout"
68+ text: "Are you sure that you want to logout?"
69+ Button {
70+ text: "Cancel"
71+ onClicked: {
72+ PopupUtils.close(dialogueLogout);
73+ d.dialogShown = false;
74+ }
75+ }
76+ Button {
77+ text: "Yes"
78+ onClicked: {
79+ DBusUnitySessionService.Logout();
80+ PopupUtils.close(dialogueLogout);
81+ d.dialogShown = false;
82+ }
83+ }
84+ }
85+ }
86+
87+ Component {
88+ id: shutdownDialog
89+ Dialog {
90+ id: dialogueShutdown
91+ title: "Shutdown"
92+ text: "Are you sure that you want to shutdown?"
93+ Button {
94+ text: "Cancel"
95+ onClicked: {
96+ PopupUtils.close(dialogueShutdown);
97+ d.dialogShown = false;
98+ }
99+ }
100+ Button {
101+ text: "Yes"
102+ onClicked: {
103+ dBusUnitySessionServiceConnection.closeAllApps();
104+ DBusUnitySessionService.Shutdown();
105+ PopupUtils.close(dialogueShutdown);
106+ d.dialogShown = false;
107+ }
108+ }
109+ }
110+ }
111+
112+ Component {
113+ id: rebootDialog
114+ Dialog {
115+ id: dialogueReboot
116+ title: "Reboot"
117+ text: "Are you sure that you want to reboot?"
118+ Button {
119+ text: "Cancel"
120+ onClicked: {
121+ PopupUtils.close(dialogueReboot)
122+ d.dialogShown = false;
123+ }
124+ }
125+ Button {
126+ text: "Yes"
127+ onClicked: {
128+ dBusUnitySessionServiceConnection.closeAllApps();
129+ DBusUnitySessionService.Reboot();
130+ PopupUtils.close(dialogueReboot);
131+ d.dialogShown = false;
132+ }
133+ }
134+ }
135+ }
136+
137+ Component {
138+ id: powerDialog
139+ Dialog {
140+ id: dialoguePower
141+ title: "Power"
142+ text: i18n.tr("Are you sure you would like to turn power off?")
143+ Button {
144+ text: i18n.tr("Power off")
145+ onClicked: {
146+ dBusUnitySessionServiceConnection.closeAllApps();
147+ PopupUtils.close(dialoguePower);
148+ d.dialogShown = false;
149+ root.powerOffClicked();
150+ }
151+ }
152+ Button {
153+ text: i18n.tr("Restart")
154+ onClicked: {
155+ dBusUnitySessionServiceConnection.closeAllApps();
156+ DBusUnitySessionService.Reboot();
157+ PopupUtils.close(dialoguePower);
158+ d.dialogShown = false;
159+ }
160+ }
161+ Button {
162+ text: i18n.tr("Cancel")
163+ onClicked: {
164+ PopupUtils.close(dialoguePower);
165+ d.dialogShown = false;
166+ }
167+ }
168+ }
169+ }
170+
171+
172+ Connections {
173+ id: dBusUnitySessionServiceConnection
174+ objectName: "dBusUnitySessionServiceConnection"
175+ target: DBusUnitySessionService
176+
177+ function closeAllApps() {
178+ while (true) {
179+ var app = ApplicationManager.get(0);
180+ if (app === null) {
181+ break;
182+ }
183+ ApplicationManager.stopApplication(app.appId);
184+ }
185+ }
186+
187+ onLogoutRequested: {
188+ // Display a dialog to ask the user to confirm.
189+ if (!d.dialogShown) {
190+ d.dialogShown = true;
191+ PopupUtils.open(logoutDialog, root, {"z": root.z});
192+ }
193+ }
194+
195+ onShutdownRequested: {
196+ // Display a dialog to ask the user to confirm.
197+ if (!d.dialogShown) {
198+ d.dialogShown = true;
199+ PopupUtils.open(shutdownDialog, root, {"z": root.z});
200+ }
201+ }
202+
203+ onRebootRequested: {
204+ // Display a dialog to ask the user to confirm.
205+ if (!d.dialogShown) {
206+ d.dialogShown = true;
207+ PopupUtils.open(rebootDialog, root, {"z": root.z});
208+ }
209+ }
210+
211+ onLogoutReady: {
212+ closeAllApps();
213+ Qt.quit();
214+ }
215+ }
216+
217+}
qml/Components/DraggingArea.qml+4
@@ -117,4 +117,8 @@ MouseArea {
117 dragging = false
117 dragging = false
118 __pressedPosition = Qt.point(mouse.x, mouse.y)
118 __pressedPosition = Qt.point(mouse.x, mouse.y)
119 }
119 }
120+
121+ onCanceled: {
122+ dragging = false
123+ }
120}
124}
qml/Components/EdgeDemo.qml+15−16
@@ -22,16 +22,15 @@ Item {
22 id: demo
22 id: demo
23
23
24 property Item greeter
24 property Item greeter
25− property Item dash
26 property Item launcher
25 property Item launcher
27 property Item indicators
26 property Item indicators
28− property Item underlay
27+ property Item stages
29
28
30 property bool launcherEnabled: true
29 property bool launcherEnabled: true
31− property bool dashEnabled: true
30+ property bool stagesEnabled: true
32 property bool panelEnabled: true
31 property bool panelEnabled: true
33 property bool panelContentEnabled: true
32 property bool panelContentEnabled: true
34− property bool running: !launcherEnabled || !dashEnabled || !panelEnabled || !panelContentEnabled
33+ property bool running: !launcherEnabled || !stagesEnabled || !panelEnabled || !panelContentEnabled
35
34
36 property bool paused: false
35 property bool paused: false
37
36
@@ -59,7 +58,7 @@ Item {
59
58
60 function stopDemo() {
59 function stopDemo() {
61 launcherEnabled = true
60 launcherEnabled = true
62− dashEnabled = true
61+ stagesEnabled = true
63 panelEnabled = true
62 panelEnabled = true
64 panelContentEnabled = true
63 panelContentEnabled = true
65 if (d.rightEdgeDemo) d.rightEdgeDemo.destroy()
64 if (d.rightEdgeDemo) d.rightEdgeDemo.destroy()
@@ -75,11 +74,11 @@ Item {
75 }
74 }
76
75
77 launcherEnabled = false;
76 launcherEnabled = false;
78− dashEnabled = false;
77+ stagesEnabled = false;
79 panelEnabled = false;
78 panelEnabled = false;
80 panelContentEnabled = false;
79 panelContentEnabled = false;
81
80
82− // Begin with either greeter or dash, depending on which is visible
81+ // Begin with either greeter or top, depending on which is visible
83 if (greeter && greeter.shown) {
82 if (greeter && greeter.shown) {
84 startRightEdgeDemo()
83 startRightEdgeDemo()
85 } else {
84 } else {
@@ -139,12 +138,12 @@ Item {
139
138
140 function startTopEdgeDemo() {
139 function startTopEdgeDemo() {
141 demo.panelEnabled = true;
140 demo.panelEnabled = true;
142− if (demo.dash && demo.underlay) {
141+ if (demo.stages) {
143− d.topEdgeDemo = d.overlay.createObject(demo.underlay, {
142+ d.topEdgeDemo = d.overlay.createObject(demo.stages, {
144 "edge": "top",
143 "edge": "top",
145 "title": i18n.tr("Top edge"),
144 "title": i18n.tr("Top edge"),
146 "text": i18n.tr("Try swiping from the top edge to access the indicators"),
145 "text": i18n.tr("Try swiping from the top edge to access the indicators"),
147− "anchors.fill": demo.dash,
146+ "anchors.fill": demo.stages,
148 });
147 });
149 }
148 }
150 if (d.topEdgeDemo) {
149 if (d.topEdgeDemo) {
@@ -193,12 +192,12 @@ Item {
193 function startLeftEdgeDemo() {
192 function startLeftEdgeDemo() {
194 demo.panelEnabled = false;
193 demo.panelEnabled = false;
195 demo.launcherEnabled = true;
194 demo.launcherEnabled = true;
196− if (demo.dash && demo.underlay) {
195+ if (demo.stages) {
197− d.leftEdgeDemo = d.overlay.createObject(demo.underlay, {
196+ d.leftEdgeDemo = d.overlay.createObject(demo.stages, {
198 "edge": "left",
197 "edge": "left",
199 "title": i18n.tr("Left edge"),
198 "title": i18n.tr("Left edge"),
200 "text": i18n.tr("Swipe from the left to reveal the launcher for quick access to apps"),
199 "text": i18n.tr("Swipe from the left to reveal the launcher for quick access to apps"),
201− "anchors.fill": demo.dash,
200+ "anchors.fill": demo.stages,
202 });
201 });
203 }
202 }
204 if (d.leftEdgeDemo) {
203 if (d.leftEdgeDemo) {
@@ -221,12 +220,12 @@ Item {
221
220
222 function startFinalEdgeDemo() {
221 function startFinalEdgeDemo() {
223 demo.launcherEnabled = false;
222 demo.launcherEnabled = false;
224− if (demo.dash && demo.underlay) {
223+ if (demo.stages) {
225− d.finalEdgeDemo = d.overlay.createObject(demo.underlay, {
224+ d.finalEdgeDemo = d.overlay.createObject(demo.stages, {
226 "edge": "none",
225 "edge": "none",
227 "title": i18n.tr("Well done"),
226 "title": i18n.tr("Well done"),
228 "text": i18n.tr("You have now mastered the edge gestures and can start using the phone<br><br>Tap on the screen to start"),
227 "text": i18n.tr("You have now mastered the edge gestures and can start using the phone<br><br>Tap on the screen to start"),
229− "anchors.fill": demo.dash,
228+ "anchors.fill": demo.stages,
230 "showSkip": false,
229 "showSkip": false,
231 });
230 });
232 }
231 }
qml/Components/FilterGrid.qmldeleted−124
@@ -1,124 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Utils 0.1
20−import "../Components"
21−
22−/*
23− A ResponsiveGridView that can optionally have the number of rows being displayed
24− reduced to collapsedRowCount, in which case a button saying "View all (123)"
25− will be shown at the bottom. If clicked, FilterGrid will them expand vertically
26− to display all rows.
27− */
28−Item {
29− id: root
30−
31− /* Whether, when collapsed, a button should be displayed enabling the user to expand
32− the grid to its full size. */
33− readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
34−
35− property var model: null
36−
37− /* Maximum number of rows to be show when filter=true. */
38− property int collapsedRowCount: 2
39− property int uncollapsedRowCount: Math.ceil(model.count / columns)
40− /* Never show more rows than model would fill up. */
41− readonly property int rowsWhenCollapsed: Math.min(collapsedRowCount, uncollapsedRowCount)
42− readonly property int collapsedHeight: iconTileGrid.contentHeightForRows(rowsWhenCollapsed)
43− readonly property int uncollapsedHeight: iconTileGrid.contentHeightForRows(uncollapsedRowCount)
44−
45− property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
46− property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
47− property alias columns: iconTileGrid.columns
48− property alias delegateWidth: iconTileGrid.delegateWidth
49− property alias delegateHeight: iconTileGrid.delegateHeight
50− property alias verticalSpacing: iconTileGrid.verticalSpacing
51− readonly property alias margins: iconTileGrid.margins
52− property alias delegate: iconTileGrid.delegate
53− property alias cellWidth: iconTileGrid.cellWidth
54− property alias cellHeight: iconTileGrid.cellHeight
55− property alias displayMarginBeginning: iconTileGrid.displayMarginBeginning
56− property alias displayMarginEnd: iconTileGrid.displayMarginEnd
57− readonly property alias originY: iconTileGrid.originY
58− readonly property alias flicking: iconTileGrid.flicking
59− readonly property alias moving: iconTileGrid.moving
60− readonly property alias pressDelay: iconTileGrid.pressDelay
61− property alias highlightIndex: iconTileGrid.highlightIndex
62− readonly property alias currentItem: iconTileGrid.currentItem
63− readonly property alias filtered: d.filter
64−
65− QtObject {
66− id: d
67− // We do have filter and collapsed properties because we need to decouple
68− // the real filtering with the animation since the closing animation
69− // i.e. setFilter(false. true) we still need to not be filtering until
70− // the animation finishes otherwise we hide the items when the animation
71− // is still running
72− property bool filter: true
73− property bool collapsed: true
74− }
75−
76− height: d.collapsed ? root.collapsedHeight : root.uncollapsedHeight
77− clip: filterAnimation.running
78−
79− Behavior on height {
80− id: heightBehaviour
81− enabled: false
82− NumberAnimation {
83− id: filterAnimation
84− // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
85− // otherwise since both animations can run at the same time you'll get
86− // some visual weirdness.
87− duration: 200
88− easing.type: Easing.InOutQuad
89− onRunningChanged: {
90− if (!running) {
91− d.filter = d.collapsed;
92− }
93− heightBehaviour.enabled = false;
94− }
95− }
96− }
97−
98− function setFilter(filter, animate) {
99− heightBehaviour.enabled = animate;
100− d.collapsed = filter;
101− if (!animate || !filter) {
102− d.filter = filter;
103− }
104− }
105−
106− ResponsiveGridView {
107− id: iconTileGrid
108−
109− anchors { left: parent.left; right: parent.right }
110− height: totalContentHeight
111− interactive: false
112−
113− minimumHorizontalSpacing: units.gu(0.5)
114− maximumNumberOfColumns: 6
115− delegateWidth: units.gu(11)
116− delegateHeight: units.gu(9.5)
117− verticalSpacing: units.gu(2)
118−
119− model: LimitProxyModel {
120− model: root.model
121− limit: d.filter ? rowsWhenCollapsed * iconTileGrid.columns : -1
122− }
123− }
124−}
qml/Components/InputMethod.qmlnew file+79
@@ -0,0 +1,79 @@
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 Unity.Application 0.1
19+import Ubuntu.Components 0.1
20+
21+Item {
22+ id: root
23+
24+ property var surface: null
25+
26+ property int transitionDuration: UbuntuAnimation.FastDuration
27+
28+ state: {
29+ if (surface && surface.state != MirSurfaceItem.Minimized) {
30+ return "shown";
31+ } else {
32+ return "hidden";
33+ }
34+ }
35+
36+ states: [
37+ State {
38+ name: "shown"
39+ PropertyChanges {
40+ target: root
41+ visible: true
42+ y: 0
43+ }
44+ },
45+ State {
46+ name: "hidden"
47+ PropertyChanges {
48+ target: root
49+ visible: false
50+ // half-way down because the vkb occupies only the lower half of the surface
51+ // TODO: consider keyboard rotation
52+ y: root.parent.height / 2.0
53+ }
54+ }
55+ ]
56+
57+ transitions: [
58+ Transition {
59+ from: "*"; to: "*"
60+ PropertyAction { property: "visible"; value: true }
61+ UbuntuNumberAnimation { property: "y"; duration: transitionDuration }
62+ }
63+ ]
64+
65+ onSurfaceChanged: {
66+ if (surface) {
67+ surface.parent = root;
68+ surface.anchors.fill = root;
69+ }
70+ }
71+
72+ Component.onDestruction: {
73+ if (surface) {
74+ surface.parent = null;
75+ surface.release();
76+ surface = null;
77+ }
78+ }
79+}
qml/Components/ListItems/Header.qml+17−26
@@ -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
@@ -15,54 +15,45 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import QtQuick.Layouts 1.1
18import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
19
20
20Item {
21Item {
21− /*!
22− \preliminary
23− The text that is shown as the header text.
24− \qmlproperty string text
25− */
26 property alias text: label.text
22 property alias text: label.text
27− property alias textColor: label.color
23+ property alias color: label.color
28− property alias image: image.source
24+ property alias iconName: icon.name
29
25
30 signal clicked(variant mouse)
26 signal clicked(variant mouse)
31
27
32 height: units.gu(5)
28 height: units.gu(5)
33
29
34− Item {
30+ RowLayout {
31+ spacing: units.gu(.5)
35 anchors {
32 anchors {
36 left: parent.left
33 left: parent.left
37 right: parent.right
34 right: parent.right
35+ verticalCenter: parent.verticalCenter
38− rightMargin: units.gu(0.5)
36+ margins: units.gu(1)
39− top: parent.top
40− bottom: parent.bottom
41 }
37 }
42
38
43 Label {
39 Label {
44 id: label
40 id: label
45− anchors {
41+ Layout.fillWidth: true
46− left: parent.left
47− leftMargin: units.gu(2)
48− verticalCenter: parent.verticalCenter
49− }
50
42
51− color: "grey" // TODO karni: Update Ubuntu.Compoonents.Themes.Palette.
52 font.family: "Ubuntu"
43 font.family: "Ubuntu"
53 fontSize: "medium"
44 fontSize: "medium"
54 elide: Text.ElideRight
45 elide: Text.ElideRight
46+ maximumLineCount: 1
55 textFormat: Text.PlainText
47 textFormat: Text.PlainText
56− width: parent.width - image.width - image.leftMargin - anchors.leftMargin
48+ width: Math.min(parent.width - units.gu(4), implicitWidth)
57 }
49 }
58
50
59− Image {
51+ Icon {
60− id: image
52+ id: icon
61− readonly property double leftMargin: units.gu(1)
53+ visible: name != ""
62− x: label.x + label.contentWidth + leftMargin
54+ height: units.gu(2)
63− anchors {
55+ width: height
64− verticalCenter: parent.verticalCenter
56+ color: label.color
65− }
66 }
57 }
67 }
58 }
68
59
qml/Components/Lockscreen.qml+17−5
@@ -186,6 +186,17 @@ Showable {
186 }
186 }
187
187
188 Column {
188 Column {
189+ id: emergencyCallColumn
190+
191+ // FIXME: We *should* show emergency dialer if there is a SIM present,
192+ // regardless of whether the side stage is enabled. But right now,
193+ // the assumption is that narrow screens are phones which have SIMs
194+ // and wider screens are tablets which don't. When we do allow this
195+ // on devices with a side stage and a SIM, work should be done to
196+ // ensure that the main stage is disabled while the dialer is present
197+ // in the side stage.
198+ visible: !shell.sideStageEnabled
199+
189 anchors {
200 anchors {
190 left: parent.left
201 left: parent.left
191 bottom: parent.bottom
202 bottom: parent.bottom
@@ -203,11 +214,6 @@ Showable {
203 name: "phone-app-call-symbolic"
214 name: "phone-app-call-symbolic"
204 color: "#f3f3e7"
215 color: "#f3f3e7"
205 opacity: 0.6
216 opacity: 0.6
206−
207− MouseArea {
208− anchors.fill: parent
209− onClicked: root.emergencyCall()
210− }
211 }
217 }
212
218
213 Label {
219 Label {
@@ -219,6 +225,12 @@ Showable {
219 }
225 }
220 }
226 }
221
227
228+ MouseArea {
229+ anchors.fill: emergencyCallColumn
230+ onClicked: root.emergencyCall()
231+ enabled: emergencyCallColumn.visible
232+ }
233+
222 Component {
234 Component {
223 id: infoPopupComponent
235 id: infoPopupComponent
224 Dialog {
236 Dialog {
qml/Components/PageHeader.qml+56−23
@@ -32,9 +32,10 @@ Item {
32 property bool searchEntryEnabled: false
32 property bool searchEntryEnabled: false
33 property ListModel searchHistory: SearchHistoryModel
33 property ListModel searchHistory: SearchHistoryModel
34 property alias searchQuery: searchTextField.text
34 property alias searchQuery: searchTextField.text
35− property bool searchInProgress: false
36
35
37 property alias bottomItem: bottomContainer.children
36 property alias bottomItem: bottomContainer.children
37+ property int paginationCount: 0
38+ property int paginationIndex: -1
38
39
39 // TODO We should use foreground for the icons
40 // TODO We should use foreground for the icons
40 // of the toolbar but unfortunately Action does not have
41 // of the toolbar but unfortunately Action does not have
@@ -44,6 +45,12 @@ Item {
44 signal backClicked()
45 signal backClicked()
45
46
46 onScopeStyleChanged: refreshLogo()
47 onScopeStyleChanged: refreshLogo()
48+ onSearchQueryChanged: {
49+ // Make sure we are at the search page if the search query changes behind our feet
50+ if (searchQuery) {
51+ headerContainer.showSearch = true;
52+ }
53+ }
47
54
48 function triggerSearch() {
55 function triggerSearch() {
49 if (searchEntryEnabled) {
56 if (searchEntryEnabled) {
@@ -52,6 +59,12 @@ Item {
52 }
59 }
53 }
60 }
54
61
62+ function closePopup() {
63+ if (headerContainer.popover != null) {
64+ PopupUtils.close(headerContainer.popover);
65+ }
66+ }
67+
55 function resetSearch(keepFocus) {
68 function resetSearch(keepFocus) {
56 if (searchHistory) {
69 if (searchHistory) {
57 searchHistory.addQuery(searchTextField.text);
70 searchHistory.addQuery(searchTextField.text);
@@ -60,9 +73,7 @@ Item {
60 unfocus();
73 unfocus();
61 }
74 }
62 searchTextField.text = "";
75 searchTextField.text = "";
63− if (headerContainer.popover != null) {
76+ closePopup();
64− PopupUtils.close(headerContainer.popover);
65− }
66 }
77 }
67
78
68 function unfocus() {
79 function unfocus() {
@@ -103,9 +114,7 @@ Item {
103 anchors { fill: parent; margins: units.gu(1); bottomMargin: units.gu(3) + bottomContainer.height }
114 anchors { fill: parent; margins: units.gu(1); bottomMargin: units.gu(3) + bottomContainer.height }
104 visible: headerContainer.showSearch
115 visible: headerContainer.showSearch
105 onPressed: {
116 onPressed: {
106− if (headerContainer.popover) {
117+ closePopup();
107− PopupUtils.close(headerContainer.popover);
108− }
109 if (!searchTextField.text) {
118 if (!searchTextField.text) {
110 headerContainer.showSearch = false;
119 headerContainer.showSearch = false;
111 }
120 }
@@ -117,7 +126,7 @@ Item {
117 Flickable {
126 Flickable {
118 id: headerContainer
127 id: headerContainer
119 objectName: "headerContainer"
128 objectName: "headerContainer"
120− clip: true
129+ clip: contentY < height
121 anchors { left: parent.left; top: parent.top; right: parent.right }
130 anchors { left: parent.left; top: parent.top; right: parent.right }
122 height: units.gu(6.5)
131 height: units.gu(6.5)
123 contentHeight: headersColumn.height
132 contentHeight: headersColumn.height
@@ -127,6 +136,11 @@ Item {
127 property bool showSearch: false
136 property bool showSearch: false
128 property var popover: null
137 property var popover: null
129
138
139+ Background {
140+ objectName: "headerBackground"
141+ style: scopeStyle.headerBackground
142+ }
143+
130 Behavior on contentY {
144 Behavior on contentY {
131 UbuntuNumberAnimation {
145 UbuntuNumberAnimation {
132 id: openSearchAnimation
146 id: openSearchAnimation
@@ -150,11 +164,13 @@ Item {
150 anchors { left: parent.left; right: parent.right }
164 anchors { left: parent.left; right: parent.right }
151 height: headerContainer.height
165 height: headerContainer.height
152 contentHeight: height
166 contentHeight: height
167+ opacity: headerContainer.clip || headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
153 separatorSource: ""
168 separatorSource: ""
154 // Required to keep PageHeadStyle noise down as it expects the Page's properties around.
169 // Required to keep PageHeadStyle noise down as it expects the Page's properties around.
155 property var styledItem: searchHeader
170 property var styledItem: searchHeader
156 property string title
171 property string title
157 property var config: PageHeadConfiguration {
172 property var config: PageHeadConfiguration {
173+ foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : "grey"
158 backAction: Action {
174 backAction: Action {
159 iconName: "back"
175 iconName: "back"
160 onTriggered: {
176 onTriggered: {
@@ -166,6 +182,7 @@ Item {
166 property var contents: TextField {
182 property var contents: TextField {
167 id: searchTextField
183 id: searchTextField
168 objectName: "searchTextField"
184 objectName: "searchTextField"
185+ inputMethodHints: Qt.ImhNoPredictiveText
169 hasClearButton: false
186 hasClearButton: false
170 anchors {
187 anchors {
171 fill: parent
188 fill: parent
@@ -185,25 +202,13 @@ Item {
185 anchors.fill: parent
202 anchors.fill: parent
186 anchors.margins: units.gu(.75)
203 anchors.margins: units.gu(.75)
187 source: "image://theme/clear"
204 source: "image://theme/clear"
188− opacity: searchTextField.text.length > 0 && !searchActivityIndicator.running
205+ opacity: searchTextField.text.length > 0
189 visible: opacity > 0
206 visible: opacity > 0
190 Behavior on opacity {
207 Behavior on opacity {
191 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
208 UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
192 }
209 }
193 }
210 }
194
211
195− ActivityIndicator {
196− id: searchActivityIndicator
197− objectName: "searchIndicator"
198− anchors.fill: parent
199− anchors.margins: units.gu(.75)
200− running: root.searchInProgress
201− opacity: running ? 1 : 0
202− Behavior on opacity {
203− UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
204− }
205− }
206−
207 onClicked: {
212 onClicked: {
208 root.resetSearch(true);
213 root.resetSearch(true);
209 root.openSearchHistory();
214 root.openSearchHistory();
@@ -215,6 +220,12 @@ Item {
215 root.openSearchHistory();
220 root.openSearchHistory();
216 }
221 }
217 }
222 }
223+
224+ onTextChanged: {
225+ if (text != "") {
226+ closePopup();
227+ }
228+ }
218 }
229 }
219 }
230 }
220
231
@@ -224,11 +235,12 @@ Item {
224 anchors { left: parent.left; right: parent.right }
235 anchors { left: parent.left; right: parent.right }
225 height: headerContainer.height
236 height: headerContainer.height
226 contentHeight: height
237 contentHeight: height
238+ opacity: headerContainer.clip || !headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
227 separatorSource: ""
239 separatorSource: ""
228− textColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
229 property var styledItem: header
240 property var styledItem: header
230 property string title: root.title
241 property string title: root.title
231 property var config: PageHeadConfiguration {
242 property var config: PageHeadConfiguration {
243+ foregroundColor: root.scopeStyle ? root.scopeStyle.headerForeground : "grey"
232 backAction: Action {
244 backAction: Action {
233 iconName: "back"
245 iconName: "back"
234 visible: root.showBackButton
246 visible: root.showBackButton
@@ -272,6 +284,25 @@ Item {
272 }
284 }
273 }
285 }
274
286
287+ Row {
288+ spacing: units.gu(.5)
289+ Repeater {
290+ objectName: "paginationRepeater"
291+ model: root.paginationCount
292+ Image {
293+ objectName: "paginationDots_" + index
294+ height: units.gu(1)
295+ width: height
296+ source: (index == root.paginationIndex) ? "graphics/pagination_dot_on.png" : "graphics/pagination_dot_off.png"
297+ }
298+ }
299+ anchors {
300+ top: headerContainer.bottom
301+ horizontalCenter: headerContainer.horizontalCenter
302+ topMargin: units.gu(.5)
303+ }
304+ }
305+
275 Component {
306 Component {
276 id: popoverComponent
307 id: popoverComponent
277 Popover {
308 Popover {
@@ -291,6 +322,7 @@ Item {
291
322
292 Repeater {
323 Repeater {
293 id: recentSearches
324 id: recentSearches
325+ objectName: "recentSearches"
294 model: searchHistory
326 model: searchHistory
295
327
296 delegate: Standard {
328 delegate: Standard {
@@ -299,7 +331,8 @@ Item {
299 onClicked: {
331 onClicked: {
300 searchHistory.addQuery(text);
332 searchHistory.addQuery(text);
301 searchTextField.text = text;
333 searchTextField.text = text;
302− PopupUtils.close(popover);
334+ closePopup();
335+ unfocus();
303 }
336 }
304 }
337 }
305 }
338 }
qml/Components/PassphraseLockscreen.qml+3
@@ -31,8 +31,10 @@ Item {
31
31
32 function clear(playAnimation) {
32 function clear(playAnimation) {
33 pinentryField.text = "";
33 pinentryField.text = "";
34+ pinentryField.enabled = true
34 if (playAnimation) {
35 if (playAnimation) {
35 wrongPasswordAnimation.start();
36 wrongPasswordAnimation.start();
37+ pinentryField.forceActiveFocus();
36 } else {
38 } else {
37 pinentryField.focus = false
39 pinentryField.focus = false
38 }
40 }
@@ -78,6 +80,7 @@ Item {
78
80
79 onAccepted: {
81 onAccepted: {
80 if (pinentryField.text) {
82 if (pinentryField.text) {
83+ pinentryField.enabled = false;
81 root.entered(pinentryField.text);
84 root.entered(pinentryField.text);
82 }
85 }
83 }
86 }
qml/Components/ResponsiveGridView.qml+2−1
@@ -44,10 +44,11 @@ Item {
44 property alias displayMarginBeginning: gridView.displayMarginBeginning
44 property alias displayMarginBeginning: gridView.displayMarginBeginning
45 property alias displayMarginEnd: gridView.displayMarginEnd
45 property alias displayMarginEnd: gridView.displayMarginEnd
46 property alias highlightIndex: gridView.highlightIndex
46 property alias highlightIndex: gridView.highlightIndex
47+ property alias cacheBuffer: gridView.cacheBuffer
47 readonly property alias currentItem: gridView.currentItem
48 readonly property alias currentItem: gridView.currentItem
48
49
49 function contentHeightForRows(rows) {
50 function contentHeightForRows(rows) {
50− return rows * cellHeight + verticalSpacing
51+ return rows * cellHeight;
51 }
52 }
52
53
53 GridView {
54 GridView {
qml/Components/SeeMore.qmldeleted−70
@@ -1,70 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−
20−/*! Widget that can be used in combination with a text area to allow easy 'expand/collapse' functionality. */
21−
22−Item {
23− //! Boolean set to true when it suggests expanded functionality
24− property bool more: false
25−
26− implicitHeight: seeMoreLabel.height + units.gu(2)
27−
28− Row {
29− anchors.centerIn: parent
30− spacing: units.gu(2)
31−
32− Label {
33− id: seeMoreLabel
34− objectName: "seeMoreLabel"
35− text: i18n.tr("See more")
36− opacity: !more ? 0.8 : 0.4
37− // TODO: Fix requiring Palette update
38− color: "grey" //Theme.palette.selected.backgroundText
39− font.weight: Font.Bold
40−
41− MouseArea {
42− anchors.fill: parent
43− onClicked: more = true
44− }
45− }
46−
47− Image {
48− anchors {
49− top: parent.top
50− bottom: parent.bottom
51− }
52− width: units.dp(2)
53− source: "ListItems/graphics/ListItemDividerVertical.png"
54− }
55−
56− Label {
57− objectName: "seeLessLabel"
58− text: i18n.tr("See less")
59− opacity: more ? 0.8 : 0.4
60− // TODO: Fix requiring Palette update
61− color: "grey" //Theme.palette.selected.backgroundText
62− font.weight: Font.Bold
63−
64− MouseArea {
65− anchors.fill: parent
66− onClicked: more = false
67− }
68− }
69− }
70−}
qml/Components/graphics/pagination_dot_off@30.pngnew file

Binary file not shown.

qml/Components/graphics/pagination_dot_on@30.pngnew file

Binary file not shown.

qml/Dash/Apps/CloseIcon.qmldeleted−62
@@ -1,62 +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: root
21−
22− Image {
23− id: closeIcon
24− anchors.centerIn: parent
25− source: "graphics/close_btn.png"
26−
27− state: (root.enabled) ? "shown" : "hidden"
28−
29− states: [
30− State {
31− name: "shown"
32− PropertyChanges {
33− target: closeIcon
34− height: root.height
35− width: root.width
36− }
37− },
38− State {
39− name: "hidden"
40− PropertyChanges {
41− target: closeIcon
42− height: 0
43− width: 0
44− }
45− }
46−
47− ]
48− transitions: [
49− Transition {
50− to: "shown"
51− NumberAnimation {
52− properties: "width, height"; duration: 300
53− easing { type: Easing.OutBack; overshoot: 5 }
54− }
55− },
56− Transition {
57− to: "hidden"
58− NumberAnimation { properties: "width, height"; duration: 250; }
59− }
60− ]
61− }
62−}
qml/Dash/Apps/RunningApplicationTile.qmldeleted−128
@@ -1,128 +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−import "../../Components/"
21−import "../../Components/ListItems"
22−
23−AbstractButton {
24− id: root
25− property var application
26−
27− signal requestedApplicationActivation(var application)
28− signal requestedApplicationTermination(var application)
29− signal requestedActivationMode()
30− signal requestedTerminationMode()
31−
32− // Was: childrenRect.height
33− // To avoid "binding loop" warning
34− height: shapedApplicationImage.height + labelContainer.height
35−
36− width: shapedApplicationImage.width <= units.gu(11) ? units.gu(11) : height
37−
38− property bool terminationModeEnabled: false
39−
40− onClicked: {
41− if (!terminationModeEnabled)
42− requestedApplicationActivation(application)
43− }
44−
45− onPressAndHold: {
46− if (terminationModeEnabled) {
47− requestedActivationMode()
48− } else {
49− requestedTerminationMode()
50− }
51− }
52−
53− UbuntuShape {
54− id: shapedApplicationImage
55− anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
56−
57− height: units.gu(17)
58− width: applicationImage.width
59− radius: "medium"
60−
61− image: Image {
62− id: applicationImage
63− source: application.screenshot
64− // height : width = ss.height : ss.width
65− height: shapedApplicationImage.height
66− fillMode: Image.PreserveAspectCrop
67− width: Math.min(height, height * sourceSize.width / sourceSize.height)
68− }
69−
70− }
71−
72− UbuntuShape {
73− id: borderPressed
74−
75− anchors.fill: shapedApplicationImage
76− radius: "medium"
77− borderSource: "radius_pressed.sci"
78− opacity: root.pressed ? 1.0 : 0.0
79− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
80− }
81−
82− // FIXME: label code duplicated with Tile
83− Item {
84− id: labelContainer
85− anchors {
86− left: parent.left
87− right: parent.right
88− top: shapedApplicationImage.bottom
89− }
90− height: units.gu(2)
91−
92− Label {
93− id: label
94− anchors {
95− baseline: parent.bottom
96− left: parent.left
97− right: parent.right
98− }
99− text: (application) ? application.name : ""
100−
101− // TODO karni: Update Ubuntu.Components.Themes.Palette and use theme color instead
102− color: "grey"
103− opacity: 0.9
104− fontSize: "small"
105− elide: Text.ElideMiddle
106− horizontalAlignment: Text.AlignHCenter
107− }
108− }
109−
110− CloseIcon {
111− objectName: "closeIcon " + model.name
112− anchors {
113− left: shapedApplicationImage.left
114− leftMargin: -units.gu(1)
115− top: parent.top
116− topMargin: -units.gu(1)
117− }
118− height: units.gu(6)
119− width: units.gu(6)
120− id: closeIcon
121− enabled: root.terminationModeEnabled
122−
123− MouseArea {
124− anchors { fill: parent; margins: -units.gu(1) }
125− onClicked: requestedApplicationTermination(application)
126− }
127− }
128−}
qml/Dash/Apps/RunningApplicationsGrid.qmldeleted−105
@@ -1,105 +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−
20−import Ubuntu.Gestures 0.1
21−import Unity.Application 0.1
22−
23−ResponsiveFlowView {
24− id: root
25− clip: true
26−
27− signal updateScreenshots
28− property alias enableHeightBehavior: heightBehaviour.enabled
29− property bool enableHeightBehaviorOnNextCreation: model.count === 0
30−
31− Behavior on height {
32− id: heightBehaviour
33− enabled: false
34− NumberAnimation { duration: 200; easing.type: Easing.InOutQuad }
35− }
36−
37− Connections {
38− target: root.model
39− onCountChanged: {
40− heightBehaviour.enabled = true;
41− }
42− }
43−
44− property bool canEnableTerminationMode: true
45−
46− onCanEnableTerminationModeChanged: {
47− if (!canEnableTerminationMode)
48− terminationModeEnabled = false
49− }
50−
51− // when false, it means it's on activation mode
52− property bool terminationModeEnabled: false
53−
54− maximumNumberOfColumns: 10
55− minimumHorizontalSpacing: units.gu(2)
56− referenceDelegateWidth: units.gu(11)
57− verticalSpacing: units.gu(2)
58−
59− delegate: Item {
60− width: runningAppTile.width + root.horizontalSpacing
61− height: runningAppTile.height + root.verticalSpacing
62−
63− RunningApplicationTile {
64− id: runningAppTile
65− objectName: "runningAppTile " + model.name
66− anchors {
67− top: parent.top
68− horizontalCenter: parent.horizontalCenter
69− }
70− application: model
71− onRequestedActivationMode: { root.terminationModeEnabled = false }
72− onRequestedTerminationMode: {
73− if (canEnableTerminationMode)
74− root.terminationModeEnabled = true
75− }
76− onRequestedApplicationTermination: {
77− ApplicationManager.stopApplication(model.appId)
78− }
79− onRequestedApplicationActivation: {
80− ApplicationManager.requestFocusApplication(model.appId)
81− }
82−
83− terminationModeEnabled: root.terminationModeEnabled
84− }
85− }
86−
87− move: Transition {
88− NumberAnimation { properties: "x,y"; duration: 400; easing.type: Easing.OutCubic }
89− }
90−
91− MouseArea {
92− anchors.fill: parent
93− z: -1 // behind all RunningApplicationTiles
94− enabled: root.terminationModeEnabled
95− onPressed: { root.terminationModeEnabled = false; }
96− }
97−
98− PressedOutsideNotifier {
99− anchors.fill: parent
100− enabled: root.terminationModeEnabled
101− onPressedOutside: {
102− root.terminationModeEnabled = false;
103− }
104− }
105−}
qml/Dash/Apps/graphics/close_btn@9.pngdeleted

Binary file not shown.

qml/Dash/CardCarousel.qml+2−7
@@ -21,13 +21,8 @@ import "../Components"
21DashRenderer {
21DashRenderer {
22 id: cardCarousel
22 id: cardCarousel
23
23
24− property alias cacheBuffer: carousel.cacheBuffer
25− property alias itemComponent: carousel.itemComponent
26− property alias minimumTileWidth: carousel.minimumTileWidth
27− property alias selectedItemScaleFactor: carousel.selectedItemScaleFactor
28− property alias tileAspectRatio: carousel.tileAspectRatio
29−
30− height: carousel.implicitHeight + units.gu(6)
24+ expandedHeight: carousel.implicitHeight + units.gu(6)
25+ collapsedHeight: expandedHeight
31
26
32 Carousel {
27 Carousel {
33 id: carousel
28 id: carousel
qml/Dash/CardFilterGrid.qml → qml/Dash/CardGrid.qmlrenamed+22−22
@@ -18,33 +18,33 @@ import QtQuick 2.0
18import "../Components"
18import "../Components"
19
19
20DashRenderer {
20DashRenderer {
21− id: genericFilterGrid
21+ id: root
22
22
23− expandable: filterGrid.expandable
23+ readonly property int collapsedRows: {
24− collapsedHeight: filterGrid.collapsedHeight
24+ if (!cardTool || !cardTool.template || typeof cardTool.template["collapsed-rows"] != "number") return 2;
25− uncollapsedHeight: filterGrid.uncollapsedHeight
25+ return cardTool.template["collapsed-rows"];
26− originY: filterGrid.originY
27− height: filterGrid.height
28− filtered: filterGrid.filtered
29−
30− function setFilter(filter, animate) {
31− filterGrid.setFilter(filter, animate)
32 }
26 }
33
27
34− FilterGrid {
28+ expandedHeight: grid.totalContentHeight
35− id: filterGrid
29+ collapsedHeight: Math.min(grid.contentHeightForRows(collapsedRows), expandedHeight)
36− width: genericFilterGrid.width
30+ collapsedItemCount: collapsedRows * grid.columns
31+ originY: grid.originY
32+
33+ ResponsiveGridView {
34+ id: grid
35+ anchors.fill: parent
37 minimumHorizontalSpacing: units.gu(1)
36 minimumHorizontalSpacing: units.gu(1)
38 delegateWidth: cardTool.cardWidth
37 delegateWidth: cardTool.cardWidth
39 delegateHeight: cardTool.cardHeight
38 delegateHeight: cardTool.cardHeight
40 verticalSpacing: units.gu(1)
39 verticalSpacing: units.gu(1)
41− model: genericFilterGrid.model
40+ model: root.model
42− collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
41+ displayMarginBeginning: root.displayMarginBeginning
43− displayMarginBeginning: genericFilterGrid.displayMarginBeginning
42+ displayMarginEnd: root.displayMarginEnd
44− displayMarginEnd: genericFilterGrid.displayMarginEnd
43+ cacheBuffer: 0
44+ interactive: false
45 delegate: Item {
45 delegate: Item {
46− width: filterGrid.cellWidth
46+ width: grid.cellWidth
47− height: filterGrid.cellHeight
47+ height: grid.cellHeight
48 Loader {
48 Loader {
49 id: loader
49 id: loader
50 sourceComponent: cardTool.cardComponent
50 sourceComponent: cardTool.cardComponent
@@ -58,12 +58,12 @@ DashRenderer {
58 item.template = Qt.binding(function() { return cardTool.template; });
58 item.template = Qt.binding(function() { return cardTool.template; });
59 item.components = Qt.binding(function() { return cardTool.components; });
59 item.components = Qt.binding(function() { return cardTool.components; });
60 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
60 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
61− item.scopeStyle = genericFilterGrid.scopeStyle;
61+ item.scopeStyle = root.scopeStyle;
62 }
62 }
63 Connections {
63 Connections {
64 target: loader.item
64 target: loader.item
65− onClicked: genericFilterGrid.clicked(index, result)
65+ onClicked: root.clicked(index, result)
66− onPressAndHold: genericFilterGrid.pressAndHold(index)
66+ onPressAndHold: root.pressAndHold(index)
67 }
67 }
68 }
68 }
69 }
69 }
qml/Dash/CardTool.qml+28−3
@@ -126,7 +126,7 @@ Item {
126 type:real \brief Height of the card's header.
126 type:real \brief Height of the card's header.
127 */
127 */
128 readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
128 readonly property int headerHeight: cardLoader.item ? cardLoader.item.headerHeight : 0
129− readonly property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
129+ property size artShapeSize: cardLoader.item ? cardLoader.item.artShapeSize : 0
130
130
131 /*!
131 /*!
132 \brief Desired alignment of header components.
132 \brief Desired alignment of header components.
@@ -165,15 +165,40 @@ Item {
165 }
165 }
166 }
166 }
167
167
168+ Item {
169+ id: attributesModel
170+ property int numOfAttributes: 0
171+ property var model: []
172+ property bool hasAttributes: {
173+ var attributes = components["attributes"];
174+ var hasAttributesFlag = (attributes != undefined) && attributes["field"];
175+
176+ if (hasAttributesFlag) {
177+ if (attributes["max-count"]) {
178+ numOfAttributes = attributes["max-count"];
179+ }
180+ }
181+ return hasAttributesFlag
182+ }
183+
184+ onNumOfAttributesChanged: {
185+ model = []
186+ for (var i = 0; i < numOfAttributes; i++) {
187+ model.push( {"value":"text"+(i+1), "icon":"image://theme/ok" } );
188+ }
189+ }
190+ }
191+
168 Loader {
192 Loader {
169 id: cardLoader
193 id: cardLoader
170− property var fields: ["art", "mascot", "title", "subtitle", "summary"]
194+ property var fields: ["art", "mascot", "title", "subtitle", "summary", "attributes"]
171 property var maxData: {
195 property var maxData: {
172 "art": Qt.resolvedUrl("graphics/checkers.png"),
196 "art": Qt.resolvedUrl("graphics/checkers.png"),
173 "mascot": Qt.resolvedUrl("graphics/checkers.png"),
197 "mascot": Qt.resolvedUrl("graphics/checkers.png"),
174 "title": "—\n—",
198 "title": "—\n—",
175 "subtitle": "—",
199 "subtitle": "—",
176− "summary": "—\n—\n—\n—\n—"
200+ "summary": "—\n—\n—\n—\n—",
201+ "attributes": attributesModel.model
177 }
202 }
178 sourceComponent: cardTool.cardComponent
203 sourceComponent: cardTool.cardComponent
179 onLoaded: {
204 onLoaded: {
qml/Dash/CardVerticalJournal.qml+3−21
@@ -23,33 +23,15 @@ DashRenderer {
23
23
24 readonly property double collapseLimit: units.gu(35)
24 readonly property double collapseLimit: units.gu(35)
25
25
26− uncollapsedHeight: cardVerticalJournal.implicitHeight
26+ expandedHeight: Math.max(cardVerticalJournal.implicitHeight, minHeight)
27− collapsedHeight: Math.min(collapseLimit, cardVerticalJournal.implicitHeight)
27+ collapsedHeight: Math.max(Math.min(collapseLimit, cardVerticalJournal.implicitHeight), minHeight)
28− expandable: uncollapsedHeight > collapseLimit
28+ // TODO: implement collapsedItemCount
29
29
30 // This minHeight is used as bootstrapper for the height. Vertical Journal
30 // This minHeight is used as bootstrapper for the height. Vertical Journal
31 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
31 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
32 // enough height that it can start creating its children so we make sure it has enough height for that
32 // enough height that it can start creating its children so we make sure it has enough height for that
33 // in case the model is non empty
33 // in case the model is non empty
34 readonly property double minHeight: root.model.count >= 1 ? cardVerticalJournal.rowSpacing + 1 : 0
34 readonly property double minHeight: root.model.count >= 1 ? cardVerticalJournal.rowSpacing + 1 : 0
35− height: filtered ? Math.max(collapsedHeight, minHeight) : uncollapsedHeight
36−
37− Behavior on height {
38− id: heightBehaviour
39− enabled: false
40− animation: UbuntuNumberAnimation {
41− onRunningChanged: {
42− if (!running) {
43− heightBehaviour.enabled = false
44− }
45− }
46− }
47− }
48−
49− function setFilter(filter, animate) {
50− heightBehaviour.enabled = animate;
51− filtered = filter;
52− }
53
35
54 ResponsiveVerticalJournal {
36 ResponsiveVerticalJournal {
55 id: cardVerticalJournal
37 id: cardVerticalJournal
qml/Dash/Dash.qml+92−11
@@ -14,10 +14,11 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.0
17+import QtQuick 2.2
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Unity 0.2
19import Unity 0.2
20import Utils 0.1
20import Utils 0.1
21+import Unity.DashCommunicator 0.1
21import "../Components"
22import "../Components"
22
23
23Showable {
24Showable {
@@ -29,8 +30,21 @@ Showable {
29 property string showScopeOnLoaded: "clickscope"
30 property string showScopeOnLoaded: "clickscope"
30 property real contentScale: 1.0
31 property real contentScale: 1.0
31
32
33+ DashCommunicatorService {
34+ objectName: "dashCommunicatorService"
35+ onSetCurrentScopeRequested: {
36+ dash.setCurrentScope(scopeId, animate, reset)
37+ }
38+ }
39+
32 function setCurrentScope(scopeId, animate, reset) {
40 function setCurrentScope(scopeId, animate, reset) {
33− var scopeIndex = filteredScopes.findFirst(Scopes.RoleId, scopeId)
41+ var scopeIndex = -1;
42+ for (var i = 0; i < scopes.count; ++i) {
43+ if (scopes.getScope(i).id == scopeId) {
44+ scopeIndex = i;
45+ break;
46+ }
47+ }
34
48
35 if (scopeIndex == -1) {
49 if (scopeIndex == -1) {
36 console.warn("No match for scope with id: %1".arg(scopeId))
50 console.warn("No match for scope with id: %1".arg(scopeId))
@@ -55,15 +69,16 @@ Showable {
55 }
69 }
56 }
70 }
57
71
58− SortFilterProxyModel {
59− id: filteredScopes
60− model: Scopes {
72+ Scopes {
61− id: scopes
73+ id: scopes
62− }
74+ }
63− dynamicSortFilter: true
64
75
65− filterRole: Scopes.RoleVisible
76+ Image {
66− filterRegExp: RegExp("^true$")
77+ anchors.fill: parent
78+ source: parent.width > parent.height ? "graphics/paper_landscape.png" : "graphics/paper_portrait.png"
79+ fillMode: Image.PreserveAspectCrop
80+ horizontalAlignment: Image.AlignRight
81+ verticalAlignment: Image.AlignTop
67 }
82 }
68
83
69 DashContent {
84 DashContent {
@@ -71,7 +86,6 @@ Showable {
71 objectName: "dashContent"
86 objectName: "dashContent"
72 width: parent.width
87 width: parent.width
73 height: parent.height
88 height: parent.height
74− model: filteredScopes
75 scopes: scopes
89 scopes: scopes
76 visible: x != -width
90 visible: x != -width
77 onGotoScope: {
91 onGotoScope: {
@@ -126,4 +140,71 @@ Showable {
126 }
140 }
127 }
141 }
128 }
142 }
143+
144+ Rectangle {
145+ id: indicator
146+ objectName: "processingIndicator"
147+ anchors {
148+ left: parent.left
149+ right: parent.right
150+ bottom: parent.bottom
151+ }
152+ height: units.dp(3)
153+ color: scopeStyle.backgroundLuminance > 0.7 ? "#50000000" : "#50ffffff"
154+ opacity: 0
155+ visible: opacity > 0
156+
157+ readonly property bool processing: dashContent.processing || scopeItem.processing
158+
159+ Behavior on opacity {
160+ UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
161+ }
162+
163+ onProcessingChanged: {
164+ if (processing) delay.start();
165+ else if (!persist.running) indicator.opacity = 0;
166+ }
167+
168+ Timer {
169+ id: delay
170+ interval: 200
171+ onTriggered: if (indicator.processing) {
172+ persist.restart();
173+ indicator.opacity = 1;
174+ }
175+ }
176+
177+ Timer {
178+ id: persist
179+ interval: 2 * UbuntuAnimation.SleepyDuration - UbuntuAnimation.FastDuration
180+ onTriggered: if (!indicator.processing) indicator.opacity = 0
181+ }
182+
183+ Rectangle {
184+ id: orange
185+ anchors { top: parent.top; bottom: parent.bottom }
186+ width: parent.width / 4
187+ color: Theme.palette.selected.foreground
188+
189+ SequentialAnimation {
190+ running: indicator.visible
191+ loops: Animation.Infinite
192+ XAnimator {
193+ from: -orange.width / 2
194+ to: indicator.width - orange.width / 2
195+ duration: UbuntuAnimation.SleepyDuration
196+ easing.type: Easing.InOutSine
197+ target: orange
198+ }
199+ XAnimator {
200+ from: indicator.width - orange.width / 2
201+ to: -orange.width / 2
202+ duration: UbuntuAnimation.SleepyDuration
203+ easing.type: Easing.InOutSine
204+ target: orange
205+ }
206+ }
207+ }
208+ }
209+
129}
210}
qml/Dash/DashApplication.qmlnew file+36
@@ -0,0 +1,36 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.2
18+import Ubuntu.Components 1.0
19+import Ubuntu.Thumbnailer 0.1 // Register support for image://thumbnailer/ and image://albumart/
20+
21+MainView {
22+ width: units.gu(40)
23+ height: units.gu(71)
24+
25+ useDeprecatedToolbar: false
26+
27+ Binding {
28+ target: i18n
29+ property: "domain"
30+ value: "unity8"
31+ }
32+
33+ Dash {
34+ anchors.fill: parent
35+ }
36+}
qml/Dash/DashApps.qmldeleted−40
@@ -1,40 +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 Unity.Application 0.1
21−import "../Components"
22−import "../Components/ListItems"
23−import "Apps"
24−
25−GenericScopeView {
26− id: scopeView
27− objectName: "DashApps"
28−
29− property var runningApps: ApplicationManager
30−
31− QtObject {
32− id: countObject
33− property int count: scopeView.scope.searchQuery.length == 0 ? scopeView.runningApps.count : 0
34− }
35−
36− onScopeChanged: {
37− scopeView.scope.categories.addSpecialCategory("running.apps.category", i18n.tr("Recent"), "", "{ \"template\": { \"category-layout\": \"running-apps\" } }", countObject);
38− enableHeightBehaviorOnNextCreation = scopeView.runningApps.count === 0
39− }
40−}
qml/Dash/DashContent.qml+12−7
@@ -23,9 +23,10 @@ import "../Components"
23Item {
23Item {
24 id: dashContent
24 id: dashContent
25
25
26− property var model: null
26+ property alias scopes: dashContentList.model
27− property var scopes: null
28 readonly property alias currentIndex: dashContentList.currentIndex
27 readonly property alias currentIndex: dashContentList.currentIndex
28+ readonly property bool processing: dashContentList.currentItem && dashContentList.currentItem.item
29+ && dashContentList.currentItem.item.processing || false
29
30
30 signal scopeLoaded(string scopeId)
31 signal scopeLoaded(string scopeId)
31 signal gotoScope(string scopeId)
32 signal gotoScope(string scopeId)
@@ -89,10 +90,9 @@ Item {
89 id: dashContentList
90 id: dashContentList
90 objectName: "dashContentList"
91 objectName: "dashContentList"
91
92
92− interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving
93+ interactive: dashContent.scopes.loaded && currentItem && !currentItem.moving && !currentItem.navigationShown
93
94
94 anchors.fill: parent
95 anchors.fill: parent
95− model: dashContent.model
96 orientation: ListView.Horizontal
96 orientation: ListView.Horizontal
97 boundsBehavior: Flickable.DragAndOvershootBounds
97 boundsBehavior: Flickable.DragAndOvershootBounds
98 flickDeceleration: units.gu(625)
98 flickDeceleration: units.gu(625)
@@ -121,13 +121,16 @@ Item {
121 Loader {
121 Loader {
122 width: ListView.view.width
122 width: ListView.view.width
123 height: ListView.view.height
123 height: ListView.view.height
124+ opacity: { // hide delegate if offscreen
125+ var xPositionRelativetoView = ListView.view.contentX - x
126+ return (xPositionRelativetoView > -width && xPositionRelativetoView < width) ? 1 : 0
127+ }
124 asynchronous: true
128 asynchronous: true
125− // TODO This if will eventually go away since we're killing DashApps.qml
126− // once we move app closing to the spread
127− source: (scope.id == "clickscope") ? "DashApps.qml" : "GenericScopeView.qml"
129+ source: "GenericScopeView.qml"
128 objectName: scope.id + " loader"
130 objectName: scope.id + " loader"
129
131
130 readonly property bool moving: item ? item.moving : false
132 readonly property bool moving: item ? item.moving : false
133+ readonly property bool navigationShown: item ? item.navigationShown : false
131 readonly property var categoryView: item ? item.categoryView : null
134 readonly property var categoryView: item ? item.categoryView : null
132 readonly property var theScope: scope
135 readonly property var theScope: scope
133
136
@@ -141,6 +144,8 @@ Item {
141 item.scope = Qt.binding(function() { return scope })
144 item.scope = Qt.binding(function() { return scope })
142 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
145 item.isCurrent = Qt.binding(function() { return visible && ListView.isCurrentItem })
143 dashContent.scopeLoaded(item.scope.id)
146 dashContent.scopeLoaded(item.scope.id)
147+ item.paginationCount = Qt.binding(function() { return dashContentList.count } )
148+ item.paginationIndex = Qt.binding(function() { return dashContentList.currentIndex } )
144 }
149 }
145 Connections {
150 Connections {
146 target: isCurrent ? scope : null
151 target: isCurrent ? scope : null
qml/Dash/DashDepartments.qml → qml/Dash/DashNavigation.qmlrenamed+50−43
@@ -15,17 +15,17 @@
15 */
15 */
16
16
17import QtQuick 2.2
17import QtQuick 2.2
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19
19
20AbstractButton {
20AbstractButton {
21 id: root
21 id: root
22− objectName: "dashDepartments"
22+ objectName: "dashNavigation"
23
23
24 property var scope: null
24 property var scope: null
25
25
26 property bool showList: false
26 property bool showList: false
27
27
28− readonly property var currentDepartment: scope && scope.hasDepartments ? scope.getDepartment(scope.currentDepartmentId) : null
28+ readonly property var currentNavigation: scope && scope.hasNavigation ? scope.getNavigation(scope.currentNavigationId) : null
29
29
30 property alias windowWidth: blackRect.width
30 property alias windowWidth: blackRect.width
31 property alias windowHeight: blackRect.height
31 property alias windowHeight: blackRect.height
@@ -34,20 +34,21 @@ AbstractButton {
34 // Are we drilling down the tree or up?
34 // Are we drilling down the tree or up?
35 property bool isGoingBack: false
35 property bool isGoingBack: false
36
36
37− visible: root.currentDepartment != null
37+ visible: root.currentNavigation != null
38
38
39 height: visible ? units.gu(5) : 0
39 height: visible ? units.gu(5) : 0
40
40
41 onClicked: {
41 onClicked: {
42+ navigationListView.updateMaxHeight();
42 root.showList = !root.showList;
43 root.showList = !root.showList;
43 }
44 }
44
45
45 Rectangle {
46 Rectangle {
46 id: blackRect
47 id: blackRect
47 color: "black"
48 color: "black"
48− opacity: departmentListView.currentItem && departmentListView.currentItem.visible ? 0.3 : 0
49+ opacity: navigationListView.currentItem && navigationListView.currentItem.visible ? 0.3 : 0
49 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
50 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration } }
50− anchors.top: departmentListView.top
51+ anchors.top: navigationListView.top
51 anchors.right: parent.right
52 anchors.right: parent.right
52 visible: opacity != 0
53 visible: opacity != 0
53 }
54 }
@@ -78,7 +79,7 @@ AbstractButton {
78 anchors.fill: parent
79 anchors.fill: parent
79 anchors.margins: units.gu(2)
80 anchors.margins: units.gu(2)
80 verticalAlignment: Text.AlignVCenter
81 verticalAlignment: Text.AlignVCenter
81− text: root.currentDepartment ? root.currentDepartment.label : ""
82+ text: root.currentNavigation ? root.currentNavigation.label : ""
82 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
83 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
83 }
84 }
84
85
@@ -92,18 +93,18 @@ AbstractButton {
92 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
93 color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
93 }
94 }
94
95
95− // departmentListView is outside root
96+ // navigationListView is outside root
96 ListView {
97 ListView {
97− id: departmentListView
98+ id: navigationListView
98− objectName: "departmentListView"
99+ objectName: "navigationListView"
99 orientation: ListView.Horizontal
100 orientation: ListView.Horizontal
100 interactive: false
101 interactive: false
101 clip: root.width != windowWidth
102 clip: root.width != windowWidth
102 model: ListModel {
103 model: ListModel {
103− id: departmentModel
104+ id: navigationModel
104 // We have two roles
105 // We have two roles
105− // departmentId: the department id of the department the list represents
106+ // navigationId: the navigation id of the navigation the list represents
106− // nullifyDepartment: overrides departmentId to be null
107+ // nullifyNavigation: overrides navigationId to be null
107 // This is used to "clear" the delegate when going "right" on the tree
108 // This is used to "clear" the delegate when going "right" on the tree
108 }
109 }
109 anchors {
110 anchors {
@@ -111,7 +112,12 @@ AbstractButton {
111 right: parent.right
112 right: parent.right
112 top: root.bottom
113 top: root.bottom
113 }
114 }
115+ property int maxHeight: -1
116+ Component.onCompleted: updateMaxHeight();
117+ function updateMaxHeight()
118+ {
114− readonly property int maxHeight: (windowHeight - mapToItem(null, root.x, root.y).y) - units.gu(8)
119+ maxHeight = (windowHeight - mapToItem(null, 0, 0).y) - units.gu(8);
120+ }
115 property int prevHeight: maxHeight
121 property int prevHeight: maxHeight
116 height: currentItem ? currentItem.height : maxHeight
122 height: currentItem ? currentItem.height : maxHeight
117 onHeightChanged: {
123 onHeightChanged: {
@@ -120,83 +126,84 @@ AbstractButton {
120 }
126 }
121 }
127 }
122 highlightMoveDuration: UbuntuAnimation.FastDuration
128 highlightMoveDuration: UbuntuAnimation.FastDuration
123− delegate: DashDepartmentsList {
129+ delegate: DashNavigationList {
124− objectName: "department" + index
130+ objectName: "navigation" + index
125 visible: height != 0
131 visible: height != 0
126− width: departmentListView.width
132+ width: navigationListView.width
127 scopeStyle: root.scopeStyle
133 scopeStyle: root.scopeStyle
128 property real desiredHeight: {
134 property real desiredHeight: {
129 if (root.showList) {
135 if (root.showList) {
130− if (department && department.loaded && x == departmentListView.contentX)
136+ if (navigation && navigation.loaded && x == navigationListView.contentX)
131 {
137 {
138+ navigationListView.updateMaxHeight();
132− return Math.min(implicitHeight, departmentListView.maxHeight);
139+ return Math.min(implicitHeight, navigationListView.maxHeight);
133 } else {
140 } else {
134− return departmentListView.prevHeight;
141+ return navigationListView.prevHeight;
135 }
142 }
136 } else {
143 } else {
137 return 0;
144 return 0;
138 }
145 }
139 }
146 }
140 height: desiredHeight
147 height: desiredHeight
141− department: (nullifyDepartment || !scope) ? null : scope.getDepartment(departmentId)
148+ navigation: (nullifyNavigation || !scope) ? null : scope.getNavigation(navigationId)
142− currentDepartment: root.currentDepartment
149+ currentNavigation: root.currentNavigation
143− onEnterDepartment: {
150+ onEnterNavigation: {
144− scope.loadDepartment(newDepartmentId);
151+ scope.setNavigationState(newNavigationId, false);
145 // We only need to add a new item to the model
152 // We only need to add a new item to the model
146 // if we have children, otherwise just load it
153 // if we have children, otherwise just load it
147 if (hasChildren) {
154 if (hasChildren) {
148 isGoingBack = false;
155 isGoingBack = false;
149− departmentModel.append({"departmentId": newDepartmentId, "nullifyDepartment": false});
156+ navigationModel.append({"navigationId": newNavigationId, "nullifyNavigation": false});
150− departmentListView.currentIndex++;
157+ navigationListView.currentIndex++;
151 } else {
158 } else {
152 showList = false;
159 showList = false;
153 }
160 }
154 }
161 }
155 onGoBackToParentClicked: {
162 onGoBackToParentClicked: {
156− scope.loadDepartment(department.parentDepartmentId);
163+ scope.setNavigationState(navigation.parentNavigationId, false);
157 isGoingBack = true;
164 isGoingBack = true;
158− departmentModel.setProperty(departmentListView.currentIndex - 1, "nullifyDepartment", false);
165+ navigationModel.setProperty(navigationListView.currentIndex - 1, "nullifyNavigation", false);
159− departmentListView.currentIndex--;
166+ navigationListView.currentIndex--;
160 }
167 }
161− onAllDepartmentClicked: {
168+ onAllNavigationClicked: {
162 showList = false;
169 showList = false;
163− if (root.currentDepartment.parentDepartmentId == department.departmentId) {
170+ if (root.currentNavigation.parentNavigationId == navigation.navigationId) {
164 // For leaves we have to go to the parent too
171 // For leaves we have to go to the parent too
165− scope.loadDepartment(root.currentDepartment.parentDepartmentId);
172+ scope.setNavigationState(root.currentNavigation.parentNavigationId, false);
166 }
173 }
167 }
174 }
168 }
175 }
169 onContentXChanged: {
176 onContentXChanged: {
170− if (contentX == width * departmentListView.currentIndex) {
177+ if (contentX == width * navigationListView.currentIndex) {
171 if (isGoingBack) {
178 if (isGoingBack) {
172− departmentModel.remove(departmentListView.currentIndex + 1);
179+ navigationModel.remove(navigationListView.currentIndex + 1);
173 } else {
180 } else {
174− departmentModel.setProperty(departmentListView.currentIndex - 1, "nullifyDepartment", true);
181+ navigationModel.setProperty(navigationListView.currentIndex - 1, "nullifyNavigation", true);
175 }
182 }
176 }
183 }
177 }
184 }
178 }
185 }
179
186
180 InverseMouseArea {
187 InverseMouseArea {
181− anchors.fill: departmentListView
188+ anchors.fill: navigationListView
182 enabled: root.showList
189 enabled: root.showList
183 onClicked: root.showList = false
190 onClicked: root.showList = false
184 }
191 }
185
192
186 onScopeChanged: {
193 onScopeChanged: {
187− departmentModel.clear();
194+ navigationModel.clear();
188− if (scope && scope.hasDepartments) {
195+ if (scope && scope.hasNavigation) {
189− departmentModel.append({"departmentId": scope.currentDepartmentId, "nullifyDepartment": false});
196+ navigationModel.append({"navigationId": scope.currentNavigationId, "nullifyNavigation": false});
190 }
197 }
191 }
198 }
192
199
193 Connections {
200 Connections {
194 target: scope
201 target: scope
195− onHasDepartmentsChanged: {
202+ onHasNavigationChanged: {
196− if (scope.hasDepartments) {
203+ if (scope.hasNavigation) {
197− departmentModel.append({"departmentId": scope.currentDepartmentId, "nullifyDepartment": false});
204+ navigationModel.append({"navigationId": scope.currentNavigationId, "nullifyNavigation": false});
198 } else {
205 } else {
199− departmentModel.clear();
206+ navigationModel.clear();
200 }
207 }
201 }
208 }
202 }
209 }
qml/Dash/DashDepartmentsList.qml → qml/Dash/DashNavigationList.qmlrenamed+14−18
@@ -15,16 +15,16 @@
15 */
15 */
16
16
17import QtQuick 2.2
17import QtQuick 2.2
18−import Ubuntu.Components 0.1
18+import Ubuntu.Components 1.1
19
19
20Item {
20Item {
21 id: root
21 id: root
22− property var department: null
22+ property var navigation: null
23− property var currentDepartment: null
23+ property var currentNavigation: null
24 property var scopeStyle: null
24 property var scopeStyle: null
25− signal enterDepartment(var newDepartmentId, bool hasChildren)
25+ signal enterNavigation(var newNavigationId, bool hasChildren)
26 signal goBackToParentClicked()
26 signal goBackToParentClicked()
27− signal allDepartmentClicked()
27+ signal allNavigationClicked()
28
28
29 readonly property int itemHeight: units.gu(5)
29 readonly property int itemHeight: units.gu(5)
30 readonly property color foregroundColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
30 readonly property color foregroundColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
@@ -35,11 +35,6 @@ Item {
35 anchors.fill: parent
35 anchors.fill: parent
36 }
36 }
37
37
38− ActivityIndicator {
39− id: loadingIndicator
40− anchors.centerIn: parent
41− running: !(department && department.loaded)
42− }
43 clip: true
38 clip: true
44
39
45 Behavior on height {
40 Behavior on height {
@@ -54,6 +49,7 @@ Item {
54
49
55 anchors.fill: parent
50 anchors.fill: parent
56
51
52+ flickableDirection: Flickable.VerticalFlick
57 contentHeight: column.height
53 contentHeight: column.height
58 contentWidth: width
54 contentWidth: width
59
55
@@ -68,7 +64,7 @@ Item {
68 id: backButton
64 id: backButton
69 objectName: "backButton"
65 objectName: "backButton"
70 width: parent.width
66 width: parent.width
71− visible: department && !department.isRoot || false
67+ visible: navigation && !navigation.isRoot || false
72 height: itemHeight
68 height: itemHeight
73
69
74 onClicked: root.goBackToParentClicked();
70 onClicked: root.goBackToParentClicked();
@@ -92,7 +88,7 @@ Item {
92 left: backImage.right
88 left: backImage.right
93 leftMargin: units.gu(0.5)
89 leftMargin: units.gu(0.5)
94 }
90 }
95− text: department ? department.parentLabel : ""
91+ text: navigation ? navigation.parentLabel : ""
96 color: root.foregroundColor
92 color: root.foregroundColor
97 }
93 }
98
94
@@ -114,7 +110,7 @@ Item {
114 id: allButton
110 id: allButton
115 objectName: "allButton"
111 objectName: "allButton"
116 width: parent.width
112 width: parent.width
117− visible: department && (!department.isRoot || (root.currentDepartment && !root.currentDepartment.isRoot && root.currentDepartment.parentDepartmentId == department.departmentId)) || false
113+ visible: navigation && (!navigation.isRoot || (root.currentNavigation && !root.currentNavigation.isRoot && root.currentNavigation.parentNavigationId == navigation.navigationId)) || false
118 height: itemHeight
114 height: itemHeight
119
115
120 Label {
116 Label {
@@ -123,7 +119,7 @@ Item {
123 left: parent.left
119 left: parent.left
124 leftMargin: units.gu(2)
120 leftMargin: units.gu(2)
125 }
121 }
126− text: department ? (department.allLabel != "" ? department.allLabel : department.label) : ""
122+ text: navigation ? (navigation.allLabel != "" ? navigation.allLabel : navigation.label) : ""
127 font.bold: true
123 font.bold: true
128 color: root.foregroundColor
124 color: root.foregroundColor
129 }
125 }
@@ -141,18 +137,18 @@ Item {
141 height: units.dp(1)
137 height: units.dp(1)
142 }
138 }
143
139
144− onClicked: root.allDepartmentClicked();
140+ onClicked: root.allNavigationClicked();
145 }
141 }
146
142
147 Repeater {
143 Repeater {
148− model: department && department.loaded ? department : null
144+ model: navigation && navigation.loaded ? navigation : null
149 clip: true
145 clip: true
150 delegate: AbstractButton {
146 delegate: AbstractButton {
151 objectName: root.objectName + "child" + index
147 objectName: root.objectName + "child" + index
152 height: root.itemHeight
148 height: root.itemHeight
153 width: root.width
149 width: root.width
154
150
155− onClicked: root.enterDepartment(departmentId, hasChildren)
151+ onClicked: root.enterNavigation(navigationId, hasChildren)
156
152
157 Label {
153 Label {
158 anchors {
154 anchors {
@@ -188,7 +184,7 @@ Item {
188 color: root.foregroundColor
184 color: root.foregroundColor
189 opacity: 0.1
185 opacity: 0.1
190 height: units.dp(1)
186 height: units.dp(1)
191− visible: index != department.count - 1
187+ visible: index != navigation.count - 1
192 }
188 }
193 }
189 }
194 }
190 }
qml/Dash/DashRenderer.qml+3−10
@@ -17,15 +17,11 @@
17import QtQuick 2.0
17import QtQuick 2.0
18
18
19Item {
19Item {
20− // Can the item be expanded?
20+ property int collapsedHeight
21− property bool expandable: false
22
21
23− // In case it can be expanded, is it filtered
22+ property int expandedHeight
24− property bool filtered: true
25
23
26− property int collapsedHeight: height
24+ property int collapsedItemCount: -1
27−
28− property int uncollapsedHeight: height
29
25
30 property int displayMarginBeginning: 0
26 property int displayMarginBeginning: 0
31
27
@@ -50,7 +46,4 @@ Item {
50 /// Emitted when the user pressed and held on an item
46 /// Emitted when the user pressed and held on an item
51 /// @param index is the index of the held item
47 /// @param index is the index of the held item
52 signal pressAndHold(int index)
48 signal pressAndHold(int index)
53−
54− function setFilter(filter, animate) {
55− }
56}
49}
qml/Dash/GenericScopeView.qml+145−86
@@ -18,7 +18,6 @@ import QtQuick 2.0
18import Ubuntu.Components 0.1
18import Ubuntu.Components 0.1
19import Utils 0.1
19import Utils 0.1
20import Unity 0.2
20import Unity 0.2
21−import Unity.Application 0.1
22import Dash 0.1
21import Dash 0.1
23import "../Components"
22import "../Components"
24import "../Components/ListItems" as ListItems
23import "../Components/ListItems" as ListItems
@@ -26,6 +25,7 @@ import "../Components/ListItems" as ListItems
26FocusScope {
25FocusScope {
27 id: scopeView
26 id: scopeView
28
27
28+ readonly property alias navigationShown: dashNavigation.showList
29 property var scope: null
29 property var scope: null
30 property SortFilterProxyModel categories: categoryFilter
30 property SortFilterProxyModel categories: categoryFilter
31 property bool isCurrent: false
31 property bool isCurrent: false
@@ -33,22 +33,16 @@ FocusScope {
33 property bool hasBackAction: false
33 property bool hasBackAction: false
34 property bool enableHeightBehaviorOnNextCreation: false
34 property bool enableHeightBehaviorOnNextCreation: false
35 property var categoryView: categoryView
35 property var categoryView: categoryView
36+ property alias paginationCount: pageHeader.paginationCount
37+ property alias paginationIndex: pageHeader.paginationIndex
36
38
37 property var scopeStyle: ScopeStyle {
39 property var scopeStyle: ScopeStyle {
38 style: scope ? scope.customizations : {}
40 style: scope ? scope.customizations : {}
39 }
41 }
40
42
41− signal backClicked()
43+ readonly property bool processing: scope ? scope.searchInProgress || previewListView.processing : false
42−
43− onScopeChanged: {
44− if (scope) {
45− scope.activateApplication.connect(activateApp);
46− }
47− }
48
44
49− function activateApp(appId) {
45+ signal backClicked()
50− shell.activateApplication(appId);
51− }
52
46
53 function positionAtBeginning() {
47 function positionAtBeginning() {
54 categoryView.positionAtBeginning()
48 categoryView.positionAtBeginning()
@@ -119,6 +113,8 @@ FocusScope {
119
113
120 model: scopeView.categories
114 model: scopeView.categories
121 forceNoClip: previewListView.open
115 forceNoClip: previewListView.open
116+ pixelAligned: true
117+ interactive: !dashNavigation.showList
122
118
123 property string expandedCategoryId: ""
119 property string expandedCategoryId: ""
124
120
@@ -128,11 +124,22 @@ FocusScope {
128 highlightWhenPressed: false
124 highlightWhenPressed: false
129 showDivider: false
125 showDivider: false
130
126
131− readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
127+ readonly property bool expandable: {
132− readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filtered : true
128+ if (categoryView.model.count === 1) return false;
129+ if (cardTool.template && cardTool.template["collapsed-rows"] === 0) return false;
130+ if (item && item.expandedHeight > item.collapsedHeight) return true;
131+ return false;
132+ }
133+ property bool expanded: false
133 readonly property string category: categoryId
134 readonly property string category: categoryId
135+ readonly property string headerLink: model.headerLink
134 readonly property var item: rendererLoader.item
136 readonly property var item: rendererLoader.item
135
137
138+ function expand(expand, animate) {
139+ heightBehaviour.enabled = animate;
140+ expanded = expand;
141+ }
142+
136 CardTool {
143 CardTool {
137 id: cardTool
144 id: cardTool
138 objectName: "cardTool"
145 objectName: "cardTool"
@@ -142,22 +149,48 @@ FocusScope {
142 viewWidth: parent.width
149 viewWidth: parent.width
143 }
150 }
144
151
152+ onExpandableChanged: {
153+ // This can happen with the VJ that doesn't know how height it will be on creation
154+ // so doesn't set expandable until a bit too late for onLoaded
155+ if (expandable) {
156+ var shouldExpand = baseItem.category === categoryView.expandedCategoryId;
157+ baseItem.expand(shouldExpand, false /*animate*/);
158+ }
159+ }
160+
161+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
162+ onYChanged: rendererLoader.updateDelegateCreationRange();
163+
145 Loader {
164 Loader {
146 id: rendererLoader
165 id: rendererLoader
147 anchors {
166 anchors {
148 top: parent.top
167 top: parent.top
149 left: parent.left
168 left: parent.left
150 right: parent.right
169 right: parent.right
151− topMargin: hasSectionHeader ? 0 : units.gu(2)
170+ topMargin: name != "" ? 0 : units.gu(2)
152 }
171 }
153
172
173+ Behavior on height {
174+ id: heightBehaviour
175+ enabled: false
176+ animation: UbuntuNumberAnimation {
177+ onRunningChanged: {
178+ if (!running) {
179+ heightBehaviour.enabled = false
180+ }
181+ }
182+ }
183+ }
184+
185+ readonly property bool expanded: baseItem.expanded || !baseItem.expandable
186+ height: expanded ? item.expandedHeight : item.collapsedHeight
187+
154 source: {
188 source: {
155 switch (cardTool.categoryLayout) {
189 switch (cardTool.categoryLayout) {
156 case "carousel": return "CardCarousel.qml";
190 case "carousel": return "CardCarousel.qml";
157 case "vertical-journal": return "CardVerticalJournal.qml";
191 case "vertical-journal": return "CardVerticalJournal.qml";
158− case "running-apps": return "Apps/RunningApplicationsGrid.qml";
159 case "grid":
192 case "grid":
160− default: return "CardFilterGrid.qml";
193+ default: return "CardGrid.qml";
161 }
194 }
162 }
195 }
163
196
@@ -166,21 +199,18 @@ FocusScope {
166 item.enableHeightBehavior = scopeView.enableHeightBehaviorOnNextCreation;
199 item.enableHeightBehavior = scopeView.enableHeightBehaviorOnNextCreation;
167 scopeView.enableHeightBehaviorOnNextCreation = false;
200 scopeView.enableHeightBehaviorOnNextCreation = false;
168 }
201 }
169− if (source.toString().indexOf("Apps/RunningApplicationsGrid.qml") != -1) {
170− // TODO: this is still a kludge :D Ideally add some kind of hook so that we
171− // can do this from DashApps.qml or think a better way that needs no special casing
172− item.model = Qt.binding(function() { return runningApps; })
173− item.canEnableTerminationMode = Qt.binding(function() { return scopeView.isCurrent })
174− } else {
175− item.model = Qt.binding(function() { return results })
202+ item.model = Qt.binding(function() { return results })
176− }
177 item.objectName = Qt.binding(function() { return categoryId })
203 item.objectName = Qt.binding(function() { return categoryId })
178 item.scopeStyle = scopeView.scopeStyle;
204 item.scopeStyle = scopeView.scopeStyle;
179− if (item.expandable) {
205+ if (baseItem.expandable) {
180− var shouldFilter = categoryId != categoryView.expandedCategoryId;
206+ var shouldExpand = categoryId === categoryView.expandedCategoryId;
181− item.setFilter(shouldFilter, false /*animate*/);
207+ baseItem.expand(shouldExpand, false /*animate*/);
182 }
208 }
183 updateDelegateCreationRange();
209 updateDelegateCreationRange();
210+ if (scope && scope.id === "clickscope" && (categoryId === "predefined" || categoryId === "local")) {
211+ // Yeah, hackish :/
212+ cardTool.artShapeSize = Qt.size(units.gu(8), units.gu(7.5));
213+ }
184 item.cardTool = cardTool;
214 item.cardTool = cardTool;
185 }
215 }
186
216
@@ -199,25 +229,22 @@ FocusScope {
199 // so it's not implemented
229 // so it's not implemented
200 scopeView.scope.activate(result)
230 scopeView.scope.activate(result)
201 } else {
231 } else {
202− previewListView.model = target.model;
232+ openPreview(index);
203− previewListView.currentIndex = -1
204− previewListView.currentIndex = index;
205− previewListView.open = true
206 }
233 }
207 }
234 }
208− onPressAndHold: {
235+ onPressAndHold: openPreview(index)
209− previewListView.model = target.model;
236+
210− previewListView.currentIndex = -1
237+ function openPreview(index) {
211− previewListView.currentIndex = index;
238+ if (!rendererLoader.expanded && !seeAllLabel.visible && target.collapsedItemCount > 0) {
212− previewListView.open = true
239+ previewLimitModel.model = target.model;
213− }
240+ previewLimitModel.limit = target.collapsedItemCount;
214− onExpandableChanged: {
241+ previewListView.model = previewLimitModel;
215− // This can happen with the VJ that doesn't know how height it will be on creation
242+ } else {
216− // so doesn't set expandable until a bit too late for onLoaded
243+ previewListView.model = target.model;
217− if (rendererLoader.item.expandable) {
218− var shouldFilter = baseItem.category != categoryView.expandedCategoryId;
219− rendererLoader.item.setFilter(shouldFilter, false /*animate*/);
220 }
244 }
245+ previewListView.currentIndex = -1;
246+ previewListView.currentIndex = index;
247+ previewListView.open = true;
221 }
248 }
222 }
249 }
223 Connections {
250 Connections {
@@ -227,17 +254,17 @@ FocusScope {
227 }
254 }
228 function collapseAllButExpandedCategory() {
255 function collapseAllButExpandedCategory() {
229 var item = rendererLoader.item;
256 var item = rendererLoader.item;
230− if (item.expandable) {
257+ if (baseItem.expandable) {
231− var shouldFilter = categoryId != categoryView.expandedCategoryId;
258+ var shouldExpand = categoryId === categoryView.expandedCategoryId;
232− if (shouldFilter != item.filter) {
259+ if (shouldExpand != baseItem.expanded) {
233 // If the filter animation will be seen start it, otherwise, just flip the switch
260 // If the filter animation will be seen start it, otherwise, just flip the switch
234− var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
261+ var shrinkingVisible = !shouldExpand && y + item.collapsedHeight + seeAll.height < categoryView.height;
235− var growingVisible = !shouldFilter && y + height < categoryView.height;
262+ var growingVisible = shouldExpand && y + height < categoryView.height;
236− if (!previewListView.open || !shouldFilter) {
263+ if (!previewListView.open || shouldExpand) {
237 var animate = shrinkingVisible || growingVisible;
264 var animate = shrinkingVisible || growingVisible;
238− item.setFilter(shouldFilter, animate)
265+ baseItem.expand(shouldExpand, animate)
239− if (!shouldFilter && !previewListView.open) {
266+ if (shouldExpand && !previewListView.open) {
240− categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
267+ categoryView.maximizeVisibleArea(index, item.expandedHeight + seeAll.height);
241 }
268 }
242 }
269 }
243 }
270 }
@@ -274,58 +301,82 @@ FocusScope {
274 item.displayMarginEnd = -baseItem.height;
301 item.displayMarginEnd = -baseItem.height;
275 } else {
302 } else {
276 item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
303 item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
277− item.displayMarginEnd = -Math.max(baseItem.height - categoryView.height + baseItem.y, 0)
304+ item.displayMarginEnd = -Math.max(baseItem.height - seeAll.height
305+ - categoryView.height + baseItem.y, 0)
278 }
306 }
279 }
307 }
280 }
308 }
309+ }
281
310
282− Image {
311+ AbstractButton {
283− visible: index != 0
312+ id: seeAll
284− anchors {
313+ objectName: "seeAll"
285− top: parent.top
314+ anchors {
286− left: parent.left
315+ top: rendererLoader.bottom
287− right: parent.right
316+ left: parent.left
317+ right: parent.right
318+ }
319+ height: seeAllLabel.visible ? seeAllLabel.font.pixelSize + units.gu(6) : 0
320+
321+ onClicked: {
322+ if (categoryView.expandedCategoryId != baseItem.category) {
323+ categoryView.expandedCategoryId = baseItem.category;
324+ } else {
325+ categoryView.expandedCategoryId = "";
288 }
326 }
289− fillMode: Image.Stretch
290− source: "graphics/dash_divider_top_lightgrad.png"
291− z: -1
292 }
327 }
293
328
294− Image {
329+ Label {
295− // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
330+ id: seeAllLabel
296− visible: index != categoryView.model.count - 1
331+ text: baseItem.expanded ? i18n.tr("See less") : i18n.tr("See all")
297 anchors {
332 anchors {
298− bottom: parent.bottom
333+ centerIn: parent
299− left: parent.left
334+ verticalCenterOffset: units.gu(-0.5)
300− right: parent.right
301 }
335 }
302− fillMode: Image.Stretch
336+ fontSize: "small"
303− source: "graphics/dash_divider_top_darkgrad.png"
337+ font.weight: Font.Bold
304− z: -1
338+ color: scopeStyle ? scopeStyle.foreground : "grey"
339+ visible: baseItem.expandable && !baseItem.headerLink
305 }
340 }
306 }
341 }
307
342
308− onHeightChanged: rendererLoader.updateDelegateCreationRange();
343+ Image {
309− onYChanged: rendererLoader.updateDelegateCreationRange();
344+ visible: index != 0
345+ anchors {
346+ top: parent.top
347+ left: parent.left
348+ right: parent.right
349+ }
350+ fillMode: Image.Stretch
351+ source: "graphics/dash_divider_top_lightgrad.png"
352+ z: -1
353+ }
354+
355+ Image {
356+ // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
357+ visible: index != categoryView.model.count - 1
358+ anchors {
359+ bottom: seeAll.bottom
360+ left: parent.left
361+ right: parent.right
362+ }
363+ fillMode: Image.Stretch
364+ source: "graphics/dash_divider_top_darkgrad.png"
365+ z: -1
366+ }
310 }
367 }
311
368
312 sectionProperty: "name"
369 sectionProperty: "name"
313 sectionDelegate: ListItems.Header {
370 sectionDelegate: ListItems.Header {
314 objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
371 objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
315− property var delegate: categoryView.item(delegateIndex)
372+ readonly property var delegate: categoryView.item(delegateIndex)
316 width: categoryView.width
373 width: categoryView.width
374+ height: section != "" ? units.gu(5) : 0
317 text: section
375 text: section
318− textColor: scopeStyle ? scopeStyle.foreground : "grey"
376+ color: scopeStyle ? scopeStyle.foreground : "grey"
319− image: {
320− if (delegate && delegate.expandable)
377+ iconName: delegate && delegate.headerLink ? "go-next" : ""
321− return delegate.filtered ? "graphics/header_handlearrow.png" : "graphics/header_handlearrow2.png"
322− return "";
323− }
324 onClicked: {
378 onClicked: {
325− if (categoryView.expandedCategoryId != delegate.category)
379+ if (delegate.headerLink) scopeView.scope.performQuery(delegate.headerLink);
326− categoryView.expandedCategoryId = delegate.category;
327− else
328− categoryView.expandedCategoryId = "";
329 }
380 }
330 }
381 }
331
382
@@ -336,10 +387,10 @@ FocusScope {
336 title: scopeView.scope ? scopeView.scope.name : ""
387 title: scopeView.scope ? scopeView.scope.name : ""
337 showBackButton: scopeView.hasBackAction
388 showBackButton: scopeView.hasBackAction
338 searchEntryEnabled: true
389 searchEntryEnabled: true
339− searchInProgress: scopeView.scope ? scopeView.scope.searchInProgress : false
340 scopeStyle: scopeView.scopeStyle
390 scopeStyle: scopeView.scopeStyle
341
391
342− bottomItem: DashDepartments {
392+ bottomItem: DashNavigation {
393+ id: dashNavigation
343 scope: scopeView.scope
394 scope: scopeView.scope
344 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
395 width: parent.width <= units.gu(60) ? parent.width : units.gu(40)
345 anchors.right: parent.right
396 anchors.right: parent.right
@@ -352,6 +403,10 @@ FocusScope {
352 }
403 }
353 }
404 }
354
405
406+ LimitProxyModel {
407+ id: previewLimitModel
408+ }
409+
355 PreviewListView {
410 PreviewListView {
356 id: previewListView
411 id: previewListView
357 objectName: "previewListView"
412 objectName: "previewListView"
@@ -361,6 +416,10 @@ FocusScope {
361 width: parent.width
416 width: parent.width
362 height: parent.height
417 height: parent.height
363 anchors.left: categoryView.right
418 anchors.left: categoryView.right
419+
420+ onOpenChanged: {
421+ pageHeader.unfocus();
422+ }
364 }
423 }
365
424
366}
425}
qml/Dash/PreviewListView.qml+24−30
@@ -32,6 +32,9 @@ Item {
32 property alias currentItem: previewListView.currentItem
32 property alias currentItem: previewListView.currentItem
33 property alias count: previewListView.count
33 property alias count: previewListView.count
34
34
35+ readonly property bool processing: currentItem && (!currentItem.previewModel.loaded
36+ || currentItem.previewModel.processingAction)
37+
35 PageHeader {
38 PageHeader {
36 id: header
39 id: header
37 objectName: "pageHeader"
40 objectName: "pageHeader"
@@ -73,9 +76,7 @@ Item {
73 property bool open: false
76 property bool open: false
74
77
75 onOpenChanged: {
78 onOpenChanged: {
76− if (open) {
79+ if (!open) {
77− pageHeader.unfocus();
78− } else {
79 // Cancel any pending preview requests or actions
80 // Cancel any pending preview requests or actions
80 if (previewListView.currentItem && previewListView.currentItem.previewData !== undefined) {
81 if (previewListView.currentItem && previewListView.currentItem.previewData !== undefined) {
81 previewListView.currentItem.previewData.cancelAction();
82 previewListView.currentItem.previewData.cancelAction();
@@ -85,39 +86,32 @@ Item {
85 }
86 }
86 }
87 }
87
88
88− delegate: Item {
89+ delegate: Previews.Preview {
90+ id: preview
89− objectName: "previewItem" + index
91+ objectName: "preview" + index
90 height: previewListView.height
92 height: previewListView.height
91 width: previewListView.width
93 width: previewListView.width
92
94
93− readonly property bool ready: preview.previewModel.loaded
95+ isCurrent: ListView.isCurrentItem
94−
95− Previews.Preview {
96− id: preview
97− objectName: "preview" + index
98− anchors.fill: parent
99
96
100− isCurrent: parent.ListView.isCurrentItem
101−
102− previewModel: {
97+ previewModel: {
103− var previewStack = root.scope.preview(result);
98+ var previewStack = root.scope.preview(result);
104− return previewStack.getPreviewModel(0);
99+ return previewStack.getPreviewModel(0);
105− }
106− scopeStyle: root.scopeStyle
107 }
100 }
101+ scopeStyle: root.scopeStyle
102+ }
103+ }
108
104
109− MouseArea {
105+ MouseArea {
110− id: processingMouseArea
106+ id: processingMouseArea
111− objectName: "processingMouseArea"
107+ objectName: "processingMouseArea"
112− anchors.fill: parent
108+ anchors {
113− enabled: !preview.previewModel.loaded || preview.previewModel.processingAction
109+ left: parent.left
114−
110+ right: parent.right
115− ActivityIndicator {
111+ top: pageHeader.bottom
116− anchors.centerIn: parent
112+ bottom: parent.bottom
117− visible: root.open && parent.enabled
118− running: visible
119− }
120− }
121 }
113 }
114+
115+ enabled: root.processing
122 }
116 }
123}
117}
qml/Dash/Previews/PreviewExpandable.qmlnew file+101
@@ -0,0 +1,101 @@
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.3
18+import Ubuntu.Components 1.1
19+import "../../Components"
20+
21+/*! \brief Preview widget for expandable widgets.
22+
23+ This widget shows a list of widgets defined in widgetData["widgets"]
24+ Those widgets can be collapsed or uncollapsed. When uncollapsed
25+ all the widgets are shown, when collapsed only the first
26+ widgetData["collapsed-widgets"] are shown. It has a title that comes
27+ in via widgetData["title"]
28+ */
29+
30+PreviewWidget {
31+ id: root
32+ implicitHeight: childrenRect.height
33+
34+ expanded: false
35+
36+ Label {
37+ id: titleLabel
38+ objectName: "titleLabel"
39+ anchors {
40+ left: parent.left
41+ right: expandButton.left
42+ }
43+ fontSize: "large"
44+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey"
45+ visible: text !== ""
46+ opacity: .8
47+ text: widgetData["title"] || ""
48+ wrapMode: Text.Wrap
49+ }
50+
51+ AbstractButton {
52+ id: expandButton
53+ objectName: "expandButton"
54+ width: titleLabel.height
55+ height: titleLabel.height
56+ anchors.right: parent.right
57+ onClicked: {
58+ root.expanded = !root.expanded;
59+ }
60+ Icon {
61+ anchors.fill: parent
62+ width: 64
63+ height: 64
64+ name: root.expanded ? "view-collapse" : "view-expand"
65+ }
66+ }
67+
68+ Column {
69+ anchors {
70+ top: titleLabel.bottom
71+ topMargin: units.gu(1)
72+ left: parent.left
73+ right: parent.right
74+ }
75+ spacing: units.gu(1)
76+ Repeater {
77+ id: repeater
78+ objectName: "repeater"
79+ model: widgetData["widgets"]
80+ delegate: PreviewWidgetFactory {
81+ height: visible ? implicitHeight : 0
82+ width: parent.width
83+ widgetId: modelData.widgetId
84+ widgetType: modelData.type
85+ widgetData: modelData.properties
86+ isCurrentPreview: root.isCurrentPreview
87+ scopeStyle: root.scopeStyle
88+ anchors {
89+ left: parent.left
90+ right: parent.right
91+ }
92+ expanded: root.expanded
93+ visible: root.expanded || index < root.widgetData["collapsed-widgets"]
94+
95+ onTriggered: {
96+ root.triggered(widgetId, actionId, data);
97+ }
98+ }
99+ }
100+ }
101+}
qml/Dash/Previews/PreviewImageGallery.qml+1
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import Ubuntu.Components 1.1
18import "../../Components"
19import "../../Components"
19
20
20/*! This preview widget shows a horizontal list of images.
21/*! This preview widget shows a horizontal list of images.
qml/Dash/Previews/PreviewTextSummary.qml+3−16
@@ -23,7 +23,7 @@ import "../../Components"
23 This widget shows text contained in widgetData["text"]
23 This widget shows text contained in widgetData["text"]
24 along with a title that comes from widgetData["title"].
24 along with a title that comes from widgetData["title"].
25
25
26− In case the text does not fit in 7 lines a See More / Less widget is also shown.
26+ In case the widget is collapsed it only shows 3 lines of text.
27 */
27 */
28
28
29PreviewWidget {
29PreviewWidget {
@@ -50,14 +50,14 @@ PreviewWidget {
50 id: textLabel
50 id: textLabel
51 objectName: "textLabel"
51 objectName: "textLabel"
52
52
53− readonly property int maximumCollapsedLineCount: 7
53+ readonly property int maximumCollapsedLineCount: 3
54
54
55 anchors {
55 anchors {
56 left: parent.left
56 left: parent.left
57 right: parent.right
57 right: parent.right
58 top: titleLabel.visible ? titleLabel.bottom : parent.top
58 top: titleLabel.visible ? titleLabel.bottom : parent.top
59 }
59 }
60− height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2)
60+ height: (lineCount <= maximumCollapsedLineCount || root.expanded) ? contentHeight : contentHeight / lineCount * maximumCollapsedLineCount
61 clip: true
61 clip: true
62 fontSize: "small"
62 fontSize: "small"
63 lineHeight: 1.2
63 lineHeight: 1.2
@@ -70,17 +70,4 @@ PreviewWidget {
70 UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
70 UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
71 }
71 }
72 }
72 }
73−
74− SeeMore {
75− id: seeMore
76− objectName: "seeMore"
77− anchors {
78− left: parent.left
79− right: parent.right
80− top: textLabel.bottom
81− topMargin: visible ? units.gu(1) : 0
82− }
83− height: visible ? implicitHeight : 0
84− visible: textLabel.lineCount > textLabel.maximumCollapsedLineCount
85− }
86}
73}
qml/Dash/Previews/PreviewWidget.qml+3
@@ -31,6 +31,9 @@ Item {
31 //! The ScopeStyle component.
31 //! The ScopeStyle component.
32 property var scopeStyle: null
32 property var scopeStyle: null
33
33
34+ //! Should the widget show in expanded mode (For those that support it)
35+ property bool expanded: true
36+
34 /*! \brief This signal should be emitted when a preview action was triggered.
37 /*! \brief This signal should be emitted when a preview action was triggered.
35 *
38 *
36 * \param widgetId, actionId Respective identifiers from widgetData.
39 * \param widgetId, actionId Respective identifiers from widgetData.
qml/Dash/Previews/PreviewWidgetFactory.qml+5
@@ -34,6 +34,9 @@ Loader {
34 //! The ScopeStyle component.
34 //! The ScopeStyle component.
35 property var scopeStyle: null
35 property var scopeStyle: null
36
36
37+ //! Should the widget show in expanded mode (For those that support it)
38+ property bool expanded: true
39+
37 //! Set to true if the parent preview is displayed.
40 //! Set to true if the parent preview is displayed.
38 property bool isCurrentPreview: false
41 property bool isCurrentPreview: false
39
42
@@ -47,6 +50,7 @@ Loader {
47 switch (widgetType) {
50 switch (widgetType) {
48 case "actions": return "PreviewActions.qml";
51 case "actions": return "PreviewActions.qml";
49 case "audio": return "PreviewAudioPlayback.qml";
52 case "audio": return "PreviewAudioPlayback.qml";
53+ case "expandable": return "PreviewExpandable.qml";
50 case "gallery": return "PreviewImageGallery.qml";
54 case "gallery": return "PreviewImageGallery.qml";
51 case "header": return "PreviewHeader.qml";
55 case "header": return "PreviewHeader.qml";
52 case "image": return "PreviewZoomableImage.qml";
56 case "image": return "PreviewZoomableImage.qml";
@@ -65,6 +69,7 @@ Loader {
65 item.widgetId = Qt.binding(function() { return root.widgetId } )
69 item.widgetId = Qt.binding(function() { return root.widgetId } )
66 item.widgetData = Qt.binding(function() { return root.widgetData } )
70 item.widgetData = Qt.binding(function() { return root.widgetData } )
67 item.isCurrentPreview = Qt.binding(function() { return root.isCurrentPreview } )
71 item.isCurrentPreview = Qt.binding(function() { return root.isCurrentPreview } )
72+ item.expanded = Qt.binding(function() { return root.expanded } )
68 if (item.hasOwnProperty("scopeStyle")) item.scopeStyle = root.scopeStyle;
73 if (item.hasOwnProperty("scopeStyle")) item.scopeStyle = root.scopeStyle;
69 }
74 }
70
75
qml/Dash/ScopeListView.qml−5
@@ -20,9 +20,4 @@ import Dash 0.1
20ListViewWithPageHeader {
20ListViewWithPageHeader {
21 maximumFlickVelocity: height * 10
21 maximumFlickVelocity: height * 10
22 flickDeceleration: height * 2
22 flickDeceleration: height * 2
23−
24− Connections {
25− target: greeter
26− onShownChanged: if (greeter.shown) showHeader()
27− }
28}
23}
qml/Dash/graphics/phone/screenshots/unity8-dash@12.pngnew file

Binary file not shown.

qml/Dash/graphics/phone/screenshots/vkb_portrait.pngnew file

Binary file not shown.

qml/Greeter/Greeter.qml+1−1
@@ -70,7 +70,7 @@ Showable {
70 DraggingArea {
70 DraggingArea {
71 id: dragHandle
71 id: dragHandle
72 anchors.fill: parent
72 anchors.fill: parent
73− enabled: greeter.narrowMode || !greeter.locked
73+ enabled: (greeter.narrowMode || !greeter.locked) && greeter.enabled && greeter.shown
74 orientation: Qt.Horizontal
74 orientation: Qt.Horizontal
75 propagateComposedEvents: true
75 propagateComposedEvents: true
76
76
qml/Launcher/Launcher.qml+3−4
@@ -29,8 +29,7 @@ Item {
29 property int dragAreaWidth: units.gu(1)
29 property int dragAreaWidth: units.gu(1)
30 property int minimizeDistance: units.gu(26)
30 property int minimizeDistance: units.gu(26)
31 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
31 property real progress: dragArea.dragging && dragArea.touchX > panelWidth ?
32− (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) :
32+ (width * (dragArea.touchX-panelWidth) / (width - panelWidth)) : 0
33− (dragArea.dragging ? 0.001 : 0)
34
33
35 readonly property bool shown: panel.x > -panel.width
34 readonly property bool shown: panel.x > -panel.width
36
35
@@ -181,7 +180,7 @@ Item {
181 bottom: parent.bottom
180 bottom: parent.bottom
182 }
181 }
183 x: -width
182 x: -width
184− opacity: (x == -width && dragArea.status === DirectionalDragArea.WaitingForTouch) ? 0 : 1
183+ visible: x > -width || dragArea.status === DirectionalDragArea.Undecided
185 model: LauncherModel
184 model: LauncherModel
186
185
187 property bool animate: true
186 property bool animate: true
@@ -245,7 +244,7 @@ Item {
245 if (!dragging) {
244 if (!dragging) {
246 if (distance > panel.width / 2) {
245 if (distance > panel.width / 2) {
247 if (distance > minimizeDistance) {
246 if (distance > minimizeDistance) {
248− root.dash()
247+ root.dash();
249 } else {
248 } else {
250 root.switchToNextState("visible")
249 root.switchToNextState("visible")
251 }
250 }
qml/Launcher/LauncherDelegate.qml+9−6
@@ -70,28 +70,31 @@ Item {
70 height: root.itemHeight - units.gu(1)
70 height: root.itemHeight - units.gu(1)
71 }
71 }
72
72
73− BorderImage {
73+ UbuntuShape {
74 objectName: "countEmblem"
74 objectName: "countEmblem"
75 anchors {
75 anchors {
76 right: parent.right
76 right: parent.right
77 top: parent.top
77 top: parent.top
78 margins: units.dp(3)
78 margins: units.dp(3)
79 }
79 }
80− width: Math.min(root.itemWidth, Math.max(units.gu(3), countLabel.implicitWidth + units.gu(2.5)))
80+ width: Math.min(root.itemWidth, Math.max(units.gu(2), countLabel.implicitWidth + units.gu(1)))
81− height: units.gu(3)
81+ height: units.gu(2)
82− source: "graphics/notification.sci"
82+ color: UbuntuColors.orange
83 visible: root.count > 0
83 visible: root.count > 0
84+ borderSource: "none"
84
85
85 Label {
86 Label {
86 id: countLabel
87 id: countLabel
87 text: root.count
88 text: root.count
88 anchors.centerIn: parent
89 anchors.centerIn: parent
90+ // FIXME: verticalCenter seems to be off wee bit and QML doesn't have a centerLine
91+ // property for Text: https://bugreports.qt-project.org/browse/QTBUG-40479
92+ anchors.verticalCenterOffset: -units.dp(.5)
89 width: root.itemWidth - units.gu(1)
93 width: root.itemWidth - units.gu(1)
90 horizontalAlignment: Text.AlignHCenter
94 horizontalAlignment: Text.AlignHCenter
91 elide: Text.ElideRight
95 elide: Text.ElideRight
92 color: "white"
96 color: "white"
93− fontSize: "small"
97+ fontSize: "x-small"
94− font.bold: true
95 }
98 }
96 }
99 }
97
100
qml/Launcher/graphics/notification@30.pngdeleted

Binary file not shown.

qml/Launcher/graphics/notification@30.scideleted−5
@@ -1,5 +0,0 @@
1−border.left: 36
2−border.top: 36
3−border.bottom: 36
4−border.right: 36
5−source: notification@30.png
qml/Notifications/NotificationMenuItemFactory.qml+3
@@ -76,6 +76,9 @@ Loader {
76 }
76 }
77 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
77 echoMode: checkBox.checked ? TextInput.Normal : TextInput.Password
78 height: units.gu(5)
78 height: units.gu(5)
79+ Component.onCompleted: {
80+ forceActiveFocus();
81+ }
79 onTextChanged: {
82 onTextChanged: {
80 menuModel.changeState(menuIndex, text);
83 menuModel.changeState(menuIndex, text);
81 }
84 }
qml/Panel/Indicators.qml+3
@@ -37,6 +37,7 @@ Showable {
37 readonly property int lockThreshold: openedHeight / 2
37 readonly property int lockThreshold: openedHeight / 2
38 property bool fullyOpened: height == openedHeight
38 property bool fullyOpened: height == openedHeight
39 property bool partiallyOpened: height > panelHeight && !fullyOpened
39 property bool partiallyOpened: height > panelHeight && !fullyOpened
40+ property bool fullyClosed: height <= panelHeight
40 property bool contentEnabled: true
41 property bool contentEnabled: true
41 property bool initalizeItem: true
42 property bool initalizeItem: true
42 readonly property alias content: menuContent
43 readonly property alias content: menuContent
@@ -187,6 +188,7 @@ Showable {
187 bottom: handle.top
188 bottom: handle.top
188 }
189 }
189 indicatorsModel: visibleIndicators.model
190 indicatorsModel: visibleIndicators.model
191+ visible: indicators.partiallyOpened || indicators.fullyOpened
190 clip: !indicators.fullyOpened
192 clip: !indicators.fullyOpened
191 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
193 activeHeader: indicators.state == "hint" || indicators.state == "reveal"
192 enabled: contentEnabled
194 enabled: contentEnabled
@@ -219,6 +221,7 @@ Showable {
219 }
221 }
220 height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
222 height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
221 clip: height < handleImage.height
223 clip: height < handleImage.height
224+ visible: menuContent.visible
222
225
223 BorderImage {
226 BorderImage {
224 id: handleImage
227 id: handleImage
qml/Panel/Indicators/DefaultIndicatorPage.qml+1−1
@@ -126,7 +126,7 @@ IndicatorBase {
126 id: loader
126 id: loader
127 objectName: "menuItem" + index
127 objectName: "menuItem" + index
128 asynchronous: false
128 asynchronous: false
129− visible: height > 0
129+ visible: status == Loader.Ready
130
130
131 property int modelIndex: index
131 property int modelIndex: index
132
132
qml/Panel/Indicators/MenuItemFactory.qml+74
@@ -57,6 +57,7 @@ Item {
57
57
58 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
58 "unity.widgets.systemsettings.tablet.wifisection" : wifiSection,
59 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
59 "unity.widgets.systemsettings.tablet.accesspoint" : accessPoint,
60+ "com.canonical.indicator.network.modeminfoitem" : modeminfoitem,
60 }
61 }
61
62
62 function getExtendedProperty(object, propertyName, defaultValue) {
63 function getExtendedProperty(object, propertyName, defaultValue) {
@@ -374,6 +375,79 @@ Item {
374 }
375 }
375 }
376 }
376
377
378+ Component {
379+ id: modeminfoitem;
380+ ModemInfoItem {
381+ objectName: "modemInfoItem"
382+ property QtObject menuData: null
383+ property var menuModel: menuFactory.menuModel
384+ property int menuIndex: -1
385+ property var extendedData: menuData && menuData.ext || undefined
386+
387+ property var statusLabelAction: UnityMenuAction {
388+ model: menuModel
389+ index: menuIndex
390+ name: getExtendedProperty(extendedData, "xCanonicalModemStatusLabelAction", "")
391+ }
392+ statusText: statusLabelAction.valid ? statusLabelAction.state : ""
393+
394+ property var statusIconAction: UnityMenuAction {
395+ model: menuModel
396+ index: menuIndex
397+ name: getExtendedProperty(extendedData, "xCanonicalModemStatusIconAction", "")
398+ }
399+ statusIcon: statusIconAction.valid ? statusIconAction.state : ""
400+
401+ property var connectivityIconAction: UnityMenuAction {
402+ model: menuModel
403+ index: menuIndex
404+ name: getExtendedProperty(extendedData, "xCanonicalModemConnectivityIconAction", "")
405+ }
406+ connectivityIcon: connectivityIconAction.valid ? connectivityIconAction.state : ""
407+
408+ property var simIdentifierLabelAction: UnityMenuAction {
409+ model: menuModel
410+ index: menuIndex
411+ name: getExtendedProperty(extendedData, "xCanonicalModemSimIdentifierLabelAction", "")
412+ }
413+ simIdentifierText: simIdentifierLabelAction.valid ? simIdentifierLabelAction.state : ""
414+
415+ property var roamingAction: UnityMenuAction {
416+ model: menuModel
417+ index: menuIndex
418+ name: getExtendedProperty(extendedData, "xCanonicalModemRoamingAction", "")
419+ }
420+ roaming: roamingAction.valid ? roamingAction.state : false
421+
422+ property var unlockAction: UnityMenuAction {
423+ model: menuModel
424+ index: menuIndex
425+ name: getExtendedProperty(extendedData, "xCanonicalModemLockedAction", "")
426+ }
427+ onUnlock: {
428+ unlockAction.activate();
429+ }
430+ locked: unlockAction.valid ? unlockAction.state : false
431+
432+ onMenuModelChanged: {
433+ loadAttributes();
434+ }
435+ onMenuIndexChanged: {
436+ loadAttributes();
437+ }
438+
439+ function loadAttributes() {
440+ if (!menuModel || menuIndex == -1) return;
441+ menuModel.loadExtendedAttributes(menuIndex, {'x-canonical-modem-status-label-action': 'string',
442+ 'x-canonical-modem-status-icon-action': 'string',
443+ 'x-canonical-modem-connectivity-icon-action': 'string',
444+ 'x-canonical-modem-sim-identifier-label-action': 'string',
445+ 'x-canonical-modem-roaming-action': 'string',
446+ 'x-canonical-modem-locked-action': 'string'});
447+ }
448+ }
449+ }
450+
377 Component {
451 Component {
378 id: messageItem
452 id: messageItem
379
453
qml/Panel/Indicators/ModemInfoItem.qmlnew file+111
@@ -0,0 +1,111 @@
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+
17+import QtQuick 2.0
18+import QtQuick.Layouts 1.1
19+import Ubuntu.Components 0.1
20+import Ubuntu.Components.ListItems 0.1 as ListItem
21+
22+ListItem.Empty {
23+ id: menu
24+ implicitHeight: mainColumn.implicitHeight
25+ + mainColumn.anchors.topMargin
26+ + mainColumn.anchors.bottomMargin
27+
28+ property alias statusIcon: statusIcon.name
29+ property alias statusText: labelStatus.text
30+ property alias connectivityIcon: iconConnectivity.name
31+ property alias simIdentifierText: labelSimIdentifier.text
32+ property bool locked : false
33+ property bool roaming: false
34+ signal unlock
35+
36+ ColumnLayout {
37+ id: mainColumn
38+ anchors.fill: parent
39+ anchors.margins: menu.__contentsMargins
40+ spacing: units.gu(0.5)
41+
42+ Label {
43+ id: labelSimIdentifier
44+ elide: Text.ElideRight
45+ visible: text !== ""
46+ font.bold: true
47+ opacity: menu.locked ? 0.6 : 1.0
48+ }
49+
50+ RowLayout {
51+ id: statusRow
52+ spacing: units.gu(1)
53+
54+ height: labelStatus.height
55+ width: parent.width
56+
57+ Label {
58+ id: labelStatus
59+ elide: Text.ElideRight
60+ opacity: 0.6
61+ }
62+
63+ RowLayout {
64+ spacing: 0.5
65+ height: parent.height
66+ Icon {
67+ id: statusIcon
68+ color: Theme.palette.selected.backgroundText
69+
70+ Layout.preferredHeight: parent.height
71+ Layout.preferredWidth: Layout.preferredHeight
72+
73+ visible: name !== ""
74+ }
75+
76+ Icon {
77+ id: iconConnectivity
78+ color: Theme.palette.selected.backgroundText
79+
80+ Layout.preferredHeight: parent.height
81+ Layout.preferredWidth: Layout.preferredHeight
82+
83+ visible: name !== ""
84+ }
85+ }
86+
87+ Item {
88+ // eat up all the excess space so that RoamingIndication
89+ // ends up to the far right
90+ Layout.fillWidth: true
91+ }
92+
93+ RoamingIndication {
94+ id: roamingIndication
95+ visible: menu.roaming
96+ Layout.fillHeight: true
97+ }
98+ }
99+
100+ Button {
101+ id: buttonUnlock
102+ objectName: "buttonUnlockSim"
103+ visible: menu.locked
104+
105+ text: i18n.tr("Unlock SIM")
106+ Layout.preferredWidth: implicitWidth + units.gu(5)
107+
108+ onTriggered: menu.unlock()
109+ }
110+ }
111+}
qml/Panel/Indicators/RoamingIndication.qmlnew file+40
@@ -0,0 +1,40 @@
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+
17+import QtQuick 2.0
18+import QtQuick.Layouts 1.1
19+import Ubuntu.Components 0.1
20+
21+RowLayout {
22+ spacing: units.gu(0.5)
23+ Label {
24+ id: labelRoaming
25+ elide: Text.ElideRight
26+ fontSize: "x-small"
27+ text: i18n.tr("Roaming")
28+ opacity: 0.6
29+ }
30+
31+ Icon {
32+ id: iconRoaming
33+ color: Theme.palette.selected.backgroundText
34+
35+ Layout.preferredHeight: parent.height
36+ Layout.preferredWidth: Layout.preferredHeight
37+
38+ name: "network-cellular-roaming"
39+ }
40+}
qml/ScopeTool.qml+2−11
@@ -17,6 +17,7 @@
17import QtQuick 2.0
17import 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
20+import Ubuntu.Thumbnailer 0.1 // Register support for image://thumbnailer/ and image://albumart/
20import Utils 0.1
21import Utils 0.1
21import Unity 0.2
22import Unity 0.2
22import "Components"
23import "Components"
@@ -45,16 +46,6 @@ Rectangle {
45 signal searchClicked
46 signal searchClicked
46 }
47 }
47
48
48− SortFilterProxyModel {
49− id: filteredScopes
50− model: Scopes {
51− id: scopes
52− }
53− dynamicSortFilter: true
54−
55− filterRole: Scopes.RoleVisible
56− filterRegExp: RegExp("^true$")
57− }
58
49
59 Rectangle {
50 Rectangle {
60 anchors.fill: dashContent
51 anchors.fill: dashContent
@@ -72,8 +63,8 @@ Rectangle {
72 DashContent {
63 DashContent {
73 id: dashContent
64 id: dashContent
74
65
75− model: filteredScopes
76 property var scope: scopes.getScope(currentIndex)
66 property var scope: scopes.getScope(currentIndex)
67+ scopes: Scopes { }
77
68
78 anchors {
69 anchors {
79 top: parent.top
70 top: parent.top
qml/Shell.qml+191−475
@@ -19,22 +19,23 @@ import AccountsService 0.1
19import GSettings 1.0
19import GSettings 1.0
20import Unity.Application 0.1
20import Unity.Application 0.1
21import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
22−import Ubuntu.Components.Popups 0.1
23import Ubuntu.Gestures 0.1
22import Ubuntu.Gestures 0.1
24import Unity.Launcher 0.1
23import Unity.Launcher 0.1
24+import Utils 0.1
25import LightDM 0.1 as LightDM
25import LightDM 0.1 as LightDM
26import Powerd 0.1
26import Powerd 0.1
27import SessionBroadcast 0.1
27import SessionBroadcast 0.1
28−import "Dash"
29import "Greeter"
28import "Greeter"
30import "Launcher"
29import "Launcher"
31import "Panel"
30import "Panel"
32import "Components"
31import "Components"
33import "Notifications"
32import "Notifications"
33+import "Stages"
34import Unity.Notifications 1.0 as NotificationBackend
34import Unity.Notifications 1.0 as NotificationBackend
35import Unity.Session 0.1
35import Unity.Session 0.1
36+import Unity.DashCommunicator 0.1
36
37
37−FocusScope {
38+Item {
38 id: shell
39 id: shell
39
40
40 // this is only here to select the width / height of the window if not running fullscreen
41 // this is only here to select the width / height of the window if not running fullscreen
@@ -47,22 +48,15 @@ FocusScope {
47 property url background
48 property url background
48 readonly property real panelHeight: panel.panelHeight
49 readonly property real panelHeight: panel.panelHeight
49
50
50− property bool dashShown: dash.shown
51−
52 property bool sideStageEnabled: shell.width >= units.gu(100)
51 property bool sideStageEnabled: shell.width >= units.gu(100)
53 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
52 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
54
53
55 function activateApplication(appId) {
54 function activateApplication(appId) {
56 if (ApplicationManager.findApplication(appId)) {
55 if (ApplicationManager.findApplication(appId)) {
57 ApplicationManager.requestFocusApplication(appId);
56 ApplicationManager.requestFocusApplication(appId);
58− stages.show(true);
59− if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
60− applicationsDisplayLoader.item.select(appId);
61− }
62 } else {
57 } else {
63 var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
58 var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
64 ApplicationManager.startApplication(appId, execFlags);
59 ApplicationManager.startApplication(appId, execFlags);
65− stages.show(false);
66 }
60 }
67 }
61 }
68
62
@@ -89,105 +83,31 @@ FocusScope {
89 id: volumeControl
83 id: volumeControl
90 }
84 }
91
85
92− Keys.onVolumeUpPressed: volumeControl.volumeUp()
86+ DashCommunicator {
93− Keys.onVolumeDownPressed: volumeControl.volumeDown()
87+ id: dash
94−
95− Item {
96− id: underlayClipper
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"
88+ objectName: "dashCommunicator"
109− anchors.fill: parent
110− anchors.rightMargin: -parent.anchors.rightMargin
111−
112− // Whether the underlay is fully covered by opaque UI elements.
113− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicators.width
114−
115− // Whether the user should see the topmost application surface (if there's one at all).
116− readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
117−
118− // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
119− // through the translucent parts of the shell surface.
120− visible: !fullyCovered && !applicationSurfaceShouldBeSeen
121−
122− Rectangle {
123− anchors.fill: parent
124− color: "black"
125− opacity: dash.disappearingAnimationProgress
126− }
127−
128− Image {
129− anchors.fill: dash
130− source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
131− fillMode: Image.PreserveAspectCrop
132− horizontalAlignment: Image.AlignRight
133− verticalAlignment: Image.AlignTop
134− }
135−
136− Dash {
137− id: dash
138− objectName: "dash"
139−
140− available: !greeter.shown && !lockscreen.shown
141− hides: [stages, launcher, panel.indicators]
142− shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
143− enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
144−
145− anchors {
146− fill: parent
147− topMargin: panel.panelHeight
148− }
149−
150− contentScale: 1.0 - 0.2 * disappearingAnimationProgress
151− opacity: 1.0 - disappearingAnimationProgress
152− property real disappearingAnimationProgress: {
153− if (stages.overlayMode) {
154− return 0;
155− } else {
156− return stages.showProgress
157− }
158− }
159−
160− // FIXME: only necessary because stages.showProgress is not animated
161− Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
162− }
163− }
164 }
89 }
165
90
166− EdgeDragArea {
91+ WindowKeysFilter {
167− id: stagesDragHandle
92+ // Handle but do not filter out volume keys
168− direction: Direction.Leftwards
93+ Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
169−
94+ Keys.onVolumeDownPressed: { volumeControl.volumeDown(); event.accepted = false; }
170− anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
171− width: shell.edgeSize
172
95
173− property real progress: stages.width
96+ Keys.onPressed: {
174−
97+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
175− onTouchXChanged: {
98+ dialogs.onPowerKeyPressed();
176− if (status == DirectionalDragArea.Recognized) {
99+ event.accepted = true;
177− if (ApplicationManager.count == 0) {
178− progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
179− } else {
100+ } else {
180− progress = stages.width - stagesDragHandle.width + touchX
101+ event.accepted = false;
181− }
182 }
102 }
183 }
103 }
184
104
185− onDraggingChanged: {
105+ Keys.onReleased: {
186− if (!dragging) {
106+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
187− if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
107+ dialogs.onPowerKeyReleased();
188− stages.show(true)
108+ event.accepted = true;
189− }
109+ } else {
190− stagesDragHandle.progress = stages.width;
110+ event.accepted = false;
191 }
111 }
192 }
112 }
193 }
113 }
@@ -197,262 +117,94 @@ FocusScope {
197 objectName: "stages"
117 objectName: "stages"
198 width: parent.width
118 width: parent.width
199 height: parent.height
119 height: parent.height
200−
120+ visible: !ApplicationManager.empty
201− x: {
202− if (shown) {
203− if (overlayMode || locked) {
204− return 0;
205− }
206− return launcher.progress
207− } else {
208− return stagesDragHandle.progress
209− }
210− }
211−
212− Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
213−
214− property bool shown: false
215−
216− property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
217−
218− property bool fullyShown: x == 0
219− property bool fullyHidden: x == width
220−
221− property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
222− property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
223− property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
224− property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
225− property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
226−
227− function show(focusApp) {
228− shown = true;
229− panel.indicators.hide();
230− edgeDemo.stopDemo();
231− greeter.hide();
232− if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
233− ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
234− }
235− }
236−
237− function hide() {
238− shown = false;
239− if (ApplicationManager.focusedApplicationId) {
240− ApplicationManager.unfocusCurrentApplication();
241− }
242− }
243
121
244 Connections {
122 Connections {
245 target: ApplicationManager
123 target: ApplicationManager
246−
247 onFocusRequested: {
124 onFocusRequested: {
248− stages.show(true);
125+ if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
126+ lockscreen.show();
127+ }
128+ greeter.hide();
249 }
129 }
250
130
251 onFocusedApplicationIdChanged: {
131 onFocusedApplicationIdChanged: {
252− if (ApplicationManager.focusedApplicationId.length > 0) {
132+ if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
253− stages.show(false);
133+ lockscreen.show();
254− } else {
255− if (!stages.overlayMode) {
256− stages.hide();
257− }
258 }
134 }
135+ panel.indicators.hide();
259 }
136 }
260
137
261 onApplicationAdded: {
138 onApplicationAdded: {
262− stages.show(false);
139+ if (greeter.shown && appId != "unity8-dash") {
263− }
140+ greeter.hide();
264−
265− onApplicationRemoved: {
266− if (ApplicationManager.focusedApplicationId.length == 0) {
267− stages.hide();
268 }
141 }
269 }
142 }
270 }
143 }
271
144
272− property bool dialogShown: false
145+ Loader {
273−
146+ id: applicationsDisplayLoader
274− Component {
147+ anchors.fill: parent
275− id: logoutDialog
276− Dialog {
277− id: dialogueLogout
278− title: "Logout"
279− text: "Are you sure that you want to logout?"
280− Button {
281− text: "Cancel"
282− onClicked: {
283− PopupUtils.close(dialogueLogout);
284− stages.dialogShown = false;
285− }
286− }
287− Button {
288− text: "Yes"
289− onClicked: {
290− DBusUnitySessionService.Logout();
291− PopupUtils.close(dialogueLogout);
292− stages.dialogShown = false;
293− }
294− }
295− }
296− }
297
148
298− Component {
149+ source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
299− id: shutdownDialog
300− Dialog {
301− id: dialogueShutdown
302− title: "Shutdown"
303− text: "Are you sure that you want to shutdown?"
304− Button {
305− text: "Cancel"
306− onClicked: {
307− PopupUtils.close(dialogueShutdown);
308− stages.dialogShown = false;
309− }
310− }
311− Button {
312− text: "Yes"
313− onClicked: {
314− dBusUnitySessionServiceConnection.closeAllApps();
315− DBusUnitySessionService.Shutdown();
316− PopupUtils.close(dialogueShutdown);
317− stages.dialogShown = false;
318− }
319− }
320− }
321− }
322
150
323− Component {
151+ Binding {
324− id: rebootDialog
152+ target: applicationsDisplayLoader.item
325− Dialog {
153+ property: "objectName"
326− id: dialogueReboot
154+ value: "stage"
327− title: "Reboot"
328− text: "Are you sure that you want to reboot?"
329− Button {
330− text: "Cancel"
331− onClicked: {
332− PopupUtils.close(dialogueReboot)
333− stages.dialogShown = false;
334− }
335− }
336− Button {
337− text: "Yes"
338− onClicked: {
339− dBusUnitySessionServiceConnection.closeAllApps();
340− DBusUnitySessionService.Reboot();
341− PopupUtils.close(dialogueReboot);
342− stages.dialogShown = false;
343− }
344− }
345 }
155 }
346− }
156+ Binding {
347−
157+ target: applicationsDisplayLoader.item
348− Component {
158+ property: "dragAreaWidth"
349− id: powerDialog
159+ value: shell.edgeSize
350− Dialog {
351− id: dialoguePower
352− title: "Power"
353− text: i18n.tr("Are you sure you would like to turn power off?")
354− Button {
355− text: i18n.tr("Power off")
356− onClicked: {
357− dBusUnitySessionServiceConnection.closeAllApps();
358− PopupUtils.close(dialoguePower);
359− stages.dialogShown = false;
360− shutdownFadeOutRectangle.enabled = true;
361− shutdownFadeOutRectangle.visible = true;
362− shutdownFadeOut.start();
363− }
364− }
365− Button {
366− text: i18n.tr("Restart")
367− onClicked: {
368− dBusUnitySessionServiceConnection.closeAllApps();
369− DBusUnitySessionService.Reboot();
370− PopupUtils.close(dialoguePower);
371− stages.dialogShown = false;
372− }
373− }
374− Button {
375− text: i18n.tr("Cancel")
376− onClicked: {
377− PopupUtils.close(dialoguePower);
378− stages.dialogShown = false;
379− }
380− }
381 }
160 }
382− }
161+ Binding {
383−
162+ target: applicationsDisplayLoader.item
384− function showPowerDialog() {
163+ property: "maximizedAppTopMargin"
385− if (!stages.dialogShown) {
164+ // Not just using panel.panelHeight as that changes depending on the focused app.
386− stages.dialogShown = true;
165+ value: panel.indicators.panelHeight
387− PopupUtils.open(powerDialog);
388 }
166 }
389− }
167+ Binding {
390−
168+ target: applicationsDisplayLoader.item
391− Connections {
169+ property: "interactive"
392− id: dBusUnitySessionServiceConnection
170+ value: edgeDemo.stagesEnabled && !greeter.shown && !lockscreen.shown && panel.indicators.fullyClosed && launcher.progress == 0
393− objectName: "dBusUnitySessionServiceConnection"
394− target: DBusUnitySessionService
395−
396− function closeAllApps() {
397− while (true) {
398− var app = ApplicationManager.get(0);
399− if (app === null) {
400− break;
401− }
402− ApplicationManager.stopApplication(app.appId);
403− }
404 }
171 }
405−
172+ Binding {
406− onLogoutRequested: {
173+ target: applicationsDisplayLoader.item
407− // Display a dialog to ask the user to confirm.
174+ property: "spreadEnabled"
408− if (!stages.dialogShown) {
175+ value: edgeDemo.stagesEnabled && greeter.fakeActiveForApp === "" // to support emergency dialer hack
409− stages.dialogShown = true;
410− PopupUtils.open(logoutDialog);
411− }
412 }
176 }
413−
177+ Binding {
414− onShutdownRequested: {
178+ target: applicationsDisplayLoader.item
415− // Display a dialog to ask the user to confirm.
179+ property: "inverseProgress"
416− if (!stages.dialogShown) {
180+ value: launcher.progress
417− stages.dialogShown = true;
418− PopupUtils.open(shutdownDialog);
419− }
420 }
181 }
182+ }
183+ }
421
184
422− onRebootRequested: {
185+ InputMethod {
423− // Display a dialog to ask the user to confirm.
186+ id: inputMethod
424− if (!stages.dialogShown) {
187+ objectName: "inputMethod"
425− stages.dialogShown = true;
188+ anchors { fill: parent; topMargin: panel.panelHeight }
426− PopupUtils.open(rebootDialog);
189+ z: notifications.useModal || panel.indicators.shown ? overlay.z + 1 : overlay.z - 1
427− }
428− }
190+ }
429
191
430− onLogoutReady: {
192+ Connections {
431− closeAllApps();
193+ target: SurfaceManager
432− Qt.quit();
194+ onSurfaceCreated: {
195+ if (surface.type == MirSurfaceItem.InputMethod) {
196+ inputMethod.surface = surface;
433 }
197 }
434 }
198 }
435
199
436− Loader {
200+ onSurfaceDestroyed: {
437− id: applicationsDisplayLoader
201+ if (inputMethod.surface == surface) {
438− anchors.fill: parent
202+ inputMethod.surface = null;
439−
203+ surface.parent = null;
440− source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
441−
442− Binding {
443− target: applicationsDisplayLoader.item
444− property: "moving"
445− value: !stages.fullyShown
446 }
204 }
447− Binding {
205+ if (!surface.parent) {
448− target: applicationsDisplayLoader.item
206+ // there's no one displaying it. delete it right away
449− property: "shown"
207+ surface.release();
450− value: stages.shown
451− }
452− Binding {
453− target: applicationsDisplayLoader.item
454− property: "dragAreaWidth"
455− value: shell.edgeSize
456 }
208 }
457 }
209 }
458 }
210 }
@@ -469,18 +221,26 @@ FocusScope {
469 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
221 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
470 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
222 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
471 y: panel.panelHeight
223 y: panel.panelHeight
472− x: required ? 0 : - width
224+ visible: required
473 width: parent.width
225 width: parent.width
474 height: parent.height - panel.panelHeight
226 height: parent.height - panel.panelHeight
475 background: shell.background
227 background: shell.background
228+ alphaNumeric: AccountsService.passwordDisplayHint === AccountsService.Keyboard
476 minPinLength: 4
229 minPinLength: 4
477 maxPinLength: 4
230 maxPinLength: 4
478
231
479 onEntered: LightDM.Greeter.respond(passphrase);
232 onEntered: LightDM.Greeter.respond(passphrase);
480 onCancel: greeter.show()
233 onCancel: greeter.show()
234+ onEmergencyCall: {
235+ greeter.fakeActiveForApp = "dialer-app"
236+ shell.activateApplication("dialer-app")
237+ lockscreen.hide()
238+ }
239+
240+ onShownChanged: if (shown) greeter.fakeActiveForApp = ""
481
241
482 Component.onCompleted: {
242 Component.onCompleted: {
483− if (LightDM.Users.count == 1) {
243+ if (greeter.narrowMode) {
484 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
244 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
485 }
245 }
486 }
246 }
@@ -492,14 +252,17 @@ FocusScope {
492 onShowGreeter: greeter.show()
252 onShowGreeter: greeter.show()
493
253
494 onShowPrompt: {
254 onShowPrompt: {
495− if (LightDM.Users.count == 1) {
255+ if (greeter.narrowMode) {
496− // TODO: There's no better way for now to determine if its a PIN or a passphrase.
497− if (text == "PIN") {
498− lockscreen.alphaNumeric = false
499− } else {
500− lockscreen.alphaNumeric = true
501− }
502− lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text);
256+ lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text.toLowerCase());
257+ lockscreen.show();
258+ }
259+ }
260+
261+ onPromptlessChanged: {
262+ if (LightDM.Greeter.promptless) {
263+ lockscreen.hide()
264+ } else {
265+ lockscreen.reset();
503 lockscreen.show();
266 lockscreen.show();
504 }
267 }
505 }
268 }
@@ -510,8 +273,12 @@ FocusScope {
510 }
273 }
511 if (LightDM.Greeter.authenticated) {
274 if (LightDM.Greeter.authenticated) {
512 lockscreen.hide();
275 lockscreen.hide();
276+ greeter.login();
513 } else {
277 } else {
514 lockscreen.clear(true);
278 lockscreen.clear(true);
279+ if (greeter.narrowMode) {
280+ LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
281+ }
515 }
282 }
516 }
283 }
517 }
284 }
@@ -519,7 +286,7 @@ FocusScope {
519 Binding {
286 Binding {
520 target: LightDM.Greeter
287 target: LightDM.Greeter
521 property: "active"
288 property: "active"
522− value: greeter.shown || lockscreen.shown
289+ value: greeter.shown || lockscreen.shown || greeter.fakeActiveForApp != ""
523 }
290 }
524
291
525 Rectangle {
292 Rectangle {
@@ -541,12 +308,18 @@ FocusScope {
541 StandardAnimation {}
308 StandardAnimation {}
542 }
309 }
543
310
311+ property bool fullyShown: showProgress === 1.0
544 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
312 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
313+ onShowProgressChanged: if (LightDM.Greeter.promptless && showProgress === 0) greeter.login()
545
314
546 Greeter {
315 Greeter {
547 id: greeter
316 id: greeter
548 objectName: "greeter"
317 objectName: "greeter"
549
318
319+ signal sessionStarted() // helpful for tests
320+
321+ property string fakeActiveForApp: ""
322+
550 available: true
323 available: true
551 hides: [launcher, panel.indicators]
324 hides: [launcher, panel.indicators]
552 shown: true
325 shown: true
@@ -558,17 +331,27 @@ FocusScope {
558
331
559 dragHandleWidth: shell.edgeSize
332 dragHandleWidth: shell.edgeSize
560
333
334+ function login() {
335+ enabled = false;
336+ if (LightDM.Greeter.startSessionSync()) {
337+ sessionStarted();
338+ greeter.hide();
339+ lockscreen.hide();
340+ launcher.hide();
341+ }
342+ enabled = true;
343+ }
344+
561 onShownChanged: {
345 onShownChanged: {
562 if (shown) {
346 if (shown) {
563− lockscreen.reset();
347+ if (greeter.narrowMode) {
564− if (!LightDM.Greeter.promptless) {
565− lockscreen.show();
566− }
567− // If there is only one user, we start authenticating with that one here.
568− // If there are more users, the Greeter will handle that
569− if (LightDM.Users.count == 1) {
570 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
348 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
571 }
349 }
350+ if (!LightDM.Greeter.promptless) {
351+ lockscreen.reset();
352+ lockscreen.show();
353+ }
354+ greeter.fakeActiveForApp = "";
572 greeter.forceActiveFocus();
355 greeter.forceActiveFocus();
573 }
356 }
574 }
357 }
@@ -591,12 +374,6 @@ FocusScope {
591 }
374 }
592 }
375 }
593
376
594− InputFilterArea {
595− anchors.fill: parent
596− blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
597− || panel.indicators.shown
598− }
599−
600 Connections {
377 Connections {
601 id: powerConnection
378 id: powerConnection
602 target: Powerd
379 target: Powerd
@@ -604,7 +381,7 @@ FocusScope {
604 onDisplayPowerStateChange: {
381 onDisplayPowerStateChange: {
605 // We ignore any display-off signals when the proximity sensor
382 // We ignore any display-off signals when the proximity sensor
606 // is active. This usually indicates something like a phone call.
383 // is active. This usually indicates something like a phone call.
607− if (status == Powerd.Off && reason != Powerd.Proximity) {
384+ if (status == Powerd.Off && reason != Powerd.Proximity && !edgeDemo.running) {
608 greeter.showNow();
385 greeter.showNow();
609 }
386 }
610
387
@@ -618,54 +395,64 @@ FocusScope {
618 }
395 }
619
396
620 function showHome() {
397 function showHome() {
398+ if (edgeDemo.running) {
399+ return
400+ }
401+
402+ if (LightDM.Greeter.active) {
403+ if (!LightDM.Greeter.promptless) {
404+ lockscreen.show()
405+ }
406+ greeter.hide()
407+ }
408+
621− var animate = !greeter.shown && !stages.shown
409+ var animate = !LightDM.Greeter.active && !stages.shown
622− greeter.hide()
623 dash.setCurrentScope("clickscope", animate, false)
410 dash.setCurrentScope("clickscope", animate, false)
624− stages.hide()
411+ ApplicationManager.requestFocusApplication("unity8-dash")
412+ }
413+
414+ function showDash() {
415+ if (LightDM.Greeter.active && !LightDM.Greeter.promptless) {
416+ return;
417+ }
418+ if (greeter.shown) {
419+ greeter.hideRight();
420+ launcher.fadeOut();
421+ }
422+
423+ ApplicationManager.requestFocusApplication("unity8-dash")
424+ launcher.fadeOut();
625 }
425 }
626
426
627 Item {
427 Item {
628 id: overlay
428 id: overlay
429+ z: 10
629
430
630 anchors.fill: parent
431 anchors.fill: parent
631
432
632 Panel {
433 Panel {
633 id: panel
434 id: panel
435+ objectName: "panel"
634 anchors.fill: parent //because this draws indicator menus
436 anchors.fill: parent //because this draws indicator menus
635 indicators {
437 indicators {
636 hides: [launcher]
438 hides: [launcher]
637− available: edgeDemo.panelEnabled
439+ available: edgeDemo.panelEnabled && greeter.fakeActiveForApp === ""
638 contentEnabled: edgeDemo.panelContentEnabled
440 contentEnabled: edgeDemo.panelContentEnabled
639 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
441 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
640 panelHeight: units.gu(3)
442 panelHeight: units.gu(3)
641 }
443 }
642− property string focusedAppId: ApplicationManager.focusedApplicationId
643− property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
644− fullscreenMode: focusedApplication && stages.fullscreen && !greeter.shown && !lockscreen.shown
645
444
646− InputFilterArea {
445+ property bool topmostApplicationIsFullscreen:
647− anchors {
446+ ApplicationManager.focusedApplicationId &&
648− top: parent.top
447+ ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
649− left: parent.left
650− right: parent.right
651− }
652− height: (panel.fullscreenMode) ? shell.edgeSize : panel.panelHeight
653− blockInput: true
654− }
655− }
656
448
657− InputFilterArea {
449+ fullscreenMode: (topmostApplicationIsFullscreen && !LightDM.Greeter.active && launcher.progress == 0)
658− blockInput: launcher.shown
450+ || greeter.fakeActiveForApp !== ""
659− anchors {
660− top: parent.top
661− bottom: parent.bottom
662− left: parent.left
663− }
664− width: launcher.width
665 }
451 }
666
452
667 Launcher {
453 Launcher {
668 id: launcher
454 id: launcher
455+ objectName: "launcher"
669
456
670 readonly property bool dashSwipe: progress > 0
457 readonly property bool dashSwipe: progress > 0
671
458
@@ -673,29 +460,19 @@ FocusScope {
673 anchors.bottom: parent.bottom
460 anchors.bottom: parent.bottom
674 width: parent.width
461 width: parent.width
675 dragAreaWidth: shell.edgeSize
462 dragAreaWidth: shell.edgeSize
676− available: edgeDemo.launcherEnabled
463+ available: edgeDemo.launcherEnabled && greeter.fakeActiveForApp === ""
677−
678− onShowDashHome: {
679− if (edgeDemo.running)
680− return;
681−
682− showHome()
683− }
684− onDash: {
685− if (stages.shown && !stages.overlayMode && !stages.locked) {
686− stages.hide();
687− launcher.fadeOut();
688− } else {
689− launcher.switchToNextState("visible");
690− }
691
464
692− if (greeter.shown) {
465+ onShowDashHome: showHome()
693− greeter.hideRight();
466+ onDash: showDash()
694− launcher.fadeOut();
467+ onDashSwipeChanged: {
468+ if (dashSwipe && ApplicationManager.focusedApplicationId !== "unity8-dash") {
469+ dash.setCurrentScope("clickscope", false, true)
695 }
470 }
696 }
471 }
697− onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true)
698 onLauncherApplicationSelected: {
472 onLauncherApplicationSelected: {
473+ if (greeter.fakeActiveForApp !== "") {
474+ lockscreen.show()
475+ }
699 if (!edgeDemo.running)
476 if (!edgeDemo.running)
700 shell.activateApplication(appId)
477 shell.activateApplication(appId)
701 }
478 }
@@ -717,11 +494,6 @@ FocusScope {
717 MouseArea {
494 MouseArea {
718 anchors.fill: parent
495 anchors.fill: parent
719 }
496 }
720−
721− InputFilterArea {
722− anchors.fill: parent
723− blockInput: modalNotificationBackground.visible
724− }
725 }
497 }
726
498
727 Notifications {
499 Notifications {
@@ -747,62 +519,31 @@ FocusScope {
747 PropertyChanges { target: notifications; width: units.gu(38) }
519 PropertyChanges { target: notifications; width: units.gu(38) }
748 }
520 }
749 ]
521 ]
750−
751− InputFilterArea {
752− anchors { left: parent.left; right: parent.right }
753− height: parent.contentHeight
754− blockInput: height > 0
755− }
756 }
522 }
757 }
523 }
758
524
759− focus: true
760− onFocusChanged: if (!focus) forceActiveFocus();
761−
762− InputFilterArea {
763− anchors {
764− top: parent.top
765− bottom: parent.bottom
766− left: parent.left
767− }
768− width: shell.edgeSize
769− blockInput: true
770− }
771−
772− InputFilterArea {
773− anchors {
774− top: parent.top
775− bottom: parent.bottom
776− right: parent.right
777− }
778− width: shell.edgeSize
779− blockInput: true
780− }
781−
782 Binding {
525 Binding {
783 target: i18n
526 target: i18n
784 property: "domain"
527 property: "domain"
785 value: "unity8"
528 value: "unity8"
786 }
529 }
787
530
788− OSKController {
531+ Dialogs {
789− anchors.topMargin: panel.panelHeight
532+ id: dialogs
790− anchors.fill: parent // as needs to know the geometry of the shell
533+ anchors.fill: parent
791− }
534+ z: overlay.z + 10
792−
535+ onPowerOffClicked: {
793− //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
536+ shutdownFadeOutRectangle.enabled = true;
794− MouseArea {
537+ shutdownFadeOutRectangle.visible = true;
795− anchors.bottom: parent.bottom
538+ shutdownFadeOut.start();
796− anchors.left: parent.left
539+ }
797− anchors.right: parent.right
798− height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
799−
800− enabled: ApplicationManager.keyboardVisible
801 }
540 }
802
541
803 Label {
542 Label {
543+ id: alphaDisclaimerLabel
804 anchors.centerIn: parent
544 anchors.centerIn: parent
805 visible: ApplicationManager.fake ? ApplicationManager.fake : false
545 visible: ApplicationManager.fake ? ApplicationManager.fake : false
546+ z: dialogs.z + 10
806 text: "EARLY ALPHA\nNOT READY FOR USE"
547 text: "EARLY ALPHA\nNOT READY FOR USE"
807 color: "lightgrey"
548 color: "lightgrey"
808 opacity: 0.2
549 opacity: 0.2
@@ -816,11 +557,11 @@ FocusScope {
816
557
817 EdgeDemo {
558 EdgeDemo {
818 id: edgeDemo
559 id: edgeDemo
560+ z: alphaDisclaimerLabel.z + 10
819 greeter: greeter
561 greeter: greeter
820 launcher: launcher
562 launcher: launcher
821− dash: dash
822 indicators: panel.indicators
563 indicators: panel.indicators
823− underlay: underlay
564+ stages: stages
824 }
565 }
825
566
826 Connections {
567 Connections {
@@ -828,35 +569,9 @@ FocusScope {
828 onShowHome: showHome()
569 onShowHome: showHome()
829 }
570 }
830
571
831− Keys.onPressed: {
832− if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
833− if (!powerKeyTimer.running) {
834− powerKeyTimer.start();
835− }
836− event.accepted = true;
837− }
838− }
839−
840− Keys.onReleased: {
841− if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
842− powerKeyTimer.stop();
843− event.accepted = true;
844− }
845− }
846−
847− Timer {
848− id: powerKeyTimer
849− interval: 2000
850− repeat: false
851− triggeredOnStart: false
852−
853− onTriggered: {
854− stages.showPowerDialog();
855− }
856− }
857−
858 Rectangle {
572 Rectangle {
859 id: shutdownFadeOutRectangle
573 id: shutdownFadeOutRectangle
574+ z: edgeDemo.z + 10
860 enabled: false
575 enabled: false
861 visible: false
576 visible: false
862 color: "black"
577 color: "black"
@@ -873,4 +588,5 @@ FocusScope {
873 }
588 }
874 }
589 }
875 }
590 }
591+
876}
592}
qml/Stages/Animations/BaseSurfaceAnimation.qmlnew file+93
@@ -0,0 +1,93 @@
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+
19+/* This is the base case for surface animations, used when adding/removing * child surfaces.
20+ * The class is meant to be overridden and changes/animations provided for state changes.
21+ * NB. It is important to release the surface at the end of the "out" animation.
22+ *
23+ * Example - Simple fade in/out
24+ *
25+ * BaseSurfaceAnimation {
26+ * outChanges: [ PropertyChanges { target: animation.surface; opacity: 0.0 } ]
27+ * outAnimations: [
28+ SequentialAnimation {
29+ * NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 }
30+ * ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
31+ * }
32+ * ]
33+ *
34+ * inChanges: [ PropertyChanges { target: animation.surface; opacity: 1.0 } ]
35+ * inAnimations: [ NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 } ]
36+ * }
37+ */
38+Item {
39+ id: base
40+ property Item surface: null
41+
42+ // changes applied when state changes to "in"
43+ property list<QtObject> outChanges
44+ // transition animations when changing state to "in"
45+ property list<QtObject> outAnimations
46+
47+ // changes applied when state changes to "out"
48+ property list<QtObject> inChanges
49+ // transition animations when changing state to "out"
50+ property list<QtObject> inAnimations
51+
52+ function start() {
53+ // "prep" state forces outChanges without transition animations.
54+ state = "prep"
55+ state = "in";
56+ }
57+ function end() {
58+ state = "out";
59+ }
60+
61+ states: [
62+ State {
63+ name: "baseAnimation"
64+ PropertyChanges { target: base.surface; anchors.fill: undefined }
65+ },
66+
67+ State {
68+ name: "prep"
69+ extend: "baseAnimation"
70+ changes: outChanges
71+ },
72+ State {
73+ name: "out"
74+ extend: "prep"
75+ },
76+ State {
77+ name: "in"
78+ extend: "baseAnimation"
79+ changes: inChanges
80+ }
81+ ]
82+
83+ transitions: [
84+ Transition {
85+ to: "out"
86+ animations: outAnimations
87+ },
88+ Transition {
89+ to: "in"
90+ animations: inAnimations
91+ }
92+ ]
93+}
qml/Stages/Animations/DarkenAndFadeInAnimation.qmlnew file+48
@@ -0,0 +1,48 @@
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 1.1
19+
20+BaseSurfaceAnimation {
21+ id: animation
22+
23+ property Rectangle darkenItem: Rectangle {
24+ parent: animation.surface.parent
25+ anchors.fill: parent
26+ color: Qt.rgba(0,0,0,0.0)
27+ }
28+
29+ outChanges: [ PropertyChanges { target: animation.surface; opacity: 0.0 } ]
30+ outAnimations: [
31+ SequentialAnimation {
32+ UbuntuNumberAnimation { target: animation.surface; property: "opacity"; duration: UbuntuAnimation.FastDuration }
33+ ColorAnimation { target: darkenItem; duration: UbuntuAnimation.FastDuration }
34+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
35+ }
36+ ]
37+
38+ inChanges: [
39+ PropertyChanges { target: darkenItem; color: Qt.rgba(0,0,0,0.7) },
40+ PropertyChanges { target: animation.surface; opacity: 1.0 }
41+ ]
42+ inAnimations: [
43+ SequentialAnimation {
44+ ColorAnimation { target: darkenItem; duration: UbuntuAnimation.FastDuration }
45+ UbuntuNumberAnimation { target: animation.surface; property: "opacity"; duration: UbuntuAnimation.FastDuration }
46+ }
47+ ]
48+}
qml/Stages/Animations/SwipeFromBottomAnimation.qmlnew file+48
@@ -0,0 +1,48 @@
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+
19+BaseSurfaceAnimation {
20+ id: animation
21+
22+ outChanges: [ AnchorChanges { target: animation.surface; anchors.top: animation.parent.bottom } ]
23+ outAnimations: [
24+ SequentialAnimation {
25+ PropertyAction { target: animation.parent; property: "clip"; value: true }
26+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
27+ PropertyAction { target: animation.surface; property: "visible"; value: !animation.parent.removing }
28+ PropertyAction { target: animation.parent; property: "clip"; value: false }
29+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
30+ }
31+ ]
32+
33+ inChanges: [
34+ AnchorChanges {
35+ target: animation.surface;
36+ anchors.top: animation.parent.top
37+ anchors.right: undefined
38+ anchors.bottom: undefined
39+ anchors.left: undefined
40+ } ]
41+ inAnimations: [
42+ SequentialAnimation {
43+ PropertyAction { target: animation.parent; property: "clip"; value: true }
44+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
45+ PropertyAction { target: animation.parent; property: "clip"; value: false }
46+ }
47+ ]
48+}
qml/Stages/Animations/SwipeUpAnimation.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+BaseSurfaceAnimation {
20+ id: animation
21+
22+ outAnimations: [
23+ SequentialAnimation {
24+ PropertyAction { target: animation.parent; property: "clip"; value: true }
25+ PropertyAction { target: animation.surface; property: "visible"; value: true }
26+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
27+ PropertyAction { target: animation.parent; property: "clip"; value: false }
28+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
29+ }
30+ ]
31+
32+ inChanges: [
33+ AnchorChanges {
34+ target: animation.surface;
35+ anchors.top: undefined
36+ anchors.right: undefined
37+ anchors.bottom: animation.parent.top
38+ anchors.left: undefined
39+ }
40+ ]
41+ inAnimations: [
42+ SequentialAnimation {
43+ PropertyAction { target: animation.parent; property: "clip"; value: true }
44+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
45+ PropertyAction { target: animation.surface; property: "visible"; value: false}
46+ PropertyAction { target: animation.parent; property: "clip"; value: false }
47+ }
48+ ]
49+}
qml/Stages/AppSurfaceContainer.qmlnew file+96
@@ -0,0 +1,96 @@
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+
17+import QtQuick 2.0
18+import "Animations"
19+
20+SurfaceContainer {
21+ id: container
22+ property var promptSurfaces
23+
24+ property bool appHasCreatedASurface: false
25+
26+ onSurfaceChanged: {
27+ if (surface) {
28+ if (!appHasCreatedASurface) {
29+ surface.visible = false; // hide until splash screen removed
30+ appHasCreatedASurface = true;
31+ }
32+ }
33+ }
34+
35+ function revealSurface() {
36+ surface.visible = true;
37+ splashLoader.source = "";
38+ }
39+
40+ Timer { //FIXME - need to delay removing splash screen to allow surface resize to complete
41+ id: surfaceRevealDelay
42+ interval: 100
43+ onTriggered: surfaceContainer.revealSurface()
44+ }
45+
46+ Loader {
47+ z: 3
48+ id: splashLoader
49+ anchors.fill: parent
50+ }
51+
52+ Repeater {
53+ model: container.promptSurfaces
54+
55+ delegate: SurfaceContainer {
56+ anchors {
57+ fill: container
58+ topMargin: container.surface.anchors.topMargin
59+ rightMargin: container.surface.anchors.rightMargin
60+ bottomMargin: container.surface.anchors.bottomMargin
61+ leftMargin: container.surface.anchors.leftMargin
62+ }
63+
64+ z: 4 + index
65+ surface: modelData
66+
67+ Component.onCompleted: {
68+ animateIn();
69+ }
70+ }
71+ }
72+
73+ StateGroup {
74+ id: appSurfaceState
75+ states: [
76+ State {
77+ name: "noSurfaceYet"
78+ when: !surfaceContainer.appHasCreatedASurface
79+ StateChangeScript {
80+ script: { splashLoader.setSource("Splash.qml", { "name": model.name, "image": model.icon }); }
81+ }
82+ },
83+ State {
84+ name: "hasSurface"
85+ when: surfaceContainer.appHasCreatedASurface && (surfaceContainer.surface !== null)
86+ StateChangeScript { script: { surfaceRevealDelay.start(); } }
87+ },
88+ State {
89+ name: "surfaceLostButAppStillAlive"
90+ when: surfaceContainer.appHasCreatedASurface && (surfaceContainer.surface === null)
91+ // TODO - use app snapshot
92+ }
93+ ]
94+ state: "noSurfaceYet"
95+ }
96+}
qml/Stages/PhoneStage.qml+219−266
@@ -21,91 +21,65 @@ import Unity.Application 0.1
21import Utils 0.1
21import Utils 0.1
22import "../Components"
22import "../Components"
23
23
24−Item {
24+Rectangle {
25 id: root
25 id: root
26
26
27 // Controls to be set from outside
27 // Controls to be set from outside
28− property bool shown: false
29− property bool moving: false
30 property int dragAreaWidth
28 property int dragAreaWidth
29+ property real maximizedAppTopMargin
30+ property bool interactive
31+ property bool spreadEnabled: true // If false, animations and right edge will be disabled
32+ property real inverseProgress: 0 // This is the progress for left edge drags, in pixels.
31
33
32− // State information propagated to the outside
34+ color: "black"
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
35
41 function select(appId) {
36 function select(appId) {
42− spreadView.snapTo(priv.indexOf(appId))
37+ spreadView.snapTo(priv.indexOf(appId));
43 }
38 }
44
39
45− onMovingChanged: {
40+ onWidthChanged: {
46− if (moving) {
41+ spreadView.selectedIndex = -1;
47− if (ApplicationManager.focusedApplicationId) {
42+ spreadView.phase = 0;
48− priv.requestNewScreenshot();
43+ spreadView.contentX = -spreadView.shift;
49− } else {
44+ }
50− mainScreenshotImage.anchors.leftMargin = 0;
45+
51− mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
46+ onInverseProgressChanged: {
52− mainScreenshotImage.visible = true;
47+ if (inverseProgress == 0 && priv.oldInverseProgress > 0) {
48+ // left edge drag released. Minimum distance is given by design.
49+ if (priv.oldInverseProgress > units.gu(22)) {
50+ ApplicationManager.focusApplication("unity8-dash");
53 }
51 }
54− } else {
55− mainScreenshotImage.visible = false;
56 }
52 }
53+ priv.oldInverseProgress = inverseProgress;
57 }
54 }
58
55
59 Connections {
56 Connections {
60 target: ApplicationManager
57 target: ApplicationManager
61
58
62 onFocusRequested: {
59 onFocusRequested: {
63− if (spreadView.visible) {
60+ if (spreadView.phase > 0) {
64 spreadView.snapTo(priv.indexOf(appId));
61 spreadView.snapTo(priv.indexOf(appId));
65 } else {
62 } else {
66− priv.switchToApp(appId);
63+ ApplicationManager.focusApplication(appId);
67 }
64 }
68 }
65 }
69
66
70− onFocusedApplicationIdChanged: {
67+ onApplicationAdded: {
68+ if (spreadView.phase == 2) {
71− if (ApplicationManager.focusedApplicationId.length > 0) {
69+ spreadView.snapTo(ApplicationManager.count - 1);
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 {
70 } else {
80− spreadView.selectedIndex = -1;
81 spreadView.phase = 0;
71 spreadView.phase = 0;
82 spreadView.contentX = -spreadView.shift;
72 spreadView.contentX = -spreadView.shift;
83− }
73+ ApplicationManager.focusApplication(appId);
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 }
74 }
101 }
75 }
102
76
103 onApplicationRemoved: {
77 onApplicationRemoved: {
104− if (ApplicationManager.count == 0) {
78+ // Unless we're closing the app ourselves in the spread,
105− mainScreenshotImage.source = ""
79+ // lets make sure the spread doesn't mess up by the changing app list.
106− mainScreenshotImage.visible = false;
80+ if (spreadView.closingIndex == -1) {
107− } else {
81+ spreadView.phase = 0;
108− mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
82+ spreadView.contentX = -spreadView.shift;
109 }
83 }
110 }
84 }
111 }
85 }
@@ -115,40 +89,11 @@ Item {
115
89
116 property string focusedAppId: ApplicationManager.focusedApplicationId
90 property string focusedAppId: ApplicationManager.focusedApplicationId
117 property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
91 property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
118− property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
92+ property var focusedAppDelegate: null
119−
120− property bool waitingForScreenshot: false
121−
122− property bool applicationStarting: false
123− property bool secondApplicationStarting: false
124−
125− property string newFocusedAppId
126
93
127− onFocusedScreenshotChanged: {
94+ property real oldInverseProgress: 0
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
95
138− function requestNewScreenshot() {
96+ onFocusedAppIdChanged: focusedAppDelegate = spreadRepeater.itemAt(0);
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
97
153 function indexOf(appId) {
98 function indexOf(appId) {
154 for (var i = 0; i < ApplicationManager.count; i++) {
99 for (var i = 0; i < ApplicationManager.count; i++) {
@@ -161,185 +106,25 @@ Item {
161
106
162 }
107 }
163
108
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: "black"
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: "black"
232− visible: priv.applicationStarting
233−
234− WaitingDots {
235− }
236− }
237− Image {
238− id: mainScreenshotImage
239− anchors { left: parent.left; bottom: parent.bottom }
240− width: parent.width
241− visible: false
242− }
243−
244− EdgeDragArea {
245− id: spreadDragArea
246− direction: Direction.Leftwards
247− enabled: ApplicationManager.count > 1 && spreadView.phase != 2
248−
249− anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
250− width: root.dragAreaWidth
251−
252− // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
253− // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
254− // spreadView and make the spreadView snap to positionMarker4.
255− property bool attachedToView: true
256−
257− property var gesturePoints: new Array()
258−
259− onTouchXChanged: {
260− if (!dragging && !priv.waitingForScreenshot) {
261− // Initial touch. Let's update the screenshot and reset the spreadView to the starting position.
262− priv.requestNewScreenshot();
263− spreadView.phase = 0;
264− spreadView.contentX = -spreadView.shift;
265− }
266− if (dragging && attachedToView) {
267− // Gesture recognized. Let's move the spreadView with the finger
268− spreadView.contentX = -touchX - spreadView.shift;
269− }
270− if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
271− // We passed positionMarker3. Detach from spreadView and snap it.
272− attachedToView = false;
273− spreadView.snap();
274− }
275− gesturePoints.push(touchX);
276− }
277−
278− onStatusChanged: {
279− if (status == DirectionalDragArea.Recognized) {
280− attachedToView = true;
281− }
282− }
283−
284− onDraggingChanged: {
285− if (dragging) {
286− // Gesture recognized. Start recording this gesture
287− gesturePoints = [];
288− return;
289− }
290−
291− // Ok. The user released. Find out if it was a one-way movement.
292− var oneWayFlick = true;
293− var smallestX = spreadDragArea.width;
294− for (var i = 0; i < gesturePoints.length; i++) {
295− if (gesturePoints[i] >= smallestX) {
296− oneWayFlick = false;
297− break;
298− }
299− smallestX = gesturePoints[i];
300− }
301− gesturePoints = [];
302−
303− if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
304− spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
305− // If it was a short one-way movement, do the Alt+Tab switch
306− // no matter if we didn't cross positionMarker1 yet.
307− spreadView.snapTo(1);
308− } else if (!dragging && attachedToView) {
309− // otherwise snap to the closest snap position we can find
310− // (might be back to start, to app 1 or to spread)
311− spreadView.snap();
312− }
313− }
314− }
315−
316− Rectangle {
317− id: coverFlipBackground
318− anchors.fill: parent
319− color: "black"
320− visible: spreadView.visible
321− }
322−
323− InputFilterArea {
324− anchors.fill: root
325− blockInput: spreadView.visible
326− }
327−
328 Flickable {
109 Flickable {
329 id: spreadView
110 id: spreadView
330 objectName: "spreadView"
111 objectName: "spreadView"
331 anchors.fill: parent
112 anchors.fill: parent
332− visible: spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1 || snapAnimation.running
113+ interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1) && draggedIndex == -1
333 contentWidth: spreadRow.width - shift
114 contentWidth: spreadRow.width - shift
334 contentX: -shift
115 contentX: -shift
335
116
117+ // This indicates when the spreadView is active. That means, all the animations
118+ // are activated and tiles need to line up for the spread.
119+ readonly property bool active: shiftedContentX > 0 || spreadDragArea.dragging
120+
336 // The flickable needs to fill the screen in order to get touch events all over.
121 // The flickable needs to fill the screen in order to get touch events all over.
337 // However, we don't want to the user to be able to scroll back all the way. For
122 // However, we don't want to the user to be able to scroll back all the way. For
338 // that, the beginning of the gesture starts with a negative value for contentX
123 // that, the beginning of the gesture starts with a negative value for contentX
339 // so the flickable wants to pull it into the view already. "shift" tunes the
124 // so the flickable wants to pull it into the view already. "shift" tunes the
340 // distance where to "lock" the content.
125 // distance where to "lock" the content.
341− property real shift: width / 2
126+ readonly property real shift: width / 2
342− property real shiftedContentX: contentX + shift
127+ readonly property real shiftedContentX: contentX + shift
343
128
344 property int tileDistance: width / 4
129 property int tileDistance: width / 4
345
130
@@ -363,6 +148,10 @@ Item {
363 property int phase: 0
148 property int phase: 0
364
149
365 property int selectedIndex: -1
150 property int selectedIndex: -1
151+ property int draggedIndex: -1
152+ property int closingIndex: -1
153+
154+ property bool focusChanging: false
366
155
367 onShiftedContentXChanged: {
156 onShiftedContentXChanged: {
368 switch (phase) {
157 switch (phase) {
@@ -386,9 +175,9 @@ Item {
386 snapAnimation.targetContentX = -shift;
175 snapAnimation.targetContentX = -shift;
387 snapAnimation.start();
176 snapAnimation.start();
388 } else if (shiftedContentX < positionMarker2 * width) {
177 } else if (shiftedContentX < positionMarker2 * width) {
389− snapTo(1)
178+ snapTo(1);
390 } else if (shiftedContentX < positionMarker3 * width) {
179 } else if (shiftedContentX < positionMarker3 * width) {
391− snapTo(1)
180+ snapTo(1);
392 } else if (phase < 2){
181 } else if (phase < 2){
393 // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
182 // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
394 snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
183 snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
@@ -396,12 +185,27 @@ Item {
396 }
185 }
397 }
186 }
398 function snapTo(index) {
187 function snapTo(index) {
188+ if (ApplicationManager.count <= index) {
189+ // In case we're trying to snap to some non existing app, lets snap back to the first one
190+ index = 0;
191+ }
399 spreadView.selectedIndex = index;
192 spreadView.selectedIndex = index;
400− root.fullscreen = ApplicationManager.get(index).fullscreen;
193+ // If we're not in full spread mode yet, always unwind to start pos
194+ // otherwise unwind up to progress 0 of the selected index
195+ if (spreadView.phase < 2) {
196+ snapAnimation.targetContentX = -shift;
197+ } else {
401− snapAnimation.targetContentX = -shift;
198+ snapAnimation.targetContentX = -shift + index * spreadView.tileDistance;
199+ }
402 snapAnimation.start();
200 snapAnimation.start();
403 }
201 }
404
202
203+ // In case the ApplicationManager already holds an app when starting up we're missing animations
204+ // Make sure we end up in the same state
205+ Component.onCompleted: {
206+ spreadView.contentX = -spreadView.shift
207+ }
208+
405 SequentialAnimation {
209 SequentialAnimation {
406 id: snapAnimation
210 id: snapAnimation
407 property int targetContentX: -spreadView.shift
211 property int targetContentX: -spreadView.shift
@@ -417,7 +221,8 @@ Item {
417 script: {
221 script: {
418 if (spreadView.selectedIndex >= 0) {
222 if (spreadView.selectedIndex >= 0) {
419 ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
223 ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
224+
420− spreadView.selectedIndex = -1
225+ spreadView.selectedIndex = -1;
421 spreadView.phase = 0;
226 spreadView.phase = 0;
422 spreadView.contentX = -spreadView.shift;
227 spreadView.contentX = -spreadView.shift;
423 }
228 }
@@ -431,6 +236,15 @@ Item {
431 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
236 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
432 // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
237 // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
433 width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
238 width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
239+ Behavior on width {
240+ enabled: spreadView.closingIndex >= 0
241+ UbuntuNumberAnimation {}
242+ }
243+ onWidthChanged: {
244+ if (spreadView.closingIndex >= 0) {
245+ spreadView.contentX = Math.min(spreadView.contentX, width - spreadView.width - spreadView.shift);
246+ }
247+ }
434
248
435 x: spreadView.contentX
249 x: spreadView.contentX
436
250
@@ -450,18 +264,76 @@ Item {
450 height: spreadView.height
264 height: spreadView.height
451 selected: spreadView.selectedIndex == index
265 selected: spreadView.selectedIndex == index
452 otherSelected: spreadView.selectedIndex >= 0 && !selected
266 otherSelected: spreadView.selectedIndex >= 0 && !selected
267+ interactive: !spreadView.interactive && spreadView.phase === 0
268+ && spreadView.shiftedContentX === 0 && root.interactive && index === 0
269+ swipeToCloseEnabled: spreadView.interactive
270+ maximizedAppTopMargin: root.maximizedAppTopMargin
271+ dropShadow: spreadView.active ||
272+ priv.focusedAppDelegate.x !== 0
273+
274+ readonly property bool isDash: model.appId == "unity8-dash"
275+
276+ z: isDash && !spreadView.active ? -1 : behavioredIndex
277+
278+ x: {
279+ // focused app is always positioned at 0 except when following left edge drag
280+ if (index == 0) {
281+ if (!isDash && root.inverseProgress > 0) {
282+ return root.inverseProgress;
283+ }
284+ return 0;
285+ }
286+ if (isDash && !spreadView.active && !spreadDragArea.dragging) {
287+ return 0;
288+ }
289+
290+ // Otherwise line up for the spread
291+ return spreadView.width + (index - 1) * spreadView.tileDistance;
292+ }
293+ property real behavioredIndex: index
294+ Behavior on behavioredIndex {
295+ enabled: spreadView.closingIndex >= 0
296+ UbuntuNumberAnimation {
297+ id: appXAnimation
298+ onRunningChanged: {
299+ if (!running) {
300+ spreadView.closingIndex = -1;
301+ }
302+ }
303+ }
304+ }
453
305
454− z: index
306+ Behavior on x {
455− x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
307+ enabled: root.spreadEnabled &&
308+ !spreadView.active &&
309+ !snapAnimation.running
310+ UbuntuNumberAnimation {
311+ duration: UbuntuAnimation.FastDuration
312+ onRunningChanged: {
313+ if (!running && root.inverseProgress == 0) {
314+ spreadView.focusChanging = false;
315+ }
316+ }
317+ }
318+ }
456
319
457 // Each tile has a different progress value running from 0 to 1.
320 // Each tile has a different progress value running from 0 to 1.
458− // A progress value of 0 means the tile is at the right edge. 1 means the tile has reched the left edge.
321+ // 0: means the tile is at the right edge.
322+ // 1: means the tile has finished the main animation towards the left edge.
323+ // >1: after the main animation has finished, tiles will continue to move very slowly to the left
459 progress: {
324 progress: {
460− var tileProgress = (spreadView.shiftedContentX - index * spreadView.tileDistance) / spreadView.width;
325+ var tileProgress = (spreadView.shiftedContentX - behavioredIndex * spreadView.tileDistance) / spreadView.width;
461 // Tile 1 needs to move directly from the beginning...
326 // Tile 1 needs to move directly from the beginning...
462− if (index == 1 && spreadView.phase < 2) {
327+ if (behavioredIndex == 1 && spreadView.phase < 2) {
463 tileProgress += spreadView.tileDistance / spreadView.width;
328 tileProgress += spreadView.tileDistance / spreadView.width;
464 }
329 }
330+ // Limiting progress to ~0 and 1.7 to avoid binding calculations when tiles are not
331+ // visible.
332+ // < 0 : The tile is outside the screen on the right
333+ // > 1.7: The tile is *very* close to the left edge and covered by other tiles now.
334+ // Using 0.0001 to differentiate when a tile should still be visible (==0)
335+ // or we can hide it (< 0)
336+ tileProgress = Math.max(-0.0001, Math.min(1.7, tileProgress));
465 return tileProgress;
337 return tileProgress;
466 }
338 }
467
339
@@ -479,9 +351,13 @@ Item {
479 return progress;
351 return progress;
480 }
352 }
481
353
354+ // Hiding tiles when their progress is negative or reached the maximum
355+ visible: (progress >= 0 && progress < 1.7) ||
356+ (isDash && priv.focusedAppDelegate.x !== 0)
357+
482 EasingCurve {
358 EasingCurve {
483 id: snappingCurve
359 id: snappingCurve
484− type: EasingCurve.OutQuad
360+ type: EasingCurve.Linear
485 period: 0.05
361 period: 0.05
486 progress: appDelegate.progress - spreadView.positionMarker1
362 progress: appDelegate.progress - spreadView.positionMarker1
487 }
363 }
@@ -495,8 +371,85 @@ Item {
495 }
371 }
496 }
372 }
497 }
373 }
374+
375+ onClosed: {
376+ spreadView.draggedIndex = -1;
377+ spreadView.closingIndex = index;
378+ ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
379+ }
498 }
380 }
499 }
381 }
500 }
382 }
501 }
383 }
384+
385+ EdgeDragArea {
386+ id: spreadDragArea
387+ direction: Direction.Leftwards
388+ enabled: spreadView.phase != 2 && root.spreadEnabled
389+
390+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
391+ width: root.dragAreaWidth
392+
393+ // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
394+ // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
395+ // spreadView and make the spreadView snap to positionMarker4.
396+ property bool attachedToView: true
397+
398+ property var gesturePoints: new Array()
399+
400+ onTouchXChanged: {
401+ if (!dragging) {
402+ // Initial touch. Let's reset the spreadView to the starting position.
403+ spreadView.phase = 0;
404+ spreadView.contentX = -spreadView.shift;
405+ }
406+ if (dragging && attachedToView) {
407+ // Gesture recognized. Let's move the spreadView with the finger
408+ spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
409+ }
410+ if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
411+ // We passed positionMarker3. Detach from spreadView and snap it.
412+ attachedToView = false;
413+ spreadView.snap();
414+ }
415+ gesturePoints.push(touchX);
416+ }
417+
418+ onStatusChanged: {
419+ if (status == DirectionalDragArea.Recognized) {
420+ attachedToView = true;
421+ }
422+ }
423+
424+ onDraggingChanged: {
425+ if (dragging) {
426+ // Gesture recognized. Start recording this gesture
427+ gesturePoints = [];
428+ return;
429+ }
430+
431+ // Ok. The user released. Find out if it was a one-way movement.
432+ var oneWayFlick = true;
433+ var smallestX = spreadDragArea.width;
434+ for (var i = 0; i < gesturePoints.length; i++) {
435+ if (gesturePoints[i] >= smallestX) {
436+ oneWayFlick = false;
437+ break;
438+ }
439+ smallestX = gesturePoints[i];
440+ }
441+ gesturePoints = [];
442+
443+ if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
444+ spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
445+ // If it was a short one-way movement, do the Alt+Tab switch
446+ // no matter if we didn't cross positionMarker1 yet.
447+ spreadView.snapTo(1);
448+ } else if (!dragging && attachedToView) {
449+ // otherwise snap to the closest snap position we can find
450+ // (might be back to start, to app 1 or to spread)
451+ spreadView.snap();
452+ }
453+ }
454+ }
502}
455}
qml/Stages/Splash.qmlnew file+68
@@ -0,0 +1,68 @@
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+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+
21+Rectangle {
22+ id: root
23+ color: "black"
24+
25+ property string name: ""
26+ property url image: ""
27+
28+ UbuntuShape {
29+ id: iconShape
30+ anchors.horizontalCenter: parent.horizontalCenter
31+ anchors.verticalCenter: parent.verticalCenter
32+ anchors.verticalCenterOffset: -units.gu(4)
33+ width: units.gu(8)
34+ height: units.gu(7.5)
35+
36+ radius: "medium"
37+ borderSource: "none"
38+
39+ image: Image {
40+ id: iconImage
41+ sourceSize.width: iconShape.width
42+ sourceSize.height: iconShape.height
43+ source: root.image
44+ fillMode: Image.PreserveAspectCrop
45+ }
46+ }
47+
48+ Label {
49+ text: root.name
50+ anchors.horizontalCenter: parent.horizontalCenter
51+ anchors.top: iconShape.bottom
52+ anchors.topMargin: units.gu(2)
53+ fontSize: "large"
54+ }
55+
56+ WaitingDots {
57+ visible: parent.visible
58+ anchors.horizontalCenter: parent.horizontalCenter
59+ anchors.bottom: parent.bottom
60+ anchors.bottomMargin: units.gu(12)
61+ }
62+
63+ MouseArea {
64+ anchors.fill: parent
65+ enabled: parent.visible
66+ // absorb all mouse events
67+ }
68+}
qml/Stages/SpreadDelegate.qml+145−25
@@ -17,39 +17,159 @@
17*/
17*/
18
18
19import QtQuick 2.0
19import QtQuick 2.0
20+import Unity.Application 0.1
21+import Ubuntu.Components 1.1
22+import "../Components"
20
23
21Item {
24Item {
22 id: root
25 id: root
23
26
27+ // to be set from outside
28+ property bool interactive: true
29+ property bool dropShadow: true
30+ property real maximizedAppTopMargin
31+ property alias swipeToCloseEnabled: dragArea.enabled
32+
33+ readonly property bool isFullscreen: surface !== null && surfaceContainer.surface.anchors.topMargin == 0
34+
24 signal clicked()
35 signal clicked()
36+ signal closed()
25
37
26− property real topMarginProgress
38+ AppSurfaceContainer {
39+ id: surfaceContainer
40+ objectName: "surfaceContainer"
41+ anchors.fill: parent
42+ surface: model.surface
43+ promptSurfaces: model.application.promptSurfaces
27
44
28− QtObject {
45+ Binding {
29− id: priv
46+ target: surfaceContainer.surface
30− property real heightDifference: root.height - appImage.implicitHeight
47+ property: "anchors.topMargin"
48+ value: {
49+ return surfaceContainer.surface.state === MirSurfaceItem.Fullscreen ? 0 : maximizedAppTopMargin;
50+ }
31− }
51+ }
32
52
33− Image {
53+ Binding {
34− id: dropShadow
54+ target: surface
35− anchors.fill: appImage
55+ property: "enabled"
36− anchors.margins: -units.gu(2)
56+ value: root.interactive
57+ }
58+ Binding {
59+ target: surface
60+ property: "focus"
61+ value: root.interactive
62+ }
63+
64+ Connections {
65+ target: surface
66+ // FIXME: I would rather not need to do this, but currently it doesn't get
67+ // active focus without it and I don't know why.
68+ onFocusChanged: forceSurfaceActiveFocusIfReady();
69+ onParentChanged: forceSurfaceActiveFocusIfReady();
70+ onEnabledChanged: forceSurfaceActiveFocusIfReady();
71+ function forceSurfaceActiveFocusIfReady() {
72+ if (surface.focus && surface.parent === surfaceContainer && surface.enabled) {
73+ surface.forceActiveFocus();
74+ }
75+ }
76+ }
77+
78+ BorderImage {
79+ id: dropShadowImage
80+ anchors {
81+ fill: parent
82+ leftMargin: -units.gu(2)
83+ rightMargin: -units.gu(2)
84+ bottomMargin: -units.gu(2)
85+ topMargin: -units.gu(2) + (root.isFullscreen ? 0 : maximizedAppTopMargin)
86+ }
37− source: "graphics/dropshadow.png"
87+ source: "graphics/dropshadow.png"
88+ border { left: 50; right: 50; top: 50; bottom: 50 }
38− opacity: .4
89+ opacity: root.dropShadow ? .4 : 0
39− }
90+ Behavior on opacity { UbuntuNumberAnimation {} }
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− }
91+ }
48− source: model.screenshot
92+
49− antialiasing: true
93+ transform: Translate {
94+ y: dragArea.distance
95+ }
50 }
96 }
51− MouseArea {
97+
98+ DraggingArea {
99+ id: dragArea
52− anchors.fill: appImage
100+ anchors.fill: parent
101+
102+ property bool moving: false
103+ property real distance: 0
104+
105+ onMovingChanged: {
106+ spreadView.draggedIndex = moving ? index : -1
107+ }
108+
109+ onDragValueChanged: {
110+ if (!dragging) {
111+ return;
112+ }
113+ moving = moving || Math.abs(dragValue) > units.gu(1)
114+ if (moving) {
115+ distance = dragValue;
116+ }
117+ }
118+
119+ onClicked: {
120+ if (!moving) {
53− onClicked: root.clicked()
121+ root.clicked();
122+ }
123+ }
124+
125+ onDragEnd: {
126+ if (model.appId == "unity8-dash") {
127+ animation.animate("center")
128+ return;
129+ }
130+
131+ // velocity and distance values specified by design prototype
132+ if ((dragVelocity < -units.gu(40) && distance < -units.gu(8)) || distance < -root.height / 2) {
133+ animation.animate("up")
134+ } else if ((dragVelocity > units.gu(40) && distance > units.gu(8)) || distance > root.height / 2) {
135+ animation.animate("down")
136+ } else {
137+ animation.animate("center")
138+ }
139+ }
140+
141+ UbuntuNumberAnimation {
142+ id: animation
143+ target: dragArea
144+ property: "distance"
145+ property bool requestClose: false
146+
147+ function animate(direction) {
148+ animation.from = dragArea.distance;
149+ switch (direction) {
150+ case "up":
151+ animation.to = -root.height * 1.5;
152+ requestClose = true;
153+ break;
154+ case "down":
155+ animation.to = root.height * 1.5;
156+ requestClose = true;
157+ break;
158+ default:
159+ animation.to = 0
160+ }
161+ animation.start();
162+ }
163+
164+ onRunningChanged: {
165+ if (!running) {
166+ dragArea.moving = false;
167+ dragArea.distance = 0;
168+ if (requestClose) {
169+ root.closed();
170+ }
171+ }
172+ }
173+ }
54 }
174 }
55}
175}
qml/Stages/StageWithSideStage.qmldeleted−413
@@ -1,413 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../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: "black"
286−
287− WaitingDots {
288− }
289− }
290−
291− SidestageHandle {
292− id: sideStageHandle
293− anchors { top: parent.top; right: sideStageImage.left; bottom: parent.bottom }
294− width: root.dragAreaWidth
295− visible: root.shown && priv.sideStageAppId && sideStageImage.x < root.width
296−
297− }
298− MouseArea {
299− id: sideStageHandleMouseArea
300− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; rightMargin: sideStageImage.shown ? sideStageImage.width : 0}
301− width: root.dragAreaWidth
302− visible: priv.sideStageAppId
303−
304− property var dragPoints: new Array()
305−
306− onPressed: {
307− priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
308− if (priv.mainStageAppId) {
309− priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
310− }
311− }
312−
313− onMouseXChanged: {
314− dragPoints.push(mouseX)
315−
316− var dragPoint = root.width + mouseX;
317− if (sideStageImage.shown) {
318− dragPoint -= sideStageImage.width
319− }
320− sideStageImage.x = Math.max(root.width - sideStageImage.width, dragPoint)
321− }
322−
323− onReleased: {
324− var distance = 0;
325− var lastX = dragPoints[0];
326− var oneWayFlick = true;
327− for (var i = 0; i < dragPoints.length; ++i) {
328− if (dragPoints[i] < lastX) {
329− oneWayFlick = false;
330− }
331− distance += dragPoints[i] - lastX;
332− lastX = dragPoints[i];
333− }
334− dragPoints = [];
335−
336− if (oneWayFlick || distance > sideStageImage.width / 2) {
337− sideStageImage.snapTo(root.width)
338− } else {
339− sideStageImage.snapToApp(priv.sideStageApp)
340− }
341− }
342− }
343−
344− SwitchingApplicationImage {
345− id: sideStageImage
346− width: priv.sideStageWidth
347− height: root.height
348− x: root.width
349− anchors.bottom: parent.bottom
350− visible: true
351− property bool shown: false
352−
353− onSwitched: {
354− mainStageImage.visible = false;
355− ApplicationManager.focusApplication(application.appId)
356− }
357−
358− function snapTo(targetX) {
359− sideStageSnapAnimation.targetX = targetX
360− sideStageImage.visible = true;
361− if (priv.mainStageAppId) {
362− mainStageImage.application = priv.mainStageApp
363− mainStageImage.visible = true;
364− }
365− sideStageSnapAnimation.start();
366− }
367−
368− function snapToApp(application) {
369− sideStageImage.application = application
370− sideStageSnapAnimation.snapToId = application.appId;
371− snapTo(root.width - sideStageImage.width);
372− }
373−
374− SequentialAnimation {
375− id: sideStageSnapAnimation
376− property int targetX: root.width
377− property string snapToId
378−
379− UbuntuNumberAnimation { target: sideStageImage; property: "x"; to: sideStageSnapAnimation.targetX; duration: UbuntuAnimation.SlowDuration }
380− ScriptAction {
381− script: {
382− if (sideStageSnapAnimation.targetX == root.width) {
383− if (priv.mainStageAppId) {
384− ApplicationManager.focusApplication(priv.mainStageAppId)
385− } else {
386− priv.overlayOverride = true;
387− ApplicationManager.unfocusCurrentApplication();
388− }
389− sideStageImage.shown = false;
390− }
391− if (sideStageSnapAnimation.snapToId) {
392− ApplicationManager.focusApplication(sideStageSnapAnimation.snapToId)
393− sideStageSnapAnimation.snapToId = "";
394− sideStageImage.shown = true;
395− priv.overlayOverride = false;
396− }
397− sideStageImage.visible = false;
398− mainStageImage.visible = false;
399− }
400− }
401− }
402− }
403−
404− Rectangle {
405− id: sideStageSplash
406− anchors.fill: parent
407− anchors.leftMargin: sideStageImage.x
408− color: "black"
409−
410− WaitingDots {
411− }
412− }
413−}
qml/Stages/SurfaceContainer.qmlnew file+106
@@ -0,0 +1,106 @@
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+
17+import QtQuick 2.0
18+import "Animations"
19+
20+Item {
21+ id: container
22+ property Item surface: null
23+ property bool removing: false
24+
25+ onSurfaceChanged: {
26+ if (surface) {
27+ surface.parent = container;
28+ surface.z = 1;
29+ state = "initial"
30+ }
31+ }
32+
33+ Connections {
34+ target: surface
35+ onRemoved: {
36+ container.removing = true;
37+
38+ var childSurfaces = surface.childSurfaces;
39+ for (var i=0; i<childSurfaces.length; i++) {
40+ childSurfaces[i].removed();
41+ }
42+
43+ animateOut();
44+ }
45+ }
46+
47+ Repeater {
48+ model: surface.childSurfaces
49+
50+ delegate: Loader {
51+ z: 2
52+ anchors {
53+ fill: container
54+ topMargin: container.surface.anchors.topMargin
55+ rightMargin: container.surface.anchors.rightMargin
56+ bottomMargin: container.surface.anchors.bottomMargin
57+ leftMargin: container.surface.anchors.leftMargin
58+ }
59+
60+ // Only way to do recursive qml items.
61+ source: Qt.resolvedUrl("SurfaceContainer.qml")
62+ onLoaded: {
63+ item.surface = modelData;
64+ item.animateIn();
65+ }
66+ }
67+ }
68+
69+ function animateIn() {
70+ var animation = swipeFromBottom.createObject(container, { "surface": container.surface });
71+ animation.start();
72+
73+ var tmp = d.animations;
74+ tmp.push(animation);
75+ d.animations = tmp;
76+ }
77+
78+ function animateOut() {
79+ if (d.animations.length > 0) {
80+ var tmp = d.animations;
81+ var popped = tmp.pop();
82+ popped.end();
83+ d.animations = tmp;
84+ } else {
85+ container.state = "initial";
86+ }
87+ }
88+
89+ QtObject {
90+ id: d
91+ property var animations: []
92+ property var currentAnimation: animations.length > 0 ? animations[animations.length-1] : undefined
93+ }
94+
95+ Component {
96+ id: swipeFromBottom
97+ SwipeFromBottomAnimation {}
98+ }
99+
100+ states: [
101+ State {
102+ name: "initial"
103+ PropertyChanges { target: surface; anchors.fill: container }
104+ }
105+ ]
106+}
qml/Stages/SwitchingApplicationImage.qmldeleted−81
@@ -1,81 +0,0 @@
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/TabletStage.qmlnew file+612
@@ -0,0 +1,612 @@
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+Rectangle {
25+ id: root
26+ objectName: "stages"
27+ anchors.fill: parent
28+ color: "black"
29+
30+ // Controls to be set from outside
31+ property bool shown: false
32+ property bool moving: false
33+ property int dragAreaWidth
34+ property real maximizedAppTopMargin
35+ property bool interactive
36+ property real inverseProgress: 0 // This is the progress for left edge drags, in pixels.
37+
38+ onInverseProgressChanged: {
39+ if (inverseProgress == 0 && priv.oldInverseProgress > 0) {
40+ // left edge drag released. Minimum distance is given by design.
41+ if (priv.oldInverseProgress > units.gu(22)) {
42+ ApplicationManager.focusApplication("unity8-dash");
43+ }
44+ }
45+ priv.oldInverseProgress = inverseProgress;
46+ }
47+
48+ QtObject {
49+ id: priv
50+
51+ property string focusedAppId: ApplicationManager.focusedApplicationId
52+ property string oldFocusedAppId: ""
53+
54+ property string mainStageAppId
55+ property string sideStageAppId
56+
57+ // For convenience, keep properties of the first two apps in the model
58+ property string appId0
59+ property string appId1
60+
61+ property int oldInverseProgress: 0
62+
63+ onFocusedAppIdChanged: {
64+ if (priv.focusedAppId.length > 0) {
65+ var focusedApp = ApplicationManager.findApplication(focusedAppId);
66+ if (focusedApp.stage == ApplicationInfoInterface.SideStage) {
67+ priv.sideStageAppId = focusedAppId;
68+ } else {
69+ priv.mainStageAppId = focusedAppId;
70+ }
71+ }
72+
73+ appId0 = ApplicationManager.count >= 1 ? ApplicationManager.get(0).appId : "";
74+ appId1 = ApplicationManager.count > 1 ? ApplicationManager.get(1).appId : "";
75+ }
76+
77+ function indexOf(appId) {
78+ for (var i = 0; i < ApplicationManager.count; i++) {
79+ if (ApplicationManager.get(i).appId == appId) {
80+ return i;
81+ }
82+ }
83+ return -1;
84+ }
85+
86+ function evaluateOneWayFlick(gesturePoints) {
87+ // Need to have at least 3 points to recognize it as a flick
88+ if (gesturePoints.length < 3) {
89+ return false;
90+ }
91+ // Need to have a movement of at least 2 grid units to recognize it as a flick
92+ if (Math.abs(gesturePoints[gesturePoints.length - 1] - gesturePoints[0]) < units.gu(2)) {
93+ return false;
94+ }
95+
96+ var oneWayFlick = true;
97+ var smallestX = gesturePoints[0];
98+ var leftWards = gesturePoints[1] < gesturePoints[0];
99+ for (var i = 1; i < gesturePoints.length; i++) {
100+ if ((leftWards && gesturePoints[i] >= smallestX)
101+ || (!leftWards && gesturePoints[i] <= smallestX)) {
102+ oneWayFlick = false;
103+ break;
104+ }
105+ smallestX = gesturePoints[i];
106+ }
107+ return oneWayFlick;
108+ }
109+ }
110+
111+ Connections {
112+ target: ApplicationManager
113+ onFocusRequested: {
114+ if (spreadView.interactive) {
115+ spreadView.snapTo(priv.indexOf(appId));
116+ } else {
117+ ApplicationManager.focusApplication(appId);
118+ }
119+ }
120+
121+ onApplicationAdded: {
122+ if (spreadView.phase == 2) {
123+ spreadView.snapTo(ApplicationManager.count - 1);
124+ } else {
125+ spreadView.phase = 0;
126+ spreadView.contentX = -spreadView.shift;
127+ ApplicationManager.focusApplication(appId);
128+ }
129+ }
130+
131+ onApplicationRemoved: {
132+ if (priv.mainStageAppId == appId) {
133+ ApplicationManager.focusApplication("unity8-dash")
134+ }
135+ if (priv.sideStageAppId == appId) {
136+ priv.sideStageAppId = "";
137+ }
138+ if (ApplicationManager.count == 0) {
139+ spreadView.phase = 0;
140+ spreadView.contentX = -spreadView.shift;
141+ }
142+ }
143+ }
144+
145+ Flickable {
146+ id: spreadView
147+ anchors.fill: parent
148+ interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1) && draggedIndex == -1
149+ contentWidth: spreadRow.width - shift
150+ contentX: -shift
151+
152+ property int tileDistance: units.gu(20)
153+ property int sideStageWidth: units.gu(40)
154+ property bool sideStageVisible: priv.sideStageAppId
155+
156+ // This indicates when the spreadView is active. That means, all the animations
157+ // are activated and tiles need to line up for the spread.
158+ readonly property bool active: shiftedContentX > 0 || spreadDragArea.dragging
159+
160+ // The flickable needs to fill the screen in order to get touch events all over.
161+ // However, we don't want to the user to be able to scroll back all the way. For
162+ // that, the beginning of the gesture starts with a negative value for contentX
163+ // so the flickable wants to pull it into the view already. "shift" tunes the
164+ // distance where to "lock" the content.
165+ readonly property real shift: width / 2
166+ readonly property real shiftedContentX: contentX + shift
167+
168+ // Phase of the animation:
169+ // 0: Starting from right edge, a new app (index 1) comes in from the right
170+ // 1: The app has reached the first snap position.
171+ // 2: The list is dragged further and snaps into the spread view when entering phase 2
172+ property int phase
173+
174+ readonly property int phase0Width: sideStageWidth
175+ readonly property int phase1Width: sideStageWidth
176+
177+ // Those markers mark the various positions in the spread (ratio to screen width from right to left):
178+ // 0 - 1: following finger, snap back to the beginning on release
179+ readonly property real positionMarker1: 0.2
180+ // 1 - 2: curved snapping movement, snap to nextInStack on release
181+ readonly property real positionMarker2: sideStageWidth / spreadView.width
182+ // 2 - 3: movement follows finger, snaps to phase 2 (full spread) on release
183+ readonly property real positionMarker3: 0.6
184+ // passing 3, we detach movement from the finger and snap to phase 2 (full spread)
185+ readonly property real positionMarker4: 0.8
186+
187+ readonly property int startSnapPosition: phase0Width * 0.5
188+ readonly property int endSnapPosition: phase0Width * 0.75
189+ readonly property real snapPosition: 0.75
190+
191+ property int selectedIndex: -1
192+ property int draggedIndex: -1
193+ property int closingIndex: -1
194+
195+ property bool sideStageDragging: sideStageDragHandle.dragging
196+ property real sideStageDragProgress: sideStageDragHandle.progress
197+
198+ onSideStageDragProgressChanged: {
199+ if (sideStageDragProgress == 1) {
200+ ApplicationManager.focusApplication(priv.mainStageAppId);
201+ priv.sideStageAppId = "";
202+ }
203+ }
204+
205+ // In case the ApplicationManager already holds an app when starting up we're missing animations
206+ // Make sure we end up in the same state
207+ Component.onCompleted: {
208+ spreadView.contentX = -spreadView.shift
209+ }
210+
211+ property int nextInStack: {
212+ switch (state) {
213+ case "main":
214+ if (ApplicationManager.count > 1) {
215+ return 1;
216+ }
217+ return -1;
218+ case "mainAndOverlay":
219+ if (ApplicationManager.count <= 2) {
220+ return -1;
221+ }
222+ if (priv.appId0 == priv.mainStageAppId || priv.appId0 == priv.sideStageAppId) {
223+ if (priv.appId1 == priv.mainStageAppId || priv.appId1 == priv.sideStageAppId) {
224+ return 2;
225+ }
226+ return 1;
227+ }
228+ return 0;
229+ case "overlay":
230+ return 1;
231+ }
232+ print("Unhandled nextInStack case! This shouldn't happen any more when the Dash is an app!");
233+ return -1;
234+ }
235+ property int nextZInStack: indexToZIndex(nextInStack)
236+
237+ states: [
238+ State {
239+ name: "empty"
240+ },
241+ State {
242+ name: "main"
243+ },
244+ State { // Side Stage only in overlay mode
245+ name: "overlay"
246+ },
247+ State { // Main Stage and Side Stage in overlay mode
248+ name: "mainAndOverlay"
249+ },
250+ State { // Main Stage and Side Stage in split mode
251+ name: "mainAndSplit"
252+ }
253+ ]
254+ state: {
255+ if (priv.mainStageAppId && !priv.sideStageAppId) {
256+ return "main";
257+ }
258+ if (!priv.mainStageAppId && priv.sideStageAppId) {
259+ return "overlay";
260+ }
261+ if (priv.mainStageAppId && priv.sideStageAppId) {
262+ return "mainAndOverlay";
263+ }
264+ return "empty";
265+ }
266+
267+ onShiftedContentXChanged: {
268+ if (spreadView.phase == 0 && spreadView.shiftedContentX > spreadView.width * spreadView.positionMarker2) {
269+ spreadView.phase = 1;
270+ } else if (spreadView.phase == 1 && spreadView.shiftedContentX > spreadView.width * spreadView.positionMarker4) {
271+ spreadView.phase = 2;
272+ } else if (spreadView.phase == 1 && spreadView.shiftedContentX < spreadView.width * spreadView.positionMarker2) {
273+ spreadView.phase = 0;
274+ }
275+ }
276+
277+ function snap() {
278+ if (shiftedContentX < phase0Width) {
279+ snapAnimation.targetContentX = -shift;
280+ snapAnimation.start();
281+ } else if (shiftedContentX < phase1Width) {
282+ snapTo(1);
283+ } else {
284+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
285+ snapAnimation.targetContentX = spreadView.width * spreadView.positionMarker4 + 1 - shift;
286+ snapAnimation.start();
287+ }
288+ }
289+ function snapTo(index) {
290+ spreadView.selectedIndex = index;
291+ snapAnimation.targetContentX = -shift;
292+ snapAnimation.start();
293+ }
294+
295+ // We need to shuffle z ordering a bit in order to keep side stage apps above main stage apps.
296+ // We don't want to really reorder them in the model because that allows us to keep track
297+ // of the last focused order.
298+ function indexToZIndex(index) {
299+ var app = ApplicationManager.get(index);
300+ if (!app) {
301+ return index;
302+ }
303+
304+ var active = app.appId == priv.mainStageAppId || app.appId == priv.sideStageAppId;
305+ if (active && app.stage == ApplicationInfoInterface.MainStage) {
306+ // if this app is active, and its the MainStage, always put it to index 0
307+ return 0;
308+ }
309+ if (active && app.stage == ApplicationInfoInterface.SideStage) {
310+ if (!priv.mainStageAppId) {
311+ // Only have SS apps running. Put the active one at 0
312+ return 0;
313+ }
314+
315+ // Precondition now: There's an active MS app and this is SS app:
316+ if (spreadView.nextInStack >= 0 && ApplicationManager.get(spreadView.nextInStack).stage == ApplicationInfoInterface.MainStage) {
317+ // If the next app coming from the right is a MS app, we need to elevate this SS ap above it.
318+ // Put it to at least level 2, or higher if there's more apps coming in before this one.
319+ return Math.max(index, 2);
320+ } else {
321+ // if this is no next app to come in from the right, place this one at index 1, just on top the active MS app.
322+ return 1;
323+ }
324+ }
325+ if (index <= 2 && app.stage == ApplicationInfoInterface.MainStage && priv.sideStageAppId) {
326+ // Ok, this is an inactive MS app. If there's an active SS app around, we need to place this one
327+ // in between the active MS app and the active SS app, so that it comes in from there when dragging from the right.
328+ // If there's now active SS app, just leave it where it is.
329+ return priv.indexOf(priv.sideStageAppId) < index ? index - 1 : index;
330+ }
331+ if (index == spreadView.nextInStack && app.stage == ApplicationInfoInterface.SideStage) {
332+ // This is a SS app and the next one to come in from the right:
333+ if (priv.sideStageAppId && priv.mainStageAppId) {
334+ // If there's both, an active MS and an active SS app, put this one right on top of that
335+ return 2;
336+ }
337+ // Or if there's only one other active app, put it on top of that.
338+ // The case that there isn't any other active app is already handled above.
339+ return 1;
340+ }
341+ if (index == 2 && spreadView.nextInStack == 1 && priv.sideStageAppId) {
342+ // If its index 2 but not the next one to come in, it means
343+ // we've pulled another one down to index 2. Move this one up to 2 instead.
344+ return 3;
345+ }
346+ // don't touch all others... (mostly index > 3 + simple cases where the above doesn't shuffle much)
347+ return index;
348+ }
349+
350+ SequentialAnimation {
351+ id: snapAnimation
352+ property int targetContentX: -spreadView.shift
353+
354+ UbuntuNumberAnimation {
355+ target: spreadView
356+ property: "contentX"
357+ to: snapAnimation.targetContentX
358+ duration: UbuntuAnimation.FastDuration
359+ }
360+
361+ ScriptAction {
362+ script: {
363+ if (spreadView.selectedIndex >= 0) {
364+ var newIndex = spreadView.selectedIndex;
365+ spreadView.selectedIndex = -1;
366+ ApplicationManager.focusApplication(ApplicationManager.get(newIndex).appId);
367+ spreadView.phase = 0;
368+ spreadView.contentX = -spreadView.shift;
369+ }
370+ }
371+ }
372+ }
373+
374+ Item {
375+ id: spreadRow
376+ x: spreadView.contentX
377+ height: root.height
378+ width: spreadView.width + Math.max(spreadView.width, ApplicationManager.count * spreadView.tileDistance)
379+
380+ Rectangle {
381+ id: sideStageBackground
382+ color: "black"
383+ anchors.fill: parent
384+ anchors.leftMargin: spreadView.width - (1 - sideStageDragHandle.progress) * spreadView.sideStageWidth
385+ z: spreadView.indexToZIndex(priv.indexOf(priv.sideStageAppId))
386+ opacity: spreadView.phase == 0 ? 1 : 0
387+ Behavior on opacity { UbuntuNumberAnimation {} }
388+ }
389+
390+ Item {
391+ id: sideStageDragHandle
392+ anchors { top: parent.top; bottom: parent.bottom; left: parent.left; leftMargin: spreadView.width - spreadView.sideStageWidth - width }
393+ width: units.gu(2)
394+ z: sideStageBackground.z
395+ opacity: spreadView.phase <= 0 && spreadView.sideStageVisible ? 1 : 0
396+ property real progress: 0
397+ property bool dragging: false
398+
399+ Behavior on opacity { UbuntuNumberAnimation {} }
400+
401+ Connections {
402+ target: spreadView
403+ onSideStageVisibleChanged: {
404+ if (spreadView.sideStageVisible) {
405+ sideStageDragHandle.progress = 0;
406+ }
407+ }
408+ }
409+
410+ Image {
411+ anchors.centerIn: parent
412+ anchors.horizontalCenterOffset: parent.progress * spreadView.sideStageWidth - (width - parent.width) / 2
413+ width: sideStageDragHandleMouseArea.pressed ? parent.width * 2 : parent.width
414+ height: parent.height
415+ source: "graphics/sidestage_handle@20.png"
416+ Behavior on width { UbuntuNumberAnimation {} }
417+ }
418+
419+ MouseArea {
420+ id: sideStageDragHandleMouseArea
421+ anchors.fill: parent
422+ enabled: spreadView.shiftedContentX == 0
423+ property int startX
424+ property var gesturePoints: new Array()
425+
426+ onPressed: {
427+ gesturePoints = [];
428+ startX = mouseX;
429+ sideStageDragHandle.progress = 0;
430+ sideStageDragHandle.dragging = true;
431+ }
432+ onMouseXChanged: {
433+ if (priv.mainStageAppId) {
434+ sideStageDragHandle.progress = Math.max(0, (-startX + mouseX) / spreadView.sideStageWidth);
435+ }
436+ gesturePoints.push(mouseX);
437+ }
438+ onReleased: {
439+ if (priv.mainStageAppId) {
440+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
441+ sideStageDragSnapAnimation.to = sideStageDragHandle.progress > 0.5 || oneWayFlick ? 1 : 0;
442+ sideStageDragSnapAnimation.start();
443+ } else {
444+ sideStageDragHandle.dragging = false;
445+ }
446+ }
447+ }
448+ UbuntuNumberAnimation {
449+ id: sideStageDragSnapAnimation
450+ target: sideStageDragHandle
451+ property: "progress"
452+
453+ onRunningChanged: {
454+ if (!running) {
455+ sideStageDragHandle.dragging = false;
456+ }
457+ }
458+ }
459+ }
460+
461+ Repeater {
462+ id: spreadRepeater
463+ model: ApplicationManager
464+
465+ delegate: TransformedTabletSpreadDelegate {
466+ id: spreadTile
467+ height: spreadView.height
468+ width: model.stage == ApplicationInfoInterface.MainStage ? spreadView.width : spreadView.sideStageWidth
469+ active: model.appId == priv.mainStageAppId || model.appId == priv.sideStageAppId
470+ zIndex: spreadView.indexToZIndex(index)
471+ selected: spreadView.selectedIndex == index
472+ otherSelected: spreadView.selectedIndex >= 0 && !selected
473+ isInSideStage: priv.sideStageAppId == model.appId
474+ interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
475+ swipeToCloseEnabled: spreadView.interactive
476+ maximizedAppTopMargin: root.maximizedAppTopMargin
477+ dragOffset: !isDash && model.appId == priv.mainStageAppId && root.inverseProgress > 0 ? root.inverseProgress : 0
478+
479+ readonly property bool isDash: model.appId == "unity8-dash"
480+
481+ // FIXME: A regular binding doesn't update any more after closing an app.
482+ // Using a Binding for now.
483+ Binding {
484+ target: spreadTile
485+ property: "z"
486+ value: (!spreadView.active && isDash && !active) ? -1 : spreadTile.zIndex
487+ }
488+ x: spreadView.width
489+
490+ property real behavioredZIndex: zIndex
491+ Behavior on behavioredZIndex {
492+ enabled: spreadView.closingIndex >= 0
493+ UbuntuNumberAnimation {}
494+ }
495+
496+ // This is required because none of the bindings are triggered in some cases:
497+ // When an app is closed, it might happen that ApplicationManager.get(nextInStack)
498+ // returns a different app even though the nextInStackIndex and all the related
499+ // bindings (index, mainStageApp, sideStageApp, etc) don't change. Let's force a
500+ // binding update in that case.
501+ Connections {
502+ target: ApplicationManager
503+ onApplicationRemoved: spreadTile.z = Qt.binding(function() {
504+ return spreadView.indexToZIndex(index);
505+ })
506+ }
507+
508+ progress: {
509+ var tileProgress = (spreadView.shiftedContentX - behavioredZIndex * spreadView.tileDistance) / spreadView.width;
510+ // Some tiles (nextInStack, active) need to move directly from the beginning, normalize progress to immediately start at 0
511+ if ((index == spreadView.nextInStack && spreadView.phase < 2) || (active && spreadView.phase < 1)) {
512+ tileProgress += behavioredZIndex * spreadView.tileDistance / spreadView.width;
513+ }
514+ return tileProgress;
515+ }
516+
517+ animatedProgress: {
518+ if (spreadView.phase == 0 && (spreadTile.active || spreadView.nextInStack == index)) {
519+ if (progress < spreadView.positionMarker1) {
520+ return progress;
521+ } else if (progress < spreadView.positionMarker1 + snappingCurve.period) {
522+ return spreadView.positionMarker1 + snappingCurve.value * 3;
523+ } else {
524+ return spreadView.positionMarker2;
525+ }
526+ }
527+ return progress;
528+ }
529+
530+ onClicked: {
531+ if (spreadView.phase == 2) {
532+ spreadView.snapTo(index);
533+ }
534+ }
535+
536+ onClosed: {
537+ spreadView.draggedIndex = -1;
538+ spreadView.closingIndex = index;
539+ ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
540+ }
541+
542+ EasingCurve {
543+ id: snappingCurve
544+ type: EasingCurve.Linear
545+ period: (spreadView.positionMarker2 - spreadView.positionMarker1) / 3
546+ progress: spreadTile.progress - spreadView.positionMarker1
547+ }
548+ }
549+ }
550+ }
551+ }
552+
553+ EdgeDragArea {
554+ id: spreadDragArea
555+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
556+ width: root.dragAreaWidth
557+ direction: Direction.Leftwards
558+
559+ property bool attachedToView: false
560+ property var gesturePoints: new Array()
561+
562+ onTouchXChanged: {
563+ if (!dragging) {
564+ spreadView.phase = 0;
565+ spreadView.contentX = -spreadView.shift;
566+ }
567+
568+ if (dragging && attachedToView) {
569+ spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
570+ if (spreadView.shiftedContentX > spreadView.phase0Width + spreadView.phase1Width / 2) {
571+ attachedToView = false;
572+ spreadView.snap();
573+ }
574+ }
575+ gesturePoints.push(touchX);
576+ }
577+
578+ onStatusChanged: {
579+ if (status == DirectionalDragArea.Recognized) {
580+ attachedToView = true;
581+ }
582+ }
583+
584+ onDraggingChanged: {
585+ if (dragging) {
586+ // Gesture recognized. Start recording this gesture
587+ gesturePoints = [];
588+ return;
589+ }
590+
591+ // Ok. The user released. Find out if it was a one-way movement.
592+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
593+ gesturePoints = [];
594+
595+ if (oneWayFlick && spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
596+ // If it was a short one-way movement, do the Alt+Tab switch
597+ // no matter if we didn't cross positionMarker1 yet.
598+ spreadView.snapTo(spreadView.nextInStack);
599+ } else if (!dragging && attachedToView) {
600+ if (spreadView.shiftedContentX < spreadView.width * spreadView.positionMarker1) {
601+ spreadView.snap();
602+ } else if (spreadView.shiftedContentX < spreadView.width * spreadView.positionMarker2) {
603+ spreadView.snapTo(spreadView.nextInStack);
604+ } else {
605+ // otherwise snap to the closest snap position we can find
606+ // (might be back to start, to app 1 or to spread)
607+ spreadView.snap();
608+ }
609+ }
610+ }
611+ }
612+}
qml/Stages/TransformedSpreadDelegate.qml+37−30
@@ -23,7 +23,9 @@ import Ubuntu.Components 0.1
23SpreadDelegate {
23SpreadDelegate {
24 id: root
24 id: root
25
25
26+ // Set this to true when this tile is selected in the spread. The animation will change to bring the tile to front.
26 property bool selected: false
27 property bool selected: false
28+ // Set this to true when another tile in the spread is selected. The animation will change to fade this tile out.
27 property bool otherSelected: false
29 property bool otherSelected: false
28
30
29 // The progress animates the tiles. A value > 0 makes it appear from the right edge. At 1 it reaches the end position.
31 // The progress animates the tiles. A value > 0 makes it appear from the right edge. At 1 it reaches the end position.
@@ -106,16 +108,6 @@ SpreadDelegate {
106 selectedTopMarginProgress = topMarginProgress;
108 selectedTopMarginProgress = topMarginProgress;
107 }
109 }
108
110
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) {
111 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
120 // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
112 // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
121 return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
113 return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
@@ -127,22 +119,24 @@ SpreadDelegate {
127 return helperEasingCurve.value * (endValue - startValue) + startValue;
119 return helperEasingCurve.value * (endValue - startValue) + startValue;
128 }
120 }
129
121
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.
122 // 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.
123 // 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.
124 // 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
125+ // The first phases are handled special for the first 2 tiles. as we do the alt-tab and snapping
136− // Once we reached phase 3, the animation is the same for all tiles.
126+ // in there. 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
127+ // When a tile is selected, the animation state is snapshotted, and the spreadView is unwound.
138− // back to negativeProgress). All tiles are kept in place and faded out to 0 opacity except
128+ // 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.
129 // the selected tile, which is animated from the snapshotted position to be fullscreen.
140
130
141− property real xTranslate: {
131+ readonly property real xTranslate: {
132+ if (!spreadView.active) {
133+ return 0;
134+ }
135+
142 if (otherSelected) {
136 if (otherSelected) {
143 if (spreadView.phase < 2 && index == 0) {
137 if (spreadView.phase < 2 && index == 0) {
144− return linearAnimation(selectedProgress, negativeProgress,
138+ return linearAnimation(selectedProgress, 0, selectedXTranslate,
145− selectedXTranslate, selectedXTranslate - spreadView.tileDistance, root.progress);
139+ selectedXTranslate - spreadView.tileDistance, root.progress);
146 }
140 }
147
141
148 return selectedXTranslate;
142 return selectedXTranslate;
@@ -160,7 +154,7 @@ SpreadDelegate {
160 // Apply the same animation as with the rest but add spreadView.width to align it with the others.
154 // 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;
155 return -easingCurve.value * spreadView.width + spreadView.width;
162 } else if (priv.isSelected) {
156 } else if (priv.isSelected) {
163− return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress);
157+ return linearAnimation(selectedProgress, 0, selectedXTranslate, 0, root.progress);
164 }
158 }
165
159
166 case 1:
160 case 1:
@@ -177,23 +171,28 @@ SpreadDelegate {
177 if (priv.isSelected) {
171 if (priv.isSelected) {
178 // Distance to left edge
172 // Distance to left edge
179 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance);
173 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance);
180− return linearAnimation(selectedProgress, negativeProgress,
174+ return linearAnimation(selectedProgress, 0,
181 selectedXTranslate, targetTranslate, root.progress);
175 selectedXTranslate, targetTranslate, root.progress);
182 }
176 }
183
177
184 // Fix it at the right edge...
178 // Fix it at the right edge...
185 var rightEdgeOffset = -((index - 1) * root.startDistance);
179 var rightEdgeOffset = -((index - 1) * root.startDistance);
186 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
180 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
181+ var animatedEndDistance = linearAnimation(0, 2, root.endDistance, 0, root.progress);
187 return -easingCurve.value * spreadView.width + (index * animatedEndDistance) + rightEdgeOffset;
182 return -easingCurve.value * spreadView.width + (index * animatedEndDistance) + rightEdgeOffset;
188
183
189 }
184 }
190
185
191− property real angle: {
186+ readonly property real angle: {
187+ if (!spreadView.active) {
188+ return 0;
189+ }
190+
192 if (priv.otherSelected) {
191 if (priv.otherSelected) {
193 return priv.selectedAngle;
192 return priv.selectedAngle;
194 }
193 }
195 if (priv.isSelected) {
194 if (priv.isSelected) {
196− return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
195+ return linearAnimation(selectedProgress, 0, selectedAngle, 0, root.progress);
197 }
196 }
198 switch (index) {
197 switch (index) {
199 case 0:
198 case 0:
@@ -217,12 +216,15 @@ SpreadDelegate {
217 return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
216 return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
218 }
217 }
219
218
220− property real scale: {
219+ readonly property real scale: {
220+ if (!spreadView.active) {
221+ return 1;
222+ }
221 if (priv.otherSelected) {
223 if (priv.otherSelected) {
222 return priv.selectedScale;
224 return priv.selectedScale;
223 }
225 }
224 if (priv.isSelected) {
226 if (priv.isSelected) {
225− return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
227+ return linearAnimation(selectedProgress, 0, selectedScale, 1, root.progress);
226 }
228 }
227
229
228 switch (index) {
230 switch (index) {
@@ -247,7 +249,7 @@ SpreadDelegate {
247 return root.startScale - easingCurve.value * (root.startScale - root.endScale);
249 return root.startScale - easingCurve.value * (root.startScale - root.endScale);
248 }
250 }
249
251
250− property real opacity: {
252+ readonly property real opacity: {
251 if (priv.otherSelected) {
253 if (priv.otherSelected) {
252 return linearAnimation (selectedProgress, Math.max(0, selectedProgress - .5),
254 return linearAnimation (selectedProgress, Math.max(0, selectedProgress - .5),
253 selectedOpacity, 0, root.progress);
255 selectedOpacity, 0, root.progress);
@@ -265,9 +267,9 @@ SpreadDelegate {
265 return 1;
267 return 1;
266 }
268 }
267
269
268− property real topMarginProgress: {
270+ readonly property real topMarginProgress: {
269 if (priv.isSelected) {
271 if (priv.isSelected) {
270− return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
272+ return linearAnimation(selectedProgress, 0, selectedTopMarginProgress, 0, root.progress);
271 }
273 }
272
274
273 switch (index) {
275 switch (index) {
@@ -290,6 +292,7 @@ SpreadDelegate {
290
292
291 return easingCurve.value;
293 return easingCurve.value;
292 }
294 }
295+
293 }
296 }
294
297
295 transform: [
298 transform: [
@@ -303,18 +306,22 @@ SpreadDelegate {
303 xScale: priv.scale
306 xScale: priv.scale
304 yScale: xScale
307 yScale: xScale
305 },
308 },
309+ Scale {
310+ origin { x: 0; y: (spreadView.height * priv.scale) + maximizedAppTopMargin * 3 }
311+ xScale: 1
312+ yScale: isFullscreen ? 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height : 1
313+ },
306 Translate {
314 Translate {
307 x: priv.xTranslate
315 x: priv.xTranslate
308 }
316 }
309 ]
317 ]
310 opacity: priv.opacity
318 opacity: priv.opacity
311− topMarginProgress: priv.topMarginProgress
312
319
313 EasingCurve {
320 EasingCurve {
314 id: easingCurve
321 id: easingCurve
315 type: EasingCurve.OutSine
322 type: EasingCurve.OutSine
316 period: 1 - spreadView.positionMarker2
323 period: 1 - spreadView.positionMarker2
317− progress: root.animatedProgress
324+ progress: root.progress
318 }
325 }
319
326
320 // This is used as a calculation helper to figure values for progress other than the current one
327 // This is used as a calculation helper to figure values for progress other than the current one
qml/Stages/TransformedTabletSpreadDelegate.qmlnew file+397
@@ -0,0 +1,397 @@
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+import Unity.Application 0.1
23+
24+SpreadDelegate {
25+ id: root
26+
27+ // Set this to true when this tile is selected in the spread. The animation will change to bring the tile to front.
28+ property bool selected: false
29+ // Set this to true when another tile in the spread is selected. The animation will change to fade this tile out.
30+ property bool otherSelected: false
31+ // Set this to true when this tile a currently active on either the MS or the SS.
32+ property bool active: false
33+
34+ property int zIndex
35+ property real progress: 0
36+ property real animatedProgress: 0
37+
38+ property real startDistance: units.gu(5)
39+ property real endDistance: units.gu(.5)
40+
41+ property real startScale: 1.1
42+ property real endScale: 0.7
43+ property real dragStartScale: startScale + .2
44+
45+ property real startAngle: 15
46+ property real endAngle: 5
47+
48+ property bool isInSideStage: false
49+
50+ property int dragOffset: 0
51+
52+ dropShadow: spreadView.active ||
53+ (active && model.stage == ApplicationInfoInterface.MainStage && priv.xTranslate != 0)
54+
55+ onSelectedChanged: {
56+ if (selected) {
57+ priv.snapshot();
58+ }
59+ priv.isSelected = selected;
60+ }
61+
62+ onOtherSelectedChanged: {
63+ if (otherSelected) {
64+ priv.snapshot();
65+ }
66+ priv.otherSelected = otherSelected;
67+ }
68+
69+ Connections {
70+ target: spreadView
71+
72+ onPhaseChanged: {
73+ if (spreadView.phase == 1) {
74+ var phase2Progress = spreadView.positionMarker4 - (root.zIndex * spreadView.tileDistance / spreadView.width);
75+ priv.phase2StartTranslate = priv.easingAnimation(0, 1, 0, -spreadView.width + (root.zIndex * root.endDistance), phase2Progress);
76+ priv.phase2StartScale = priv.easingAnimation(0, 1, root.startScale, root.endScale, phase2Progress);
77+ priv.phase2StartAngle = priv.easingAnimation(0, 1, root.startAngle, root.endAngle, phase2Progress);
78+ priv.phase2StartTopMarginProgress = priv.easingAnimation(0, 1, 0, 1, phase2Progress);
79+ }
80+ }
81+ }
82+
83+ // Required to be an item because we're using states on it.
84+ Item {
85+ id: priv
86+
87+ // true if this is the next tile on the stack that comes in when dragging from the right
88+ property bool nextInStack: spreadView.nextZInStack == zIndex
89+ // true if the next tile in the stack is the nextInStack one. This one will be moved a bit to the left
90+ property bool movedActive: spreadView.nextZInStack == zIndex + 1
91+ property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
92+
93+ property real phase2StartTranslate
94+ property real phase2StartScale
95+ property real phase2StartAngle
96+ property real phase2StartTopMarginProgress
97+
98+ property bool isSelected: false
99+ property bool otherSelected: false
100+ property real selectedProgress
101+ property real selectedXTranslate
102+ property real selectedAngle
103+ property real selectedScale
104+ property real selectedOpacity
105+ property real selectedTopMarginProgress
106+
107+ function snapshot() {
108+ selectedProgress = root.progress;
109+ selectedXTranslate = xTranslate;
110+ selectedAngle = angle;
111+ selectedScale = priv.scale;
112+ selectedOpacity = priv.opacityTransform;
113+ selectedTopMarginProgress = topMarginProgress;
114+ }
115+
116+ // This calculates how much negative progress there can be if unwinding the spread completely
117+ // the progress for each tile starts at 0 when it crosses the right edge, so the later a tile comes in,
118+ // the bigger its negativeProgress can be.
119+ property real negativeProgress: {
120+ if (nextInStack && spreadView.phase < 2) {
121+ return 0;
122+ }
123+ return -root.zIndex * spreadView.tileDistance / spreadView.width;
124+ }
125+
126+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
127+ // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
128+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
129+ }
130+
131+ function easingAnimation(startProgress, endProgress, startValue, endValue, progress) {
132+ helperEasingCurve.progress = progress - startProgress;
133+ helperEasingCurve.period = endProgress - startProgress;
134+ return helperEasingCurve.value * (endValue - startValue) + startValue;
135+ }
136+
137+ Behavior on xTranslate {
138+ enabled: !spreadView.active &&
139+ !snapAnimation.running &&
140+ model.appId !== "unity8-dash" &&
141+ !spreadView.sideStageDragging
142+ UbuntuNumberAnimation {
143+ duration: UbuntuAnimation.FastDuration
144+ }
145+ }
146+
147+ property real xTranslate: {
148+ var newTranslate = 0;
149+
150+ if (otherSelected) {
151+ return priv.selectedXTranslate;
152+ }
153+
154+ if (isSelected) {
155+ if (model.stage == ApplicationInfoInterface.MainStage) {
156+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress);
157+ } else {
158+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.sideStageWidth, root.progress);
159+ }
160+ }
161+
162+ // The tile should move a bit to the left if a new one comes on top of it, but not for the Side Stage and not
163+ // when we're only dragging the side stage in on top of a main stage app
164+ var shouldMoveAway = spreadView.nextInStack >= 0 && priv.movedActive && model.stage === ApplicationInfoInterface.MainStage &&
165+ ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
166+
167+ if (active) {
168+ newTranslate -= root.width
169+ // Only do the hide animation for active apps in the mainstage, and not if we only drag the ss in
170+ if (spreadView.phase == 0 && shouldMoveAway) {
171+ newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -units.gu(4), root.animatedProgress);
172+ }
173+ newTranslate += root.dragOffset;
174+ }
175+ if (!spreadView.active && model.appId == "unity8-dash" && !root.active) {
176+ newTranslate -= root.width;
177+ }
178+
179+ if (nextInStack && spreadView.phase == 0) {
180+ if (model.stage == ApplicationInfoInterface.MainStage) {
181+ if (spreadView.sideStageVisible && root.progress > 0) {
182+ // Move it so it appears from behind the side stage immediately
183+ newTranslate += -spreadView.sideStageWidth;
184+ }
185+ }
186+
187+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
188+ // This is when we only drag the side stage in, without rotation or snapping
189+ newTranslate = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth, root.progress);
190+ } else {
191+ newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth * spreadView.snapPosition, root.animatedProgress);
192+ }
193+ }
194+
195+ if (spreadView.phase == 1) {
196+ if (nextInStack) {
197+ if (model.stage == ApplicationInfoInterface.MainStage) {
198+ var startValue = -spreadView.sideStageWidth * spreadView.snapPosition + (spreadView.sideStageVisible ? -spreadView.sideStageWidth : 0);
199+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startValue, priv.phase2StartTranslate, root.animatedProgress);
200+ } else {
201+ var endValue = -spreadView.width + spreadView.width * root.zIndex / 6;
202+ if (!spreadView.sideStageVisible) {
203+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.sideStageWidth, priv.phase2StartTranslate, root.progress);
204+ } else {
205+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.sideStageWidth * spreadView.snapPosition, priv.phase2StartTranslate, root.animatedProgress);
206+ }
207+ }
208+ } else if (root.active) {
209+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
210+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
211+ var startTranslate = -root.width + (shouldMoveAway ? -units.gu(4) : 0);
212+ newTranslate = linearAnimation(startProgress, endProgress, startTranslate, priv.phase2StartTranslate, root.progress);
213+ } else {
214+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
215+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
216+ newTranslate = linearAnimation(startProgress, endProgress, 0, priv.phase2StartTranslate, root.progress);
217+ }
218+ }
219+
220+ if (spreadView.phase == 2) {
221+ newTranslate = -easingCurve.value * (spreadView.width - root.zIndex * animatedEndDistance);
222+ }
223+
224+ return newTranslate;
225+ }
226+
227+ property real scale: {
228+ if (!spreadView.active) {
229+ return 1;
230+ }
231+
232+ if (otherSelected) {
233+ return selectedScale;
234+ }
235+
236+ if (isSelected) {
237+ return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
238+ }
239+
240+ if (spreadView.phase == 0) {
241+ if (nextInStack) {
242+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
243+ return 1;
244+ } else {
245+ var targetScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
246+ return linearAnimation(0, spreadView.positionMarker2, root.dragStartScale, targetScale, root.animatedProgress);
247+ }
248+ } else if (active) {
249+ return 1;
250+ } else {
251+ return linearAnimation(0, spreadView.positionMarker2, root.startScale, root.endScale, root.progress);
252+ }
253+ }
254+
255+ if (spreadView.phase == 1) {
256+ if (nextInStack) {
257+ var startScale = 1;
258+ if (model.stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
259+ startScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
260+ }
261+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startScale, priv.phase2StartScale, root.animatedProgress);
262+ }
263+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
264+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
265+ return linearAnimation(startProgress, endProgress, 1, priv.phase2StartScale, root.animatedProgress);
266+ }
267+
268+ if (spreadView.phase == 2) {
269+ return root.startScale - easingCurve.value * (root.startScale - root.endScale);
270+ }
271+
272+ return 1;
273+ }
274+
275+ property real angle: {
276+ if (!spreadView.active) {
277+ return 0;
278+ }
279+
280+ if (otherSelected) {
281+ return selectedAngle;
282+ }
283+ if (isSelected) {
284+ return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
285+ }
286+
287+ // The tile should rotate a bit when another one comes on top, but not when only dragging the side stage in
288+ var shouldMoveAway = spreadView.nextInStack >= 0 && movedActive &&
289+ (ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
290+ model.stage == ApplicationInfoInterface.SideStage);
291+
292+ if (spreadView.phase == 0) {
293+ if (nextInStack) {
294+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
295+ return 0;
296+ } else {
297+ return linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
298+ }
299+ }
300+ if (shouldMoveAway) {
301+ return linearAnimation(0, spreadView.positionMarker2, 0, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
302+ }
303+ }
304+ if (spreadView.phase == 1) {
305+ if (nextInStack) {
306+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
307+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.phase2StartAngle, root.animatedProgress);
308+ } else {
309+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.phase2StartAngle, root.animatedProgress);
310+ }
311+ }
312+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
313+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
314+ var startAngle = shouldMoveAway ? root.startAngle * (1-spreadView.snapPosition) : 0;
315+ return linearAnimation(startProgress, endProgress, startAngle, priv.phase2StartAngle, root.progress);
316+ }
317+ if (spreadView.phase == 2) {
318+ return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
319+ }
320+
321+ return 0;
322+ }
323+
324+ property real opacityTransform: {
325+ if (otherSelected && spreadView.phase == 2) {
326+ return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress);
327+ }
328+
329+ return 1;
330+ }
331+
332+ property real topMarginProgress: {
333+ if (priv.isSelected) {
334+ return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
335+ }
336+ switch (spreadView.phase) {
337+ case 0:
338+ return 0;
339+ case 1:
340+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
341+ 0, priv.phase2StartTopMarginProgress, root.progress);
342+ }
343+ return 1;
344+ }
345+
346+ states: [
347+ State {
348+ name: "sideStageDragging"; when: spreadView.sideStageDragging && root.isInSideStage
349+ PropertyChanges { target: priv; xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress }
350+ }
351+ ]
352+ }
353+
354+ transform: [
355+ Rotation {
356+ origin { x: 0; y: spreadView.height / 2 }
357+ axis { x: 0; y: 1; z: 0 }
358+ angle: priv.angle
359+ },
360+ Scale {
361+ origin { x: 0; y: spreadView.height / 2 }
362+ xScale: priv.scale
363+ yScale: xScale
364+ },
365+ Scale {
366+ origin { x: 0; y: (spreadView.height * priv.scale) + maximizedAppTopMargin * 3 }
367+ xScale: 1
368+ yScale: isFullscreen ? 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height : 1
369+ },
370+ Translate {
371+ x: priv.xTranslate
372+ }
373+ ]
374+ opacity: priv.opacityTransform
375+
376+ UbuntuNumberAnimation {
377+ id: fadeBackInAnimation
378+ target: root
379+ property: "opacity"
380+ duration: UbuntuAnimation.SlowDuration
381+ from: 0
382+ to: 1
383+ }
384+
385+ EasingCurve {
386+ id: easingCurve
387+ type: EasingCurve.OutSine
388+ period: 1
389+ progress: root.progress
390+ }
391+
392+ EasingCurve {
393+ id: helperEasingCurve
394+ type: easingCurve.type
395+ period: easingCurve.period
396+ }
397+}
run.sh+15−6
@@ -8,6 +8,7 @@ GDB=false
8FAKE=false
8FAKE=false
9PINLOCK=false
9PINLOCK=false
10KEYLOCK=false
10KEYLOCK=false
11+USE_MOCKS=false
11MOUSE_TOUCH=true
12MOUSE_TOUCH=true
12
13
13usage() {
14usage() {
@@ -31,9 +32,9 @@ eval set -- "$ARGS"
31while [ $# -gt 0 ]
32while [ $# -gt 0 ]
32do
33do
33 case "$1" in
34 case "$1" in
34− -f|--fake) FAKE=true;;
35+ -f|--fake) FAKE=true; USE_MOCKS=true;;
35− -p|--pinlock) PINLOCK=true;;
36+ -p|--pinlock) PINLOCK=true; USE_MOCKS=true;;
36− -k|--keylock) KEYLOCK=true;;
37+ -k|--keylock) KEYLOCK=true; USE_MOCKS=true;;
37 -g|--gdb) GDB=true;;
38 -g|--gdb) GDB=true;;
38 -h|--help) usage;;
39 -h|--help) usage;;
39 -m|--nomousetouch) MOUSE_TOUCH=false;;
40 -m|--nomousetouch) MOUSE_TOUCH=false;;
@@ -43,20 +44,28 @@ do
43done
44done
44
45
45if $FAKE; then
46if $FAKE; then
46− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
47 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
47 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
48fi
48fi
49
49
50if $PINLOCK; then
50if $PINLOCK; then
51− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
52 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
51 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
53fi
52fi
54
53
55if $KEYLOCK; then
54if $KEYLOCK; then
56− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
57 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
55 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
58fi
56fi
59
57
58+if $USE_MOCKS; then
59+ rm -f $PWD/builddir/nonmirplugins/LightDM # undo symlink (from below) for cleanliness
60+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
61+else
62+ # Still fake no-login user for convenience (it's annoying to be prompted for your password when testing)
63+ # And in particular, just link our LightDM mock into the nonmirplugins folder. We don't want the rest of
64+ # our plugins to be used.
65+ ln -s $PWD/builddir/tests/mocks/LightDM $PWD/builddir/nonmirplugins/
66+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/LightDM/single
67+fi
68+
60QML_PHONE_SHELL_ARGS=""
69QML_PHONE_SHELL_ARGS=""
61if $MOUSE_TOUCH; then
70if $MOUSE_TOUCH; then
62 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
71 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
run_on_device.sh+1−3
@@ -2,7 +2,6 @@
2CODE_DIR=shell
2CODE_DIR=shell
3USER=phablet
3USER=phablet
4USER_ID=32011
4USER_ID=32011
5−PASSWORD=phablet
6PACKAGE=unity8
5PACKAGE=unity8
7BINARY=unity8
6BINARY=unity8
8TARGET_IP=${TARGET_IP-127.0.0.1}
7TARGET_IP=${TARGET_IP-127.0.0.1}
@@ -13,7 +12,6 @@ SETUP=false
13GDB=false
12GDB=false
14PINLOCK=false
13PINLOCK=false
15KEYLOCK=false
14KEYLOCK=false
16−SUDO="echo $PASSWORD | sudo -S"
17NUM_JOBS='$(( `grep -c ^processor /proc/cpuinfo` + 1 ))'
15NUM_JOBS='$(( `grep -c ^processor /proc/cpuinfo` + 1 ))'
18FLIPPED=false
16FLIPPED=false
19CHROOT_PREFIX="/data/ubuntu"
17CHROOT_PREFIX="/data/ubuntu"
@@ -76,7 +74,7 @@ setup_adb_forwarding() {
76
74
77install_dependencies() {
75install_dependencies() {
78 exec_with_adb apt-get update
76 exec_with_adb apt-get update
79− exec_with_ssh $SUDO apt-get -y install build-essential rsync bzr ccache gdb ninja-build devscripts equivs unity-plugin-scopes
77+ exec_with_adb apt-get -y --force-yes install build-essential rsync bzr ccache gdb ninja-build devscripts equivs unity-plugin-scopes
80}
78}
81
79
82sync_code() {
80sync_code() {
src/CMakeLists.txt+1−3
@@ -1,8 +1,5 @@
1−pkg_check_modules(UNITY-MIR REQUIRED unity-mir)
2−
3include_directories(
1include_directories(
4 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
2 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
5− ${UNITY-MIR_INCLUDE_DIRS}
6)
3)
7
4
8file(GLOB_RECURSE QML_FILES
5file(GLOB_RECURSE QML_FILES
@@ -38,3 +35,4 @@ install(TARGETS ${SHELL_APP}
38 )
35 )
39
36
40add_subdirectory(Panel)
37add_subdirectory(Panel)
38+add_subdirectory(Dash)
src/Dash/CMakeLists.txtnew file+13
@@ -0,0 +1,13 @@
1+set(DASH_SRCS
2+ main.cpp
3+ ../MouseTouchAdaptor.cpp
4+)
5+
6+add_executable(unity8-dash ${DASH_SRCS})
7+
8+qt5_use_modules(unity8-dash Gui Qml Quick Test)
9+
10+# install binaries
11+install(TARGETS ${DASH_APP}
12+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
13+)
src/Dash/main.cppnew file+96
@@ -0,0 +1,96 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * Authors:
5+ * Michael Zanetti <michael.zanetti@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+#include <QtQuick/QQuickView>
21+#include <QtGui/QGuiApplication>
22+#include <QtQml/QQmlEngine>
23+#include <QtQml/QQmlContext>
24+#include <QDebug>
25+#include <QCommandLineParser>
26+#include <QLibrary>
27+#include <libintl.h>
28+
29+#include <paths.h>
30+#include "../MouseTouchAdaptor.h"
31+
32+int main(int argc, const char *argv[])
33+{
34+ QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
35+
36+ QCommandLineParser parser;
37+ parser.setApplicationDescription("Description: Unity 8 Shell Dash");
38+ parser.addHelpOption();
39+
40+ QCommandLineOption mousetouchOption("mousetouch",
41+ "Allow the mouse to provide touch input");
42+ parser.addOption(mousetouchOption);
43+
44+ // FIXME Remove once we drop the need of the hint
45+ QCommandLineOption desktopFileHintOption("desktop_file_hint",
46+ "The desktop_file_hint option for QtMir", "hint_file");
47+ parser.addOption(desktopFileHintOption);
48+
49+ // Treat args with single dashes the same as arguments with two dashes
50+ // Ex: -fullscreen == --fullscreen
51+ parser.setSingleDashWordOptionMode(QCommandLineParser::ParseAsLongOptions);
52+ parser.process(*application);
53+
54+ if (getenv("QT_LOAD_TESTABILITY")) {
55+ QLibrary testLib(QLatin1String("qttestability"));
56+ if (testLib.load()) {
57+ typedef void (*TasInitialize)(void);
58+ TasInitialize initFunction = (TasInitialize)testLib.resolve("qt_testability_init");
59+ if (initFunction) {
60+ initFunction();
61+ } else {
62+ qCritical("Library qttestability resolve failed!");
63+ }
64+ } else {
65+ qCritical("Library qttestability load failed!");
66+ }
67+ }
68+
69+ bindtextdomain("unity8", translationDirectory().toUtf8().data());
70+
71+ QQuickView* view = new QQuickView();
72+ view->setResizeMode(QQuickView::SizeRootObjectToView);
73+ view->setTitle("Unity Dash");
74+
75+ // You will need this if you want to interact with touch-only components using a mouse
76+ // Needed only when manually testing on a desktop.
77+ MouseTouchAdaptor *mouseTouchAdaptor = 0;
78+ if (parser.isSet(mousetouchOption)) {
79+ mouseTouchAdaptor = new MouseTouchAdaptor;
80+ application->installNativeEventFilter(mouseTouchAdaptor);
81+ }
82+
83+ QUrl source(::qmlDirectory()+"Dash/DashApplication.qml");
84+ prependImportPaths(view->engine(), ::overrideImportPaths());
85+ appendImportPaths(view->engine(), ::fallbackImportPaths());
86+
87+ view->setSource(source);
88+ view->show();
89+
90+ int result = application->exec();
91+
92+ delete view;
93+ delete application;
94+
95+ return result;
96+}
src/main.cpp+21−89
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012 Canonical, Ltd.
2+ * Copyright (C) 2012-2014 Canonical, Ltd.
3 *
3 *
4 * Authors:
4 * Authors:
5 * Gerry Boland <gerry.boland@canonical.com>
5 * Gerry Boland <gerry.boland@canonical.com>
@@ -23,12 +23,10 @@
23#include <QtGui/QGuiApplication>
23#include <QtGui/QGuiApplication>
24#include <QtQml/QQmlEngine>
24#include <QtQml/QQmlEngine>
25#include <QtQml/QQmlContext>
25#include <QtQml/QQmlContext>
26−#include <qpa/qplatformnativeinterface.h>
27#include <QLibrary>
26#include <QLibrary>
28#include <QDebug>
27#include <QDebug>
29−#include <libintl.h>
30−#include <dlfcn.h>
31#include <csignal>
28#include <csignal>
29+#include <libintl.h>
32
30
33// local
31// local
34#include <paths.h>
32#include <paths.h>
@@ -36,11 +34,13 @@
36#include "ApplicationArguments.h"
34#include "ApplicationArguments.h"
37#include "CachingNetworkManagerFactory.h"
35#include "CachingNetworkManagerFactory.h"
38
36
39−#include <unity-mir/qmirserver.h>
40−
41−int startShell(int argc, const char** argv, void* server)
37+int main(int argc, const char *argv[])
42{
38{
39+ bool isMirServer = false;
43− const bool isUbuntuMirServer = qgetenv("QT_QPA_PLATFORM") == "ubuntumirserver";
40+ if (qgetenv("QT_QPA_PLATFORM") == "ubuntumirclient") {
41+ setenv("QT_QPA_PLATFORM", "mirserver", 1 /* overwrite */);
42+ isMirServer = true;
43+ }
44
44
45 QGuiApplication::setApplicationName("unity8");
45 QGuiApplication::setApplicationName("unity8");
46 QGuiApplication *application;
46 QGuiApplication *application;
@@ -70,21 +70,7 @@ int startShell(int argc, const char** argv, void* server)
70Load the testability driver");
70Load the testability driver");
71 parser.addOption(testabilityOption);
71 parser.addOption(testabilityOption);
72
72
73− if (isUbuntuMirServer) {
74− QLibrary unityMir("unity-mir", 1);
75− unityMir.load();
76−
77− typedef QGuiApplication* (*createServerApplication_t)(int&, const char **, void*);
78− createServerApplication_t createQMirServerApplication = (createServerApplication_t) unityMir.resolve("createQMirServerApplication");
79− if (!createQMirServerApplication) {
80− qDebug() << "unable to resolve symbol: createQMirServerApplication";
81− return 4;
82− }
83−
84− application = createQMirServerApplication(argc, argv, server);
85− } else {
86− application = new QGuiApplication(argc, (char**)argv);
73+ application = new QGuiApplication(argc, (char**)argv);
87− }
88
74
89 // Treat args with single dashes the same as arguments with two dashes
75 // Treat args with single dashes the same as arguments with two dashes
90 // Ex: -fullscreen == --fullscreen
76 // Ex: -fullscreen == --fullscreen
@@ -100,8 +86,8 @@ Load the testability driver");
100 if (parser.isSet(windowGeometryOption) &&
86 if (parser.isSet(windowGeometryOption) &&
101 parser.value(windowGeometryOption).split('x').size() == 2)
87 parser.value(windowGeometryOption).split('x').size() == 2)
102 {
88 {
103− QStringList geom = parser.value(windowGeometryOption).split('x');
89+ QStringList geom = parser.value(windowGeometryOption).split('x');
104− qmlArgs.setSize(geom.at(0).toInt(), geom.at(1).toInt());
90+ qmlArgs.setSize(geom.at(0).toInt(), geom.at(1).toInt());
105 }
91 }
106
92
107 // The testability driver is only loaded by QApplication but not by QGuiApplication.
93 // The testability driver is only loaded by QApplication but not by QGuiApplication.
@@ -125,7 +111,8 @@ Load the testability driver");
125
111
126 QQuickView* view = new QQuickView();
112 QQuickView* view = new QQuickView();
127 view->setResizeMode(QQuickView::SizeRootObjectToView);
113 view->setResizeMode(QQuickView::SizeRootObjectToView);
114+ view->setColor("black");
128− view->setTitle("Qml Phone Shell");
115+ view->setTitle("Unity8 Shell");
129 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
116 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
130 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
117 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
131 view->rootContext()->setContextProperty("indicatorProfile", indicatorProfile);
118 view->rootContext()->setContextProperty("indicatorProfile", indicatorProfile);
@@ -141,18 +128,9 @@ Load the testability driver");
141 application->installNativeEventFilter(mouseTouchAdaptor);
128 application->installNativeEventFilter(mouseTouchAdaptor);
142 }
129 }
143
130
144− QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface();
145− /* Shell is declared as a system session so that it always receives all
146− input events.
147− FIXME: use the enum value corresponding to SYSTEM_SESSION_TYPE (= 1)
148− when it becomes available.
149− */
150− nativeInterface->setProperty("ubuntuSessionType", 1);
151− view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE
152−
153 QUrl source(::qmlDirectory()+"Shell.qml");
131 QUrl source(::qmlDirectory()+"Shell.qml");
154 prependImportPaths(view->engine(), ::overrideImportPaths());
132 prependImportPaths(view->engine(), ::overrideImportPaths());
155− if (!isUbuntuMirServer) {
133+ if (!isMirServer) {
156 prependImportPaths(view->engine(), ::nonMirImportPaths());
134 prependImportPaths(view->engine(), ::nonMirImportPaths());
157 }
135 }
158 appendImportPaths(view->engine(), ::fallbackImportPaths());
136 appendImportPaths(view->engine(), ::fallbackImportPaths());
@@ -161,10 +139,15 @@ Load the testability driver");
161 view->engine()->setNetworkAccessManagerFactory(managerFactory);
139 view->engine()->setNetworkAccessManagerFactory(managerFactory);
162
140
163 view->setSource(source);
141 view->setSource(source);
164− view->setColor("transparent");
165 QObject::connect(view->engine(), SIGNAL(quit()), application, SLOT(quit()));
142 QObject::connect(view->engine(), SIGNAL(quit()), application, SLOT(quit()));
166
143
144+ if (!isMirServer && qEnvironmentVariableIsSet("UNITY_MIR_EMITS_SIGSTOP")) {
145+ // Emit SIGSTOP as expected by upstart, under Mir it's qtmir that will raise it.
146+ // see http://upstart.ubuntu.com/cookbook/#expect-stop
147+ raise(SIGSTOP);
148+ }
149+
167− if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || isUbuntuMirServer || parser.isSet(fullscreenOption)) {
150+ if (isMirServer || parser.isSet(fullscreenOption)) {
168 view->showFullScreen();
151 view->showFullScreen();
169 } else {
152 } else {
170 view->show();
153 view->show();
@@ -178,54 +161,3 @@ Load the testability driver");
178
161
179 return result;
162 return result;
180}
163}
181−
182−int main(int argc, const char *argv[])
183−{
184− /* Workaround Qt platform integration plugin not advertising itself
185− as having the following capabilities:
186− - QPlatformIntegration::ThreadedOpenGL
187− - QPlatformIntegration::BufferQueueingOpenGL
188− */
189− setenv("QML_FORCE_THREADED_RENDERER", "1", 1);
190− setenv("QML_FIXED_ANIMATION_STEP", "1", 1);
191−
192− // For ubuntumirserver/ubuntumirclient
193− if (qgetenv("QT_QPA_PLATFORM").startsWith("ubuntumir")) {
194− setenv("QT_QPA_PLATFORM", "ubuntumirserver", 1);
195−
196− // If we use unity-mir directly, we automatically link to the Mir-server
197− // platform-api bindings, which result in unexpected behaviour when
198− // running the non-Mir scenario.
199− QLibrary unityMir("unity-mir", 1);
200− unityMir.load();
201− if (!unityMir.isLoaded()) {
202− qDebug() << "Library unity-mir not found/loaded";
203− return 1;
204− }
205−
206− typedef QMirServer* (*createServer_t)(int, const char **);
207− createServer_t createQMirServer = (createServer_t) unityMir.resolve("createQMirServer");
208− if (!createQMirServer) {
209− qDebug() << "unable to resolve symbol: createQMirServer";
210− return 2;
211− }
212−
213− QMirServer* mirServer = createQMirServer(argc, argv);
214−
215− typedef int (*runWithClient_t)(QMirServer*, std::function<int(int, const char**, void*)>);
216− runWithClient_t runWithClient = (runWithClient_t) unityMir.resolve("runQMirServerWithClient");
217− if (!runWithClient) {
218− qDebug() << "unable to resolve symbol: runWithClient";
219− return 3;
220− }
221−
222− return runWithClient(mirServer, startShell);
223− } else {
224− if (qgetenv("UPSTART_JOB") == "unity8") {
225− // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
226− // see http://upstart.ubuntu.com/cookbook/#expect-stop
227− raise(SIGSTOP);
228− }
229− return startShell(argc, argv, nullptr);
230− }
231−}
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+2−2
@@ -106,7 +106,7 @@ class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
106 self.assert_current_focused_application(application_name)
106 self.assert_current_focused_application(application_name)
107
107
108 self.main_window.show_dash_swiping()
108 self.main_window.show_dash_swiping()
109− self.assert_current_focused_application('')
109+ self.assert_current_focused_application('unity8-dash')
110
110
111 process_helpers.lock_unity()
111 process_helpers.lock_unity()
112 greeter = self.main_window.get_greeter()
112 greeter = self.main_window.get_greeter()
@@ -122,4 +122,4 @@ class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
122
122
123 self.main_window.show_dash_from_launcher()
123 self.main_window.show_dash_from_launcher()
124
124
125− self.assert_current_focused_application('')
125+ self.assert_current_focused_application('unity8-dash')
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+3−2
@@ -39,7 +39,8 @@ class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
39 desktop_file_name = os.path.basename(desktop_file_path)
39 desktop_file_name = os.path.basename(desktop_file_path)
40 application_name, _ = os.path.splitext(desktop_file_name)
40 application_name, _ = os.path.splitext(desktop_file_name)
41
41
42+ self.assertEqual(
42− self.assertEqual('', self.main_window.get_current_focused_app_id())
43+ 'unity8-dash', self.main_window.get_current_focused_app_id())
43 self.addCleanup(os.system, 'pkill qmlscene')
44 self.addCleanup(os.system, 'pkill qmlscene')
44
45
45 subprocess.check_call(
46 subprocess.check_call(
@@ -47,4 +48,4 @@ class URLDispatcherTestCase(tests.ApplicationLifeCycleTestCase):
47 self.assert_current_focused_application(application_name)
48 self.assert_current_focused_application(application_name)
48
49
49 self.main_window.show_dash_swiping()
50 self.main_window.show_dash_swiping()
50− self.assert_current_focused_application('')
51+ self.assert_current_focused_application('unity8-dash')
tests/autopilot/unity8/fixture_setup.pynew file+64
@@ -0,0 +1,64 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2014 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+import fixtures
21+from autopilot import introspection
22+
23+from unity8 import process_helpers
24+from unity8.shell import emulators
25+
26+
27+class LaunchDashApp(fixtures.Fixture):
28+
29+ """Fixture to launch the Dash app."""
30+
31+ def __init__(self, binary_path, variables):
32+ """Initialize an instance.
33+
34+ :param str binary_path: The path to the Dash app binary.
35+ :param variables: The variables to use when launching the app.
36+ :type variables: A dictionary.
37+
38+ """
39+ super(LaunchDashApp, self).__init__()
40+ self.binary_path = binary_path
41+ self.variables = variables
42+
43+ def setUp(self):
44+ """Launch the dash app when the fixture is used."""
45+ super(LaunchDashApp, self).setUp()
46+ self.addCleanup(self.stop_application)
47+ self.application_proxy = self.launch_application()
48+
49+ def launch_application(self):
50+ binary_arg = 'BINARY={}'.format(self.binary_path)
51+ testability_arg = 'QT_LOAD_TESTABILITY={}'.format(1)
52+ env_args = [
53+ '{}={}'.format(key, value) for key, value in self.variables.items()
54+ ]
55+ all_args = [binary_arg, testability_arg] + env_args
56+
57+ pid = process_helpers.start_job('unity8-dash', *all_args)
58+ return introspection.get_proxy_object_for_existing_process(
59+ pid=pid,
60+ emulator_base=emulators.UnityEmulatorBase,
61+ )
62+
63+ def stop_application(self):
64+ process_helpers.stop_job('unity8-dash')
tests/autopilot/unity8/process_helpers.py+89−20
@@ -36,6 +36,10 @@ from unity8.shell.emulators import main_window as main_window_emulator
36logger = logging.getLogger(__name__)
36logger = logging.getLogger(__name__)
37
37
38
38
39+class JobError(Exception):
40+ pass
41+
42+
39class CannotAccessUnity(Exception):
43class CannotAccessUnity(Exception):
40 pass
44 pass
41
45
@@ -134,48 +138,113 @@ def restart_unity(*args):
134 """
138 """
135 status = _get_unity_status()
139 status = _get_unity_status()
136 if "start/" in status:
140 if "start/" in status:
137− try:
141+ stop_job('unity8')
138− output = subprocess.check_output(
142+
139− ['/sbin/initctl', 'stop', 'unity8'])
143+ pid = start_job('unity8', *args)
140− logger.info(output)
144+ return _get_unity_proxy_object(pid)
141− except subprocess.CalledProcessError as e:
142− e.args += (
143− "Failed to stop running instance of unity8: %s" % e.output,
144− )
145− raise
146
145
146+
147+def start_job(name, *args):
148+ """Start a job.
149+
150+ :param str name: The name of the job.
151+ :param args: The arguments to be used when starting the job.
152+ :return: The process id of the started job.
153+ :raises CalledProcessError: if the job failed to start.
154+
155+ """
156+ logger.info('Starting job {} with arguments {}.'.format(name, args))
157+ command = ['/sbin/initctl', 'start', name] + list(args)
147 try:
158 try:
148− command = ['/sbin/initctl', 'start', 'unity8'] + list(args)
149 output = subprocess.check_output(
159 output = subprocess.check_output(
150 command,
160 command,
151 stderr=subprocess.STDOUT,
161 stderr=subprocess.STDOUT,
152 universal_newlines=True,
162 universal_newlines=True,
153 )
163 )
154 logger.info(output)
164 logger.info(output)
155− pid = _get_unity_pid()
165+ pid = get_job_pid(name)
156 except subprocess.CalledProcessError as e:
166 except subprocess.CalledProcessError as e:
157− e.args += ("Failed to start unity8: %s" % e.output,)
167+ e.args += ('Failed to start {}: {}.'.format(name, e.output),)
158 raise
168 raise
159 else:
169 else:
160− return _get_unity_proxy_object(pid)
170+ return pid
161
171
162
172
163−def _get_unity_status():
173+def get_job_pid(name):
174+ """Return the process id of a running job.
175+
176+ :param str name: The name of the job.
177+ :raises JobError: if the job is not running.
178+
179+ """
180+ status = get_job_status(name)
181+ if "start/" not in status:
182+ raise JobError('{} is not in the running state.'.format(name))
183+ return int(status.split()[-1])
184+
185+
186+def get_job_status(name):
187+ """Return the status of a job.
188+
189+ :param str name: The name of the job.
190+ :raises JobError: if it's not possible to get the status of the job.
191+
192+ """
164 try:
193 try:
165 return subprocess.check_output([
194 return subprocess.check_output([
166 '/sbin/initctl',
195 '/sbin/initctl',
167 'status',
196 'status',
168− 'unity8'
197+ name
169 ], universal_newlines=True)
198 ], universal_newlines=True)
199+ except subprocess.CalledProcessError as error:
200+ raise JobError(
201+ "Unable to get {}'s status: {}".format(name, error)
202+ )
203+
204+
205+def stop_job(name):
206+ """Stop a job.
207+
208+ :param str name: The name of the job.
209+ :raises CalledProcessError: if the job failed to stop.
210+
211+ """
212+ logger.info('Stoping job {}.'.format(name))
213+ command = ['/sbin/initctl', 'stop', name]
214+ try:
215+ output = subprocess.check_output(
216+ command,
217+ stderr=subprocess.STDOUT,
218+ universal_newlines=True,
219+ )
220+ logger.info(output)
170 except subprocess.CalledProcessError as e:
221 except subprocess.CalledProcessError as e:
171− raise CannotAccessUnity("Unable to get unity's status: %s" % str(e))
222+ e.args += ('Failed to stop {}: {}.'.format(name, e.output),)
223+ raise
224+
225+
226+def is_job_running(name):
227+ """Return True if the job is running. Otherwise, False.
228+
229+ :param str name: The name of the job.
230+ :raises JobError: if it's not possible to get the status of the job.
231+
232+ """
233+ return 'start/' in get_job_status(name)
234+
235+
236+def _get_unity_status():
237+ try:
238+ return get_job_status('unity8')
239+ except JobError as error:
240+ raise CannotAccessUnity(str(error))
172
241
173
242
174def _get_unity_pid():
243def _get_unity_pid():
175− status = _get_unity_status()
244+ try:
176− if "start/" not in status:
245+ return get_job_pid('unity8')
246+ except JobError as error:
177− raise CannotAccessUnity("Unity is not in the running state.")
247+ raise CannotAccessUnity(str(error))
178− return int(status.split()[-1])
179
248
180
249
181def _get_unity_proxy_object(pid):
250def _get_unity_proxy_object(pid):
tests/autopilot/unity8/shell/emulators/dash.py+34−19
@@ -18,6 +18,7 @@
18#
18#
19
19
20import logging
20import logging
21+import ubuntuuitoolkit
21
22
22from unity8.shell import emulators
23from unity8.shell import emulators
23
24
@@ -30,6 +31,17 @@ from ubuntuuitoolkit import emulators as toolkit_emulators
30logger = logging.getLogger(__name__)
31logger = logging.getLogger(__name__)
31
32
32
33
34+class DashApp(object):
35+
36+ """Autopilot helper for the Dash app."""
37+
38+ def __init__(self, app_proxy):
39+ self.app_proxy = app_proxy
40+ self.main_view = self.app_proxy.select_single(
41+ toolkit_emulators.MainView)
42+ self.dash = self.main_view.select_single(Dash)
43+
44+
33class Dash(emulators.UnityEmulatorBase):
45class Dash(emulators.UnityEmulatorBase):
34 """An emulator that understands the Dash."""
46 """An emulator that understands the Dash."""
35
47
@@ -40,7 +52,7 @@ class Dash(emulators.UnityEmulatorBase):
40
52
41 def get_applications_grid(self):
53 def get_applications_grid(self):
42 get_grid = self.get_scope('clickscope').wait_select_single(
54 get_grid = self.get_scope('clickscope').wait_select_single(
43− 'CardFilterGrid', objectName='local')
55+ 'CardGrid', objectName='local')
44 return get_grid
56 return get_grid
45
57
46 def get_application_icon(self, text):
58 def get_application_icon(self, text):
@@ -108,35 +120,37 @@ class Dash(emulators.UnityEmulatorBase):
108 @autopilot_logging.log_action(logger.info)
120 @autopilot_logging.log_action(logger.info)
109 def _scroll_to_left_scope(self):
121 def _scroll_to_left_scope(self):
110 original_index = self.dash_content_list.currentIndex
122 original_index = self.dash_content_list.currentIndex
111− dashContent = self.select_single(objectName="dashContent")
123+ dash_content = self.select_single(objectName="dashContent")
124+ x, y, width, height = dash_content.globalRect
112− start_x = dashContent.width / 3
125+ start_x = x + width / 3
113− stop_x = dashContent.width / 3 * 2
126+ stop_x = x + width / 3 * 2
114− start_y = stop_y = dashContent.globalRect.y + 1
127+ start_y = stop_y = y + 1
115 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
128 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
116 self.dash_content_list.currentIndex.wait_for(original_index - 1)
129 self.dash_content_list.currentIndex.wait_for(original_index - 1)
117
130
118 @autopilot_logging.log_action(logger.info)
131 @autopilot_logging.log_action(logger.info)
119 def _scroll_to_right_scope(self):
132 def _scroll_to_right_scope(self):
120 original_index = self.dash_content_list.currentIndex
133 original_index = self.dash_content_list.currentIndex
121− dashContent = self.select_single(objectName="dashContent")
134+ dash_content = self.select_single(objectName="dashContent")
135+ x, y, width, height = dash_content.globalRect
122− start_x = dashContent.width / 3 * 2
136+ start_x = x + width / 3 * 2
123− stop_x = dashContent.width / 3
137+ stop_x = x + width / 3
124− start_y = stop_y = dashContent.globalRect.y + 1
138+ start_y = stop_y = y + 1
125 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
139 self.pointing_device.drag(start_x, start_y, stop_x, stop_y)
126 self.dash_content_list.currentIndex.wait_for(original_index + 1)
140 self.dash_content_list.currentIndex.wait_for(original_index + 1)
127
141
128 def enter_search_query(self, query):
142 def enter_search_query(self, query):
129 current_header = self._get_current_page_header()
143 current_header = self._get_current_page_header()
130 self.pointing_device.move(current_header.globalRect.x +
144 self.pointing_device.move(current_header.globalRect.x +
131− current_header.width - current_header.height / 2,
145+ current_header.width - current_header.height / 4,
132 current_header.globalRect.y +
146 current_header.globalRect.y +
133− current_header.height / 2)
147+ current_header.height / 4)
134 self.pointing_device.click()
148 self.pointing_device.click()
135 headerContainer = current_header.select_single(objectName="headerContainer")
149 headerContainer = current_header.select_single(objectName="headerContainer")
136 headerContainer.contentY.wait_for(0)
150 headerContainer.contentY.wait_for(0)
137 search_text_field = self._get_search_text_field()
151 search_text_field = self._get_search_text_field()
138 search_text_field.write(query)
152 search_text_field.write(query)
139− current_header.select_single(objectName="searchIndicator").running.wait_for(False)
153+ self.select_single(objectName="processingIndicator").visible.wait_for(False)
140
154
141 def _get_search_text_field(self):
155 def _get_search_text_field(self):
142 page_header = self._get_current_page_header()
156 page_header = self._get_current_page_header()
@@ -151,6 +165,10 @@ class Dash(emulators.UnityEmulatorBase):
151 return None
165 return None
152
166
153
167
168+class ListViewWithPageHeader(ubuntuuitoolkit.QQuickFlickable):
169+ pass
170+
171+
154class GenericScopeView(emulators.UnityEmulatorBase):
172class GenericScopeView(emulators.UnityEmulatorBase):
155 """Autopilot emulator for generic scopes."""
173 """Autopilot emulator for generic scopes."""
156
174
@@ -183,10 +201,6 @@ class GenericScopeView(emulators.UnityEmulatorBase):
183 raise emulators.UnityEmulatorException(
201 raise emulators.UnityEmulatorException(
184 'No category found with name {}'.format(category))
202 'No category found with name {}'.format(category))
185
203
186−
187−class DashApps(GenericScopeView):
188− """Autopilot emulator for the applications scope."""
189−
190 def get_applications(self, category):
204 def get_applications(self, category):
191 """Return the list of applications on a category.
205 """Return the list of applications on a category.
192
206
@@ -194,16 +208,17 @@ class DashApps(GenericScopeView):
194
208
195 """
209 """
196 category_element = self._get_category_element(category)
210 category_element = self._get_category_element(category)
211+ see_all = category_element.select_single(objectName='seeAll')
197 application_cards = category_element.select_many('AbstractButton')
212 application_cards = category_element.select_many('AbstractButton')
198
213
199− # sort by y, x
200 application_cards = sorted(
214 application_cards = sorted(
201− application_cards,
215+ (card for card in application_cards
216+ if card.globalRect.y < see_all.globalRect.y),
202 key=lambda card: (card.globalRect.y, card.globalRect.x))
217 key=lambda card: (card.globalRect.y, card.globalRect.x))
203
218
204 result = []
219 result = []
205 for card in application_cards:
220 for card in application_cards:
206− if card.objectName != 'cardToolCard':
221+ if card.objectName not in ('cardToolCard', 'seeAll'):
207 result.append(card.title)
222 result.append(card.title)
208 return result
223 return result
209
224
tests/autopilot/unity8/shell/emulators/greeter.py+4−1
@@ -17,6 +17,8 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20+import ubuntuuitoolkit
21+
20from unity8.shell.emulators import UnityEmulatorBase
22from unity8.shell.emulators import UnityEmulatorBase
21
23
22
24
@@ -37,4 +39,5 @@ class Greeter(UnityEmulatorBase):
37 self.created.wait_for(False)
39 self.created.wait_for(False)
38
40
39 def get_prompt(self):
41 def get_prompt(self):
42+ return self.select_single(
40− return self.select_single("TextField", objectName="passwordInput")
43+ ubuntuuitoolkit.TextField, objectName='passwordInput')
tests/autopilot/unity8/shell/emulators/main_window.py+36−23
@@ -25,7 +25,6 @@ from autopilot import input
25from unity8.shell import emulators
25from unity8.shell import emulators
26from unity8.shell.emulators.greeter import Greeter
26from unity8.shell.emulators.greeter import Greeter
27from unity8.shell.emulators.hud import Hud
27from unity8.shell.emulators.hud import Hud
28−from unity8.shell.emulators.dash import Dash
29from unity8.shell.emulators.launcher import Launcher
28from unity8.shell.emulators.launcher import Launcher
30
29
31logger = logging.getLogger(__name__)
30logger = logging.getLogger(__name__)
@@ -61,9 +60,6 @@ class QQuickView(emulators.UnityEmulatorBase):
61 def get_hud_edge_drag_area(self):
60 def get_hud_edge_drag_area(self):
62 return self.select_single(objectName="hudDragArea")
61 return self.select_single(objectName="hudDragArea")
63
62
64− def get_dash(self):
65− return self.select_single(Dash)
66−
67 def get_bottombar(self):
63 def get_bottombar(self):
68 return self.select_single("Bottombar")
64 return self.select_single("Bottombar")
69
65
@@ -73,12 +69,6 @@ class QQuickView(emulators.UnityEmulatorBase):
73 objectName="pinPadLoader"
69 objectName="pinPadLoader"
74 )
70 )
75
71
76− def get_pinPadButton(self, buttonId):
77− return self.select_single(
78− "PinPadButton",
79− objectName="pinPadButton%i" % buttonId
80− )
81−
82 def get_lockscreen(self):
72 def get_lockscreen(self):
83 return self.select_single("Lockscreen")
73 return self.select_single("Lockscreen")
84
74
@@ -114,30 +104,25 @@ class QQuickView(emulators.UnityEmulatorBase):
114 @autopilot_logging.log_action(logger.info)
104 @autopilot_logging.log_action(logger.info)
115 def show_dash_swiping(self):
105 def show_dash_swiping(self):
116 """Show the dash swiping from the left."""
106 """Show the dash swiping from the left."""
117− width = self.width
107+ x, y, width, height = self._get_shell().globalRect
118− height = self.height
119− start_x = 0
108+ start_x = x
120− start_y = height // 2
121− end_x = width
109+ end_x = x + width
122− end_y = start_y
110+ start_y = end_y = y + height // 2
123
111
124 self.pointing_device.drag(start_x, start_y, end_x, end_y)
112 self.pointing_device.drag(start_x, start_y, end_x, end_y)
113+
114+ def _get_shell(self):
125− return self.get_dash()
115+ return self.select_single('Shell')
126
116
127 def get_current_focused_app_id(self):
117 def get_current_focused_app_id(self):
128 """Return the id of the focused application."""
118 """Return the id of the focused application."""
129− return self.select_single('Shell').focusedApplicationId
119+ return self._get_shell().focusedApplicationId
130−
131− @autopilot_logging.log_action(logger.info)
132− def search(self, query):
133− self.get_dash().enter_search_query(query)
134
120
135 @autopilot_logging.log_action(logger.info)
121 @autopilot_logging.log_action(logger.info)
136 def show_dash_from_launcher(self):
122 def show_dash_from_launcher(self):
137 """Open the dash clicking the dash icon on the launcher."""
123 """Open the dash clicking the dash icon on the launcher."""
138 launcher = self.open_launcher()
124 launcher = self.open_launcher()
139 launcher.click_dash_icon()
125 launcher.click_dash_icon()
140− return self.get_dash()
141
126
142 @autopilot_logging.log_action(logger.info)
127 @autopilot_logging.log_action(logger.info)
143 def open_launcher(self):
128 def open_launcher(self):
@@ -150,3 +135,31 @@ class QQuickView(emulators.UnityEmulatorBase):
150
135
151 def is_launcher_open(self):
136 def is_launcher_open(self):
152 return self._get_launcher().shown
137 return self._get_launcher().shown
138+
139+ def enter_pin_code(self, code):
140+ """Enter code 'code' into the single-pin lightdm pincode entry screen.
141+
142+ :param code: must be a string of numeric characters.
143+ :raises: TypeError if code is not a string.
144+ :raises: ValueError if code contains non-numeric characters.
145+
146+ """
147+ if not isinstance(code, str):
148+ raise TypeError(
149+ "'code' parameter must be a string, not %r."
150+ % type(code)
151+ )
152+ for num in code:
153+ if not num.isdigit():
154+ raise ValueError(
155+ "'code' parameter contains non-numeric characters."
156+ )
157+ self.pointing_device.click_object(
158+ self._get_pinpad_button(int(num)))
159+
160+ def _get_pinpad_button(self, button_id):
161+ return self.select_single(
162+ 'PinPadButton',
163+ objectName='pinPadButton{}'.format(button_id)
164+ )
165+>>>>>>> MERGE-SOURCE
tests/autopilot/unity8/shell/tests/__init__.py+141−48
@@ -24,6 +24,7 @@ try:
24except ImportError:
24except ImportError:
25 Gio = None
25 Gio = None
26
26
27+from autopilot import introspection
27from autopilot.platform import model
28from autopilot.platform import model
28from autopilot.testcase import AutopilotTestCase
29from autopilot.testcase import AutopilotTestCase
29from autopilot.matchers import Eventually
30from autopilot.matchers import Eventually
@@ -34,6 +35,10 @@ import os.path
34import subprocess
35import subprocess
35import sys
36import sys
36from testtools.matchers import Equals
37from testtools.matchers import Equals
38+from ubuntuuitoolkit import (
39+ fixture_setup as toolkit_fixtures,
40+ ubuntu_scenarios
41+)
37
42
38from unity8 import (
43from unity8 import (
39 get_lib_path,
44 get_lib_path,
@@ -42,9 +47,15 @@ from unity8 import (
42 get_default_extra_mock_libraries,
47 get_default_extra_mock_libraries,
43 get_data_dirs
48 get_data_dirs
44)
49)
45−from unity8.process_helpers import restart_unity_with_testability
50+from unity8 import (
51+ fixture_setup,
52+ process_helpers
53+)
54+from unity8.shell import emulators
55+from unity8.shell.emulators import (
56+ dash as dash_helpers,
46−from unity8.shell.emulators import main_window as main_window_emulator
57+ main_window as main_window_emulator,
47−from unity8.shell.emulators.dash import Dash
58+)
48
59
49
60
50logger = logging.getLogger(__name__)
61logger = logging.getLogger(__name__)
@@ -78,6 +89,26 @@ def _get_device_emulation_scenarios(devices='All'):
78 return [native]
89 return [native]
79
90
80
91
92+def is_unity7_running():
93+ """Return True if Unity7 is running. Otherwise, return False."""
94+ return (
95+ Gio is not None and
96+ UNITYSHELL_GSETTINGS_SCHEMA in
97+ Gio.Settings.list_relocatable_schemas()
98+ )
99+
100+
101+def get_qml_import_path_with_mock():
102+ """Return the QML2_IMPORT_PATH value with the mock path prepended."""
103+ qml_import_path = [get_mocks_library_path()]
104+ if os.getenv('QML2_IMPORT_PATH') is not None:
105+ qml_import_path.append(os.getenv('QML2_IMPORT_PATH'))
106+
107+ qml_import_path = ':'.join(qml_import_path)
108+ logger.info("New QML2 import path: %s", qml_import_path)
109+ return qml_import_path
110+
111+
81class UnityTestCase(AutopilotTestCase):
112class UnityTestCase(AutopilotTestCase):
82
113
83 """A test case base class for the Unity shell tests."""
114 """A test case base class for the Unity shell tests."""
@@ -118,23 +149,8 @@ class UnityTestCase(AutopilotTestCase):
118
149
119 def setUp(self):
150 def setUp(self):
120 super(UnityTestCase, self).setUp()
151 super(UnityTestCase, self).setUp()
121− if (Gio is not None and
152+ if is_unity7_running():
122− UNITYSHELL_GSETTINGS_SCHEMA in
153+ self.useFixture(toolkit_fixtures.HideUnity7Launcher())
123− Gio.Settings.list_relocatable_schemas()):
124−
125− # Hide Unity launcher
126− self._unityshell_schema = Gio.Settings.new_with_path(
127− UNITYSHELL_GSETTINGS_SCHEMA,
128− UNITYSHELL_GSETTINGS_PATH,
129− )
130− self._launcher_hide_mode = self._unityshell_schema.get_int(
131− UNITYSHELL_LAUNCHER_KEY,
132− )
133− self._unityshell_schema.set_int(
134− UNITYSHELL_LAUNCHER_KEY,
135− UNITYSHELL_LAUNCHER_MODE,
136− )
137− self.addCleanup(self._reset_launcher)
138
154
139 self._proxy = None
155 self._proxy = None
140 self._lightdm_mock_type = None
156 self._lightdm_mock_type = None
@@ -151,13 +167,6 @@ class UnityTestCase(AutopilotTestCase):
151 self.touch = Touch.create()
167 self.touch = Touch.create()
152 self._setup_display_details()
168 self._setup_display_details()
153
169
154− def _reset_launcher(self):
155− """Reset Unity launcher hide mode"""
156− self._unityshell_schema.set_int(
157− UNITYSHELL_LAUNCHER_KEY,
158− self._launcher_hide_mode,
159− )
160−
161 def _setup_display_details(self):
170 def _setup_display_details(self):
162 scale_divisor = self._determine_geometry()
171 scale_divisor = self._determine_geometry()
163 self._setup_grid_size(scale_divisor)
172 self._setup_grid_size(scale_divisor)
@@ -263,7 +272,9 @@ class UnityTestCase(AutopilotTestCase):
263 self.patch_lightdm_mock()
272 self.patch_lightdm_mock()
264
273
265 if self._qml_mock_enabled:
274 if self._qml_mock_enabled:
266− self._setup_extra_mock_environment_patch()
275+ self._environment['QML2_IMPORT_PATH'] = (
276+ get_qml_import_path_with_mock()
277+ )
267
278
268 if self._data_dirs_mock_enabled:
279 if self._data_dirs_mock_enabled:
269 self._patch_data_dirs()
280 self._patch_data_dirs()
@@ -292,9 +303,14 @@ class UnityTestCase(AutopilotTestCase):
292
303
293 # Ensure that the dash is visible before we return:
304 # Ensure that the dash is visible before we return:
294 logger.debug("Unity started, waiting for it to be ready.")
305 logger.debug("Unity started, waiting for it to be ready.")
295− self.assertUnityReady()
306+ self.wait_for_unity()
296 logger.debug("Unity loaded and ready.")
307 logger.debug("Unity loaded and ready.")
297
308
309+ if model() == 'Desktop':
310+ # On desktop, close the dash because it's opened in a separate
311+ # window and it gets in the way.
312+ process_helpers.stop_job('unity8-dash')
313+
298 return app_proxy
314 return app_proxy
299
315
300 def _launch_unity_with_upstart(self, binary_path, args):
316 def _launch_unity_with_upstart(self, binary_path, args):
@@ -308,7 +324,7 @@ class UnityTestCase(AutopilotTestCase):
308
324
309 self.addCleanup(self._cleanup_launching_upstart_unity)
325 self.addCleanup(self._cleanup_launching_upstart_unity)
310
326
311− return restart_unity_with_testability(*all_args)
327+ return process_helpers.restart_unity_with_testability(*all_args)
312
328
313 def _cleanup_launching_upstart_unity(self):
329 def _cleanup_launching_upstart_unity(self):
314 logger.info("Stopping unity")
330 logger.info("Stopping unity")
@@ -353,15 +369,6 @@ class UnityTestCase(AutopilotTestCase):
353 )
369 )
354 return lightdm_mock_path
370 return lightdm_mock_path
355
371
356− def _setup_extra_mock_environment_patch(self):
357− qml_import_path = [get_mocks_library_path()]
358− if os.getenv('QML2_IMPORT_PATH') is not None:
359− qml_import_path.append(os.getenv('QML2_IMPORT_PATH'))
360−
361− qml_import_path = ':'.join(qml_import_path)
362− logger.info("New QML2 import path: %s", qml_import_path)
363− self._environment['QML2_IMPORT_PATH'] = qml_import_path
364−
365 def _set_proxy(self, proxy):
372 def _set_proxy(self, proxy):
366 """Keep a copy of the proxy object, so we can use it to get common
373 """Keep a copy of the proxy object, so we can use it to get common
367 parts of the shell later on.
374 parts of the shell later on.
@@ -373,10 +380,80 @@ class UnityTestCase(AutopilotTestCase):
373 def _clear_proxy(self):
380 def _clear_proxy(self):
374 self._proxy = None
381 self._proxy = None
375
382
376− def assertUnityReady(self):
383+ def wait_for_unity(self):
384+ greeter_content_loader = self.main_window.wait_select_single(
385+ objectName='greeterContentLoader')
386+ greeter_content_loader.progress.wait_for(1)
387+
377− dash = self.get_dash()
388+ def get_dash(self):
378− home_scope = dash.get_scope('clickscope')
389+ pid = process_helpers.get_job_pid('unity8-dash')
390+ dash_proxy = introspection.get_proxy_object_for_existing_process(
391+ pid=pid,
392+ emulator_base=emulators.UnityEmulatorBase,
393+ )
394+ dash_app = dash_helpers.DashApp(dash_proxy)
395+ return dash_app.dash
396+
397+ @property
398+ def main_window(self):
399+ return self._proxy.select_single(main_window_emulator.QQuickView)
379
400
401+
402+class DashBaseTestCase(AutopilotTestCase):
403+
404+ scenarios = ubuntu_scenarios.get_device_simulation_scenarios()
405+ qml_mock_enabled = True
406+ environment = {}
407+
408+ def setUp(self):
409+ super(DashBaseTestCase, self).setUp()
410+
411+ if is_unity7_running():
412+ self.useFixture(toolkit_fixtures.HideUnity7Launcher())
413+
414+ if model() != 'Desktop':
415+ # On the phone, we need unity to be running and unlocked.
416+ self.addCleanup(process_helpers.stop_job, 'unity8')
417+ process_helpers.restart_unity_with_testability()
418+ process_helpers.unlock_unity()
419+
420+ self.ensure_dash_not_running()
421+
422+ if self.qml_mock_enabled:
423+ self.environment['QML2_IMPORT_PATH'] = (
424+ get_qml_import_path_with_mock()
425+ )
426+
427+ if self.should_simulate_device():
428+ # This sets the grid units, so it should be called before launching
429+ # the app.
430+ self.simulate_device()
431+
432+ binary_path = get_binary_path('unity8-dash')
433+ dash_proxy = self.launch_dash(binary_path, self.environment)
434+
435+ if self.should_simulate_device():
436+ # XXX Currently we have no way to launch the application with a
437+ # specific size, so we must resize it after it's launched.
438+ # --elopio - 2014-06-25
439+ self.resize_window()
440+
441+ self.dash_app = dash_helpers.DashApp(dash_proxy)
442+ self.dash = self.dash_app.dash
443+ self.wait_for_dash()
444+
445+ def ensure_dash_not_running(self):
446+ if process_helpers.is_job_running('unity8-dash'):
447+ process_helpers.stop_job('unity8-dash')
448+
449+ def launch_dash(self, binary_path, variables):
450+ launch_dash_app_fixture = fixture_setup.LaunchDashApp(
451+ binary_path, variables)
452+ self.useFixture(launch_dash_app_fixture)
453+ return launch_dash_app_fixture.application_proxy
454+
455+ def wait_for_dash(self):
456+ home_scope = self.dash.get_scope('clickscope')
380 # FIXME! There is a huge timeout here for when we're doing CI on
457 # FIXME! There is a huge timeout here for when we're doing CI on
381 # VMs. See lp:1203715
458 # VMs. See lp:1203715
382 self.assertThat(
459 self.assertThat(
@@ -385,10 +462,26 @@ class UnityTestCase(AutopilotTestCase):
385 )
462 )
386 self.assertThat(home_scope.isCurrent, Eventually(Equals(True)))
463 self.assertThat(home_scope.isCurrent, Eventually(Equals(True)))
387
464
388− def get_dash(self):
465+ def should_simulate_device(self):
389− dash = self._proxy.wait_select_single(Dash)
466+ return (hasattr(self, 'app_width') and hasattr(self, 'app_height') and
390− return dash
467+ hasattr(self, 'grid_unit_px'))
391
468
392− @property
469+ def simulate_device(self):
393− def main_window(self):
470+ simulate_device_fixture = self.useFixture(
394− return self._proxy.select_single(main_window_emulator.QQuickView)
471+ toolkit_fixtures.SimulateDevice(
472+ self.app_width, self.app_height, self.grid_unit_px))
473+ self.app_width = simulate_device_fixture.app_width
474+ self.app_height = simulate_device_fixture.app_height
475+
476+ def resize_window(self):
477+ application = self.process_manager.get_running_applications()[0]
478+ window = application.get_windows()[0]
479+ window.resize(self.app_width, self.app_height)
480+
481+ def get_window_size():
482+ _, _, window_width, window_height = window.geometry
483+ return window_width, window_height
484+
485+ self.assertThat(
486+ get_window_size,
487+ Eventually(Equals((self.app_width, self.app_height))))
tests/autopilot/unity8/shell/tests/test_emulators.py+23−24
@@ -16,6 +16,7 @@
16# You should have received a copy of the GNU General Public License
16# You should have received a copy of the GNU General Public License
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19+from unity8.shell.emulators.dash import ListViewWithPageHeader
19
20
20"""Tests for the Dash autopilot emulators.
21"""Tests for the Dash autopilot emulators.
21
22
@@ -46,24 +47,13 @@ class MainWindowTestCase(tests.UnityTestCase):
46 unity_proxy = self.launch_unity()
47 unity_proxy = self.launch_unity()
47 process_helpers.unlock_unity(unity_proxy)
48 process_helpers.unlock_unity(unity_proxy)
48
49
49− def test_search(self):
50− self.main_window.search('Test')
51− text_field = self.main_window.get_dash()._get_search_text_field()
52− self.assertEqual(text_field.text, 'Test')
53−
54−
55−class DashBaseTestCase(tests.UnityTestCase):
56
50
57− scenarios = tests._get_device_emulation_scenarios()
51+class DashEmulatorTestCase(tests.DashBaseTestCase):
58
52
59− def setUp(self):
53+ def test_search(self):
60− super(DashBaseTestCase, self).setUp()
54+ self.dash.enter_search_query('Test')
61− unity_proxy = self.launch_unity()
55+ text_field = self.dash._get_search_text_field()
62− process_helpers.unlock_unity(unity_proxy)
56+ self.assertEqual(text_field.text, 'Test')
63− self.dash = self.main_window.get_dash()
64−
65−
66−class DashEmulatorTestCase(DashBaseTestCase):
67
57
68 def test_open_unexisting_scope(self):
58 def test_open_unexisting_scope(self):
69 scope_name = 'unexisting'
59 scope_name = 'unexisting'
@@ -141,10 +131,10 @@ class DashEmulatorTestCase(DashBaseTestCase):
141 scope_id = 'clickscope'
131 scope_id = 'clickscope'
142 scope = self.dash.open_scope(scope_id)
132 scope = self.dash.open_scope(scope_id)
143 self._assert_scope_is_opened(scope, scope_id)
133 self._assert_scope_is_opened(scope, scope_id)
144− self.assertIsInstance(scope, dash_emulators.DashApps)
134+ self.assertIsInstance(scope, dash_emulators.GenericScopeView)
145
135
146
136
147−class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
137+class GenericScopeViewEmulatorTestCase(tests.DashBaseTestCase):
148
138
149 def setUp(self):
139 def setUp(self):
150 # Set up the fake scopes before launching unity.
140 # Set up the fake scopes before launching unity.
@@ -158,7 +148,7 @@ class GenericScopeViewEmulatorTestCase(DashBaseTestCase):
158 self.assertTrue(preview.isCurrent)
148 self.assertTrue(preview.isCurrent)
159
149
160
150
161−class DashAppsEmulatorTestCase(DashBaseTestCase):
151+class DashAppsEmulatorTestCase(tests.DashBaseTestCase):
162
152
163 available_applications = [
153 available_applications = [
164 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
154 'Title.2.0', 'Title.2.1', 'Title.2.2', 'Title.2.3', 'Title.2.4',
@@ -182,18 +172,27 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
182
172
183 def test_get_applications_should_return_correct_applications(self):
173 def test_get_applications_should_return_correct_applications(self):
184 category = '2'
174 category = '2'
175+ category_element = self.applications_scope._get_category_element(
176+ category)
177+ list_view = self.dash.get_scope('clickscope')\
178+ .select_single(ListViewWithPageHeader)
185 expected_apps_count = self._get_number_of_application_slots(category)
179 expected_apps_count = self._get_number_of_application_slots(category)
186 expected_applications = self.available_applications[
180 expected_applications = self.available_applications[
187 :expected_apps_count]
181 :expected_apps_count]
182+ x_center = list_view.globalRect.x + list_view.width / 2
183+ y_center = list_view.globalRect.y + list_view.height / 2
184+ y_diff = category_element.y - list_view.height + category_element.height
185+ list_view._slow_drag(x_center, x_center,
186+ y_center, y_center - y_diff)
188 applications = self.applications_scope.get_applications(category)
187 applications = self.applications_scope.get_applications(category)
189 self.assertEqual(expected_applications, applications)
188 self.assertEqual(expected_applications, applications)
190
189
191 def _get_number_of_application_slots(self, category):
190 def _get_number_of_application_slots(self, category):
192 category_element = self.applications_scope._get_category_element(
191 category_element = self.applications_scope._get_category_element(
193 category)
192 category)
194− grid = category_element.select_single('CardFilterGrid')
193+ cardgrid = category_element.select_single('CardGrid')
195− filtergrid = grid.select_single('FilterGrid')
194+ if (category_element.expanded):
196− if (grid.filtered):
195+ return cardgrid.select_single('QQuickGridView').count
197− return filtergrid.collapsedRowCount * filtergrid.columns
198 else:
196 else:
199− return filtergrid.uncollapsedRowCount * filtergrid.columns
197+ return cardgrid.collapsedRows \
198+ * cardgrid.select_single('ResponsiveGridView').columns
tests/autopilot/unity8/shell/tests/test_lock_screen.py+7−47
@@ -51,7 +51,7 @@ class TestLockscreen(UnityTestCase):
51 if greeter.narrowMode:
51 if greeter.narrowMode:
52 unlock_unity(unity_proxy)
52 unlock_unity(unity_proxy)
53 lockscreen = self._wait_for_lockscreen()
53 lockscreen = self._wait_for_lockscreen()
54− self._enter_pincode("1234")
54+ self.main_window.enter_pin_code("1234")
55 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
55 self.assertThat(lockscreen.shown, Eventually(Equals(False)))
56 else:
56 else:
57 self._enter_prompt_passphrase("1234")
57 self._enter_prompt_passphrase("1234")
@@ -81,7 +81,7 @@ class TestLockscreen(UnityTestCase):
81 if greeter.narrowMode:
81 if greeter.narrowMode:
82 unlock_unity(unity_proxy)
82 unlock_unity(unity_proxy)
83 lockscreen = self._wait_for_lockscreen()
83 lockscreen = self._wait_for_lockscreen()
84− self._enter_pincode("4321")
84+ self.main_window.enter_pin_code("4321")
85 pinentryField = self.main_window.get_pinentryField()
85 pinentryField = self.main_window.get_pinentryField()
86 self.assertThat(pinentryField.text, Eventually(Equals("")))
86 self.assertThat(pinentryField.text, Eventually(Equals("")))
87 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
87 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
@@ -118,28 +118,6 @@ class TestLockscreen(UnityTestCase):
118 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
118 self.assertThat(lockscreen.shown, Eventually(Equals(True)))
119 return lockscreen
119 return lockscreen
120
120
121− def _enter_pincode(self, code):
122− """Enter code 'code' into the single-pin lightdm pincode entry
123− screen.
124−
125− :param code: must be a string of numeric characters.
126− :raises: TypeError if code is not a string.
127− :raises: ValueError if code contains non-numeric characters.
128−
129− """
130−
131− if not isinstance(code, basestring):
132− raise TypeError(
133− "'code' parameter must be a string, not %r."
134− % type(code)
135− )
136− for num in code:
137− if not num.isdigit():
138− raise ValueError(
139− "'code' parameter contains non-numeric characters."
140− )
141− self.touch.tap_object(self.main_window.get_pinPadButton(int(num)))
142−
143 def _enter_pin_passphrase(self, passphrase):
121 def _enter_pin_passphrase(self, passphrase):
144 """Enter the password specified in 'passphrase' into the password entry
122 """Enter the password specified in 'passphrase' into the password entry
145 field of the pin lock screen.
123 field of the pin lock screen.
@@ -148,18 +126,15 @@ class TestLockscreen(UnityTestCase):
148 :raises: TypeError if passphrase is not a string.
126 :raises: TypeError if passphrase is not a string.
149
127
150 """
128 """
151− if not isinstance(passphrase, basestring):
129+ if not isinstance(passphrase, str):
152 raise TypeError(
130 raise TypeError(
153 "'passphrase' parameter must be a string, not %r."
131 "'passphrase' parameter must be a string, not %r."
154 % type(passphrase)
132 % type(passphrase)
155 )
133 )
156
134
157− pinentryField = self.main_window.get_pinentryField()
135+ pin_entry_field = self.main_window.get_pinentryField()
158− self.touch.tap_object(pinentryField)
136+ pin_entry_field.write(passphrase)
159− self.assertThat(pinentryField.activeFocus, Eventually(Equals(True)))
160− for character in passphrase:
161− self._type_character(character, pinentryField)
162− logger.debug("Typed passphrase: %s", pinentryField.text)
137+ logger.debug("Typed passphrase: %s", pin_entry_field.text)
163 self.keyboard.type("\n")
138 self.keyboard.type("\n")
164
139
165 def _enter_prompt_passphrase(self, passphrase):
140 def _enter_prompt_passphrase(self, passphrase):
@@ -177,21 +152,6 @@ class TestLockscreen(UnityTestCase):
177 )
152 )
178
153
179 prompt = self.main_window.get_greeter().get_prompt()
154 prompt = self.main_window.get_greeter().get_prompt()
180− self.touch.tap_object(prompt)
181− self.assertThat(prompt.activeFocus, Eventually(Equals(True)))
182− for character in passphrase:
155+ prompt.write(passphrase)
183− self._type_character(character, prompt)
184 logger.debug("Typed passphrase: %s", prompt.text)
156 logger.debug("Typed passphrase: %s", prompt.text)
185 self.keyboard.type("\n")
157 self.keyboard.type("\n")
186−
187− def _type_character(self, character, prompt, retries=5):
188− current_text = prompt.text
189− self.keyboard.type(character)
190− try:
191− self.assertThat(
192− prompt.text, Eventually(Equals(current_text + character)))
193− except AssertionError:
194− if retries > 0:
195− self._type_character(character, prompt, retries-1)
196− else:
197− raise
tests/autopilot/unity8/shell/tests/test_notifications.py+12−7
@@ -154,7 +154,7 @@ class InteractiveNotificationBase(NotificationsBase):
154 'Notification', objectName='notification1')
154 'Notification', objectName='notification1')
155 notification = get_notification()
155 notification = get_notification()
156
156
157− self.touch.tap_object(
157+ notification.pointing_device.click_object(
158 notification.select_single(objectName="interactiveArea")
158 notification.select_single(objectName="interactiveArea")
159 )
159 )
160
160
@@ -201,11 +201,14 @@ class InteractiveNotificationBase(NotificationsBase):
201 'Notification', objectName='notification1')
201 'Notification', objectName='notification1')
202 notification = get_notification()
202 notification = get_notification()
203 self._assert_notification(notification, summary, body, True, True, 1.0)
203 self._assert_notification(notification, summary, body, True, True, 1.0)
204− initial_height = notification.height
204+ notification.pointing_device.click_object(
205− self.touch.tap_object(notification.select_single(objectName="combobutton_dropdown"))
205+ notification.select_single(objectName="combobutton_dropdown"))
206+ self.assertThat(
206− self.assertThat(notification.select_single(objectName="button2").expanded, Eventually(Equals(True)))
207+ notification.select_single(objectName="button2").expanded,
208+ Eventually(Equals(True)))
207 time.sleep(2)
209 time.sleep(2)
210+ notification.pointing_device.click_object(
208− self.touch.tap_object(notification.select_single(objectName="button4"))
211+ notification.select_single(objectName="button4"))
209 self.assert_notification_action_id_was_called("action_decline_4")
212 self.assert_notification_action_id_was_called("action_decline_4")
210
213
211 def test_modal_sd_without_greeter(self):
214 def test_modal_sd_without_greeter(self):
@@ -249,7 +252,8 @@ class InteractiveNotificationBase(NotificationsBase):
249 notification = get_notification()
252 notification = get_notification()
250 self._assert_notification(
253 self._assert_notification(
251 notification, summary, body, True, False, 1.0)
254 notification, summary, body, True, False, 1.0)
255+ notification.pointing_device.click_object(
252− self.touch.tap_object(notification.select_single(objectName="button0"))
256+ notification.select_single(objectName="button0"))
253 self.assert_notification_action_id_was_called("action_accept")
257 self.assert_notification_action_id_was_called("action_accept")
254
258
255 def test_modal_sd_with_greeter(self):
259 def test_modal_sd_with_greeter(self):
@@ -291,7 +295,8 @@ class InteractiveNotificationBase(NotificationsBase):
291 notification = get_notification()
295 notification = get_notification()
292 self._assert_notification(
296 self._assert_notification(
293 notification, summary, body, True, False, 1.0)
297 notification, summary, body, True, False, 1.0)
298+ notification.pointing_device.click_object(
294− self.touch.tap_object(notification.select_single(objectName="button0"))
299+ notification.select_single(objectName="button0"))
295 self.assert_notification_action_id_was_called("action_accept")
300 self.assert_notification_action_id_was_called("action_accept")
296
301
297 def _create_interactive_notification(
302 def _create_interactive_notification(
tests/autopilot/unity8/shell/tests/test_upstart.py+33−5
@@ -20,11 +20,13 @@
20"""Tests for upstart integration."""
20"""Tests for upstart integration."""
21
21
22import os
22import os
23+import stat
23import signal
24import signal
24import subprocess
25import subprocess
25import time
26import time
26
27
28+import fixtures
27−from testtools.matchers._basic import Equals
29+from testtools.matchers import Equals, MismatchError
28from autopilot.matchers import Eventually
30from autopilot.matchers import Eventually
29from autopilot.introspection import get_proxy_object_for_existing_process
31from autopilot.introspection import get_proxy_object_for_existing_process
30
32
@@ -57,6 +59,18 @@ class UpstartIntegrationTests(UnityTestCase):
57
59
58 def _launch_unity(self):
60 def _launch_unity(self):
59 self.patch_environment("QT_LOAD_TESTABILITY", "1")
61 self.patch_environment("QT_LOAD_TESTABILITY", "1")
62+
63+ try:
64+ host_socket = os.getenv("MIR_SOCKET", "/run/mir_socket")
65+ if stat.S_ISSOCK(os.stat(host_socket).st_mode):
66+ self.patch_environment("MIR_SERVER_HOST_SOCKET",
67+ host_socket)
68+ socket = os.path.join(os.getenv("XDG_RUNTIME_DIR", "/tmp"),
69+ "mir_socket")
70+ self.patch_environment("MIR_SERVER_FILE", socket)
71+ except OSError:
72+ pass
73+
60 self.process = subprocess.Popen(
74 self.process = subprocess.Popen(
61 [get_binary_path()] + self.unity_geometry_args)
75 [get_binary_path()] + self.unity_geometry_args)
62
76
@@ -87,16 +101,30 @@ class UpstartIntegrationTests(UnityTestCase):
87 emulator_base=UnityEmulatorBase,))
101 emulator_base=UnityEmulatorBase,))
88
102
89 def test_no_sigstop(self):
103 def test_no_sigstop(self):
104+ self.useFixture(
105+ fixtures.EnvironmentVariable(
90− self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "")
106+ 'UNITY_MIR_EMITS_SIGSTOP', newvalue=None))
91 self._launch_unity()
107 self._launch_unity()
108+
109+ try:
110+ self.assertThat(
111+ lambda: os.WIFSTOPPED(self._get_status()),
112+ Eventually(Equals(True)))
113+ except MismatchError:
114+ pass
115+ else:
116+ self.process.send_signal(signal.SIGCONT)
117+ self.fail('Unity8 raised SIGSTOP')
118+
92 self._set_proxy()
119 self._set_proxy()
93
120
94 logger.debug("Unity started, waiting for it to be ready.")
121 logger.debug("Unity started, waiting for it to be ready.")
95− self.assertUnityReady()
122+ self.wait_for_unity()
96 logger.debug("Unity loaded and ready.")
123 logger.debug("Unity loaded and ready.")
97
124
98 def test_expect_sigstop(self):
125 def test_expect_sigstop(self):
126+ self.useFixture(
99− self.patch_environment("UNITY_MIR_EMITS_SIGSTOP", "1")
127+ fixtures.EnvironmentVariable('UNITY_MIR_EMITS_SIGSTOP', '1'))
100 self._launch_unity()
128 self._launch_unity()
101 self.assertThat(
129 self.assertThat(
102 lambda: os.WIFSTOPPED(self._get_status()),
130 lambda: os.WIFSTOPPED(self._get_status()),
@@ -109,5 +137,5 @@ class UpstartIntegrationTests(UnityTestCase):
109
137
110 logger.debug("Unity started, waiting for it to be ready.")
138 logger.debug("Unity started, waiting for it to be ready.")
111 self._set_proxy()
139 self._set_proxy()
112− self.assertUnityReady()
140+ self.wait_for_unity()
113 logger.debug("Unity loaded and ready.")
141 logger.debug("Unity loaded and ready.")
tests/mocks/AccountsService/AccountsService.cpp+12−2
@@ -29,12 +29,14 @@ AccountsService::AccountsService(QObject* parent)
29
29
30QString AccountsService::user() const
30QString AccountsService::user() const
31{
31{
32− return "testuser";
32+ return m_user;
33}
33}
34
34
35void AccountsService::setUser(const QString &user)
35void AccountsService::setUser(const QString &user)
36{
36{
37− Q_UNUSED(user)
37+ m_user = user;
38+ Q_EMIT userChanged();
39+ Q_EMIT passwordDisplayHintChanged();
38}
40}
39
41
40bool AccountsService::demoEdges() const
42bool AccountsService::demoEdges() const
@@ -68,3 +70,11 @@ void AccountsService::setStatsWelcomeScreen(bool statsWelcomeScreen)
68 m_statsWelcomeScreen = statsWelcomeScreen;
70 m_statsWelcomeScreen = statsWelcomeScreen;
69 statsWelcomeScreenChanged();
71 statsWelcomeScreenChanged();
70}
72}
73+
74+AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
75+{
76+ if (m_user == "has-pin")
77+ return PasswordDisplayHint::Numeric;
78+ else
79+ return PasswordDisplayHint::Keyboard;
80+}
tests/mocks/AccountsService/AccountsService.h+12
@@ -27,6 +27,7 @@
27class AccountsService: public QObject
27class AccountsService: public QObject
28{
28{
29 Q_OBJECT
29 Q_OBJECT
30+ Q_ENUMS(PasswordDisplayHint)
30 Q_PROPERTY (QString user
31 Q_PROPERTY (QString user
31 READ user
32 READ user
32 WRITE setUser
33 WRITE setUser
@@ -43,8 +44,16 @@ class AccountsService: public QObject
43 READ statsWelcomeScreen
44 READ statsWelcomeScreen
44 WRITE setStatsWelcomeScreen // only available in mock
45 WRITE setStatsWelcomeScreen // only available in mock
45 NOTIFY statsWelcomeScreenChanged)
46 NOTIFY statsWelcomeScreenChanged)
47+ Q_PROPERTY (PasswordDisplayHint passwordDisplayHint
48+ READ passwordDisplayHint
49+ NOTIFY passwordDisplayHintChanged)
46
50
47public:
51public:
52+ enum PasswordDisplayHint {
53+ Keyboard,
54+ Numeric,
55+ };
56+
48 explicit AccountsService(QObject *parent = 0);
57 explicit AccountsService(QObject *parent = 0);
49
58
50 QString user() const;
59 QString user() const;
@@ -55,15 +64,18 @@ public:
55 void setBackgroundFile(const QString &backgroundFile);
64 void setBackgroundFile(const QString &backgroundFile);
56 bool statsWelcomeScreen() const;
65 bool statsWelcomeScreen() const;
57 void setStatsWelcomeScreen(bool statsWelcomeScreen);
66 void setStatsWelcomeScreen(bool statsWelcomeScreen);
67+ PasswordDisplayHint passwordDisplayHint() const;
58
68
59Q_SIGNALS:
69Q_SIGNALS:
60 void userChanged();
70 void userChanged();
61 void demoEdgesChanged();
71 void demoEdgesChanged();
62 void backgroundFileChanged();
72 void backgroundFileChanged();
63 void statsWelcomeScreenChanged();
73 void statsWelcomeScreenChanged();
74+ void passwordDisplayHintChanged();
64
75
65private:
76private:
66 QString m_backgroundFile;
77 QString m_backgroundFile;
78+ QString m_user;
67 bool m_statsWelcomeScreen;
79 bool m_statsWelcomeScreen;
68};
80};
69
81
tests/mocks/AccountsService/CMakeLists.txt+4−1
@@ -5,4 +5,7 @@ add_library(MockAccountsService-qml MODULE
5
5
6qt5_use_modules(MockAccountsService-qml DBus Qml)
6qt5_use_modules(MockAccountsService-qml DBus Qml)
7
7
8−add_unity8_mock(AccountsService 0.1 AccountsService TARGETS MockAccountsService-qml)
8+add_unity8_mock(AccountsService 0.1 AccountsService
9+ PREFIX mocks
10+ TARGETS MockAccountsService-qml
11+ )
tests/mocks/AccountsService/plugin.cpp+1
@@ -32,5 +32,6 @@ static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
32void AccountsServicePlugin::registerTypes(const char *uri)
32void AccountsServicePlugin::registerTypes(const char *uri)
33{
33{
34 Q_ASSERT(uri == QLatin1String("AccountsService"));
34 Q_ASSERT(uri == QLatin1String("AccountsService"));
35+ qRegisterMetaType<AccountsService::PasswordDisplayHint>("AccountsService::PasswordDisplayHint");
35 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
36 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
36}
37}
tests/mocks/LightDM/GreeterPrivate.h+2
@@ -24,6 +24,7 @@
24namespace QLightDM
24namespace QLightDM
25{
25{
26class Greeter;
26class Greeter;
27+class GreeterImpl;
27
28
28class GreeterPrivate
29class GreeterPrivate
29{
30{
@@ -40,6 +41,7 @@ public:
40 void handleRespond(const QString &response);
41 void handleRespond(const QString &response);
41
42
42protected:
43protected:
44+ GreeterImpl *m_impl; // if the backend needs more private data
43 Greeter * const q_ptr;
45 Greeter * const q_ptr;
44
46
45private:
47private:
tests/mocks/LightDM/demo/CMakeLists.txt+4−2
@@ -11,11 +11,13 @@ set(LibLightDM_SOURCES
11add_library(MockLightDM-demo STATIC ${LibLightDM_SOURCES})
11add_library(MockLightDM-demo STATIC ${LibLightDM_SOURCES})
12
12
13include_directories(
13include_directories(
14+ ${CMAKE_CURRENT_BINARY_DIR}
14 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
15 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
15)
16)
16
17
17target_link_libraries(MockLightDM-demo
18target_link_libraries(MockLightDM-demo
18 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
19 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
20+ -lpam
19− )
21+)
20
22
21−qt5_use_modules(MockLightDM-demo Gui)
23+qt5_use_modules(MockLightDM-demo Concurrent Gui)
tests/mocks/LightDM/demo/GreeterPrivate.cpp+202−30
@@ -18,53 +18,225 @@
18
18
19#include "../Greeter.h"
19#include "../Greeter.h"
20#include "../GreeterPrivate.h"
20#include "../GreeterPrivate.h"
21−#include <QtCore/QDir>
21+#include <QFuture>
22−#include <QtCore/QSettings>
22+#include <QFutureInterface>
23+#include <QFutureWatcher>
24+#include <QQueue>
25+#include <QtConcurrent>
26+#include <QVector>
27+#include <security/pam_appl.h>
23
28
24namespace QLightDM
29namespace QLightDM
25{
30{
26
31
32+class GreeterImpl : public QObject
33+{
34+ Q_OBJECT
35+
36+ typedef QFutureInterface<QString> ResponseFuture;
37+
38+public:
39+ explicit GreeterImpl(Greeter *parent, GreeterPrivate *greeterPrivate)
40+ : QObject(parent),
41+ greeter(parent),
42+ greeterPrivate(greeterPrivate),
43+ pamHandle(NULL)
44+ {
45+ qRegisterMetaType<QLightDM::GreeterImpl::ResponseFuture>("QLightDM::GreeterImpl::ResponseFuture");
46+
47+ connect(&futureWatcher, SIGNAL(finished()),
48+ this, SLOT(finishPam()));
49+ connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
50+ greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
51+ // This next connect is how we pass ResponseFutures between threads
52+ connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
53+ this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
54+ }
55+
56+ void start(QString username)
57+ {
58+ // Clear out any existing PAM interactions first (we can't simply
59+ // cancel our QFuture because QtConcurrent::run doesn't support cancel)
60+ if (pamHandle != NULL) {
61+ pam_handle *handle = pamHandle;
62+ pamHandle = NULL; // to disable normal finishPam() handling
63+ while (respond(QString())); // clear our local queue of QFutures
64+ pam_end(handle, PAM_CONV_ERR);
65+ }
66+
67+ // Now actually start a new conversation with PAM
68+ pam_conv conversation;
69+ conversation.conv = converseWithPam;
70+ conversation.appdata_ptr = static_cast<void*>(this);
71+
72+ if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
73+ futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
74+ } else {
75+ greeterPrivate->authenticated = false;
76+ Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
77+ Q_EMIT greeter->authenticationComplete();
78+ }
79+ }
80+
81+ static int authenticateWithPam(pam_handle* pamHandle)
82+ {
83+ int pamStatus = pam_authenticate(pamHandle, 0);
84+ if (pamStatus == PAM_SUCCESS) {
85+ pamStatus = pam_acct_mgmt(pamHandle, 0);
86+ }
87+ if (pamStatus == PAM_NEW_AUTHTOK_REQD) {
88+ pamStatus = pam_chauthtok(pamHandle, PAM_CHANGE_EXPIRED_AUTHTOK);
89+ }
90+ if (pamStatus == PAM_SUCCESS) {
91+ pam_setcred(pamHandle, PAM_REINITIALIZE_CRED);
92+ }
93+ return pamStatus;
94+ }
95+
96+ static int converseWithPam(int num_msg, const pam_message** msg,
97+ pam_response** resp, void* appdata_ptr)
98+ {
99+ if (num_msg <= 0)
100+ return PAM_CONV_ERR;
101+
102+ auto* tmp_response = static_cast<pam_response*>(calloc(num_msg, sizeof(pam_response)));
103+ if (!tmp_response)
104+ return PAM_CONV_ERR;
105+
106+ GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
107+
108+ int count;
109+ QVector<ResponseFuture> responses;
110+
111+ for (count = 0; count < num_msg; ++count)
112+ {
113+ switch (msg[count]->msg_style)
114+ {
115+ case PAM_PROMPT_ECHO_ON:
116+ {
117+ QString message(msg[count]->msg);
118+ responses.append(ResponseFuture());
119+ responses.last().reportStarted();
120+ Q_EMIT impl->showPrompt(message, Greeter::PromptTypeQuestion, responses.last());
121+ break;
122+ }
123+ case PAM_PROMPT_ECHO_OFF:
124+ {
125+ QString message(msg[count]->msg);
126+ responses.append(ResponseFuture());
127+ responses.last().reportStarted();
128+ Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
129+ break;
130+ }
131+ case PAM_TEXT_INFO:
132+ {
133+ QString message(msg[count]->msg);
134+ Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
135+ break;
136+ }
137+ default:
138+ {
139+ QString message(msg[count]->msg);
140+ Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
141+ break;
142+ }
143+ }
144+ }
145+
146+ int i = 0;
147+ bool raise_error = false;
148+
149+ for (auto &response : responses)
150+ {
151+ pam_response* resp_item = &tmp_response[i++];
152+ resp_item->resp_retcode = 0;
153+ resp_item->resp = strdup(response.future().result().toUtf8());
154+
155+ if (!resp_item->resp)
156+ {
157+ raise_error = true;
158+ break;
159+ }
160+ }
161+
162+ if (raise_error)
163+ {
164+ for (int i = 0; i < count; ++i)
165+ free(tmp_response[i].resp);
166+
167+ free(tmp_response);
168+ return PAM_CONV_ERR;
169+ }
170+ else
171+ {
172+ *resp = tmp_response;
173+ return PAM_SUCCESS;
174+ }
175+ }
176+
177+public Q_SLOTS:
178+ bool respond(QString response)
179+ {
180+ if (!futures.isEmpty()) {
181+ futures.dequeue().reportFinished(&response);
182+ return true;
183+ } else {
184+ return false;
185+ }
186+ }
187+
188+Q_SIGNALS:
189+ void showMessage(QString text, QLightDM::Greeter::MessageType type);
190+ void showPrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
191+
192+private Q_SLOTS:
193+ void finishPam()
194+ {
195+ if (pamHandle == NULL) {
196+ return;
197+ }
198+
199+ int pamStatus = futureWatcher.result();
200+
201+ pam_end(pamHandle, pamStatus);
202+ pamHandle = NULL;
203+
204+ greeterPrivate->authenticated = (pamStatus == PAM_SUCCESS);
205+ Q_EMIT greeter->authenticationComplete();
206+ }
207+
208+ void handlePrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
209+ {
210+ futures.enqueue(future);
211+ Q_EMIT greeter->showPrompt(text, type);
212+ }
213+
214+private:
215+ Greeter *greeter;
216+ GreeterPrivate *greeterPrivate;
217+ pam_handle* pamHandle;
218+ QFutureWatcher<int> futureWatcher;
219+ QQueue<ResponseFuture> futures;
220+};
221+
27GreeterPrivate::GreeterPrivate(Greeter* parent)
222GreeterPrivate::GreeterPrivate(Greeter* parent)
28 : authenticated(false),
223 : authenticated(false),
29 authenticationUser(),
224 authenticationUser(),
225+ m_impl(new GreeterImpl(parent, this)),
30 q_ptr(parent)
226 q_ptr(parent)
31{
227{
32}
228}
33
229
34void GreeterPrivate::handleAuthenticate()
230void GreeterPrivate::handleAuthenticate()
35{
231{
36− Q_Q(Greeter);
37−
38− QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
39− settings.beginGroup(authenticationUser);
232+ m_impl->start(authenticationUser);
40− QVariant password = settings.value("password", "none");
41−
42− if (password == "pin") {
43− Q_EMIT q->showPrompt("PIN", Greeter::PromptTypeSecret);
44− } else if (password == "keyboard") {
45− Q_EMIT q->showPrompt("Password", Greeter::PromptTypeSecret);
46− } else {
47− authenticated = true;
48− Q_EMIT q->authenticationComplete();
49− }
50}
233}
51
234
52void GreeterPrivate::handleRespond(const QString &response)
235void GreeterPrivate::handleRespond(const QString &response)
53{
236{
54− Q_Q(Greeter);
237+ m_impl->respond(response);
55−
56− QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
57− settings.beginGroup(authenticationUser);
58− QVariant password = settings.value("password", "none");
59−
60− QString passwordValue;
61− if (password == "pin") {
62− passwordValue = settings.value("passwordValue", "1234").toString();
63− } else {
64− passwordValue = settings.value("passwordValue", "password").toString();
65− }
66− authenticated = (response == passwordValue);
67− Q_EMIT q->authenticationComplete();
68}
238}
69
239
70}
240}
241+
242+#include "GreeterPrivate.moc"
tests/mocks/LightDM/demo/UsersModelPrivate.cpp+1−1
@@ -29,7 +29,7 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
29 : q_ptr(parent)
29 : q_ptr(parent)
30{
30{
31 QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
31 QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
32− QStringList users = settings.value("users", QStringList() << "phablet").toStringList();
32+ QStringList users = settings.value("users", QStringList() << qgetenv("USER")).toStringList();
33
33
34 Q_FOREACH(const QString &user, users)
34 Q_FOREACH(const QString &user, users)
35 {
35 {
tests/mocks/LightDM/full/GreeterPrivate.cpp+1−1
@@ -54,7 +54,7 @@ void GreeterPrivate::handleAuthenticate()
54 authenticated = true;
54 authenticated = true;
55 Q_EMIT q->authenticationComplete();
55 Q_EMIT q->authenticationComplete();
56 } else if (authenticationUser == "has-pin"){
56 } else if (authenticationUser == "has-pin"){
57− Q_EMIT q->showPrompt("PIN", Greeter::PromptTypeSecret);
57+ Q_EMIT q->showPrompt("Password:", Greeter::PromptTypeSecret);
58 } else if (authenticationUser == "auth-error") {
58 } else if (authenticationUser == "auth-error") {
59 authenticated = false;
59 authenticated = false;
60 Q_EMIT q->authenticationComplete();
60 Q_EMIT q->authenticationComplete();
tests/mocks/LightDM/single-pin/GreeterPrivate.cpp+1−9
@@ -19,8 +19,6 @@
19#include "../Greeter.h"
19#include "../Greeter.h"
20#include "../GreeterPrivate.h"
20#include "../GreeterPrivate.h"
21
21
22−#include <QDebug>
23−
24namespace QLightDM
22namespace QLightDM
25{
23{
26
24
@@ -34,19 +32,13 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
34void GreeterPrivate::handleAuthenticate()
32void GreeterPrivate::handleAuthenticate()
35{
33{
36 Q_Q(Greeter);
34 Q_Q(Greeter);
37−
38− qDebug() << "handleAuthentication called!" << authenticationUser;
39−
40− Q_EMIT q->showPrompt("PIN:", Greeter::PromptTypeSecret);
35+ Q_EMIT q->showPrompt("Password:", Greeter::PromptTypeSecret);
41}
36}
42
37
43void GreeterPrivate::handleRespond(const QString &response)
38void GreeterPrivate::handleRespond(const QString &response)
44{
39{
45 Q_Q(Greeter);
40 Q_Q(Greeter);
46−
47−
48 authenticated = (response == "1234");
41 authenticated = (response == "1234");
49− qDebug() << "responding" << response << authenticated;
50 Q_EMIT q->authenticationComplete();
42 Q_EMIT q->authenticationComplete();
51}
43}
52
44
tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp+1−1
@@ -26,7 +26,7 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
26{
26{
27 entries =
27 entries =
28 {
28 {
29− { "single", "Has PIN", 0, 0, false, false, 0, 0 },
29+ { "has-pin", "Has PIN", 0, 0, false, false, 0, 0 },
30 };
30 };
31}
31}
32
32
tests/mocks/QMenuModel/unitymenumodel.cpp+5
@@ -126,6 +126,11 @@ void UnityMenuModel::setActionStateParser(ActionStateParser*)
126{
126{
127}
127}
128
128
129+QString UnityMenuModel::nameOwner() const
130+{
131+ return QString("");
132+}
133+
129int UnityMenuModel::rowCount(const QModelIndex&) const
134int UnityMenuModel::rowCount(const QModelIndex&) const
130{
135{
131 return m_modelData.count();
136 return m_modelData.count();
tests/mocks/QMenuModel/unitymenumodel.h+4
@@ -32,6 +32,7 @@ class Q_DECL_EXPORT UnityMenuModel : public QAbstractListModel
32 Q_PROPERTY(QVariantMap actions READ actions WRITE setActions NOTIFY actionsChanged)
32 Q_PROPERTY(QVariantMap actions READ actions WRITE setActions NOTIFY actionsChanged)
33 Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath WRITE setMenuObjectPath NOTIFY menuObjectPathChanged)
33 Q_PROPERTY(QByteArray menuObjectPath READ menuObjectPath WRITE setMenuObjectPath NOTIFY menuObjectPathChanged)
34 Q_PROPERTY(ActionStateParser* actionStateParser READ actionStateParser WRITE setActionStateParser NOTIFY actionStateParserChanged)
34 Q_PROPERTY(ActionStateParser* actionStateParser READ actionStateParser WRITE setActionStateParser NOTIFY actionStateParserChanged)
35+ Q_PROPERTY(QString nameOwner READ nameOwner NOTIFY nameOwnerChanged)
35
36
36public:
37public:
37 UnityMenuModel(QObject *parent = NULL);
38 UnityMenuModel(QObject *parent = NULL);
@@ -56,6 +57,8 @@ public:
56 ActionStateParser* actionStateParser() const;
57 ActionStateParser* actionStateParser() const;
57 void setActionStateParser(ActionStateParser* actionStateParser);
58 void setActionStateParser(ActionStateParser* actionStateParser);
58
59
60+ QString nameOwner() const;
61+
59 int rowCount(const QModelIndex &parent = QModelIndex()) const;
62 int rowCount(const QModelIndex &parent = QModelIndex()) const;
60 int columnCount(const QModelIndex &parent = QModelIndex()) const;
63 int columnCount(const QModelIndex &parent = QModelIndex()) const;
61 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
64 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
@@ -79,6 +82,7 @@ Q_SIGNALS:
79 void menuObjectPathChanged();
82 void menuObjectPathChanged();
80 void actionStateParserChanged();
83 void actionStateParserChanged();
81 void modelDataChanged();
84 void modelDataChanged();
85+ void nameOwnerChanged();
82
86
83private:
87private:
84 QVariantMap rowData(int row) const;
88 QVariantMap rowData(int row) const;
tests/mocks/Ubuntu/Telephony/CMakeLists.txt+1−9
@@ -11,12 +11,4 @@ add_library(FakeUbuntuTelephonyQml MODULE ${FakeUbuntuTelephonyQml_SOURCES})
11
11
12qt5_use_modules(FakeUbuntuTelephonyQml Core Quick)
12qt5_use_modules(FakeUbuntuTelephonyQml Core Quick)
13
13
14−# copy files into build directory for shadow builds
15−add_custom_target(UbuntuTelephonyQmlDirFile ALL
16− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
17− DEPENDS qmldir
18−)
19−
20−install(TARGETS FakeUbuntuTelephonyQml
14+add_unity8_mock(Ubuntu.Telephony 0.1 Ubuntu/Telephony TARGETS FakeUbuntuTelephonyQml)
21− DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Telephony
22− )
tests/mocks/Unity/Application/Application.qmltypes−2
@@ -102,8 +102,6 @@ Module {
102 "ForceMainStage": 1
102 "ForceMainStage": 1
103 }
103 }
104 }
104 }
105− Property { name: "keyboardHeight"; type: "int"; isReadonly: true }
106− Property { name: "keyboardVisible"; type: "bool"; isReadonly: true }
107 Property { name: "sideStageWidth"; type: "int"; isReadonly: true }
105 Property { name: "sideStageWidth"; type: "int"; isReadonly: true }
108 Property { name: "stageHint"; type: "StageHint"; isReadonly: true }
106 Property { name: "stageHint"; type: "StageHint"; isReadonly: true }
109 Property { name: "formFactorHint"; type: "FormFactorHint"; isReadonly: true }
107 Property { name: "formFactorHint"; type: "FormFactorHint"; isReadonly: true }
tests/mocks/Unity/Application/ApplicationDBusAdaptor.cppnew file+81
@@ -0,0 +1,81 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ApplicationInfo.h"
18+#include "ApplicationDBusAdaptor.h"
19+#include "ApplicationManager.h"
20+#include "SurfaceManager.h"
21+#include "MirSurfaceItem.h"
22+
23+quint32 nextId = 0;
24+
25+ApplicationDBusAdaptor::ApplicationDBusAdaptor(ApplicationManager* applicationManager)
26+ : QDBusAbstractAdaptor(applicationManager)
27+ , m_applicationManager(applicationManager)
28+{
29+}
30+
31+MirSurfaceItem* topSurface(MirSurfaceItem* surface)
32+{
33+ if (!surface)
34+ return nullptr;
35+
36+ MirSurfaceItem* child = NULL;
37+ Q_FOREACH (MirSurfaceItem *childSurface, surface->childSurfaceList()) {
38+ child = topSurface(childSurface);
39+ if (child) {
40+ break;
41+ }
42+ }
43+ return child ? child : surface;
44+}
45+
46+quint32 ApplicationDBusAdaptor::addPromptSurface(const QString &appId, const QString &surfaceImage)
47+{
48+ qDebug() << "ApplicationDBusAdaptor::addPromptSurface to " << appId;
49+
50+ ApplicationInfo* application = m_applicationManager->findApplication(appId);
51+ if (!application) {
52+ qDebug() << "ApplicationDBusAdaptor::addChildSurface - No application found for " << appId;
53+ return 0;
54+ }
55+ quint32 surfaceId = ++nextId;
56+ MirSurfaceItem* surface = new MirSurfaceItem(QString("%1-ChildSurface%2").arg(appId).arg(surfaceId),
57+ MirSurfaceItem::Normal,
58+ MirSurfaceItem::Maximized,
59+ QUrl(surfaceImage));
60+ m_childItems[surfaceId] = surface;
61+
62+ if (application->promptSurfaceList().count() > 0) {
63+ surface->setParentSurface(topSurface(application->promptSurfaceList()[0]));
64+ } else {
65+ application->addPromptSurface(surface);
66+ }
67+
68+ return surfaceId;
69+}
70+
71+void ApplicationDBusAdaptor::removeChildSurface(int surfaceId)
72+{
73+ qDebug() << "ApplicationDBusAdaptor::removeChildSurface - " << surfaceId;
74+
75+ if (!m_childItems.contains(surfaceId)) {
76+ qDebug() << "ApplicationDBusAdaptor::removeChildSurface - No added surface for " << surfaceId;
77+ return;
78+ }
79+ MirSurfaceItem* surface = m_childItems.take(surfaceId);
80+ Q_EMIT surface->removed();
81+}
tests/mocks/Unity/Application/ApplicationDBusAdaptor.hnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef APPLICATIONDBUSADAPTOR_H
18+#define APPLICATIONDBUSADAPTOR_H
19+
20+#include <QtDBus/QtDBus>
21+
22+class ApplicationManager;
23+class SurfaceManager;
24+class MirSurfaceItem;
25+
26+class ApplicationDBusAdaptor : public QDBusAbstractAdaptor
27+{
28+ Q_OBJECT
29+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity8.Mocks.Application")
30+public:
31+ ApplicationDBusAdaptor(ApplicationManager* applicationManager);
32+
33+public Q_SLOTS:
34+ quint32 addPromptSurface(const QString& appId, const QString& surfaceImage);
35+ void removeChildSurface(int surfaceId);
36+
37+private:
38+ ApplicationManager* m_applicationManager;
39+
40+ QHash<quint32, MirSurfaceItem*> m_childItems;
41+};
42+
43+#endif // APPLICATIONDBUSADAPTOR_H
tests/mocks/Unity/Application/ApplicationInfo.cpp+94−55
@@ -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
@@ -15,6 +15,8 @@
15 */
15 */
16
16
17#include "ApplicationInfo.h"
17#include "ApplicationInfo.h"
18+#include "MirSurfaceItem.h"
19+#include "SurfaceManager.h"
18
20
19#include <QGuiApplication>
21#include <QGuiApplication>
20#include <QQuickItem>
22#include <QQuickItem>
@@ -24,91 +26,128 @@
24
26
25ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
27ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
26 : ApplicationInfoInterface(appId, parent)
28 : ApplicationInfoInterface(appId, parent)
27− ,m_appId(appId)
29+ , m_appId(appId)
28− ,m_stage(MainStage)
30+ , m_stage(MainStage)
29− ,m_state(Starting)
31+ , m_state(Starting)
30− ,m_focused(false)
32+ , m_focused(false)
31− ,m_fullscreen(false)
33+ , m_fullscreen(false)
32− ,m_windowItem(0)
33− ,m_windowComponent(0)
34− ,m_parentItem(0)
34+ , m_parentItem(0)
35+ , m_surface(0)
35{
36{
36− QTimer::singleShot(300, this, SLOT(setRunning()));
37+ connect(this, &ApplicationInfo::stateChanged, this, &ApplicationInfo::onStateChanged);
37}
38}
38
39
39ApplicationInfo::ApplicationInfo(QObject *parent)
40ApplicationInfo::ApplicationInfo(QObject *parent)
40 : ApplicationInfoInterface(QString(), parent)
41 : ApplicationInfoInterface(QString(), parent)
41− ,m_stage(MainStage)
42+ , m_stage(MainStage)
42− ,m_state(Starting)
43+ , m_state(Starting)
43− ,m_focused(false)
44+ , m_focused(false)
44− ,m_fullscreen(false)
45+ , m_fullscreen(false)
45− ,m_windowItem(0)
46− ,m_windowComponent(0)
47− ,m_parentItem(0)
46+ , m_parentItem(0)
47+ , m_surface(0)
48{
48{
49− QTimer::singleShot(300, this, SLOT(setRunning()));
49+ connect(this, &ApplicationInfo::stateChanged, this, &ApplicationInfo::onStateChanged);
50}
50}
51
51
52−void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
52+ApplicationInfo::~ApplicationInfo()
53{
53{
54− if (status == QQmlComponent::Ready && !m_windowItem)
54+ if (m_surface) {
55− doCreateWindowItem();
55+ Q_EMIT SurfaceManager::singleton()->surfaceDestroyed(m_surface);
56+ m_surface->deleteLater();
57+ }
58+}
59+
60+void ApplicationInfo::onStateChanged(State state)
61+{
62+ if (state == ApplicationInfo::Running) {
63+ QTimer::singleShot(1000, this, SLOT(createSurface()));
64+ } else if (state == ApplicationInfo::Stopped) {
65+ setSurface(nullptr);
66+ }
56}
67}
57
68
58−void ApplicationInfo::setRunning()
69+void ApplicationInfo::createSurface()
59{
70{
60− m_state = Running;
71+ if (m_surface || state() == ApplicationInfo::Stopped) return;
61− Q_EMIT stateChanged();
72+
73+ setSurface(new MirSurfaceItem(name(),
74+ MirSurfaceItem::Normal,
75+ fullscreen() ? MirSurfaceItem::Fullscreen : MirSurfaceItem::Maximized,
76+ screenshot()));
62}
77}
63
78
64−void ApplicationInfo::createWindowComponent()
79+void ApplicationInfo::setSurface(MirSurfaceItem* surface)
65{
80{
66− // The assumptions I make here really should hold.
81+ qDebug() << "Application::setSurface - appId=" << appId() << "surface=" << surface;
67− QQuickView *quickView =
82+ if (m_surface == surface)
68− qobject_cast<QQuickView*>(QGuiApplication::topLevelWindows()[0]);
83+ return;
84+
85+ if (m_surface) {
86+ m_surface->setApplication(nullptr);
87+ m_surface->setParent(nullptr);
88+ SurfaceManager::singleton()->unregisterSurface(m_surface);
89+ }
90+
91+ m_surface = surface;
69
92
70− QQmlEngine *engine = quickView->engine();
93+ if (m_surface) {
94+ m_surface->setApplication(this);
95+ m_surface->setParent(this);
96+ SurfaceManager::singleton()->registerSurface(m_surface);
97+ }
71
98
72− m_windowComponent = new QQmlComponent(engine, this);
99+ Q_EMIT surfaceChanged(m_surface);
73− m_windowComponent->setData(m_windowQml.toLatin1(), QUrl());
100+ SurfaceManager::singleton()->registerSurface(m_surface);
74}
101}
75
102
76−void ApplicationInfo::doCreateWindowItem()
103+void ApplicationInfo::addPromptSurface(MirSurfaceItem* surface)
77{
104{
78− m_windowItem = qobject_cast<QQuickItem *>(m_windowComponent->create());
105+ qDebug() << "ApplicationInfo::addPromptSurface " << surface->name() << " to " << name();
79− m_windowItem->setParentItem(m_parentItem);
106+ if (surface == m_surface || m_promptSurfaces.contains(surface)) return;
107+
108+ surface->setApplication(this);
109+ m_promptSurfaces.append(surface);
110+ Q_EMIT promptSurfacesChanged();
80}
111}
81
112
82−void ApplicationInfo::createWindowItem()
113+void ApplicationInfo::removeSurface(MirSurfaceItem* surface)
83{
114{
84− if (!m_windowComponent)
115+ if (m_surface == surface) {
85− createWindowComponent();
116+ setSurface(nullptr);
86−
117+ } else if (m_promptSurfaces.contains(surface)) {
87− // only create the windowItem once the component is ready
118+ qDebug() << "Application::removeSurface " << surface->name() << " from " << name();
88− if (!m_windowComponent->isReady()) {
119+
89− connect(m_windowComponent, &QQmlComponent::statusChanged,
120+ m_promptSurfaces.removeAll(surface);
90− this, &ApplicationInfo::onWindowComponentStatusChanged);
121+ surface->setApplication(nullptr);
91− } else {
122+
92− doCreateWindowItem();
123+ Q_EMIT promptSurfacesChanged();
93 }
124 }
94}
125}
95
126
96−void ApplicationInfo::showWindow(QQuickItem *parent)
127+QList<MirSurfaceItem*> ApplicationInfo::promptSurfaceList() const
97{
128{
98− m_parentItem = parent;
129+ return m_promptSurfaces;
130+}
99
131
100− if (!m_windowItem)
132+QQmlListProperty<MirSurfaceItem> ApplicationInfo::promptSurfaces()
101− createWindowItem();
133+{
134+ return QQmlListProperty<MirSurfaceItem>(this,
135+ 0,
136+ ApplicationInfo::promptSurfaceCount,
137+ ApplicationInfo::promptSurfaceAt);
138+}
102
139
103− if (m_windowItem) {
140+int ApplicationInfo::promptSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop)
104− m_windowItem->setVisible(true);
141+{
105− }
142+ ApplicationInfo *p = qobject_cast<ApplicationInfo*>(prop->object);
143+ return p->m_promptSurfaces.count();
106}
144}
107
145
108−void ApplicationInfo::hideWindow()
146+MirSurfaceItem* ApplicationInfo::promptSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index)
109{
147{
110− if (!m_windowItem)
148+ ApplicationInfo *p = qobject_cast<ApplicationInfo*>(prop->object);
111− return;
112
149
113− m_windowItem->setVisible(false);
150+ if (index < 0 || index >= p->m_promptSurfaces.count())
151+ return nullptr;
152+ return p->m_promptSurfaces[index];
114}
153}
tests/mocks/Unity/Application/ApplicationInfo.h+32−16
@@ -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
@@ -21,6 +21,7 @@
21#include <QQmlComponent>
21#include <QQmlComponent>
22
22
23class QQuickItem;
23class QQuickItem;
24+class MirSurfaceItem;
24
25
25// unity-api
26// unity-api
26#include <unity/shell/application/ApplicationInfoInterface.h>
27#include <unity/shell/application/ApplicationInfoInterface.h>
@@ -36,6 +37,8 @@ class ApplicationInfo : public ApplicationInfoInterface {
36
37
37 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
38 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
38 Q_PROPERTY(Stage stage READ stage WRITE setStage NOTIFY stageChanged)
39 Q_PROPERTY(Stage stage READ stage WRITE setStage NOTIFY stageChanged)
40+ Q_PROPERTY(MirSurfaceItem* surface READ surface NOTIFY surfaceChanged)
41+ Q_PROPERTY(QQmlListProperty<MirSurfaceItem> promptSurfaces READ promptSurfaces NOTIFY promptSurfacesChanged DESIGNABLE false)
39
42
40 // Only exists in this fake implementation
43 // Only exists in this fake implementation
41
44
@@ -45,9 +48,10 @@ class ApplicationInfo : public ApplicationInfoInterface {
45 // QML component used to represent the application window
48 // QML component used to represent the application window
46 Q_PROPERTY(QString windowQml READ windowQml WRITE setWindowQml NOTIFY windowQmlChanged)
49 Q_PROPERTY(QString windowQml READ windowQml WRITE setWindowQml NOTIFY windowQmlChanged)
47
50
48− public:
51+public:
49 ApplicationInfo(QObject *parent = NULL);
52 ApplicationInfo(QObject *parent = NULL);
50 ApplicationInfo(const QString &appId, QObject *parent = NULL);
53 ApplicationInfo(const QString &appId, QObject *parent = NULL);
54+ ~ApplicationInfo();
51
55
52 #define IMPLEMENT_PROPERTY(name, Name, type) \
56 #define IMPLEMENT_PROPERTY(name, Name, type) \
53 public: \
57 public: \
@@ -56,11 +60,11 @@ class ApplicationInfo : public ApplicationInfoInterface {
56 { \
60 { \
57 if (m_##name != value) { \
61 if (m_##name != value) { \
58 m_##name = value; \
62 m_##name = value; \
59− Q_EMIT name##Changed(); \
63+ Q_EMIT name##Changed(value); \
60 } \
64 } \
61 } \
65 } \
62 Q_SIGNALS: \
66 Q_SIGNALS: \
63− void name##Changed(); \
67+ void name##Changed(const type&); \
64 private: \
68 private: \
65 type m_##name;
69 type m_##name;
66
70
@@ -78,23 +82,35 @@ class ApplicationInfo : public ApplicationInfoInterface {
78
82
79 #undef IMPLEMENT_PROPERTY
83 #undef IMPLEMENT_PROPERTY
80
84
81− public:
85+public:
82− void showWindow(QQuickItem *parent);
86+ void setSurface(MirSurfaceItem* surface);
83− void hideWindow();
87+ MirSurfaceItem* surface() const { return m_surface; }
84
88
89+ void removeSurface(MirSurfaceItem* surface);
90+
91+ void addPromptSurface(MirSurfaceItem* surface);
92+ QList<MirSurfaceItem*> promptSurfaceList() const;
93+ QQmlListProperty<MirSurfaceItem> promptSurfaces();
94+
95+Q_SIGNALS:
96+ void surfaceChanged(MirSurfaceItem*);
97+ void promptSurfacesChanged();
98+
85− private Q_SLOTS:
99+private Q_SLOTS:
86− void onWindowComponentStatusChanged(QQmlComponent::Status status);
100+ void onStateChanged(State state);
87− void setRunning();
101+
102+ void createSurface();
103+
104+private:
105+ static int promptSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop);
106+ static MirSurfaceItem* promptSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index);
88
107
89− private:
90− void createWindowItem();
91− void doCreateWindowItem();
92− void createWindowComponent();
93− QQuickItem *m_windowItem;
94− QQmlComponent *m_windowComponent;
95 QQuickItem *m_parentItem;
108 QQuickItem *m_parentItem;
109+ MirSurfaceItem* m_surface;
110+ QList<MirSurfaceItem*> m_promptSurfaces;
96};
111};
97
112
98Q_DECLARE_METATYPE(ApplicationInfo*)
113Q_DECLARE_METATYPE(ApplicationInfo*)
114+Q_DECLARE_METATYPE(QQmlListProperty<MirSurfaceItem>)
99
115
100#endif // APPLICATION_H
116#endif // APPLICATION_H
tests/mocks/Unity/Application/ApplicationManager.cpp+76−174
@@ -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
@@ -15,7 +15,9 @@
15 */
15 */
16
16
17#include "ApplicationManager.h"
17#include "ApplicationManager.h"
18+#include "ApplicationDBusAdaptor.h"
18#include "ApplicationInfo.h"
19#include "ApplicationInfo.h"
20+#include "MirSurfaceItem.h"
19
21
20#include <paths.h>
22#include <paths.h>
21
23
@@ -26,17 +28,35 @@
26#include <QQmlComponent>
28#include <QQmlComponent>
27#include <QTimer>
29#include <QTimer>
28#include <QDateTime>
30#include <QDateTime>
31+#include <QtDBus/QtDBus>
32+
33+ApplicationManager *ApplicationManager::the_application_manager = nullptr;
34+
35+ApplicationManager *ApplicationManager::singleton()
36+{
37+ if (!the_application_manager) {
38+ the_application_manager = new ApplicationManager();
39+ new ApplicationDBusAdaptor(the_application_manager);
40+
41+ QDBusConnection connection = QDBusConnection::sessionBus();
42+ connection.registerService("com.canonical.Unity8");
43+ connection.registerObject("/com/canonical/Unity8/Mocks", the_application_manager);
44+ }
45+ return the_application_manager;
46+}
29
47
30ApplicationManager::ApplicationManager(QObject *parent)
48ApplicationManager::ApplicationManager(QObject *parent)
31 : ApplicationManagerInterface(parent)
49 : ApplicationManagerInterface(parent)
32 , m_suspended(false)
50 , m_suspended(false)
33− , m_mainStageComponent(0)
34− , m_mainStage(0)
35− , m_sideStageComponent(0)
36− , m_sideStage(0)
37− , m_rightMargin(0)
38{
51{
52+ m_roleNames.insert(RoleSurface, "surface");
53+ m_roleNames.insert(RoleFullscreen, "fullscreen");
54+ m_roleNames.insert(RoleApplication, "application");
55+
39 buildListOfAvailableApplications();
56 buildListOfAvailableApplications();
57+
58+ startApplication("unity8-dash");
59+ focusApplication("unity8-dash");
40}
60}
41
61
42ApplicationManager::~ApplicationManager()
62ApplicationManager::~ApplicationManager()
@@ -69,6 +89,12 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
69 return app->focused();
89 return app->focused();
70 case RoleScreenshot:
90 case RoleScreenshot:
71 return app->screenshot();
91 return app->screenshot();
92+ case RoleSurface:
93+ return QVariant::fromValue(app->surface());
94+ case RoleFullscreen:
95+ return app->fullscreen();
96+ case RoleApplication:
97+ return QVariant::fromValue(app);
72 default:
98 default:
73 return QVariant();
99 return QVariant();
74 }
100 }
@@ -89,6 +115,17 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
89 return nullptr;
115 return nullptr;
90}
116}
91
117
118+QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
119+{
120+ for (int i = 0; i < m_runningApplications.size(); ++i) {
121+ if (m_runningApplications.at(i) == application) {
122+ return index(i);
123+ }
124+ }
125+
126+ return QModelIndex();
127+}
128+
92void ApplicationManager::add(ApplicationInfo *application) {
129void ApplicationManager::add(ApplicationInfo *application) {
93 if (!application) {
130 if (!application) {
94 return;
131 return;
@@ -99,7 +136,13 @@ void ApplicationManager::add(ApplicationInfo *application) {
99 endInsertRows();
136 endInsertRows();
100 Q_EMIT applicationAdded(application->appId());
137 Q_EMIT applicationAdded(application->appId());
101 Q_EMIT countChanged();
138 Q_EMIT countChanged();
102− Q_EMIT focusRequested(application->appId());
139+ if (count() == 1) Q_EMIT emptyChanged(isEmpty()); // was empty but not anymore
140+
141+ connect(application, &ApplicationInfo::surfaceChanged, this, [application, this]() {
142+ QModelIndex appIndex = findIndex(application);
143+ if (!appIndex.isValid()) return;
144+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
145+ });
103}
146}
104
147
105void ApplicationManager::remove(ApplicationInfo *application) {
148void ApplicationManager::remove(ApplicationInfo *application) {
@@ -110,7 +153,9 @@ void ApplicationManager::remove(ApplicationInfo *application) {
110 endRemoveRows();
153 endRemoveRows();
111 Q_EMIT applicationRemoved(application->appId());
154 Q_EMIT applicationRemoved(application->appId());
112 Q_EMIT countChanged();
155 Q_EMIT countChanged();
156+ if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
113 }
157 }
158+ disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
114}
159}
115
160
116void ApplicationManager::move(int from, int to) {
161void ApplicationManager::move(int from, int to) {
@@ -127,16 +172,6 @@ void ApplicationManager::move(int from, int to) {
127 }
172 }
128}
173}
129
174
130−int ApplicationManager::keyboardHeight() const
131−{
132− return 0;
133−}
134−
135−bool ApplicationManager::keyboardVisible() const
136−{
137− return false;
138−}
139−
140int ApplicationManager::sideStageWidth() const
175int ApplicationManager::sideStageWidth() const
141{
176{
142 return 0;
177 return 0;
@@ -180,14 +215,17 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
180 application->setStage(ApplicationInfo::MainStage);
215 application->setStage(ApplicationInfo::MainStage);
181 }
216 }
182 add(application);
217 add(application);
183−
218+ application->setState(ApplicationInfo::Running);
184− QMetaObject::invokeMethod(this, "focusApplication", Qt::QueuedConnection, Q_ARG(QString, appId));
185
219
186 return application;
220 return application;
187}
221}
188
222
189bool ApplicationManager::stopApplication(const QString &appId)
223bool ApplicationManager::stopApplication(const QString &appId)
190{
224{
225+ if (appId == "unity8-dash") {
226+ return false;
227+ }
228+
191 ApplicationInfo *application = findApplication(appId);
229 ApplicationInfo *application = findApplication(appId);
192 if (application == nullptr)
230 if (application == nullptr)
193 return false;
231 return false;
@@ -195,6 +233,7 @@ bool ApplicationManager::stopApplication(const QString &appId)
195 if (application->appId() == focusedApplicationId()) {
233 if (application->appId() == focusedApplicationId()) {
196 unfocusCurrentApplication();
234 unfocusCurrentApplication();
197 }
235 }
236+ application->setState(ApplicationInfo::Stopped);
198 remove(application);
237 remove(application);
199 return true;
238 return true;
200}
239}
@@ -215,7 +254,6 @@ bool ApplicationManager::updateScreenshot(const QString &appId)
215 return false;
254 return false;
216 }
255 }
217
256
218− application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
219 QModelIndex appIndex = index(idx);
257 QModelIndex appIndex = index(idx);
220 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
258 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
221 return true;
259 return true;
@@ -260,35 +298,25 @@ bool ApplicationManager::focusApplication(const QString &appId)
260 for (ApplicationInfo *app : m_runningApplications) {
298 for (ApplicationInfo *app : m_runningApplications) {
261 if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
299 if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
262 app->setFocused(false);
300 app->setFocused(false);
263− app->hideWindow();
301+ app->setState(ApplicationInfo::Suspended);
264 }
302 }
265 }
303 }
266
304
267 // focus this app
305 // focus this app
268 application->setFocused(true);
306 application->setFocused(true);
269− if (!m_mainStage)
307+ application->setState(ApplicationInfo::Running);
270− createMainStage();
271− application->showWindow(m_mainStage);
272− m_mainStage->setZ(-1000);
273− if (m_sideStage)
274− m_sideStage->setZ(-2000);
275 } else if (application->stage() == ApplicationInfo::SideStage) {
308 } else if (application->stage() == ApplicationInfo::SideStage) {
276 // unfocus currently focused sidestage app
309 // unfocus currently focused sidestage app
277 for (ApplicationInfo *app : m_runningApplications) {
310 for (ApplicationInfo *app : m_runningApplications) {
278 if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
311 if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
279 app->setFocused(false);
312 app->setFocused(false);
280− app->hideWindow();
313+ app->setState(ApplicationInfo::Suspended);
281 }
314 }
282 }
315 }
283
316
284 // focus this app
317 // focus this app
285 application->setFocused(true);
318 application->setFocused(true);
286− if (!m_sideStage)
319+ application->setState(ApplicationInfo::Running);
287− createSideStage();
288− application->showWindow(m_sideStage);
289− m_sideStage->setZ(-1000);
290− if (m_mainStage)
291− m_mainStage->setZ(-2000);
292 }
320 }
293
321
294 // move app to top of stack
322 // move app to top of stack
@@ -299,18 +327,14 @@ bool ApplicationManager::focusApplication(const QString &appId)
299
327
300bool ApplicationManager::requestFocusApplication(const QString &appId)
328bool ApplicationManager::requestFocusApplication(const QString &appId)
301{
329{
302− if (appId != focusedApplicationId()) {
303− QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
330+ QMetaObject::invokeMethod(this, "focusRequested", Qt::QueuedConnection, Q_ARG(QString, appId));
304− return true;
331+ return true;
305− }
306− return false;
307}
332}
308
333
309void ApplicationManager::unfocusCurrentApplication()
334void ApplicationManager::unfocusCurrentApplication()
310{
335{
311 for (ApplicationInfo *app : m_runningApplications) {
336 for (ApplicationInfo *app : m_runningApplications) {
312 if (app->focused()) {
337 if (app->focused()) {
313− app->hideWindow();
314 app->setFocused(false);
338 app->setFocused(false);
315 }
339 }
316 }
340 }
@@ -319,53 +343,27 @@ void ApplicationManager::unfocusCurrentApplication()
319
343
320void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
344void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
321{
345{
322− // TODO: Is there a better way of solving this fullscreen vs. regular
323− // application height?
324− QString topMargin;
325− if (application->fullscreen()) {
326− topMargin.append("0");
327− } else {
328− // Taken from Panel.panelHeight
329− topMargin.append("units.gu(3) + units.dp(2)");
330− }
331−
332− QString windowQml = QString(
333− "import QtQuick 2.0\n"
334− "Image {\n"
335− " anchors.fill: parent\n"
336− " anchors.topMargin: %1\n"
337− " anchors.rightMargin: %2\n"
338− " source: \"file://%3/Dash/graphics/phone/screenshots/%4.png\"\n"
339− " smooth: true\n"
340− " fillMode: Image.PreserveAspectCrop\n"
341− "}").arg(topMargin)
342− .arg(m_rightMargin)
343− .arg(qmlDirectory())
344− .arg(application->icon().toString());
345− application->setWindowQml(windowQml);
346−
347− QString imageQml = QString(
348− "import QtQuick 2.0\n"
349− "Image {\n"
350− " anchors.fill: parent\n"
351− " source: \"file://%1/Dash/graphics/phone/screenshots/%2.png\"\n"
346+ application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
352− " smooth: true\n"
353− " fillMode: Image.PreserveAspectCrop\n"
354− "}").arg(qmlDirectory())
355− .arg(application->icon().toString());
347+ .arg(application->icon().toString()));
356− application->setImageQml(imageQml);
357}
348}
358
349
359void ApplicationManager::buildListOfAvailableApplications()
350void ApplicationManager::buildListOfAvailableApplications()
360{
351{
361 ApplicationInfo *application;
352 ApplicationInfo *application;
362
353
354+ application = new ApplicationInfo(this);
355+ application->setAppId("unity8-dash");
356+ application->setName("Unity 8 Mock Dash");
357+ application->setIcon(QUrl("unity8-dash"));
358+ application->setStage(ApplicationInfo::MainStage);
359+ generateQmlStrings(application);
360+ m_availableApplications.append(application);
361+
363 application = new ApplicationInfo(this);
362 application = new ApplicationInfo(this);
364 application->setAppId("dialer-app");
363 application->setAppId("dialer-app");
365 application->setName("Dialer");
364 application->setName("Dialer");
366 application->setIcon(QUrl("dialer"));
365 application->setIcon(QUrl("dialer"));
367 application->setStage(ApplicationInfo::SideStage);
366 application->setStage(ApplicationInfo::SideStage);
368− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
369 generateQmlStrings(application);
367 generateQmlStrings(application);
370 m_availableApplications.append(application);
368 m_availableApplications.append(application);
371
369
@@ -374,7 +372,6 @@ void ApplicationManager::buildListOfAvailableApplications()
374 application->setName("Camera");
372 application->setName("Camera");
375 application->setIcon(QUrl("camera"));
373 application->setIcon(QUrl("camera"));
376 application->setFullscreen(true);
374 application->setFullscreen(true);
377− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
378 generateQmlStrings(application);
375 generateQmlStrings(application);
379 m_availableApplications.append(application);
376 m_availableApplications.append(application);
380
377
@@ -382,7 +379,6 @@ void ApplicationManager::buildListOfAvailableApplications()
382 application->setAppId("gallery-app");
379 application->setAppId("gallery-app");
383 application->setName("Gallery");
380 application->setName("Gallery");
384 application->setIcon(QUrl("gallery"));
381 application->setIcon(QUrl("gallery"));
385− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
386 generateQmlStrings(application);
382 generateQmlStrings(application);
387 m_availableApplications.append(application);
383 m_availableApplications.append(application);
388
384
@@ -391,7 +387,6 @@ void ApplicationManager::buildListOfAvailableApplications()
391 application->setName("Facebook");
387 application->setName("Facebook");
392 application->setIcon(QUrl("facebook"));
388 application->setIcon(QUrl("facebook"));
393 application->setStage(ApplicationInfo::SideStage);
389 application->setStage(ApplicationInfo::SideStage);
394− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
395 generateQmlStrings(application);
390 generateQmlStrings(application);
396 m_availableApplications.append(application);
391 m_availableApplications.append(application);
397
392
@@ -400,7 +395,6 @@ void ApplicationManager::buildListOfAvailableApplications()
400 application->setFullscreen(true);
395 application->setFullscreen(true);
401 application->setName("Browser");
396 application->setName("Browser");
402 application->setIcon(QUrl("browser"));
397 application->setIcon(QUrl("browser"));
403− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
404 generateQmlStrings(application);
398 generateQmlStrings(application);
405 m_availableApplications.append(application);
399 m_availableApplications.append(application);
406
400
@@ -409,7 +403,6 @@ void ApplicationManager::buildListOfAvailableApplications()
409 application->setName("Twitter");
403 application->setName("Twitter");
410 application->setIcon(QUrl("twitter"));
404 application->setIcon(QUrl("twitter"));
411 application->setStage(ApplicationInfo::SideStage);
405 application->setStage(ApplicationInfo::SideStage);
412− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
413 generateQmlStrings(application);
406 generateQmlStrings(application);
414 m_availableApplications.append(application);
407 m_availableApplications.append(application);
415
408
@@ -417,7 +410,6 @@ void ApplicationManager::buildListOfAvailableApplications()
417 application->setAppId("gmail-webapp");
410 application->setAppId("gmail-webapp");
418 application->setName("GMail");
411 application->setName("GMail");
419 application->setIcon(QUrl("gmail"));
412 application->setIcon(QUrl("gmail"));
420− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
421 m_availableApplications.append(application);
413 m_availableApplications.append(application);
422
414
423 application = new ApplicationInfo(this);
415 application = new ApplicationInfo(this);
@@ -425,7 +417,6 @@ void ApplicationManager::buildListOfAvailableApplications()
425 application->setName("Weather");
417 application->setName("Weather");
426 application->setIcon(QUrl("weather"));
418 application->setIcon(QUrl("weather"));
427 application->setStage(ApplicationInfo::SideStage);
419 application->setStage(ApplicationInfo::SideStage);
428− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
429 generateQmlStrings(application);
420 generateQmlStrings(application);
430 m_availableApplications.append(application);
421 m_availableApplications.append(application);
431
422
@@ -434,7 +425,6 @@ void ApplicationManager::buildListOfAvailableApplications()
434 application->setName("Notepad");
425 application->setName("Notepad");
435 application->setIcon(QUrl("notepad"));
426 application->setIcon(QUrl("notepad"));
436 application->setStage(ApplicationInfo::SideStage);
427 application->setStage(ApplicationInfo::SideStage);
437− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
438 m_availableApplications.append(application);
428 m_availableApplications.append(application);
439
429
440 application = new ApplicationInfo(this);
430 application = new ApplicationInfo(this);
@@ -442,7 +432,6 @@ void ApplicationManager::buildListOfAvailableApplications()
442 application->setName("Calendar");
432 application->setName("Calendar");
443 application->setIcon(QUrl("calendar"));
433 application->setIcon(QUrl("calendar"));
444 application->setStage(ApplicationInfo::SideStage);
434 application->setStage(ApplicationInfo::SideStage);
445− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
446 m_availableApplications.append(application);
435 m_availableApplications.append(application);
447
436
448 application = new ApplicationInfo(this);
437 application = new ApplicationInfo(this);
@@ -450,21 +439,18 @@ void ApplicationManager::buildListOfAvailableApplications()
450 application->setName("Media Player");
439 application->setName("Media Player");
451 application->setIcon(QUrl("mediaplayer-app"));
440 application->setIcon(QUrl("mediaplayer-app"));
452 application->setFullscreen(true);
441 application->setFullscreen(true);
453− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
454 m_availableApplications.append(application);
442 m_availableApplications.append(application);
455
443
456 application = new ApplicationInfo(this);
444 application = new ApplicationInfo(this);
457 application->setAppId("evernote");
445 application->setAppId("evernote");
458 application->setName("Evernote");
446 application->setName("Evernote");
459 application->setIcon(QUrl("evernote"));
447 application->setIcon(QUrl("evernote"));
460− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
461 m_availableApplications.append(application);
448 m_availableApplications.append(application);
462
449
463 application = new ApplicationInfo(this);
450 application = new ApplicationInfo(this);
464 application->setAppId("map");
451 application->setAppId("map");
465 application->setName("Map");
452 application->setName("Map");
466 application->setIcon(QUrl("map"));
453 application->setIcon(QUrl("map"));
467− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
468 generateQmlStrings(application);
454 generateQmlStrings(application);
469 m_availableApplications.append(application);
455 m_availableApplications.append(application);
470
456
@@ -472,103 +458,27 @@ void ApplicationManager::buildListOfAvailableApplications()
472 application->setAppId("pinterest");
458 application->setAppId("pinterest");
473 application->setName("Pinterest");
459 application->setName("Pinterest");
474 application->setIcon(QUrl("pinterest"));
460 application->setIcon(QUrl("pinterest"));
475− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
476 m_availableApplications.append(application);
461 m_availableApplications.append(application);
477
462
478 application = new ApplicationInfo(this);
463 application = new ApplicationInfo(this);
479 application->setAppId("soundcloud");
464 application->setAppId("soundcloud");
480 application->setName("SoundCloud");
465 application->setName("SoundCloud");
481 application->setIcon(QUrl("soundcloud"));
466 application->setIcon(QUrl("soundcloud"));
482− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
483 m_availableApplications.append(application);
467 m_availableApplications.append(application);
484
468
485 application = new ApplicationInfo(this);
469 application = new ApplicationInfo(this);
486 application->setAppId("wikipedia");
470 application->setAppId("wikipedia");
487 application->setName("Wikipedia");
471 application->setName("Wikipedia");
488 application->setIcon(QUrl("wikipedia"));
472 application->setIcon(QUrl("wikipedia"));
489− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
490 m_availableApplications.append(application);
473 m_availableApplications.append(application);
491
474
492 application = new ApplicationInfo(this);
475 application = new ApplicationInfo(this);
493 application->setAppId("youtube");
476 application->setAppId("youtube");
494 application->setName("YouTube");
477 application->setName("YouTube");
495 application->setIcon(QUrl("youtube"));
478 application->setIcon(QUrl("youtube"));
496− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
497 m_availableApplications.append(application);
479 m_availableApplications.append(application);
498}
480}
499
481
500−void ApplicationManager::createMainStageComponent()
501−{
502− // The assumptions I make here really should hold.
503− QQuickView *quickView =
504− qobject_cast<QQuickView*>(QGuiApplication::topLevelWindows()[0]);
505−
506− QQmlEngine *engine = quickView->engine();
507−
508− m_mainStageComponent = new QQmlComponent(engine, this);
509− QString mainStageQml =
510− "import QtQuick 2.0\n"
511− "Rectangle {\n"
512− " anchors.fill: parent\n"
513− " color: 'black'\n"
514− " z: -2000\n"
515− "}\n";
516− m_mainStageComponent->setData(mainStageQml.toLatin1(), QUrl());
517−}
518−
519−void ApplicationManager::createMainStage()
520−{
521− if (!m_mainStageComponent)
522− createMainStageComponent();
523−
524− // The assumptions I make here really should hold.
525− QQuickView *quickView =
526− qobject_cast<QQuickView*>(QGuiApplication::topLevelWindows()[0]);
527−
528− QQuickItem *shell = quickView->rootObject();
529−
530− m_mainStage = qobject_cast<QQuickItem *>(m_mainStageComponent->create());
531− m_mainStage->setParentItem(shell);
532−}
533−
534−void ApplicationManager::createSideStageComponent()
535−{
536− // The assumptions I make here really should hold.
537− QQuickView *quickView =
538− qobject_cast<QQuickView*>(QGuiApplication::topLevelWindows()[0]);
539−
540− QQmlEngine *engine = quickView->engine();
541−
542− m_sideStageComponent = new QQmlComponent(engine, this);
543− QString sideStageQml =
544− "import QtQuick 2.0\n"
545− "import Ubuntu.Components 0.1\n"
546− "Item {\n"
547− " width: units.gu(40)\n" // from SideStage in Shell.qml
548− " anchors.top: parent.top\n"
549− " anchors.bottom: parent.bottom\n"
550− " anchors.right: parent.right\n"
551− " z: -1000\n"
552− "}\n";
553− m_sideStageComponent->setData(sideStageQml.toLatin1(), QUrl());
554−}
555−
556−void ApplicationManager::createSideStage()
557−{
558− if (!m_sideStageComponent)
559− createSideStageComponent();
560−
561− // The assumptions I make here really should hold.
562− QQuickView *quickView =
563− qobject_cast<QQuickView*>(QGuiApplication::topLevelWindows()[0]);
564−
565− QQuickItem *shell = quickView->rootObject();
566−
567− m_sideStage = qobject_cast<QQuickItem *>(m_sideStageComponent->create());
568− m_sideStage->setParentItem(shell);
569− m_sideStage->setFlag(QQuickItem::ItemHasContents, false);
570−}
571−
572QStringList ApplicationManager::availableApplications()
482QStringList ApplicationManager::availableApplications()
573{
483{
574 QStringList appIds;
484 QStringList appIds;
@@ -578,15 +488,7 @@ QStringList ApplicationManager::availableApplications()
578 return appIds;
488 return appIds;
579}
489}
580
490
581−int ApplicationManager::rightMargin() const
491+bool ApplicationManager::isEmpty() const
582{
492{
583− return m_rightMargin;
493+ return m_runningApplications.isEmpty();
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}
494}
tests/mocks/Unity/Application/ApplicationManager.h+15−24
@@ -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
@@ -36,8 +36,7 @@ class ApplicationManager : public ApplicationManagerInterface {
36 Q_ENUMS(FavoriteApplication)
36 Q_ENUMS(FavoriteApplication)
37 Q_FLAGS(ExecFlags)
37 Q_FLAGS(ExecFlags)
38
38
39− Q_PROPERTY(int keyboardHeight READ keyboardHeight NOTIFY keyboardHeightChanged)
39+ Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
40− Q_PROPERTY(bool keyboardVisible READ keyboardVisible NOTIFY keyboardVisibleChanged)
41
40
42 Q_PROPERTY(int sideStageWidth READ sideStageWidth)
41 Q_PROPERTY(int sideStageWidth READ sideStageWidth)
43 Q_PROPERTY(StageHint stageHint READ stageHint)
42 Q_PROPERTY(StageHint stageHint READ stageHint)
@@ -45,14 +44,17 @@ class ApplicationManager : public ApplicationManagerInterface {
45
44
46 Q_PROPERTY(bool fake READ fake CONSTANT)
45 Q_PROPERTY(bool fake READ fake CONSTANT)
47
46
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−
52 public:
47 public:
53 ApplicationManager(QObject *parent = NULL);
48 ApplicationManager(QObject *parent = NULL);
54 virtual ~ApplicationManager();
49 virtual ~ApplicationManager();
55
50
51+ static ApplicationManager *singleton();
52+
53+ enum MoreRoles {
54+ RoleSurface = RoleScreenshot+1,
55+ RoleFullscreen,
56+ RoleApplication,
57+ };
56 enum Role {
58 enum Role {
57 Dash, Default, Indicators, Notifications, Greeter, Launcher, OnScreenKeyboard,
59 Dash, Default, Indicators, Notifications, Greeter, Launcher, OnScreenKeyboard,
58 ShutdownDialog
60 ShutdownDialog
@@ -74,8 +76,6 @@ class ApplicationManager : public ApplicationManagerInterface {
74 };
76 };
75 Q_DECLARE_FLAGS(ExecFlags, Flag)
77 Q_DECLARE_FLAGS(ExecFlags, Flag)
76
78
77− int keyboardHeight() const;
78− bool keyboardVisible() const;
79 int sideStageWidth() const;
79 int sideStageWidth() const;
80 StageHint stageHint() const;
80 StageHint stageHint() const;
81 FormFactorHint formFactorHint() const;
81 FormFactorHint formFactorHint() const;
@@ -105,14 +105,15 @@ class ApplicationManager : public ApplicationManagerInterface {
105
105
106 // Only for testing
106 // Only for testing
107 Q_INVOKABLE QStringList availableApplications();
107 Q_INVOKABLE QStringList availableApplications();
108− int rightMargin() const;
108+
109− void setRightMargin(int rightMargin);
109+ QModelIndex findIndex(ApplicationInfo* application);
110+
111+ bool isEmpty() const;
110
112
111 Q_SIGNALS:
113 Q_SIGNALS:
112− void keyboardHeightChanged();
113− void keyboardVisibleChanged();
114 void focusRequested(FavoriteApplication favoriteApplication);
114 void focusRequested(FavoriteApplication favoriteApplication);
115 void focusRequested(const QString &appId);
115 void focusRequested(const QString &appId);
116+ void emptyChanged(bool empty);
116
117
117 private:
118 private:
118 void add(ApplicationInfo *application);
119 void add(ApplicationInfo *application);
@@ -120,21 +121,11 @@ class ApplicationManager : public ApplicationManagerInterface {
120 void showApplicationWindow(ApplicationInfo *application);
121 void showApplicationWindow(ApplicationInfo *application);
121 void buildListOfAvailableApplications();
122 void buildListOfAvailableApplications();
122 void generateQmlStrings(ApplicationInfo *application);
123 void generateQmlStrings(ApplicationInfo *application);
123− void createMainStageComponent();
124− void createMainStage();
125− void createSideStageComponent();
126− void createSideStage();
127− int m_keyboardHeight;
128− bool m_keyboardVisible;
129 bool m_suspended;
124 bool m_suspended;
130 QList<ApplicationInfo*> m_runningApplications;
125 QList<ApplicationInfo*> m_runningApplications;
131 QList<ApplicationInfo*> m_availableApplications;
126 QList<ApplicationInfo*> m_availableApplications;
132− QQmlComponent *m_mainStageComponent;
133− QQuickItem *m_mainStage;
134− QQmlComponent *m_sideStageComponent;
135− QQuickItem *m_sideStage;
136
127
137− int m_rightMargin;
128+ static ApplicationManager *the_application_manager;
138};
129};
139
130
140Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
131Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
tests/mocks/Unity/Application/ApplicationScreenshotProvider.cpp+1−1
@@ -64,7 +64,7 @@ QImage ApplicationScreenshotProvider::requestImage(const QString &imageId, QSize
64 Q_FOREACH (QWindow *win, unity->allWindows()) {
64 Q_FOREACH (QWindow *win, unity->allWindows()) {
65 QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
65 QQuickWindow *quickWin = qobject_cast<QQuickWindow*>(win);
66 if (quickWin) {
66 if (quickWin) {
67− image = image.scaledToWidth(quickWin->width() - m_appManager->rightMargin());
67+ image = image.scaledToWidth(quickWin->width());
68 break;
68 break;
69 }
69 }
70 }
70 }
tests/mocks/Unity/Application/CMakeLists.txt+6−2
@@ -2,10 +2,14 @@ pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application)
2
2
3set(FakeUnityApplicationQml_SOURCES
3set(FakeUnityApplicationQml_SOURCES
4 plugin.cpp
4 plugin.cpp
5+ ApplicationDBusAdaptor.cpp
5 ApplicationInfo.cpp
6 ApplicationInfo.cpp
6 ApplicationImage.cpp
7 ApplicationImage.cpp
7 ApplicationManager.cpp
8 ApplicationManager.cpp
8 ApplicationScreenshotProvider.cpp
9 ApplicationScreenshotProvider.cpp
10+ MirSurfaceItem.cpp
11+ SurfaceManager.cpp
12+ VirtualKeyboard.cpp
9 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
13 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
10 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
14 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
11)
15)
@@ -15,8 +19,8 @@ add_library(FakeUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
15add_library(NonMirUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
19add_library(NonMirUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
16set_target_properties(NonMirUnityApplicationQml PROPERTIES OUTPUT_NAME FakeUnityApplicationQml)
20set_target_properties(NonMirUnityApplicationQml PROPERTIES OUTPUT_NAME FakeUnityApplicationQml)
17
21
18−qt5_use_modules(FakeUnityApplicationQml Core Quick)
22+qt5_use_modules(FakeUnityApplicationQml Core Quick DBus)
19−qt5_use_modules(NonMirUnityApplicationQml Core Quick)
23+qt5_use_modules(NonMirUnityApplicationQml Core Quick DBus)
20
24
21add_unity8_mock(Unity.Application 0.1 Unity/Application PREFIX mocks TARGETS FakeUnityApplicationQml)
25add_unity8_mock(Unity.Application 0.1 Unity/Application PREFIX mocks TARGETS FakeUnityApplicationQml)
22add_unity8_mock(Unity.Application 0.1 Unity/Application
26add_unity8_mock(Unity.Application 0.1 Unity/Application
tests/mocks/Unity/Application/MirSurfaceItem.cppnew file+180
@@ -0,0 +1,180 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MirSurfaceItem.h"
18+#include "ApplicationInfo.h"
19+
20+#include <QPainter>
21+#include <QQmlEngine>
22+
23+MirSurfaceItem::MirSurfaceItem(const QString& name,
24+ MirSurfaceItem::Type type,
25+ MirSurfaceItem::State state,
26+ const QUrl& screenshot,
27+ QQuickItem *parent)
28+ : QQuickPaintedItem(parent)
29+ , m_application(nullptr)
30+ , m_name(name)
31+ , m_type(type)
32+ , m_state(state)
33+ , m_img(screenshot.isLocalFile() ? screenshot.toLocalFile() : screenshot.toString())
34+ , m_parentSurface(nullptr)
35+ , m_haveInputMethod(false)
36+{
37+ qDebug() << "MirSurfaceItem::MirSurfaceItem() " << this->name();
38+
39+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
40+
41+ // The virtual keyboard (input method) has a big transparent area so that
42+ // content behind it show through
43+ setFillColor(Qt::transparent);
44+
45+ connect(this, &QQuickItem::focusChanged,
46+ this, &MirSurfaceItem::onFocusChanged);
47+}
48+
49+MirSurfaceItem::~MirSurfaceItem()
50+{
51+ qDebug() << "MirSurfaceItem::~MirSurfaceItem() " << name();
52+
53+ QList<MirSurfaceItem*> children(m_children);
54+ for (MirSurfaceItem* child : children) {
55+ child->setParentSurface(nullptr);
56+ }
57+ if (m_parentSurface)
58+ m_parentSurface->removeChildSurface(this);
59+
60+ if (m_application)
61+ m_application->removeSurface(this);
62+}
63+
64+void MirSurfaceItem::paint(QPainter * painter)
65+{
66+ if (!m_img.isNull()) {
67+ painter->drawImage(contentsBoundingRect(), m_img, QRect(QPoint(0,0), m_img.size()));
68+ }
69+}
70+
71+void MirSurfaceItem::release()
72+{
73+ QList<MirSurfaceItem*> children(m_children);
74+ for (MirSurfaceItem* child : children) {
75+ child->release();
76+ }
77+ if (m_parentSurface) {
78+ m_parentSurface->removeChildSurface(this);
79+ }
80+
81+ if (m_application) {
82+ m_application->removeSurface(this);
83+ }
84+ if (!parent()) {
85+ deleteLater();
86+ }
87+}
88+
89+void MirSurfaceItem::setApplication(ApplicationInfo* application)
90+{
91+ m_application = application;
92+}
93+
94+void MirSurfaceItem::setParentSurface(MirSurfaceItem* surface)
95+{
96+ if (m_parentSurface == surface || surface == this)
97+ return;
98+
99+ if (m_parentSurface) {
100+ m_parentSurface->removeChildSurface(this);
101+ }
102+
103+ m_parentSurface = surface;
104+
105+ if (m_parentSurface) {
106+ m_parentSurface->addChildSurface(this);
107+ }
108+ Q_EMIT parentSurfaceChanged(surface);
109+}
110+
111+void MirSurfaceItem::addChildSurface(MirSurfaceItem* surface)
112+{
113+ qDebug() << "MirSurfaceItem::addChildSurface " << surface->name() << " to " << name();
114+
115+ m_children.append(surface);
116+ Q_EMIT childSurfacesChanged();
117+}
118+
119+void MirSurfaceItem::removeChildSurface(MirSurfaceItem* surface)
120+{
121+ qDebug() << "MirSurfaceItem::removeChildSurface " << surface->name() << " from " << name();
122+
123+ if (m_children.contains(surface)) {
124+ m_children.removeOne(surface);
125+ Q_EMIT childSurfacesChanged();
126+ }
127+}
128+
129+QList<MirSurfaceItem*> MirSurfaceItem::childSurfaceList()
130+{
131+ return m_children;
132+}
133+
134+QQmlListProperty<MirSurfaceItem> MirSurfaceItem::childSurfaces()
135+{
136+ return QQmlListProperty<MirSurfaceItem>(this,
137+ 0,
138+ MirSurfaceItem::childSurfaceCount,
139+ MirSurfaceItem::childSurfaceAt);
140+}
141+
142+int MirSurfaceItem::childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop)
143+{
144+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
145+ return p->m_children.count();
146+}
147+
148+MirSurfaceItem* MirSurfaceItem::childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index)
149+{
150+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
151+
152+ if (index < 0 || index >= p->m_children.count())
153+ return nullptr;
154+ return p->m_children[index];
155+}
156+
157+
158+void MirSurfaceItem::touchEvent(QTouchEvent * event)
159+{
160+ if (event->type() == QEvent::TouchBegin && hasFocus()) {
161+ Q_EMIT inputMethodRequested();
162+ m_haveInputMethod = true;
163+ }
164+}
165+
166+void MirSurfaceItem::onFocusChanged()
167+{
168+ if (!hasFocus() && m_haveInputMethod) {
169+ Q_EMIT inputMethodDismissed();
170+ m_haveInputMethod = false;
171+ }
172+}
173+
174+void MirSurfaceItem::setState(MirSurfaceItem::State newState)
175+{
176+ if (newState != m_state) {
177+ m_state = newState;
178+ Q_EMIT stateChanged(newState);
179+ }
180+}
tests/mocks/Unity/Application/MirSurfaceItem.hnew file+122
@@ -0,0 +1,122 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MIRSURFACEITEM_H
18+#define MIRSURFACEITEM_H
19+
20+#include <QQuickPaintedItem>
21+#include <QImage>
22+
23+class ApplicationInfo;
24+
25+class MirSurfaceItem : public QQuickPaintedItem
26+{
27+ Q_OBJECT
28+ Q_ENUMS(Type)
29+ Q_ENUMS(State)
30+
31+ Q_PROPERTY(Type type READ type NOTIFY typeChanged)
32+ Q_PROPERTY(State state READ state NOTIFY stateChanged)
33+ Q_PROPERTY(QString name READ name NOTIFY nameChanged)
34+ Q_PROPERTY(MirSurfaceItem* parentSurface READ parentSurface NOTIFY parentSurfaceChanged)
35+ Q_PROPERTY(QQmlListProperty<MirSurfaceItem> childSurfaces READ childSurfaces NOTIFY childSurfacesChanged DESIGNABLE false)
36+
37+public:
38+ enum Type {
39+ Normal,
40+ Utility,
41+ Dialog,
42+ Overlay,
43+ Freestyle,
44+ Popover,
45+ InputMethod,
46+ };
47+
48+ enum State {
49+ Unknown,
50+ Restored,
51+ Minimized,
52+ Maximized,
53+ VertMaximized,
54+ /* SemiMaximized, */
55+ Fullscreen,
56+ };
57+
58+ explicit MirSurfaceItem(const QString& name,
59+ Type type,
60+ State state,
61+ const QUrl& screenshot,
62+ QQuickItem *parent = 0);
63+ ~MirSurfaceItem();
64+
65+ //getters
66+ ApplicationInfo* application() const { return m_application; }
67+ Type type() const { return m_type; }
68+ State state() const { return m_state; }
69+ QString name() const { return m_name; }
70+ MirSurfaceItem* parentSurface() const { return m_parentSurface; }
71+ QList<MirSurfaceItem*> childSurfaceList();
72+
73+ void setApplication(ApplicationInfo* item);
74+ void setParentSurface(MirSurfaceItem* item);
75+
76+ Q_INVOKABLE void setState(State newState);
77+ Q_INVOKABLE void release();
78+
79+ void paint(QPainter * painter) override;
80+ void touchEvent(QTouchEvent * event) override;
81+
82+Q_SIGNALS:
83+ void typeChanged(Type);
84+ void stateChanged(State);
85+ void nameChanged(QString);
86+ void parentSurfaceChanged(MirSurfaceItem*);
87+ void childSurfacesChanged();
88+
89+ void removed();
90+
91+ void inputMethodRequested();
92+ void inputMethodDismissed();
93+
94+private Q_SLOTS:
95+ void onFocusChanged();
96+
97+protected:
98+ const QImage &screenshotImage() { return m_img; }
99+
100+private:
101+ void addChildSurface(MirSurfaceItem* surface);
102+ void removeChildSurface(MirSurfaceItem* surface);
103+
104+ QQmlListProperty<MirSurfaceItem> childSurfaces();
105+ static int childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop);
106+ static MirSurfaceItem* childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index);
107+
108+ ApplicationInfo* m_application;
109+ const QString m_name;
110+ const Type m_type;
111+ State m_state;
112+ const QImage m_img;
113+
114+ MirSurfaceItem* m_parentSurface;
115+ QList<MirSurfaceItem*> m_children;
116+ bool m_haveInputMethod;
117+};
118+
119+Q_DECLARE_METATYPE(MirSurfaceItem*)
120+Q_DECLARE_METATYPE(QList<MirSurfaceItem*>)
121+
122+#endif // MIRSURFACEITEM_H
tests/mocks/Unity/Application/SurfaceManager.cppnew file+73
@@ -0,0 +1,73 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "SurfaceManager.h"
18+
19+#include "MirSurfaceItem.h"
20+#include "VirtualKeyboard.h"
21+
22+
23+SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
24+
25+SurfaceManager *SurfaceManager::singleton()
26+{
27+ if (!the_surface_manager) {
28+ the_surface_manager = new SurfaceManager();
29+ }
30+ return the_surface_manager;
31+}
32+
33+SurfaceManager::SurfaceManager(QObject *parent) :
34+ QObject(parent)
35+ , m_virtualKeyboard(nullptr)
36+{
37+}
38+
39+void SurfaceManager::registerSurface(MirSurfaceItem *surface)
40+{
41+ connect(surface, &MirSurfaceItem::inputMethodRequested,
42+ this, &SurfaceManager::showInputMethod);
43+ connect(surface, &MirSurfaceItem::inputMethodDismissed,
44+ this, &SurfaceManager::hideInputMethod);
45+ Q_EMIT surfaceCreated(surface);
46+}
47+
48+void SurfaceManager::unregisterSurface(MirSurfaceItem *surface)
49+{
50+ disconnect(surface, 0, this, 0);
51+ Q_EMIT surfaceDestroyed(surface);
52+}
53+
54+void SurfaceManager::showInputMethod()
55+{
56+ inputMethodSurface()->setState(MirSurfaceItem::Restored);
57+}
58+
59+void SurfaceManager::hideInputMethod()
60+{
61+ if (m_virtualKeyboard) {
62+ m_virtualKeyboard->setState(MirSurfaceItem::Minimized);
63+ }
64+}
65+
66+MirSurfaceItem *SurfaceManager::inputMethodSurface()
67+{
68+ if (!m_virtualKeyboard) {
69+ m_virtualKeyboard = new VirtualKeyboard(MirSurfaceItem::Minimized);
70+ Q_EMIT surfaceCreated(m_virtualKeyboard);
71+ }
72+ return m_virtualKeyboard;
73+}
tests/mocks/Unity/Application/SurfaceManager.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef SURFACEMANAGER_H
18+#define SURFACEMANAGER_H
19+
20+#include <QObject>
21+
22+class MirSurfaceItem;
23+class VirtualKeyboard;
24+
25+class SurfaceManager : public QObject
26+{
27+ Q_OBJECT
28+public:
29+ explicit SurfaceManager(QObject *parent = 0);
30+
31+ static SurfaceManager *singleton();
32+
33+ // Internal mock use
34+ void registerSurface(MirSurfaceItem *surface);
35+ void unregisterSurface(MirSurfaceItem *surface);
36+
37+ // To be used in the tests
38+ Q_INVOKABLE MirSurfaceItem *inputMethodSurface();
39+
40+Q_SIGNALS:
41+ void countChanged();
42+ void surfaceCreated(MirSurfaceItem *surface);
43+ void surfaceDestroyed(MirSurfaceItem *surface);
44+
45+private Q_SLOTS:
46+ void showInputMethod();
47+ void hideInputMethod();
48+
49+private:
50+ static SurfaceManager *the_surface_manager;
51+ VirtualKeyboard *m_virtualKeyboard;
52+};
53+
54+#endif // SURFACEMANAGER_H
tests/mocks/Unity/Application/VirtualKeyboard.cppnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "VirtualKeyboard.h"
18+
19+#include <paths.h>
20+
21+VirtualKeyboard::VirtualKeyboard(State state, QQuickItem *parent)
22+ : MirSurfaceItem("input-method",
23+ MirSurfaceItem::InputMethod,
24+ state,
25+ QString("file://%1/Dash/graphics/phone/screenshots/vkb_portrait.png").arg(qmlDirectory()),
26+ parent)
27+{
28+}
29+
30+void VirtualKeyboard::touchEvent(QTouchEvent *event)
31+{
32+ if (event->type() == QEvent::TouchBegin && !hasTouchInsideKeyboard(event)) {
33+ event->ignore();
34+ }
35+}
36+
37+bool VirtualKeyboard::hasTouchInsideKeyboard(QTouchEvent *event)
38+{
39+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
40+ for (int i = 0; i < touchPoints.count(); ++i) {
41+ QPoint pos = touchPoints.at(i).pos().toPoint();
42+
43+ // Map to image coords
44+ int imageX = (int)( ( ((qreal)pos.x()) / width() ) * ((qreal)screenshotImage().size().width()) );
45+ int imageY = (int)( ( ((qreal)pos.y()) / height() ) * ((qreal)screenshotImage().size().height()) );
46+
47+ QRgb pixelHit = screenshotImage().pixel(imageX, imageY);
48+
49+ // The keyboard depicted in the image is in its opaque part.
50+ if (qAlpha(pixelHit) != 0) {
51+ return true;
52+ }
53+ }
54+ return false;
55+}
qml/Stages/SidestageHandle.qml → tests/mocks/Unity/Application/VirtualKeyboard.hrenamed+19−6
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 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
@@ -14,9 +14,22 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−import QtQuick 2.0
17+#ifndef VIRTUALKEYBOARD_H
18−import Ubuntu.Components 0.1
18+#define VIRTUALKEYBOARD_H
19
19
20−BorderImage {
20+#include "MirSurfaceItem.h"
21− source: "graphics/sidestage_handle.sci"
21+
22+class VirtualKeyboard : public MirSurfaceItem
23+{
24+ Q_OBJECT
25+public:
26+ VirtualKeyboard(State state,
27+ QQuickItem *parent = 0);
28+
29+ void touchEvent(QTouchEvent * event) override;
30+
31+private:
32+ bool hasTouchInsideKeyboard(QTouchEvent *event);
22−}
33+};
34+
35+#endif // VIRTUALKEYBOARD_H
tests/mocks/Unity/Application/plugin.cpp+16−9
@@ -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
@@ -19,29 +19,37 @@
19#include "ApplicationImage.h"
19#include "ApplicationImage.h"
20#include "ApplicationManager.h"
20#include "ApplicationManager.h"
21#include "ApplicationScreenshotProvider.h"
21#include "ApplicationScreenshotProvider.h"
22+#include "MirSurfaceItem.h"
23+#include "SurfaceManager.h"
22
24
23#include <qqml.h>
25#include <qqml.h>
24#include <QQmlEngine>
26#include <QQmlEngine>
25
27
26−ApplicationManager *s_appManager = 0;
27−
28static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
28static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
29 Q_UNUSED(engine);
29 Q_UNUSED(engine);
30 Q_UNUSED(scriptEngine);
30 Q_UNUSED(scriptEngine);
31− if (!s_appManager) {
32− s_appManager = new ApplicationManager();
31+ return ApplicationManager::singleton();
33− }
32+}
34− return s_appManager;
33+
34+static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
35+ Q_UNUSED(engine);
36+ Q_UNUSED(scriptEngine);
37+ return SurfaceManager::singleton();
35}
38}
36
39
37void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
40void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
38{
41{
42+ qRegisterMetaType<MirSurfaceItem*>("MirSurfaceItem*");
43+
39 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
44 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
40 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
45 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
46+ qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
41
47
42 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
48 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
43 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
49 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
44
50
51+ qmlRegisterUncreatableType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem", "MirSurfaceItem can't be instantiated from QML");
52+
45 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
53 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
46}
54}
47
55
@@ -49,6 +57,5 @@ void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const c
49{
57{
50 QQmlExtensionPlugin::initializeEngine(engine, uri);
58 QQmlExtensionPlugin::initializeEngine(engine, uri);
51
59
52− ApplicationManager* appManager = static_cast<ApplicationManager*>(applicationManagerSingleton(engine, NULL));
53− engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(appManager));
60+ engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(ApplicationManager::singleton()));
54}
61}
tests/mocks/Unity/CMakeLists.txt+4−3
@@ -2,11 +2,12 @@ add_subdirectory(Application)
2add_subdirectory(Indicators)
2add_subdirectory(Indicators)
3add_subdirectory(Launcher)
3add_subdirectory(Launcher)
4add_subdirectory(Notifications)
4add_subdirectory(Notifications)
5+add_subdirectory(DashCommunicator)
5
6
6pkg_search_module(DEE dee-1.0 REQUIRED)
7pkg_search_module(DEE dee-1.0 REQUIRED)
7pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
8pkg_search_module(GOBJECT gobject-2.0 REQUIRED)
8pkg_search_module(DEEQT libdee-qt5 REQUIRED)
9pkg_search_module(DEEQT libdee-qt5 REQUIRED)
9−pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=2)
10+pkg_check_modules(SCOPES_API REQUIRED unity-shell-scopes=4)
10
11
11include_directories(
12include_directories(
12 ${CMAKE_CURRENT_BINARY_DIR}
13 ${CMAKE_CURRENT_BINARY_DIR}
@@ -22,14 +23,14 @@ set(UnityQML_SOURCES
22 fake_scope.cpp
23 fake_scope.cpp
23 fake_scopes.cpp
24 fake_scopes.cpp
24 fake_categories.cpp
25 fake_categories.cpp
25− fake_department.cpp
26+ fake_navigation.cpp
26 fake_resultsmodel.cpp
27 fake_resultsmodel.cpp
27 fake_previewmodel.cpp
28 fake_previewmodel.cpp
28 fake_previewstack.cpp
29 fake_previewstack.cpp
29 fake_previewwidgetmodel.cpp
30 fake_previewwidgetmodel.cpp
30 fake_unity_plugin.cpp
31 fake_unity_plugin.cpp
31 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/CategoriesInterface.h
32 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/CategoriesInterface.h
32− ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/DepartmentInterface.h
33+ ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/NavigationInterface.h
33 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewModelInterface.h
34 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewModelInterface.h
34 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewStackInterface.h
35 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewStackInterface.h
35 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewWidgetModelInterface.h
36 ${SCOPES_API_INCLUDEDIR}/unity/shell/scopes/PreviewWidgetModelInterface.h
tests/mocks/Unity/DashCommunicator/CMakeLists.txtnew file+18
@@ -0,0 +1,18 @@
1+include_directories(
2+ ${CMAKE_CURRENT_SOURCE_DIR}
3+)
4+
5+set(QMLDASHCOMMUNICATORPLUGIN_SRC
6+ plugin.cpp
7+ dashcommunicatorservice.cpp
8+ dashcommunicator.cpp
9+ )
10+
11+add_library(MockDashCommunicator-qml MODULE
12+ ${QMLDASHCOMMUNICATORPLUGIN_SRC}
13+ )
14+
15+qt5_use_modules(MockDashCommunicator-qml DBus Qml)
16+
17+# export the qmldir and qmltypes files
18+add_unity8_mock(Unity.DashCommunicator 0.1 Unity/DashCommunicator TARGETS MockDashCommunicator-qml)
tests/mocks/Unity/DashCommunicator/dashcommunicator.cppnew file+37
@@ -0,0 +1,37 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify 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 "dashcommunicator.h"
18+
19+#include <QObject>
20+#include <QDBusConnection>
21+#include <QDBusInterface>
22+#include <QDebug>
23+
24+DashCommunicator::DashCommunicator(QObject *parent):
25+ QObject(parent)
26+{
27+}
28+
29+DashCommunicator::~DashCommunicator()
30+{
31+}
32+
33+
34+void DashCommunicator::setCurrentScope(const QString &scopeId, bool animate, bool reset)
35+{
36+ Q_EMIT setCurrentScopeCalled(scopeId, animate, reset);
37+}
tests/mocks/Unity/DashCommunicator/dashcommunicator.hnew file+39
@@ -0,0 +1,39 @@
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+#ifndef DASHCOMMUNICATOR_H
18+#define DASHCOMMUNICATOR_H
19+
20+#include <QObject>
21+
22+class DashCommunicator: public QObject
23+{
24+ Q_OBJECT
25+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity.DashCommunicator")
26+
27+public:
28+ DashCommunicator(QObject *parent = 0);
29+ ~DashCommunicator();
30+
31+public Q_SLOTS:
32+ void setCurrentScope(const QString &scopeId, bool animate, bool reset);
33+
34+Q_SIGNALS:
35+ // This mock just emits calls back to the QML api for the plugin to verify calls
36+ void setCurrentScopeCalled(const QString &scopeId, bool animate, bool reset);
37+};
38+
39+#endif
tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.cppnew file+33
@@ -0,0 +1,33 @@
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 "dashcommunicatorservice.h"
18+
19+DashCommunicatorService::DashCommunicatorService(QObject *parent):
20+ QObject(parent)
21+{
22+}
23+
24+
25+DashCommunicatorService::~DashCommunicatorService()
26+{
27+
28+}
29+
30+void DashCommunicatorService::mockSetCurrentScope(const QString &scopeId, bool animate, bool reset)
31+{
32+ Q_EMIT setCurrentScopeRequested(scopeId, animate, reset);
33+}
tests/mocks/Unity/DashCommunicator/dashcommunicatorservice.hnew file+36
@@ -0,0 +1,36 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software: you can redistribute it and/or modify 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 DASHCOMMUNICATORSERVICE_H
18+#define DASHCOMMUNICATORSERVICE_H
19+
20+#include <QObject>
21+
22+class DashCommunicatorService: public QObject
23+{
24+ Q_OBJECT
25+public:
26+ DashCommunicatorService(QObject *parent = 0);
27+ ~DashCommunicatorService();
28+
29+Q_SIGNALS:
30+ void setCurrentScopeRequested(const QString &scopeId, bool animate, bool reset);
31+
32+public Q_SLOTS:
33+ void mockSetCurrentScope(const QString &scopeId, bool animate, bool reset);
34+};
35+
36+#endif // DBUSUNITYSESSIONSERVICE_H
tests/mocks/Unity/DashCommunicator/plugin.cppnew file+31
@@ -0,0 +1,31 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#include "plugin.h"
20+#include "dashcommunicator.h"
21+#include "dashcommunicatorservice.h"
22+
23+#include <QDBusConnection>
24+#include <QtQml/qqml.h>
25+
26+void DashCommunicatorPlugin::registerTypes(const char *uri)
27+{
28+ Q_ASSERT(uri == QStringLiteral("Unity.DashCommunicator"));
29+ qmlRegisterType<DashCommunicatorService>(uri, 0, 1, "DashCommunicatorService");
30+ qmlRegisterType<DashCommunicator>(uri, 0, 1, "DashCommunicator");
31+}
tests/mocks/Unity/DashCommunicator/plugin.hnew file+34
@@ -0,0 +1,34 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+ */
18+
19+#ifndef DASHCOMMUNICATOR_PLUGIN_H
20+#define DASHCOMMUNICATOR_PLUGIN_H
21+
22+#include <QtQml/QQmlEngine>
23+#include <QtQml/QQmlExtensionPlugin>
24+
25+class DashCommunicatorPlugin : public QQmlExtensionPlugin
26+{
27+ Q_OBJECT
28+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29+
30+public:
31+ void registerTypes(const char *uri);
32+};
33+
34+#endif
tests/mocks/Unity/DashCommunicator/qmldirnew file+3
@@ -0,0 +1,3 @@
1+module Unity.DashCommunicator
2+plugin MockDashCommunicator-qml
3+typeinfo DashCommunicator.qmltypes
tests/mocks/Unity/Unity.qmltypes+79−27
@@ -24,6 +24,12 @@ Module {
24 Parameter { name: "categoryId"; type: "string" }
24 Parameter { name: "categoryId"; type: "string" }
25 Parameter { name: "json"; type: "string" }
25 Parameter { name: "json"; type: "string" }
26 }
26 }
27+ Method {
28+ name: "data"
29+ type: "QVariant"
30+ Parameter { name: "row"; type: "int" }
31+ Parameter { name: "role"; type: "int" }
32+ }
27 }
33 }
28 Component {
34 Component {
29 name: "PreviewModel"
35 name: "PreviewModel"
@@ -62,6 +68,10 @@ Module {
62 prototype: "unity::shell::scopes::ScopeInterface"
68 prototype: "unity::shell::scopes::ScopeInterface"
63 exports: ["Unity/MockScope 0.2"]
69 exports: ["Unity/MockScope 0.2"]
64 exportMetaObjectRevisions: [0]
70 exportMetaObjectRevisions: [0]
71+ Signal {
72+ name: "performQuery"
73+ Parameter { name: "query"; type: "string" }
74+ }
65 Method {
75 Method {
66 name: "setSearchInProgress"
76 name: "setSearchInProgress"
67 Parameter { name: "inProg"; type: "bool" }
77 Parameter { name: "inProg"; type: "bool" }
@@ -81,18 +91,21 @@ Module {
81 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
91 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
82 }
92 }
83 Method {
93 Method {
84− name: "getDepartment"
94+ name: "getNavigation"
85− type: "unity::shell::scopes::DepartmentInterface*"
95+ type: "unity::shell::scopes::NavigationInterface*"
86− Parameter { name: "id"; type: "string" }
96+ Parameter { name: "navigationId"; type: "string" }
87 }
97 }
88 Method {
98 Method {
89− name: "loadDepartment"
99+ name: "getAltNavigation"
100+ type: "unity::shell::scopes::NavigationInterface*"
90− Parameter { name: "id"; type: "string" }
101+ Parameter { name: "altNavigationId"; type: "string" }
91 }
102 }
92 Method {
103 Method {
93− name: "performQuery"
104+ name: "setNavigationState"
94− Parameter { name: "query"; type: "string" }
105+ Parameter { name: "navigationId"; type: "string" }
106+ Parameter { name: "isAltNavigation"; type: "bool" }
95 }
107 }
108+ Method { name: "refresh" }
96 }
109 }
97 Component {
110 Component {
98 name: "Scopes"
111 name: "Scopes"
@@ -137,6 +150,7 @@ Module {
137 "RoleRawRendererTemplate": 3,
150 "RoleRawRendererTemplate": 3,
138 "RoleRenderer": 4,
151 "RoleRenderer": 4,
139 "RoleComponents": 5,
152 "RoleComponents": 5,
153+ "RoleHeaderLink": 6,
140 "RoleResults": 7,
154 "RoleResults": 7,
141 "RoleCount": 8
155 "RoleCount": 8
142 }
156 }
@@ -157,27 +171,28 @@ Module {
157 }
171 }
158 }
172 }
159 Component {
173 Component {
160− name: "unity::shell::scopes::DepartmentInterface"
174+ name: "unity::shell::scopes::NavigationInterface"
161 prototype: "QAbstractListModel"
175 prototype: "QAbstractListModel"
162− exports: ["Unity/Department 0.2"]
176+ exports: ["Unity/Navigation 0.2"]
163 isCreatable: false
177 isCreatable: false
164 exportMetaObjectRevisions: [0]
178 exportMetaObjectRevisions: [0]
165 Enum {
179 Enum {
166 name: "Roles"
180 name: "Roles"
167 values: {
181 values: {
168− "RoleDepartmentId": 0,
182+ "RoleNavigationId": 0,
169 "RoleLabel": 1,
183 "RoleLabel": 1,
170 "RoleHasChildren": 2,
184 "RoleHasChildren": 2,
171 "RoleIsActive": 3
185 "RoleIsActive": 3
172 }
186 }
173 }
187 }
174− Property { name: "departmentId"; type: "string"; isReadonly: true }
188+ Property { name: "navigationId"; type: "string"; isReadonly: true }
175 Property { name: "label"; type: "string"; isReadonly: true }
189 Property { name: "label"; type: "string"; isReadonly: true }
176 Property { name: "allLabel"; type: "string"; isReadonly: true }
190 Property { name: "allLabel"; type: "string"; isReadonly: true }
177− Property { name: "parentDepartmentId"; type: "string"; isReadonly: true }
191+ Property { name: "parentNavigationId"; type: "string"; isReadonly: true }
178 Property { name: "parentLabel"; type: "string"; isReadonly: true }
192 Property { name: "parentLabel"; type: "string"; isReadonly: true }
179 Property { name: "loaded"; type: "bool"; isReadonly: true }
193 Property { name: "loaded"; type: "bool"; isReadonly: true }
180 Property { name: "isRoot"; type: "bool"; isReadonly: true }
194 Property { name: "isRoot"; type: "bool"; isReadonly: true }
195+ Property { name: "hidden"; type: "bool"; isReadonly: true }
181 Property { name: "count"; type: "int"; isReadonly: true }
196 Property { name: "count"; type: "int"; isReadonly: true }
182 }
197 }
183 Component {
198 Component {
@@ -247,7 +262,8 @@ Module {
247 "RoleEmblem": 8,
262 "RoleEmblem": 8,
248 "RoleSummary": 9,
263 "RoleSummary": 9,
249 "RoleAttributes": 10,
264 "RoleAttributes": 10,
250− "RoleBackground": 11
265+ "RoleBackground": 11,
266+ "RoleOverlayColor": 12
251 }
267 }
252 }
268 }
253 Property { name: "categoryId"; type: "string" }
269 Property { name: "categoryId"; type: "string" }
@@ -259,13 +275,22 @@ Module {
259 exports: ["Unity/Scope 0.2"]
275 exports: ["Unity/Scope 0.2"]
260 isCreatable: false
276 isCreatable: false
261 exportMetaObjectRevisions: [0]
277 exportMetaObjectRevisions: [0]
278+ Enum {
279+ name: "Status"
280+ values: {
281+ "Okay": 0,
282+ "NoInternet": 1,
283+ "NoLocationData": 2,
284+ "Unknown": 3
285+ }
286+ }
262 Property { name: "id"; type: "string"; isReadonly: true }
287 Property { name: "id"; type: "string"; isReadonly: true }
263 Property { name: "name"; type: "string"; isReadonly: true }
288 Property { name: "name"; type: "string"; isReadonly: true }
264 Property { name: "iconHint"; type: "string"; isReadonly: true }
289 Property { name: "iconHint"; type: "string"; isReadonly: true }
265 Property { name: "description"; type: "string"; isReadonly: true }
290 Property { name: "description"; type: "string"; isReadonly: true }
266 Property { name: "searchHint"; type: "string"; isReadonly: true }
291 Property { name: "searchHint"; type: "string"; isReadonly: true }
267 Property { name: "searchInProgress"; type: "bool"; isReadonly: true }
292 Property { name: "searchInProgress"; type: "bool"; isReadonly: true }
268− Property { name: "visible"; type: "bool"; isReadonly: true }
293+ Property { name: "favorite"; type: "bool" }
269 Property { name: "shortcut"; type: "string"; isReadonly: true }
294 Property { name: "shortcut"; type: "string"; isReadonly: true }
270 Property {
295 Property {
271 name: "categories"
296 name: "categories"
@@ -273,13 +298,27 @@ Module {
273 isReadonly: true
298 isReadonly: true
274 isPointer: true
299 isPointer: true
275 }
300 }
301+ Property {
302+ name: "settings"
303+ type: "unity::shell::scopes::SettingsModelInterface"
304+ isReadonly: true
305+ isPointer: true
306+ }
276 Property { name: "searchQuery"; type: "string" }
307 Property { name: "searchQuery"; type: "string" }
277 Property { name: "noResultsHint"; type: "string" }
308 Property { name: "noResultsHint"; type: "string" }
278 Property { name: "formFactor"; type: "string" }
309 Property { name: "formFactor"; type: "string" }
279 Property { name: "isActive"; type: "bool" }
310 Property { name: "isActive"; type: "bool" }
311+ Property { name: "currentNavigationId"; type: "string"; isReadonly: true }
312+ Property { name: "hasNavigation"; type: "bool"; isReadonly: true }
280− Property { name: "currentDepartmentId"; type: "string"; isReadonly: true }
313+ Property { name: "currentAltNavigationId"; type: "string"; isReadonly: true }
281− Property { name: "hasDepartments"; type: "bool"; isReadonly: true }
314+ Property { name: "hasAltNavigation"; type: "bool"; isReadonly: true }
282 Property { name: "customizations"; type: "QVariantMap"; isReadonly: true }
315 Property { name: "customizations"; type: "QVariantMap"; isReadonly: true }
316+ Property {
317+ name: "status"
318+ type: "unity::shell::scopes::ScopeInterface::Status"
319+ isReadonly: true
320+ }
321+ Signal { name: "detailsChanged" }
283 Signal { name: "showDash" }
322 Signal { name: "showDash" }
284 Signal { name: "hideDash" }
323 Signal { name: "hideDash" }
285 Signal {
324 Signal {
@@ -298,10 +337,6 @@ Module {
298 name: "openScope"
337 name: "openScope"
299 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
338 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
300 }
339 }
301− Signal {
302− name: "activateApplication"
303− Parameter { name: "desktop"; type: "string" }
304− }
305 Method {
340 Method {
306 name: "activate"
341 name: "activate"
307 Parameter { name: "result"; type: "QVariant" }
342 Parameter { name: "result"; type: "QVariant" }
@@ -317,14 +352,25 @@ Module {
317 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
352 Parameter { name: "scope"; type: "unity::shell::scopes::ScopeInterface"; isPointer: true }
318 }
353 }
319 Method {
354 Method {
320− name: "getDepartment"
355+ name: "getNavigation"
321− type: "unity::shell::scopes::DepartmentInterface*"
356+ type: "unity::shell::scopes::NavigationInterface*"
322− Parameter { name: "departmentId"; type: "string" }
357+ Parameter { name: "navigationId"; type: "string" }
358+ }
359+ Method {
360+ name: "getAltNavigation"
361+ type: "unity::shell::scopes::NavigationInterface*"
362+ Parameter { name: "altNavigationId"; type: "string" }
323 }
363 }
324 Method {
364 Method {
325− name: "loadDepartment"
365+ name: "setNavigationState"
326− Parameter { name: "departmentId"; type: "string" }
366+ Parameter { name: "navId"; type: "string" }
367+ Parameter { name: "altNavigation"; type: "bool" }
327 }
368 }
369+ Method {
370+ name: "performQuery"
371+ Parameter { name: "cannedQuery"; type: "string" }
372+ }
373+ Method { name: "refresh" }
328 }
374 }
329 Component {
375 Component {
330 name: "unity::shell::scopes::ScopesInterface"
376 name: "unity::shell::scopes::ScopesInterface"
@@ -334,11 +380,17 @@ Module {
334 values: {
380 values: {
335 "RoleScope": 0,
381 "RoleScope": 0,
336 "RoleId": 1,
382 "RoleId": 1,
337− "RoleVisible": 2,
338− "RoleTitle": 3
383+ "RoleTitle": 2
339 }
384 }
340 }
385 }
341 Property { name: "loaded"; type: "bool"; isReadonly: true }
386 Property { name: "loaded"; type: "bool"; isReadonly: true }
387+ Property { name: "count"; type: "int"; isReadonly: true }
388+ Property {
389+ name: "overviewScope"
390+ type: "unity::shell::scopes::ScopeInterface"
391+ isReadonly: true
392+ isPointer: true
393+ }
342 Method {
394 Method {
343 name: "getScope"
395 name: "getScope"
344 type: "unity::shell::scopes::ScopeInterface*"
396 type: "unity::shell::scopes::ScopeInterface*"
tests/mocks/Unity/fake_categories.cpp+13−1
@@ -145,9 +145,12 @@ Categories::data(const QModelIndex& index, int role) const
145 } else {
145 } else {
146 map["category-layout"] = "carousel";
146 map["category-layout"] = "carousel";
147 map["card-size"] = "medium";
147 map["card-size"] = "medium";
148− map["collapsed-rows"] = 2;
149 map["overlay"] = true;
148 map["overlay"] = true;
150 }
149 }
150+ if (index.row() == 19) {
151+ map["category-layout"] = "grid";
152+ map["collapsed-rows"] = 0;
153+ }
151 map["card-size"] = "small";
154 map["card-size"] = "small";
152 return map;
155 return map;
153 }
156 }
@@ -166,6 +169,9 @@ Categories::data(const QModelIndex& index, int role) const
166 return map;
169 return map;
167 }
170 }
168 case RoleHeaderLink:
171 case RoleHeaderLink:
172+ if (index.row() == 1 || index.row() == 4) {
173+ return QString("scope://query/1");
174+ }
169 return QString();
175 return QString();
170 case RoleResults:
176 case RoleResults:
171 return QVariant::fromValue(resultsModel);
177 return QVariant::fromValue(resultsModel);
@@ -177,3 +183,9 @@ Categories::data(const QModelIndex& index, int role) const
177 }
183 }
178 }
184 }
179}
185}
186+
187+QVariant
188+Categories::data(int row, int role) const
189+{
190+ return data(index(row, 0), role);
191+}
tests/mocks/Unity/fake_categories.h+2
@@ -37,6 +37,8 @@ public:
37 Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
37 Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
38 Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
38 Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
39
39
40+ Q_INVOKABLE QVariant data(int row, int role) const;
41+
40private Q_SLOTS:
42private Q_SLOTS:
41 void countChanged();
43 void countChanged();
42
44
tests/mocks/Unity/fake_department.cpp → tests/mocks/Unity/fake_navigation.cpprenamed+32−40
@@ -14,14 +14,15 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−#include "fake_department.h"
17+#include "fake_navigation.h"
18
18
19#include "fake_scope.h"
19#include "fake_scope.h"
20
20
21+#include <QDebug>
21#include <QTimer>
22#include <QTimer>
22
23
23−Department::Department(const QString& departmentId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope)
24+Navigation::Navigation(const QString& navigationId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope)
24− : m_departmentId(departmentId)
25+ : m_navigationId(navigationId)
25 , m_label(label)
26 , m_label(label)
26 , m_allLabel(allLabel)
27 , m_allLabel(allLabel)
27 , m_parentId(parentId)
28 , m_parentId(parentId)
@@ -30,96 +31,87 @@ Department::Department(const QString& departmentId, const QString& label, const
30 , m_scope(scope)
31 , m_scope(scope)
31{
32{
32 QTimer::singleShot(1500, this, SLOT(slotLoaded()));
33 QTimer::singleShot(1500, this, SLOT(slotLoaded()));
33− connect(scope, SIGNAL(currentDepartmentIdChanged()), this, SLOT(slotCurrentDepartmentChanged()));
34+ connect(scope, SIGNAL(currentNavigationIdChanged()), this, SLOT(slotCurrentNavigationChanged()));
34}
35}
35
36
36−QString Department::departmentId() const
37+QString Navigation::navigationId() const
37{
38{
38− return m_departmentId;
39+ return m_navigationId;
39}
40}
40
41
41−QString Department::label() const
42+QString Navigation::label() const
42{
43{
43 return m_label;
44 return m_label;
44}
45}
45
46
46−QString Department::allLabel() const
47+QString Navigation::allLabel() const
47{
48{
48 return m_allLabel;
49 return m_allLabel;
49}
50}
50
51
51−QString Department::parentDepartmentId() const
52+QString Navigation::parentNavigationId() const
52{
53{
53 return m_parentId;
54 return m_parentId;
54}
55}
55
56
56−QString Department::parentLabel() const
57+QString Navigation::parentLabel() const
57{
58{
58 return m_parentLabel;
59 return m_parentLabel;
59}
60}
60
61
61−void Department::slotLoaded()
62+void Navigation::slotLoaded()
62{
63{
63 m_loaded = true;
64 m_loaded = true;
64 Q_EMIT loadedChanged();
65 Q_EMIT loadedChanged();
65}
66}
66
67
67−bool Department::loaded() const
68+bool Navigation::loaded() const
68{
69{
69 return m_loaded;
70 return m_loaded;
70}
71}
71
72
72−int Department::count() const
73+int Navigation::count() const
73{
74{
74 return rowCount();
75 return rowCount();
75}
76}
76
77
77−bool Department::isRoot() const
78+bool Navigation::isRoot() const
78{
79{
79− return m_departmentId == "root";
80+ return m_navigationId == "root" || m_navigationId == "altroot";
80}
81}
81
82
82−int Department::rowCount(const QModelIndex & /*parent*/) const
83+bool Navigation::hidden() const
83{
84{
84− if (!m_loaded || m_departmentId.startsWith("child") || m_departmentId == "middle3")
85+ return m_navigationId == "altroot";
85− return 0;
86− else
87− return 8;
88}
86}
89
87
90−QHash<int, QByteArray> Department::roleNames() const
88+int Navigation::rowCount(const QModelIndex & /*parent*/) const
91{
89{
92− QHash<int, QByteArray> res;
90+ if (!m_loaded || m_navigationId.startsWith("child") || m_navigationId == "middle3")
93− res[RoleDepartmentId] = "departmentId";
91+ return 0;
94− res[RoleLabel] = "label";
92+ else
95− res[RoleHasChildren] = "hasChildren";
96− res[RoleIsActive] = "isActive";
97− return res;
93+ return 8;
98}
94}
99
95
100−QVariant Department::data(const QModelIndex &index, int role) const
96+QVariant Navigation::data(const QModelIndex &index, int role) const
101{
97{
102 switch (role) {
98 switch (role) {
103− case RoleDepartmentId:
99+ case RoleNavigationId:
104− if (m_departmentId == "root")
100+ if (m_navigationId == "root")
105 return QString("middle%1").arg(index.row());
101 return QString("middle%1").arg(index.row());
106− else if (m_departmentId.startsWith("middle"))
102+ else if (m_navigationId.startsWith("middle"))
107− return QString("child%1%2").arg(m_departmentId).arg(index.row());
103+ return QString("child%1%2").arg(m_navigationId).arg(index.row());
108− break;
109 case RoleLabel:
104 case RoleLabel:
110− return QString("%1Child%2").arg(m_departmentId).arg(index.row());
105+ return QString("%1Child%2").arg(m_navigationId).arg(index.row());
111− break;
112 case RoleHasChildren:
106 case RoleHasChildren:
113− return m_departmentId == "root" && index.row() != 3;
107+ return m_navigationId == "root" && index.row() != 3;
114− break;
115 case RoleIsActive:
108 case RoleIsActive:
116− return m_scope->currentDepartmentId() == data(index, RoleDepartmentId);
109+ return m_scope->currentNavigationId() == data(index, RoleNavigationId);
117− break;
118 }
110 }
119 return QVariant();
111 return QVariant();
120}
112}
121
113
122−void Department::slotCurrentDepartmentChanged()
114+void Navigation::slotCurrentNavigationChanged()
123{
115{
124 // This is wasteful, should only emit it if really something changed in this
116 // This is wasteful, should only emit it if really something changed in this
125 // deparment, but this is a mock, so no need to optimize
117 // deparment, but this is a mock, so no need to optimize
tests/mocks/Unity/fake_department.h → tests/mocks/Unity/fake_navigation.hrenamed+13−13
@@ -14,48 +14,48 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17−#ifndef FAKE_DEPARTMENT_H
17+#ifndef FAKE_NAVIGATION_H
18−#define FAKE_DEPARTMENT_H
18+#define FAKE_NAVIGATION_H
19
19
20−#include <unity/shell/scopes/DepartmentInterface.h>
20+#include <unity/shell/scopes/NavigationInterface.h>
21
21
22class Scope;
22class Scope;
23
23
24−class Department : public unity::shell::scopes::DepartmentInterface
24+class Navigation : public unity::shell::scopes::NavigationInterface
25{
25{
26 Q_OBJECT
26 Q_OBJECT
27
27
28public:
28public:
29− Department(const QString& departmentId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope);
29+ Navigation(const QString& navigationId, const QString& label, const QString& allLabel, const QString& parentId, const QString& parentLabel, Scope* scope);
30
30
31− QString departmentId() const override;
31+ QString navigationId() const override;
32 QString label() const override;
32 QString label() const override;
33 QString allLabel() const override;
33 QString allLabel() const override;
34− QString parentDepartmentId() const override;
34+ QString parentNavigationId() const override;
35 QString parentLabel() const override;
35 QString parentLabel() const override;
36 bool loaded() const override;
36 bool loaded() const override;
37− int count() const override;
38 bool isRoot() const override;
37 bool isRoot() const override;
38+ bool hidden() const override;
39+ int count() const override;
39
40
40 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41 int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41− QHash<int, QByteArray> roleNames() const;
42 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
42 QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
43
43
44public Q_SLOTS:
44public Q_SLOTS:
45− void slotCurrentDepartmentChanged();
45+ void slotCurrentNavigationChanged();
46
46
47private Q_SLOTS:
47private Q_SLOTS:
48 void slotLoaded();
48 void slotLoaded();
49
49
50private:
50private:
51− QString m_departmentId;
51+ QString m_navigationId;
52 QString m_label;
52 QString m_label;
53 QString m_allLabel;
53 QString m_allLabel;
54 QString m_parentId;
54 QString m_parentId;
55 QString m_parentLabel;
55 QString m_parentLabel;
56 bool m_loaded;
56 bool m_loaded;
57− QString m_currentDepartment;
57+ QString m_currentNavigation;
58 Scope *m_scope;
58 Scope *m_scope;
59};
59};
60
60
61−#endif // FAKE_DEPARTMENT_H
61+#endif // FAKE_NAVIGATION_H
tests/mocks/Unity/fake_scope.cpp+69−24
@@ -14,26 +14,28 @@
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
15 */
16
16
17+#include <QDebug>
17#include <QUrl>
18#include <QUrl>
18
19
19#include "fake_scope.h"
20#include "fake_scope.h"
20−#include "fake_department.h"
21+#include "fake_navigation.h"
21#include "fake_resultsmodel.h"
22#include "fake_resultsmodel.h"
22
23
23Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
24Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
24{
25{
25}
26}
26
27
27−Scope::Scope(QString const& id, QString const& name, bool visible, QObject* parent)
28+Scope::Scope(QString const& id, QString const& name, bool favorite, QObject* parent, int categories)
28 : unity::shell::scopes::ScopeInterface(parent)
29 : unity::shell::scopes::ScopeInterface(parent)
29 , m_id(id)
30 , m_id(id)
30 , m_name(name)
31 , m_name(name)
31− , m_visible(visible)
32 , m_searching(false)
32 , m_searching(false)
33+ , m_favorite(favorite)
33 , m_isActive(false)
34 , m_isActive(false)
34− , m_currentDeparment("root")
35+ , m_currentNavigationId("root")
36+ , m_currentAltNavigationId("altroot")
35 , m_previewRendererName("preview-generic")
37 , m_previewRendererName("preview-generic")
36− , m_categories(new Categories(20, this))
38+ , m_categories(new Categories(categories, this))
37{
39{
38}
40}
39
41
@@ -77,6 +79,11 @@ bool Scope::searchInProgress() const
77 return m_searching;
79 return m_searching;
78}
80}
79
81
82+bool Scope::favorite() const
83+{
84+ return m_favorite;
85+}
86+
80unity::shell::scopes::CategoriesInterface* Scope::categories() const
87unity::shell::scopes::CategoriesInterface* Scope::categories() const
81{
88{
82 return m_categories;
89 return m_categories;
@@ -97,11 +104,6 @@ QString Scope::formFactor() const
97 return m_formFactor;
104 return m_formFactor;
98}
105}
99
106
100−bool Scope::visible() const
101−{
102− return m_visible;
103−}
104−
105bool Scope::isActive() const
107bool Scope::isActive() const
106{
108{
107 return m_isActive;
109 return m_isActive;
@@ -131,6 +133,13 @@ void Scope::setActive(const bool active)
131 }
133 }
132}
134}
133
135
136+void Scope::setFavorite(const bool favorite)
137+{
138+ if (favorite != m_favorite) {
139+ m_favorite = favorite;
140+ Q_EMIT favoriteChanged();
141+ }
142+}
134void Scope::setSearchInProgress(const bool inProg)
143void Scope::setSearchInProgress(const bool inProg)
135{
144{
136 if (inProg != m_searching) {
145 if (inProg != m_searching) {
@@ -170,31 +179,53 @@ void Scope::closeScope(unity::shell::scopes::ScopeInterface* /*scope*/)
170 qFatal("Scope::closeScope is not implemented");
179 qFatal("Scope::closeScope is not implemented");
171}
180}
172
181
173−QString Scope::currentDepartmentId() const
182+QString Scope::currentNavigationId() const
174{
183{
175− return m_currentDeparment;
184+ return m_currentNavigationId;
176}
185}
177
186
178−bool Scope::hasDepartments() const
187+bool Scope::hasNavigation() const
179{
188{
180 return true;
189 return true;
181}
190}
182
191
192+QString Scope::currentAltNavigationId() const
193+{
194+ return m_currentAltNavigationId;
195+}
196+
197+bool Scope::hasAltNavigation() const
198+{
199+ return true;
200+}
201+
202+Scope::Status Scope::status() const
203+{
204+ return Status::Okay;
205+}
206+
183QVariantMap Scope::customizations() const
207QVariantMap Scope::customizations() const
184{
208{
185− QVariantMap m;
209+ QVariantMap m, h;
186 if (m_id == "clickscope") {
210 if (m_id == "clickscope") {
211+ h["foreground-color"] = "yellow";
187 m["background-color"] = "red";
212 m["background-color"] = "red";
188 m["foreground-color"] = "blue";
213 m["foreground-color"] = "blue";
214+ m["page-header"] = h;
189 } else if (m_id == "MockScope5") {
215 } else if (m_id == "MockScope5") {
190− QVariantMap pageHeader;
216+ h["background"] = "gradient:///lightgrey/grey";
191− pageHeader["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
217+ h["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
192− m["page-header"] = pageHeader;
218+ m["page-header"] = h;
193 }
219 }
194 return m;
220 return m;
195}
221}
196
222
223+void Scope::refresh()
224+{
225+ qDebug() << "Scope::refresh is currently not implmented in the fake scopes plugin";
226+}
227+
197−unity::shell::scopes::DepartmentInterface* Scope::getDepartment(const QString& id)
228+unity::shell::scopes::NavigationInterface* Scope::getNavigation(const QString& id)
198{
229{
199 if (id.isEmpty())
230 if (id.isEmpty())
200 return nullptr;
231 return nullptr;
@@ -208,16 +239,30 @@ unity::shell::scopes::DepartmentInterface* Scope::getDepartment(const QString& i
208 parentId = id.mid(5, 7);
239 parentId = id.mid(5, 7);
209 parentLabel = parentId;
240 parentLabel = parentId;
210 }
241 }
211− return new Department(id, id, "all"+id, parentId, parentLabel, this);
242+ return new Navigation(id, id, "all"+id, parentId, parentLabel, this);
212}
243}
213
244
214−void Scope::loadDepartment(const QString& id)
245+unity::shell::scopes::NavigationInterface* Scope::getAltNavigation(QString const& id)
215{
246{
216− m_currentDeparment = id;
247+ if (id.isEmpty())
217− Q_EMIT currentDepartmentIdChanged();
248+ return nullptr;
249+
250+ QString parentId;
251+ QString parentLabel;
252+ if (id.startsWith("altmiddle")) {
253+ parentId = "altroot";
254+ parentLabel = "altroot";
255+ }
256+ return new Navigation(id, id, "all"+id, parentId, parentLabel, this);
218}
257}
219
258
220−void Scope::performQuery(const QString& query)
259+void Scope::setNavigationState(const QString &navigationId, bool isAltNavigation)
221{
260{
222− Q_UNUSED(query);
261+ if (isAltNavigation) {
262+ m_currentAltNavigationId = navigationId;
263+ Q_EMIT currentAltNavigationIdChanged();
264+ } else {
265+ m_currentNavigationId = navigationId;
266+ Q_EMIT currentNavigationIdChanged();
267+ }
223}
268}
tests/mocks/Unity/fake_scope.h+17−9
@@ -30,7 +30,7 @@ class Scope : public unity::shell::scopes::ScopeInterface
30
30
31public:
31public:
32 Scope(QObject* parent = 0);
32 Scope(QObject* parent = 0);
33− Scope(QString const& id, QString const& name, bool visible, QObject* parent = 0);
33+ Scope(QString const& id, QString const& name, bool favorite, QObject* parent = 0, int categories = 20);
34
34
35 /* getters */
35 /* getters */
36 QString id() const override;
36 QString id() const override;
@@ -38,9 +38,9 @@ public:
38 QString iconHint() const override;
38 QString iconHint() const override;
39 QString description() const override;
39 QString description() const override;
40 QString searchHint() const override;
40 QString searchHint() const override;
41− bool visible() const override;
42 QString shortcut() const override;
41 QString shortcut() const override;
43 bool searchInProgress() const override;
42 bool searchInProgress() const override;
43+ bool favorite() const override;
44 unity::shell::scopes::CategoriesInterface* categories() const override;
44 unity::shell::scopes::CategoriesInterface* categories() const override;
45 QString searchQuery() const override;
45 QString searchQuery() const override;
46 QString noResultsHint() const override;
46 QString noResultsHint() const override;
@@ -53,6 +53,7 @@ public:
53 void setNoResultsHint(const QString& hint) override;
53 void setNoResultsHint(const QString& hint) override;
54 void setFormFactor(const QString& form_factor) override;
54 void setFormFactor(const QString& form_factor) override;
55 void setActive(const bool) override;
55 void setActive(const bool) override;
56+ void setFavorite(const bool) override;
56 Q_INVOKABLE void setSearchInProgress(const bool inProg); // This is not invokable in the Interface, here for testing benefits
57 Q_INVOKABLE void setSearchInProgress(const bool inProg); // This is not invokable in the Interface, here for testing benefits
57
58
58 Q_INVOKABLE void activate(QVariant const& result) override;
59 Q_INVOKABLE void activate(QVariant const& result) override;
@@ -60,14 +61,20 @@ public:
60 Q_INVOKABLE void cancelActivation() override;
61 Q_INVOKABLE void cancelActivation() override;
61 Q_INVOKABLE void closeScope(unity::shell::scopes::ScopeInterface* scope) override;
62 Q_INVOKABLE void closeScope(unity::shell::scopes::ScopeInterface* scope) override;
62
63
63− QString currentDepartmentId() const override;
64+ QString currentNavigationId() const override;
65+ bool hasNavigation() const override;
66+ QString currentAltNavigationId() const override;
64− bool hasDepartments() const override;
67+ bool hasAltNavigation() const override;
65− Q_INVOKABLE unity::shell::scopes::DepartmentInterface* getDepartment(const QString& id) override;
68+ Q_INVOKABLE unity::shell::scopes::NavigationInterface* getNavigation(QString const& navigationId) override;
69+ Q_INVOKABLE unity::shell::scopes::NavigationInterface* getAltNavigation(QString const& altNavigationId) override;
66− Q_INVOKABLE void loadDepartment(const QString& id) override;
70+ Q_INVOKABLE void setNavigationState(const QString &navigationId, bool isAltNavigation) override;
67− Q_INVOKABLE void performQuery(const QString& query) override;
71+ Q_SIGNAL void performQuery(const QString& query) override;
68
72
73+ Status status() const override;
69 QVariantMap customizations() const override;
74 QVariantMap customizations() const override;
70
75
76+ Q_INVOKABLE void refresh() override;
77+
71protected:
78protected:
72
79
73 QString m_id;
80 QString m_id;
@@ -77,10 +84,11 @@ protected:
77 QString m_searchQuery;
84 QString m_searchQuery;
78 QString m_noResultsHint;
85 QString m_noResultsHint;
79 QString m_formFactor;
86 QString m_formFactor;
80− bool m_visible;
81 bool m_searching;
87 bool m_searching;
88+ bool m_favorite;
82 bool m_isActive;
89 bool m_isActive;
83− QString m_currentDeparment;
90+ QString m_currentNavigationId;
91+ QString m_currentAltNavigationId;
84
92
85 QString m_previewRendererName;
93 QString m_previewRendererName;
86
94
tests/mocks/Unity/fake_scopes.cpp+16−2
@@ -32,6 +32,11 @@ Scopes::Scopes(QObject *parent)
32 timer.setSingleShot(true);
32 timer.setSingleShot(true);
33 timer.setInterval(100);
33 timer.setInterval(100);
34 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateScopes()));
34 QObject::connect(&timer, SIGNAL(timeout()), this, SLOT(updateScopes()));
35+
36+ QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
37+ QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
38+ QObject::connect(this, SIGNAL(modelReset()), this, SIGNAL(countChanged()));
39+
35 load();
40 load();
36}
41}
37
42
@@ -46,6 +51,7 @@ void Scopes::updateScopes()
46 addScope(new Scope("MockScope2", "Music", false, this));
51 addScope(new Scope("MockScope2", "Music", false, this));
47 addScope(new Scope("clickscope", "Apps", true, this));
52 addScope(new Scope("clickscope", "Apps", true, this));
48 addScope(new Scope("MockScope5", "Videos", true, this));
53 addScope(new Scope("MockScope5", "Videos", true, this));
54+ addScope(new Scope("SingleCategoryScope", "Single", true, this, 1));
49
55
50 if (!m_loaded) {
56 if (!m_loaded) {
51 m_loaded = true;
57 m_loaded = true;
@@ -91,8 +97,6 @@ QVariant Scopes::data(const QModelIndex& index, int role) const
91 return QVariant::fromValue(scope);
97 return QVariant::fromValue(scope);
92 } else if (role == Scopes::RoleId) {
98 } else if (role == Scopes::RoleId) {
93 return QVariant::fromValue(scope->id());
99 return QVariant::fromValue(scope->id());
94− } else if (role == Scopes::RoleVisible) {
95− return QVariant::fromValue(scope->visible());
96 } else if (role == Scopes::RoleTitle) {
100 } else if (role == Scopes::RoleTitle) {
97 return QVariant::fromValue(scope->name());
101 return QVariant::fromValue(scope->name());
98 } else {
102 } else {
@@ -124,6 +128,16 @@ bool Scopes::loaded() const
124 return m_loaded;
128 return m_loaded;
125}
129}
126
130
131+int Scopes::count() const
132+{
133+ return rowCount();
134+}
135+
136+unity::shell::scopes::ScopeInterface* Scopes::overviewScope() const
137+{
138+ return nullptr;
139+}
140+
127void Scopes::addScope(Scope* scope)
141void Scopes::addScope(Scope* scope)
128{
142{
129 int index = rowCount();
143 int index = rowCount();
tests/mocks/Unity/fake_scopes.h+2
@@ -50,6 +50,8 @@ public:
50 QModelIndex parent ( const QModelIndex & index ) const;
50 QModelIndex parent ( const QModelIndex & index ) const;
51
51
52 bool loaded() const override;
52 bool loaded() const override;
53+ int count() const override;
54+ unity::shell::scopes::ScopeInterface* overviewScope() const override;
53
55
54private Q_SLOTS:
56private Q_SLOTS:
55 void updateScopes();
57 void updateScopes();
tests/mocks/Unity/fake_unity_plugin.cpp+2−2
@@ -22,7 +22,7 @@
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_department.h"
25+#include "fake_navigation.h"
26#include "fake_previewmodel.h"
26#include "fake_previewmodel.h"
27#include "fake_previewwidgetmodel.h"
27#include "fake_previewwidgetmodel.h"
28#include "fake_resultsmodel.h"
28#include "fake_resultsmodel.h"
@@ -43,7 +43,7 @@ void FakeUnityPlugin::registerTypes(const char *uri)
43 qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
43 qmlRegisterType<Scopes>(uri, 0, 2, "Scopes");
44 qmlRegisterType<Scope>(uri, 0, 2, "MockScope");
44 qmlRegisterType<Scope>(uri, 0, 2, "MockScope");
45 qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
45 qmlRegisterUncreatableType<unity::shell::scopes::ScopeInterface>(uri, 0, 2, "Scope", "Can't create Scope object in QML.");
46− qmlRegisterUncreatableType<unity::shell::scopes::DepartmentInterface>(uri, 0, 2, "Department", "Can't create Department object in QML.");
46+ qmlRegisterUncreatableType<unity::shell::scopes::NavigationInterface>(uri, 0, 2, "Navigation", "Can't create Navigation object in QML.");
47 qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
47 qmlRegisterUncreatableType<unity::shell::scopes::CategoriesInterface>(uri, 0, 2, "Categories", "Can't create Categories object in QML.");
48 qmlRegisterUncreatableType<unity::shell::scopes::PreviewModelInterface>(uri, 0, 2, "PreviewModel", "Can't create new PreviewModel in QML. Get them from PreviewStack instance.");
48 qmlRegisterUncreatableType<unity::shell::scopes::PreviewModelInterface>(uri, 0, 2, "PreviewModel", "Can't create new PreviewModel in QML. Get them from PreviewStack instance.");
49 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
49 qmlRegisterUncreatableType<ResultsModel>(uri, 0, 2, "ResultsModel", "Can't create ResultsModel object in QML.");
tests/mocks/libusermetrics/UserMetrics.cpp+3
@@ -24,6 +24,9 @@
24#include <QtGui/QIcon>
24#include <QtGui/QIcon>
25#include <QMultiMap>
25#include <QMultiMap>
26
26
27+#include <functional>
28+#include <random>
29+
27using namespace UserMetricsOutput;
30using namespace UserMetricsOutput;
28
31
29namespace UserMetricsOutput
32namespace UserMetricsOutput
tests/plugins/Dash/CMakeLists.txt+1
@@ -79,3 +79,4 @@ set(qmltest_DEFAULT_NO_ADD_TEST TRUE)
79set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
79set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
80add_qml_test(. ScopeStyle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
80add_qml_test(. ScopeStyle IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
81add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
81add_qml_test(. ListViewWithPageHeaderQML IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
82+add_qml_test(. CardAttributes IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins)
tests/plugins/Dash/cardcreator/1.res+65−61
@@ -5,8 +5,8 @@ AbstractButton {
5 property var cardData;
5 property var cardData;
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8− property var scopeStyle: null;
8+ property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int headerAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -16,71 +16,75 @@ AbstractButton {
16onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; }
16onArtShapeBorderSourceChanged: { if (artShapeBorderSource !== undefined && artShapeLoader.item) artShapeLoader.item.borderSource = artShapeBorderSource; }
17readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
17readonly property size artShapeSize: artShapeLoader.item ? Qt.size(artShapeLoader.item.width, artShapeLoader.item.height) : Qt.size(-1, -1);
18Item {
18Item {
19− id: artShapeHolder;
19+ id: artShapeHolder;
20− height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
20+ height: root.fixedArtShapeSize.height > 0 ? root.fixedArtShapeSize.height : artShapeLoader.height;
21− width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
21+ width: root.fixedArtShapeSize.width > 0 ? root.fixedArtShapeSize.width : artShapeLoader.width;
22− anchors { horizontalCenter: parent.horizontalCenter; }
22+ anchors { horizontalCenter: parent.horizontalCenter; }
23− Loader {
23+ Loader {
24− id: artShapeLoader;
24+ id: artShapeLoader;
25− objectName: "artShapeLoader";
25+ objectName: "artShapeLoader";
26− active: cardData && cardData["art"] || false;
26+ active: cardData && cardData["art"] || false;
27− asynchronous: root.asynchronous;
28− visible: status == Loader.Ready;
29− sourceComponent: UbuntuShape {
30− id: artShape;
31− objectName: "artShape";
32− radius: "medium";
33− visible: image.status == Image.Ready;
34− readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
35− readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1;
36− readonly property bool aspectSmallerThanImageAspect: aspect < image.aspect;
37− Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
38− onAspectSmallerThanImageAspectChanged: updateWidthHeightBindings();
39− Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
40− function updateWidthHeightBindings() {
41− if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
42− width = root.fixedArtShapeSize.width;
43− height = root.fixedArtShapeSize.height;
44− } else if (aspectSmallerThanImageAspect) {
45− width = Qt.binding(function() { return !visible ? 0 : image.width });
46− height = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.height : width / image.aspect });
47− } else {
48− width = Qt.binding(function() { return !visible ? 0 : image.fillMode === Image.PreserveAspectCrop ? image.width : height * image.aspect });
49− height = Qt.binding(function() { return !visible ? 0 : image.height });
50− }
51− }
52− image: Image {
53− objectName: "artImage";
54− source: cardData && cardData["art"] || "";
55− cache: true;
56 asynchronous: root.asynchronous;
27 asynchronous: root.asynchronous;
28+ visible: status == Loader.Ready;
29+ sourceComponent: UbuntuShape {
30+ id: artShape;
31+ objectName: "artShape";
32+ radius: "medium";
33+ visible: image.status == Image.Ready;
34+ readonly property real fixedArtShapeSizeAspect: (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) ? root.fixedArtShapeSize.width / root.fixedArtShapeSize.height : -1;
35+ readonly property real aspect: fixedArtShapeSizeAspect > 0 ? fixedArtShapeSizeAspect : components !== undefined ? components["art"]["aspect-ratio"] : 1;
36+ Component.onCompleted: { updateWidthHeightBindings(); if (artShapeBorderSource !== undefined) borderSource = artShapeBorderSource; }
37+ Connections { target: root; onFixedArtShapeSizeChanged: updateWidthHeightBindings(); }
38+ function updateWidthHeightBindings() {
39+ if (root.fixedArtShapeSize.height > 0 && root.fixedArtShapeSize.width > 0) {
40+ width = root.fixedArtShapeSize.width;
41+ height = root.fixedArtShapeSize.height;
42+ } else {
43+ width = Qt.binding(function() { return !visible ? 0 : image.width });
44+ height = Qt.binding(function() { return !visible ? 0 : image.height });
45+ }
46+ }
47+ image: Image {
48+ objectName: "artImage";
49+ source: cardData && cardData["art"] || "";
50+ cache: true;
51+ asynchronous: root.asynchronous;
57− fillMode: components && components["art"]["fill-mode"] === "fit" ? Image.PreserveAspectFit: Image.PreserveAspectCrop;
52+ fillMode: Image.PreserveAspectCrop;
58− readonly property real aspect: implicitWidth / implicitHeight;
59− width: root.width;
53+ width: root.width;
60− height: width / artShape.aspect;
54+ height: width / artShape.aspect;
55+ }
56+ }
61 }
57 }
62− }
58+ }
63− }
64− }
65readonly property int headerHeight: titleLabel.height;
59readonly property int headerHeight: titleLabel.height;
66Label {
60Label {
67− id: titleLabel;
61+ id: titleLabel;
68− objectName: "titleLabel";
62+ objectName: "titleLabel";
69− anchors { right: parent.right;left: parent.left;
63+ anchors { right: parent.right;
64+rightMargin: units.gu(1);
65+left: parent.left;
70top: artShapeHolder.bottom;
66top: artShapeHolder.bottom;
71 topMargin: units.gu(1);
67 topMargin: units.gu(1);
72leftMargin: units.gu(1);
68leftMargin: units.gu(1);
73− }
69+ }
74− elide: Text.ElideRight;
70+ elide: Text.ElideRight;
75− fontSize: "small";
71+ fontSize: "small";
76− wrapMode: Text.Wrap;
72+ wrapMode: Text.Wrap;
77− maximumLineCount: 2;
73+ maximumLineCount: 2;
78− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
74+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
79− color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
75+ color: root.scopeStyle ? root.scopeStyle.foreground : "grey";
80− visible: showHeader ;
76+ visible: showHeader ;
81− text: root.title;
77+ text: root.title;
82− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
78+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
83− horizontalAlignment: root.headerAlignment;
79+ horizontalAlignment: root.headerAlignment;
80+ }
81+UbuntuShape {
82+ id: touchdown;
83+ objectName: "touchdown";
84+ anchors { fill: artShapeHolder }
85+ visible: root.pressed;
86+ radius: "medium";
87+ borderSource: "radius_pressed.sci"
84− }
88+}
85implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);
89implicitHeight: titleLabel.y + titleLabel.height + units.gu(1);
86}
90}
tests/plugins/Dash/cardcreator/1.tst+1−1
@@ -1,3 +1,3 @@
1template: {"card-layout":"vertical","card-size":"small","category-layout":"grid","collapsed-rows":2}
1template: {"card-layout":"vertical","card-size":"small","category-layout":"grid","collapsed-rows":2}
2−components: {"art":{"aspect-ratio":1.6,"field":"art","fill-mode":"fit"},"title":{"field":"title"}}
2+components: {"art":{"aspect-ratio":1.6,"field":"art"},"title":{"field":"title"}}
3result: 1.res
3result: 1.res
tests/plugins/Dash/cardcreator/2.res+101−90
@@ -5,8 +5,8 @@ AbstractButton {
5 property var cardData;
5 property var cardData;
6 property var artShapeBorderSource: undefined;
6 property var artShapeBorderSource: undefined;
7 property real fontScale: 1.0;
7 property real fontScale: 1.0;
8− property var scopeStyle: null;
8+ property var scopeStyle: null;
9− property int headerAlignment: Text.AlignLeft;
9+ property int headerAlignment: Text.AlignLeft;
10 property int fixedHeaderHeight: -1;
10 property int fixedHeaderHeight: -1;
11 property size fixedArtShapeSize: Qt.size(-1, -1);
11 property size fixedArtShapeSize: Qt.size(-1, -1);
12 readonly property string title: cardData && cardData["title"] || "";
12 readonly property string title: cardData && cardData["title"] || "";
@@ -14,104 +14,115 @@ AbstractButton {
14 property bool showHeader: true;
14 property bool showHeader: true;
15 implicitWidth: childrenRect.width;
15 implicitWidth: childrenRect.width;
16Loader {
16Loader {
17− id: backgroundLoader;
17+ id: backgroundLoader;
18− objectName: "backgroundLoader";
18+ objectName: "backgroundLoader";
19− anchors.fill: parent;
19+ anchors.fill: parent;
20− asynchronous: root.asynchronous;
20+ asynchronous: root.asynchronous;
21− visible: status == Loader.Ready;
21+ visible: status == Loader.Ready;
22− sourceComponent: UbuntuShape {
22+ sourceComponent: UbuntuShape {
23− objectName: "background";
23+ objectName: "background";
24− radius: "medium";
24+ radius: "medium";
25− color: getColor(0) || "white";
25+ color: getColor(0) || "white";
26− gradientColor: getColor(1) || color;
26+ gradientColor: getColor(1) || color;
27− anchors.fill: parent;
27+ anchors.fill: parent;
28− image: backgroundImage.source ? backgroundImage : null;
28+ image: backgroundImage.source ? backgroundImage : null;
29− property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
29+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b;
30− property Image backgroundImage: Image {
30+ property Image backgroundImage: Image {
31− objectName: "backgroundImage";
31+ objectName: "backgroundImage";
32− source: {
32+ source: {
33− if (cardData && typeof cardData["background"] === "string") return cardData["background"];
33+ if (cardData && typeof cardData["background"] === "string") return cardData["background"];
34− else if (template && typeof template["card-background"] === "string") return template["card-background"];
34+ else if (template && typeof template["card-background"] === "string") return template["card-background"];
35− else return "";
35+ else return "";
36− }
36+ }
37− }
37+ }
38− function getColor(index) {
38+ function getColor(index) {
39− if (cardData && typeof cardData["background"] === "object"
39+ if (cardData && typeof cardData["background"] === "object"
40− && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
40+ && (cardData["background"]["type"] === "color" || cardData["background"]["type"] === "gradient")) {
41− return cardData["background"]["elements"][index];
41+ return cardData["background"]["elements"][index];
42− } else if (template && typeof template["card-background"] === "object"
42+ } else if (template && typeof template["card-background"] === "object"
43− && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
43+ && (template["card-background"]["type"] === "color" || template["card-background"]["type"] === "gradient")) {
44− return template["card-background"]["elements"][index];
44+ return template["card-background"]["elements"][index];
45− } else return undefined;
45+ } else return undefined;
46− }
46+ }
47− }
47+ }
48− }
48+ }
49readonly property size artShapeSize: Qt.size(-1, -1);
49readonly property size artShapeSize: Qt.size(-1, -1);
50readonly property int headerHeight: row.height;
50readonly property int headerHeight: row.height;
51Row {
51Row {
52− id: row;
52+ id: row;
53− objectName: "outerRow";
53+ objectName: "outerRow";
54− property real margins: units.gu(1);
54+ property real margins: units.gu(1);
55− spacing: margins;
55+ spacing: margins;
56− height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
56+ height: root.fixedHeaderHeight != -1 ? root.fixedHeaderHeight : implicitHeight;
57− anchors { top: parent.top;
57+ anchors { top: parent.top;
58 topMargin: units.gu(1);
58 topMargin: units.gu(1);
59− left: parent.left;
59+left: parent.left;
60−}
60+ }
61− anchors.right: parent.right;
61+ anchors.right: parent.right;
62− anchors.margins: margins;
62+ anchors.margins: margins;
63−data: [ Image {
63+ data: [ Image {
64− id: mascotImage;
64+ id: mascotImage;
65− objectName: "mascotImage";
65+ objectName: "mascotImage";
66− anchors { verticalCenter: parent.verticalCenter; }
66+ anchors { verticalCenter: parent.verticalCenter; }
67− readonly property int maxSize: Math.max(width, height) * 4;
67+ readonly property int maxSize: Math.max(width, height) * 4;
68− source: cardData && cardData["mascot"];
68+ source: cardData && cardData["mascot"];
69− width: units.gu(6);
69+ width: units.gu(6);
70− height: units.gu(5.625);
70+ height: units.gu(5.625);
71− sourceSize { width: maxSize; height: maxSize }
71+ sourceSize { width: maxSize; height: maxSize }
72− fillMode: Image.PreserveAspectCrop;
72+ fillMode: Image.PreserveAspectCrop;
73− horizontalAlignment: Image.AlignHCenter;
73+ horizontalAlignment: Image.AlignHCenter;
74− verticalAlignment: Image.AlignVCenter;
74+ verticalAlignment: Image.AlignVCenter;
75− visible: showHeader;
76− }
77−,
78−Column {
79− anchors.verticalCenter: parent.verticalCenter;
80− spacing: units.dp(2);
81− width: parent.width - x;
82− data: [ Label {
83− id: titleLabel;
84− objectName: "titleLabel";
85− anchors { left: parent.left; right: parent.right }
86− elide: Text.ElideRight;
87− fontSize: "small";
88− wrapMode: Text.Wrap;
89− maximumLineCount: 2;
90− font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91− color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
92− visible: showHeader ;
75+ visible: showHeader;
93− text: root.title;
76+ }
94− font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
95− horizontalAlignment: root.headerAlignment;
96− }
97−,
98−Label {
99− id: subtitleLabel;
100− objectName: "subtitleLabel";
101− anchors { left: parent.left; right: parent.right }
102
77
78+ ,
79+ Column {
80+ anchors.verticalCenter: parent.verticalCenter;
81+ spacing: units.dp(2);
82+ width: parent.width - x;
83+ data: [ Label {
84+ id: titleLabel;
85+ objectName: "titleLabel";
86+ anchors { left: parent.left; right: parent.right }
103 elide: Text.ElideRight;
87 elide: Text.ElideRight;
104 fontSize: "small";
88 fontSize: "small";
89+ wrapMode: Text.Wrap;
90+ maximumLineCount: 2;
105 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
91 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
106− color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
92+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
107− visible: titleLabel.visible && titleLabel.text;
93+ visible: showHeader ;
108− text: cardData && cardData["subtitle"] || "";
94+ text: root.title;
109− font.weight: Font.Light;
95+ font.weight: components && components["subtitle"] ? Font.DemiBold : Font.Normal;
110 horizontalAlignment: root.headerAlignment;
96 horizontalAlignment: root.headerAlignment;
111 }
97 }
98+
99+ ,
100+ Label {
101+ id: subtitleLabel;
102+ objectName: "subtitleLabel";
103+ anchors { left: parent.left; right: parent.right }
104+ elide: Text.ElideRight;
105+ fontSize: "small";
106+ font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale);
107+ color: backgroundLoader.active && backgroundLoader.item && backgroundLoader.item.luminance < 0.7 ? "white" : (root.scopeStyle ? root.scopeStyle.foreground : "grey");
108+ visible: titleLabel.visible && titleLabel.text;
109+ text: cardData && cardData["subtitle"] || "";
110+ font.weight: Font.Light;
111+ horizontalAlignment: root.headerAlignment;
112+ }
113+
112−]
114+ ]
113−}
115+ }
116+
114−]
117+ ]
118+ }
119+UbuntuShape {
120+ id: touchdown;
121+ objectName: "touchdown";
122+ anchors { fill: backgroundLoader }
123+ visible: root.pressed;
124+ radius: "medium";
125+ borderSource: "radius_pressed.sci"
115}
126}
116implicitHeight: row.y + row.height + units.gu(1);
127implicitHeight: row.y + row.height + units.gu(1);
117}
128}
tests/plugins/Dash/cardcreator/2.tst+1−1
@@ -1,3 +1,3 @@
1template: {"card-background":{"elements":["#E9E9E9"],"type":"color"},"card-layout":"vertical","card-size":"medium","category-layout":"grid","collapsed-rows":2}
1template: {"card-background":{"elements":["#E9E9E9"],"type":"color"},"card-layout":"vertical","card-size":"medium","category-layout":"grid","collapsed-rows":2}
2−components: {"art":{"aspect-ratio":1,"fill-mode":"crop"},"background":{"field":"background"},"mascot":{"field":"icon"},"subtitle":{"field":"author"},"title":{"field":"title"}}
2+components: {"art":{"aspect-ratio":1},"background":{"field":"background"},"mascot":{"field":"icon"},"subtitle":{"field":"author"},"title":{"field":"title"}}
3result: 2.res
3result: 2.res
tests/plugins/Dash/cardcreator/3.res+79−74

This diff is too big to show here.

tests/plugins/Dash/cardcreator/3.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.res+8

This diff is too big to show here.

tests/plugins/Dash/cardcreator/4.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.res+122−118

This diff is too big to show here.

tests/plugins/Dash/cardcreator/5.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.res+10−8

This diff is too big to show here.

tests/plugins/Dash/cardcreator/6.tst+1−1

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.resnew file+136

This diff is too big to show here.

tests/plugins/Dash/cardcreator/7.tstnew file+3

This diff is too big to show here.

tests/plugins/Dash/cardcreatortest.cpp+19−2

This diff is too big to show here.

tests/plugins/Dash/listviewwithpageheadersectiontest.cpp−1

This diff is too big to show here.

tests/plugins/Dash/tst_CardAttributes.qmlnew file+54

This diff is too big to show here.

tests/plugins/Dash/tst_ScopeStyle.qml+41−9

This diff is too big to show here.

tests/plugins/Unity/Indicators/unitymenumodelstacktest.cpp+3

This diff is too big to show here.

tests/qmltests/CMakeLists.txt+5−6

This diff is too big to show here.

tests/qmltests/Components/tst_Background.qmlnew file+90

This diff is too big to show here.

tests/qmltests/Components/tst_FilterGrid.qmldeleted−190

This diff is too big to show here.

tests/qmltests/Components/tst_PageHeader.qml+57−29

This diff is too big to show here.

tests/qmltests/Components/tst_SeeMore.qmldeleted−52

This diff is too big to show here.

tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qmldeleted−196

This diff is too big to show here.

tests/qmltests/Dash/CardHelpers.js+8−5

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewExpandable.qmlnew file+97

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml+1

This diff is too big to show here.

tests/qmltests/Dash/tst_Card.qml+19−5

This diff is too big to show here.

tests/qmltests/Dash/tst_Dash.qml+47−15

This diff is too big to show here.

tests/qmltests/Dash/tst_DashContent.qml+109−101

This diff is too big to show here.

tests/qmltests/Dash/tst_GenericScopeView.qml+139−50

This diff is too big to show here.

tests/qmltests/Greeter/tst_Lockscreen.qml+11−5

This diff is too big to show here.

tests/qmltests/Launcher/tst_Launcher.qml+11−2

This diff is too big to show here.

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

This diff is too big to show here.

tests/qmltests/Panel/tst_ActiveCallHint.qml+1

This diff is too big to show here.

tests/qmltests/Stages/tst_PhoneStage.qml+12−58

This diff is too big to show here.

tests/qmltests/tst_Shell.qml+175−272

This diff is too big to show here.

tests/qmltests/tst_ShellWithPin.qmlnew file+170

This diff is too big to show here.