on xenial help sign in
Merge from trunk
commite538b27f6e42855cf2906aac31834c8bd097992a authorMichael Terry <michael.terry@canonical.com> dateMon 17 Mar 2014, 11:17 (13 years ago) parent919fb3cdf0623c
145 files changed+1258−719
cmake/modules/autopilot.cmake+10−1 data/unity8.conf+5 debian/changelog+104 debian/control+8−1 debian/rules+2−2 plugins/DashViews/listviewwithpageheader.cpp+33−10 plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+10 plugins/Ubuntu/Gestures/DirectionalDragArea.h+1 plugins/Unity/Indicators/qml/MenuItemFactory.qml+1 plugins/Utils/CMakeLists.txt−1 plugins/Utils/bottombarvisibilitycommunicatorshell.cpp−49 plugins/Utils/bottombarvisibilitycommunicatorshell.h−59 plugins/Utils/plugin.cpp−10 po/am.po+2−2 po/ar.po+2−2 po/ast.po+11−9 po/az.po+2−2 po/bg.po+2−2 po/bs.po+2−2 po/ca.po+2−2 po/ckb.po+2−2 po/cs.po+2−2 po/da.po+2−2 po/de.po+2−2 po/el.po+10−8 po/en_AU.po+2−2 po/en_GB.po+11−9 po/eo.po+2−2 po/es.po+2−2 po/eu.po+32−30 po/fa.po+2−2 po/fi.po+8−6 po/fo.po+2−2 po/fr.po+2−2 po/gd.po+2−2 po/gl.po+5−5 po/he.po+2−2 po/hi.po+2−2 po/hr.po+2−2 po/hu.po+2−2 po/hy.po+2−2 po/id.po+2−2 po/is.po+2−2 po/it.po+2−2 po/ja.po+2−2 po/km.po+5−5 po/kn.po+2−2 po/ko.po+2−2 po/ky.po+2−2 po/lo.po+2−2 po/lt.po+2−2 po/lv.po+2−2 po/ml.po+2−2 po/mr.po+2−2 po/ms.po+2−2 po/my.po+2−2 po/nb.po+2−2 po/nl.po+2−2 po/pl.po+2−2 po/pt.po+2−2 po/pt_BR.po+2−2 po/ro.po+2−2 po/ru.po+2−2 po/shn.po+2−2 po/si.po+2−2 po/sl.po+2−2 po/sq.po+2−2 po/sr.po+2−2 po/sv.po+2−2 po/sw.po+2−2 po/ta.po+2−2 po/te.po+2−2 po/tr.po+15−13 po/ug.po+2−2 po/uk.po+2−2 po/vi.po+2−2 po/xh.po+2−2 po/zh_CN.po+2−2 po/zh_HK.po+2−2 po/zh_TW.po+2−2 qml/Components/Stage.qml+4−6 qml/Dash/Apps/FrequentlyUsedAppsModel.qml+6−6 qml/Dash/Card.qml+9 qml/Dash/CardHeader.qml+33−59 qml/Dash/CardTool.qml+46−8 qml/Dash/Dash.qml+1−1 qml/Dash/DashContent.qml+1−8 qml/Dash/GenericScopeView.qml+1−5 qml/Dash/Previews/PreviewActions.qml+1−1 qml/Dash/Previews/PreviewHeader.qml+3−1 qml/Dash/Previews/PreviewImageGallery.qml+9 qml/Dash/Previews/PreviewRatingDisplay.qml+101 qml/Dash/Previews/PreviewRating.qml → qml/Dash/Previews/PreviewRatingInput.qml qml/Dash/Previews/PreviewTextSummary.qml+2−1 qml/Dash/Previews/PreviewWidgetFactory.qml+2−1 qml/Greeter/Greeter.qml+4 qml/Greeter/GreeterContent.qml−1 qml/Panel/IndicatorItem.qml+13−21 qml/Panel/Indicators.qml+1−1 qml/Shell.qml+4−52 src/main.cpp+6 tests/autopilot/unity8/__init__.py+5−2 tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+5−40 tests/autopilot/unity8/process_helpers.py+1−1 tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+2−1 tests/autopilot/unity8/shell/tests/__init__.py+12−13 tests/autopilot/unity8/shell/tests/test_hud.py → tests/autopilot/unity8/shell/tests/disabled_test_hud.py+2−2 tests/autopilot/unity8/shell/tests/test_emulators.py+4−1 tests/autopilot/unity8/shell/tests/test_lock_screen.py+18−3 tests/autopilot/unity8/shell/tests/test_notifications.py+8−1 tests/autopilot/unity8/shell/tests/test_upstart.py+6−1 tests/mocks/AccountsService/AccountsService.cpp+1−1 tests/mocks/Unity/Indicators/CMakeLists.txt+1 tests/mocks/Unity/Indicators/IndicatorsModel.qml+3−5 tests/mocks/Unity/Indicators/fakeindicatorsmodel.cpp+116 tests/mocks/Unity/Indicators/fakeindicatorsmodel.h+59 tests/mocks/Unity/Indicators/fakeplugin.cpp+6 tests/mocks/data/applications/camera-app.desktop → tests/mocks/data/applications/webbrowser-app.desktop tests/plugins/DashViews/listviewwithpageheadertest.cpp−6 tests/plugins/DashViews/listviewwithpageheadertestsection.cpp−3 tests/plugins/DashViews/organicgridtest.cpp+2−1 tests/plugins/DashViews/verticaljournaltest.cpp+2−1 tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+54 tests/qmltests/CMakeLists.txt+2−1 tests/qmltests/Components/tst_DragHandle.cpp−1 tests/qmltests/Components/tst_LazyImage.qml+1−1 tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qml+112 tests/qmltests/Dash/Previews/tst_PreviewRating.qml → tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qml+15−15 tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−6 tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml+2−1 tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+3−4 tests/qmltests/Dash/qml/FakeScopeView.qml−5 tests/qmltests/Dash/tst_Card.qml+63 tests/qmltests/Dash/tst_CardHeader.qml+1−28 tests/qmltests/Dash/tst_CardTool.qml+20 tests/qmltests/Dash/tst_DashContent.qml+15−36 tests/qmltests/Dash/tst_GenericPreview.qml+2−2 tests/qmltests/Dash/tst_GenericScopeView.qml+3−3 tests/qmltests/Greeter/tst_Phone.qml+19 tests/qmltests/Greeter/tst_Tablet.qml+19 tests/qmltests/Launcher/tst_Launcher.qml+6−4 tests/qmltests/Panel/tst_IndicatorRow.qml+3−3 tests/qmltests/Panel/tst_MenuContent.qml+1−1 tests/qmltests/tst_Shell.qml+18−2 tests/utils/modules/Unity/Test/UnityTestCase.qml+10−16
cmake/modules/autopilot.cmake+10−1
@@ -2,7 +2,7 @@ add_custom_target(autopilot)
22
33function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
44 add_custom_target(autopilot-${TEST_NAME}
5− COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks autopilot run ${TEST_SUITE}
5+ COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python3 -m autopilot.run run ${TEST_SUITE}
66 WORKING_DIRECTORY ${WORKING_DIR}
77 DEPENDS fake_install
88 )
@@ -12,4 +12,13 @@ function(declare_autopilot_test TEST_NAME TEST_SUITE WORKING_DIR)
1212 )
1313
1414 add_dependencies(autopilot autopilot-${TEST_NAME})
15+
16+ add_custom_target(autopilot2-${TEST_NAME}
17+ COMMAND LANG=C UBUNTU_ICON_THEME=ubuntu-mobile QML2_IMPORT_PATH=${SHELL_INSTALL_QML}/mocks python2 -m autopilot.run run ${TEST_SUITE}
18+ WORKING_DIRECTORY ${WORKING_DIR}
19+ DEPENDS fake_install
20+ )
21+
22+ add_dependencies(autopilot autopilot2-${TEST_NAME})
23+
1524endfunction()
data/unity8.conf+5
@@ -28,6 +28,11 @@ pre-start script
2828 initctl set-env --global MIR_SOCKET=$MIR_SERVER_FILE
2929 gdbus call --session --dest org.freedesktop.DBus --object-path /org/freedesktop/DBus --method org.freedesktop.DBus.UpdateActivationEnvironment "@a{ss} {'MIR_SOCKET': '$MIR_SERVER_FILE'}"
3030 fi
31+
32+ # Remove the socket if still there
33+ if [ -S "$MIR_SERVER_FILE" ]; then
34+ rm "$MIR_SERVER_FILE"
35+ fi
3136end script
3237
3338exec ${BINARY:-unity8} $ARGS
debian/changelog+104
@@ -1,3 +1,107 @@
1+unity8 (7.84+14.04.20140314-0ubuntu1) trusty; urgency=low
2+
3+ [ Michał Sawicz ]
4+ * Fix tests under Qt 5.2.
5+ * CardHeader improvements depending on background. Also drop prices,
6+ they need to be reworked into attributes.
7+ * Bring Cards closer to design
8+ * Add back the workaround for not being able scroll the image gallery
9+ Taken from AppPreview.qml (LP: #1281709)
10+ * Only allow searching when preview isn't open. (LP: #1282475)
11+ * Adds carousel dynamic switch
12+
13+ [ Leo Arias ]
14+ * Update the url dispatcher test to use the fake app fixture from the
15+ toolkit.
16+
17+ [ Albert Astals ]
18+ * Fix tests under Qt 5.2.
19+ * Workaround compiz/unity7 behaviour change/bug
20+
21+ [ Michael Zanetti ]
22+ * Fix tests under Qt 5.2.
23+ * Disable HUD from the bottom edge.
24+
25+ [ Andrea Cimitan ]
26+ * Adds carousel dynamic switch
27+
28+ [ CI bot ]
29+ * Resync trunk
30+
31+ [ Michał Karnicki ]
32+ * CardHeader improvements depending on background. Also drop prices,
33+ they need to be reworked into attributes.
34+
35+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 14 Mar 2014 15:46:10 +0000
36+
37+unity8 (7.84+14.04.20140307-0ubuntu1) trusty; urgency=low
38+
39+ * New rebuild forced
40+
41+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 07 Mar 2014 10:54:33 +0000
42+
43+unity8 (7.84+14.04.20140306-0ubuntu1) trusty; urgency=low
44+
45+ [ Bill Filler ]
46+ * Convert gallery and camera to click
47+
48+ [ Michael Zanetti ]
49+ * Just disable HUD tests, without really disabling the HUD itself
50+
51+ [ Sergio Schvezov ]
52+ * Convert gallery and camera to click
53+
54+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 06 Mar 2014 16:45:46 +0000
55+
56+unity8 (7.84+14.04.20140304-0ubuntu1) trusty; urgency=low
57+
58+ [ Michael Terry ]
59+ * Ensure that the selected() signal is emitted by the greeter on
60+ startup, fixing the background on startup for the first user in
61+ tablet mode.
62+
63+ [ Nick Dedekind ]
64+ * Remocked IndicatorModel to fix qt5.2.1 changes.
65+
66+ [ Albert Astals ]
67+ * Initialize m_distance (LP: #1285385)
68+ * import Ubuntu.Components so we can use UbuntuAnimation
69+
70+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 04 Mar 2014 11:43:04 +0000
71+
72+unity8 (7.84+14.04.20140228-0ubuntu1) trusty; urgency=low
73+
74+ [ Michał Sawicz ]
75+ * Fix CardHeader title font weight.
76+ * Delete stale sockets. (LP: #1285215)
77+
78+ [ Dmitrijs Ledkovs ]
79+ * Ship python3 autopilot modules.
80+
81+ [ Albert Astals ]
82+ * Cleanup DashContent Remove unused signals and properties
83+
84+ [ Michał Karnicki ]
85+ * Take it easy on the logging.
86+ * Fix CardHeader title font weight.
87+
88+ [ Nick Dedekind ]
89+ * Added ability to change indicator profile in shell (env
90+ UNITY_INDICATOR_PROFILE)
91+
92+ [ Andrea Cimitan ]
93+ * Rename PreviewRating to PreviewRatingInput
94+ * Adds PreviewRatingDisplay
95+
96+ [ Daniel d'Andrada ]
97+ * DirectionalDragArea: Reset status if disabled while dragging (LP:
98+ #1276122)
99+
100+ [ Dimitri John Ledkov ]
101+ * Ship python3 autopilot modules.
102+
103+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 28 Feb 2014 10:48:06 +0000
104+
1105unity8 (7.84+14.04.20140221-0ubuntu1) trusty; urgency=low
2106
3107 [ Michał Sawicz ]
debian/control+8−1
@@ -28,7 +28,8 @@ Build-Depends: cmake,
2828 pkg-config,
2929 python:any (>= 2.7),
3030 python-setuptools,
31− python3:any,
31+ python3-all:any,
32+ python3-setuptools,
3233 qt5-default,
3334 qtbase5-dev,
3435 qtbase5-dev-tools,
@@ -107,16 +108,22 @@ Depends: gir1.2-glib-2.0,
107108 libautopilot-qt (>= 1.4),
108109 libqt5test5,
109110 libqt5widgets5,
111+ python-autopilot,
110112 python-evdev,
111113 python-fixtures,
112114 python-gi,
113115 python-mock,
116+ python3-autopilot,
117+ python3-evdev,
118+ python3-fixtures,
119+ python3-gi,
114120 ubuntu-ui-toolkit-autopilot,
115121 unity8 (>= ${source:Version}),
116122 unity8-fake-env (>= ${source:Version}),
117123 url-dispatcher-tools,
118124 ${misc:Depends},
119125 ${python:Depends},
126+ ${python3:Depends},
120127 ${shlibs:Depends},
121128Description: Test package for Unity 8 shell
122129 Autopilot tests for the unity8 package
debian/rules+2−2
@@ -10,7 +10,7 @@ SCOPES_RECOMMENDS := $(shell perl debian/scopes-recommends-generator /usr/share/
1010
1111.PHONY: build
1212build %:
13− dh $@ --parallel --fail-missing --with python2
13+ dh $@ --parallel --fail-missing --with python2,python3
1414
1515override_dh_auto_clean:
1616 dh_auto_clean
@@ -28,7 +28,7 @@ override_dh_auto_build:
2828override_dh_install:
2929 # install autopilot tests
3030 cd tests/autopilot; \
31− set -ex; for python in $(shell pyversions -r); do \
31+ set -ex; for python in $(shell pyversions -r) $(shell py3versions -r); do \
3232 $$python setup.py install --root=$(CURDIR)/debian/tmp --install-layout=deb; \
3333 done; \
3434 cd $(CURDIR)
plugins/DashViews/listviewwithpageheader.cpp+33−10
@@ -91,6 +91,7 @@
9191
9292#include "listviewwithpageheader.h"
9393
94+#include <QCoreApplication>
9495#include <QDebug>
9596#include <qqmlinfo.h>
9697#include <qqmlengine.h>
@@ -477,6 +478,11 @@ void ListViewWithPageHeader::componentComplete()
477478 polish();
478479}
479480
481+static inline bool uFuzzyCompare(qreal r1, qreal r2)
482+{
483+ return qFuzzyCompare(r1, r2) || (qFuzzyIsNull(r1) && qFuzzyIsNull(r2));
484+}
485+
480486void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
481487{
482488 // Check we are not being taken down and don't paint anything
@@ -491,11 +497,7 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
491497 const bool showHeaderAnimationRunning = m_contentYAnimation->isRunning() && contentYAnimationType == ContentYAnimationShowHeader;
492498 if (m_headerItem) {
493499 const auto oldHeaderItemShownHeight = m_headerItemShownHeight;
494− if (contentY() < -m_minYExtent) {
495− // Stick the header item to the top when dragging down
496− m_headerItem->setY(contentY());
497− m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
498− } else {
500+ if (uFuzzyCompare(contentY(), -m_minYExtent) || contentY() > -m_minYExtent) {
499501 m_headerItem->setHeight(m_headerItem->implicitHeight());
500502 // We are going down (but it's not because of the rebound at the end)
501503 // (but the header was not shown by it's own position)
@@ -509,21 +511,32 @@ void ListViewWithPageHeader::viewportMoved(Qt::Orientations orient)
509511 m_headerItemShownHeight = 0;
510512 m_headerItem->setY(-m_minYExtent);
511513 } else if ((scrolledUp && notRebounding && notShownByItsOwn && !maximizeVisibleAreaRunning) || (m_headerItemShownHeight > 0) || m_inContentHeightKeepHeaderShown) {
512− if (maximizeVisibleAreaRunning && diff > 0) // If we are maximizing and the header was shown, make sure we hide it
514+ if (maximizeVisibleAreaRunning && diff > 0) {
515+ // If we are maximizing and the header was shown, make sure we hide it
513516 m_headerItemShownHeight -= diff;
514− else
517+ } else {
515518 m_headerItemShownHeight += diff;
516− if (contentY() == -m_minYExtent) {
519+ }
520+ if (uFuzzyCompare(contentY(), -m_minYExtent)) {
517521 m_headerItemShownHeight = 0;
518522 } else {
519523 m_headerItemShownHeight = qBound(static_cast<qreal>(0.), m_headerItemShownHeight, m_headerItem->height());
520524 }
521525 if (m_headerItemShownHeight > 0) {
522− m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
526+ if (uFuzzyCompare(m_headerItem->height(), m_headerItemShownHeight)) {
527+ m_headerItem->setY(contentY());
528+ m_headerItemShownHeight = m_headerItem->height();
529+ } else {
530+ m_headerItem->setY(contentY() - m_headerItem->height() + m_headerItemShownHeight);
531+ }
523532 } else {
524533 m_headerItem->setY(-m_minYExtent);
525534 }
526535 }
536+ } else {
537+ // Stick the header item to the top when dragging down
538+ m_headerItem->setY(contentY());
539+ m_headerItem->setHeight(m_headerItem->implicitHeight() + (-m_minYExtent - contentY()));
527540 }
528541 // We will be changing the clip item, need to accomadate for it
529542 // otherwise we move the firstItem down/up twice (unless the
@@ -1128,7 +1141,12 @@ void ListViewWithPageHeader::adjustMinYExtent()
11281141 nonCreatedHeight = m_firstVisibleIndex * visibleItemsHeight / visibleItems;
11291142// qDebug() << m_firstVisibleIndex << visibleItemsHeight << visibleItems << nonCreatedHeight;
11301143 }
1131− m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + (m_headerItem ? m_headerItem->implicitHeight() : 0);
1144+ const qreal headerHeight = (m_headerItem ? m_headerItem->implicitHeight() : 0);
1145+ m_minYExtent = nonCreatedHeight - m_visibleItems.first()->y() - m_clipItem->y() + headerHeight;
1146+ if (m_minYExtent != 0 && qFuzzyIsNull(m_minYExtent)) {
1147+ m_minYExtent = 0;
1148+ m_visibleItems.first()->setY(nonCreatedHeight - m_clipItem->y() + headerHeight);
1149+ }
11321150 }
11331151}
11341152
@@ -1264,6 +1282,11 @@ void ListViewWithPageHeader::updatePolish()
12641282 refill();
12651283
12661284 if (m_contentHeightDirty) {
1285+ // We need to make sure all bindings have updated otherwise
1286+ // we may end up with bindings updating when we call setContentHeight
1287+ // and then everything gets out of sync, i.e. testHeaderPositionBug1240118
1288+ QCoreApplication::instance()->processEvents();
1289+
12671290 qreal contentHeight;
12681291 if (m_visibleItems.isEmpty()) {
12691292 contentHeight = m_headerItem ? m_headerItem->height() : 0;
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+10
@@ -109,6 +109,7 @@ private:
109109DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
110110 : QQuickItem(parent)
111111 , m_status(WaitingForTouch)
112+ , m_sceneDistance(0)
112113 , m_touchId(-1)
113114 , m_direction(Direction::Rightwards)
114115 , m_wideningAngle(0)
@@ -129,6 +130,8 @@ DirectionalDragArea::DirectionalDragArea(QQuickItem *parent)
129130 m_recognitionTimer->setInterval(60);
130131
131132 m_velocityCalculator = new AxisVelocityCalculator(this);
133+
134+ connect(this, &QQuickItem::enabledChanged, this, &DirectionalDragArea::onEnabledChanged);
132135}
133136
134137Direction::Type DirectionalDragArea::direction() const
@@ -528,6 +531,13 @@ void DirectionalDragArea::checkSpeed()
528531 m_numSamplesOnLastSpeedCheck = m_velocityCalculator->numSamples();
529532}
530533
534+void DirectionalDragArea::onEnabledChanged()
535+{
536+ if (!isEnabled() && m_status != WaitingForTouch) {
537+ setStatus(WaitingForTouch);
538+ }
539+}
540+
531541void DirectionalDragArea::setStatus(DirectionalDragArea::Status newStatus)
532542{
533543 if (newStatus == m_status)
plugins/Ubuntu/Gestures/DirectionalDragArea.h+1
@@ -218,6 +218,7 @@ protected:
218218
219219private Q_SLOTS:
220220 void checkSpeed();
221+ void onEnabledChanged();
221222
222223private:
223224 void touchEvent_absent(QTouchEvent *event);
plugins/Unity/Indicators/qml/MenuItemFactory.qml+1
@@ -22,6 +22,7 @@ import Ubuntu.Settings.Menus 0.1 as Menus
2222import QMenuModel 0.1 as QMenuModel
2323import Utils 0.1 as Utils
2424import Ubuntu.Components.ListItems 0.1 as ListItems
25+import Ubuntu.Components 0.1
2526
2627Item {
2728 id: menuFactory
plugins/Utils/CMakeLists.txt−1
@@ -12,7 +12,6 @@ include_directories(
1212
1313set(QMLPLUGIN_SRC
1414 albumartprovider.cpp
15− bottombarvisibilitycommunicatorshell.cpp
1615 mediaartcache.cpp
1716 qlimitproxymodelqml.cpp
1817 qsortfilterproxymodelqml.cpp
plugins/Utils/bottombarvisibilitycommunicatorshell.cppdeleted−49
@@ -1,49 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#include "bottombarvisibilitycommunicatorshell.h"
18−
19−BottomBarVisibilityCommunicatorShell::BottomBarVisibilityCommunicatorShell()
20− : m_forceHidden(false),
21− m_position(0)
22−{
23−}
24−
25−bool BottomBarVisibilityCommunicatorShell::forceHidden() const
26−{
27− return m_forceHidden;
28−}
29−
30−double BottomBarVisibilityCommunicatorShell::position() const
31−{
32− return m_position;
33−}
34−
35−void BottomBarVisibilityCommunicatorShell::setForceHidden(bool forceHidden)
36−{
37− if (forceHidden != m_forceHidden) {
38− m_forceHidden = forceHidden;
39− Q_EMIT forceHiddenChanged(forceHidden);
40− }
41−}
42−
43−void BottomBarVisibilityCommunicatorShell::setPosition(double position)
44−{
45− if (position != m_position) {
46− m_position = position;
47− Q_EMIT positionChanged(position);
48− }
49−}
plugins/Utils/bottombarvisibilitycommunicatorshell.hdeleted−59
@@ -1,59 +0,0 @@
1−/*
2− * Copyright (C) 2012 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−#ifndef BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
18−#define BOTTOMBARVISIBILITYCOMMUNICATORSHELL_H
19−
20−#include <QObject>
21−
22−class QDBusInterface;
23−
24−/** This is an internal class used to talk with the bottom bar used by either
25− * applications or the SDK.
26− * There is a method to force the bottom bar to be hidden or otherwise behave as usual
27− */
28−
29−class BottomBarVisibilityCommunicatorShell : public QObject
30−{
31− Q_OBJECT
32− Q_PROPERTY(bool forceHidden READ forceHidden WRITE setForceHidden NOTIFY forceHiddenChanged)
33− Q_PROPERTY(double position READ position WRITE setPosition NOTIFY positionChanged)
34−
35− Q_CLASSINFO("D-Bus Interface", "com.canonical.Shell.BottomBarVisibilityCommunicator")
36−public:
37− static BottomBarVisibilityCommunicatorShell& instance() {
38− static BottomBarVisibilityCommunicatorShell instance;
39− return instance;
40− }
41−
42− bool forceHidden() const;
43− void setForceHidden(bool forceHidden);
44−
45− double position() const;
46− void setPosition(double position);
47−
48−Q_SIGNALS:
49− void forceHiddenChanged(bool forceHidden);
50− void positionChanged(double position);
51−
52−private:
53− BottomBarVisibilityCommunicatorShell();
54−
55− bool m_forceHidden;
56− double m_position;
57−};
58−
59−#endif
plugins/Utils/plugin.cpp−10
@@ -27,15 +27,11 @@
2727
2828// local
2929#include "albumartprovider.h"
30−#include "bottombarvisibilitycommunicatorshell.h"
3130#include "qlimitproxymodelqml.h"
3231#include "qsortfilterproxymodelqml.h"
3332#include "timeformatter.h"
3433#include "unitymenumodelpaths.h"
3534
36−static const char* BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH = "/BottomBarVisibilityCommunicator";
37−static const char* DBUS_SERVICE = "com.canonical.Shell.BottomBarVisibilityCommunicator";
38−
3935void UtilsPlugin::registerTypes(const char *uri)
4036{
4137 Q_ASSERT(uri == QLatin1String("Utils"));
@@ -45,7 +41,6 @@ void UtilsPlugin::registerTypes(const char *uri)
4541 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
4642 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
4743 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
48− qmlRegisterUncreatableType<BottomBarVisibilityCommunicatorShell>(uri, 0, 1, "BottomBarVisibilityCommunicatorShell", "Can't create BottomBarVisibilityCommunicatorShell");
4944}
5045
5146void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
@@ -64,9 +59,4 @@ void UtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
6459 {
6560 qWarning() << "Failed to register image provider for albumart (unknown error)";
6661 }
67−
68− QDBusConnection::sessionBus().registerService(DBUS_SERVICE);
69− BottomBarVisibilityCommunicatorShell *bottomBarVisibilityCommunicator = &BottomBarVisibilityCommunicatorShell::instance();
70− QDBusConnection::sessionBus().registerObject(BOTTOM_BAR_VISIBILITY_COMMUNICATOR_DBUS_PATH, bottomBarVisibilityCommunicator, QDBusConnection::ExportAllContents);
71− engine->rootContext()->setContextProperty("bottomBarVisibilityCommunicatorShell", bottomBarVisibilityCommunicator);
7262}
po/am.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ar.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n % 100 >= "
1818"3 && n % 100 <= 10 ? 3 : n % 100 >= 11 && n % 100 <= 99 ? 4 : 5;\n"
19−"X-Launchpad-Export-Date: 2014-02-22 07:40+0000\n"
20−"X-Generator: Launchpad (build 16926)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ast.po+11−9
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2013-12-11 20:45+0000\n"
12−"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
11+"PO-Revision-Date: 2014-03-01 16:51+0000\n"
12+"Last-Translator: Xuacu Saturio <xuacusk8@gmail.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,6 +74,8 @@ msgid ""
7474"You have now mastered the edge gestures and can start using the "
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
77+"Agora domina los xestos de los bordes y pue principiar a usar el "
78+"teléfonu<br><br>Toque la pantalla pa comenzar"
7779
7880#: qml/Components/PageHeader.qml:340
7981msgid "Recent searches"
@@ -81,11 +83,11 @@ msgstr "Busques recientes"
8183
8284#: qml/Components/SeeMore.qml:35
8385msgid "See more"
84−msgstr ""
86+msgstr "Ver más"
8587
8688#: qml/Components/SeeMore.qml:57
8789msgid "See less"
88−msgstr ""
90+msgstr "Ver menos"
8991
9092#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
9193msgid "Rate this"
@@ -107,11 +109,11 @@ msgstr[1] "%1 reseñes"
107109
108110#: qml/Dash/Previews/PreviewActionCombo.qml:34
109111msgid "More..."
110−msgstr ""
112+msgstr "Más…"
111113
112114#: qml/Dash/Previews/PreviewActionCombo.qml:34
113115msgid "Less..."
114−msgstr ""
116+msgstr "Menos…"
115117
116118#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
117119msgid "Add a review"
@@ -168,7 +170,7 @@ msgstr "Amosar contraseña"
168170
169171#: qml/Notifications/NotificationMenuItemFactory.qml:103
170172msgid "Please enter SIM PIN"
171−msgstr ""
173+msgstr "Escriba'l PIN de la SIM"
172174
173175#: qml/Panel/SearchIndicator.qml:27
174176msgid "Search"
po/az.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/bg.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/bs.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ca.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ckb.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/cs.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/da.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/de.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/el.po+10−8
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-15 16:34+0000\n"
12−"Last-Translator: Filippos Kolyvas <Unknown>\n"
11+"PO-Revision-Date: 2014-02-26 09:58+0000\n"
12+"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
1313"Language-Team: Greek <el@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -74,6 +74,8 @@ msgid ""
7474"You have now mastered the edge gestures and can start using the "
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
77+"Πλέον γνωρίζετε τις χειρονομίες από τα άκρα και μπορείτε να ξεκινήσετε να "
78+"χρησιμοποιείτε το τηλέφωνο<br><br>Αγγίξτε την οθόνη για να ξεκινήσετε"
7779
7880#: qml/Components/PageHeader.qml:340
7981msgid "Recent searches"
@@ -81,11 +83,11 @@ msgstr "Πρόσφατες αναζητήσεις"
8183
8284#: qml/Components/SeeMore.qml:35
8385msgid "See more"
84−msgstr ""
86+msgstr "Περρισότερα"
8587
8688#: qml/Components/SeeMore.qml:57
8789msgid "See less"
88−msgstr ""
90+msgstr "Λιγότερα"
8991
9092#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
9193msgid "Rate this"
@@ -152,7 +154,7 @@ msgstr "Πληκτρολογήστε ή πείτε μια εντολή"
152154
153155#: qml/Hud/Hud.qml:84
154156msgid "Loading. Please Wait..."
155−msgstr "Γίνεται φόρτωση, παρακαλώ περιμένετε..."
157+msgstr "Γίνεται φόρτωση. Παρακαλώ περιμένετε..."
156158
157159#: qml/Hud/Hud.qml:89
158160msgid "Speak Now..."
@@ -168,7 +170,7 @@ msgstr "Εμφάνιση κωδικού"
168170
169171#: qml/Notifications/NotificationMenuItemFactory.qml:103
170172msgid "Please enter SIM PIN"
171−msgstr ""
173+msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
172174
173175#: qml/Panel/SearchIndicator.qml:27
174176msgid "Search"
po/en_AU.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/en_GB.po+11−9
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-14 20:46+0000\n"
12−"Last-Translator: Dan Bishop <dan@danbishop.org>\n"
11+"PO-Revision-Date: 2014-03-07 13:27+0000\n"
12+"Last-Translator: Andi Chandler <Unknown>\n"
1313"Language-Team: English (United Kingdom) <en_GB@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,6 +72,8 @@ msgid ""
7272"You have now mastered the edge gestures and can start using the "
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
75+"You have now mastered the edge gestures and can start using the "
76+"phone<br><br>Tap on the screen to start"
7577
7678#: qml/Components/PageHeader.qml:340
7779msgid "Recent searches"
@@ -79,11 +81,11 @@ msgstr "Recent searches"
7981
8082#: qml/Components/SeeMore.qml:35
8183msgid "See more"
82−msgstr ""
84+msgstr "See more"
8385
8486#: qml/Components/SeeMore.qml:57
8587msgid "See less"
86−msgstr ""
88+msgstr "See less"
8789
8890#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
8991msgid "Rate this"
@@ -105,11 +107,11 @@ msgstr[1] "%1 reviews"
105107
106108#: qml/Dash/Previews/PreviewActionCombo.qml:34
107109msgid "More..."
108−msgstr ""
110+msgstr "More..."
109111
110112#: qml/Dash/Previews/PreviewActionCombo.qml:34
111113msgid "Less..."
112−msgstr ""
114+msgstr "Less..."
113115
114116#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115117msgid "Add a review"
@@ -166,7 +168,7 @@ msgstr "Show password"
166168
167169#: qml/Notifications/NotificationMenuItemFactory.qml:103
168170msgid "Please enter SIM PIN"
169−msgstr ""
171+msgstr "Please enter SIM PIN"
170172
171173#: qml/Panel/SearchIndicator.qml:27
172174msgid "Search"
po/eo.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/es.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-21 06:42+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/eu.po+32−30
@@ -8,24 +8,24 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-03 22:04+0000\n"
11+"PO-Revision-Date: 2014-03-16 17:40+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-17 05:13+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
2323msgid "Lock to Launcher"
24−msgstr ""
24+msgstr "Lotu abiarazlera"
2525
2626#: plugins/Unity/Launcher/launcheritem.cpp:73
2727msgid "Unlock from Launcher"
28−msgstr ""
28+msgstr "Askatu abiarazletik"
2929
3030#: qml/Components/EdgeDemoOverlay.qml:151
3131msgid "Skip intro"
@@ -74,107 +74,109 @@ msgid ""
7474"You have now mastered the edge gestures and can start using the "
7575"phone<br><br>Tap on the screen to start"
7676msgstr ""
77+"Jadanik ezagutzen dituzu ertzetako keinuak, eta mugikorra erabiltzen has "
78+"zaitezke<br><br>Ukitu pantaila hasteko"
7779
7880#: qml/Components/PageHeader.qml:340
7981msgid "Recent searches"
80−msgstr ""
82+msgstr "Azken bilaketak"
8183
8284#: qml/Components/SeeMore.qml:35
8385msgid "See more"
84−msgstr ""
86+msgstr "Ikusi gehiago"
8587
8688#: qml/Components/SeeMore.qml:57
8789msgid "See less"
88−msgstr ""
90+msgstr "Ikusi gutxiago"
8991
9092#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
9193msgid "Rate this"
92−msgstr ""
94+msgstr "Puntuatu hau"
9395
9496#. TRANSLATORS: Number of persons who rated this app/video/whatever
9597#: qml/Dash/Previews/Header.qml:93
9698#, qt-format
9799msgid "(%1)"
98−msgstr ""
100+msgstr "(%1)"
99101
100102#. TRANSLATORS: Number of persons who wrote reviews for this app/video/whatever
101103#: qml/Dash/Previews/Header.qml:105
102104#, qt-format
103105msgid "%1 review"
104106msgid_plural "%1 reviews"
105−msgstr[0] ""
106−msgstr[1] ""
107+msgstr[0] "berrikuspen %1"
108+msgstr[1] "%1 berrikuspen"
107109
108110#: qml/Dash/Previews/PreviewActionCombo.qml:34
109111msgid "More..."
110−msgstr ""
112+msgstr "Gehiago..."
111113
112114#: qml/Dash/Previews/PreviewActionCombo.qml:34
113115msgid "Less..."
114−msgstr ""
116+msgstr "Gutxiago..."
115117
116118#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
117119msgid "Add a review"
118−msgstr ""
120+msgstr "Gehitu berrikuspena"
119121
120122#: qml/Dash/Previews/PreviewRating.qml:153 qml/Dash/Previews/Reviews.qml:121
121123msgid "Send"
122−msgstr ""
124+msgstr "Bidali"
123125
124126#: qml/Dash/Previews/Reviews.qml:86
125127msgid "Review"
126−msgstr ""
128+msgstr "Berrikusi"
127129
128130#: qml/Dash/Previews/Reviews.qml:139
129131msgid "Comments:"
130−msgstr ""
132+msgstr "Iruzkinak:"
131133
132134#: qml/Greeter/Lockscreen.qml:149
133135msgid "Emergency Call"
134−msgstr ""
136+msgstr "Larrialdi-deia"
135137
136138#: qml/Greeter/PassphraseLockscreen.qml:59
137139#, qt-format
138140msgid "Hello %1"
139−msgstr ""
141+msgstr "Kaixo %1"
140142
141143#: qml/Greeter/PassphraseLockscreen.qml:59
142144msgid "Hello"
143−msgstr ""
145+msgstr "Kaixo"
144146
145147#: qml/Hud/HudParametrizedActionsPage.qml:132
146148msgid "Confirm"
147−msgstr ""
149+msgstr "Baieztatu"
148150
149151#: qml/Hud/Hud.qml:61 qml/Hud/Hud.qml:99 qml/Hud/Hud.qml:372
150152msgid "Type or say a command"
151−msgstr ""
153+msgstr "Idatzi edo esan agindu bat"
152154
153155#: qml/Hud/Hud.qml:84
154156msgid "Loading. Please Wait..."
155−msgstr ""
157+msgstr "Kargatzen. Itxaron, mesedez..."
156158
157159#: qml/Hud/Hud.qml:89
158160msgid "Speak Now..."
159−msgstr ""
161+msgstr "Hitz egin orain..."
160162
161163#: qml/Hud/Hud.qml:94
162164msgid "Speaking..."
163−msgstr ""
165+msgstr "Hitz egiten..."
164166
165167#: qml/Notifications/NotificationMenuItemFactory.qml:91
166168msgid "Show password"
167−msgstr ""
169+msgstr "Erakutsi pasahitza"
168170
169171#: qml/Notifications/NotificationMenuItemFactory.qml:103
170172msgid "Please enter SIM PIN"
171−msgstr ""
173+msgstr "Sartu SIMaren PINa"
172174
173175#: qml/Panel/SearchIndicator.qml:27
174176msgid "Search"
175−msgstr ""
177+msgstr "Bilatu"
176178
177179#: qml/Shell.qml:440
178180#, qt-format
179181msgid "Please enter %1"
180−msgstr ""
182+msgstr "Sartu %1"
po/fa.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/fi.po+8−6
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-21 19:36+0000\n"
11+"PO-Revision-Date: 2014-03-09 19:22+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-22 07:40+0000\n"
19−"X-Generator: Launchpad (build 16926)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,6 +72,8 @@ msgid ""
7272"You have now mastered the edge gestures and can start using the "
7373"phone<br><br>Tap on the screen to start"
7474msgstr ""
75+"Hallitset nyt reunaeleet, joten voit aloittaa puhelimen "
76+"käytön<br><br>Napauta näyttöä aloittaaksesi"
7577
7678#: qml/Components/PageHeader.qml:340
7779msgid "Recent searches"
@@ -79,11 +81,11 @@ msgstr "Viimeisimmät haut"
7981
8082#: qml/Components/SeeMore.qml:35
8183msgid "See more"
82−msgstr ""
84+msgstr "Näytä lisää"
8385
8486#: qml/Components/SeeMore.qml:57
8587msgid "See less"
86−msgstr ""
88+msgstr "Näytä vähemmän"
8789
8890#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
8991msgid "Rate this"
@@ -109,7 +111,7 @@ msgstr "Lisää..."
109111
110112#: qml/Dash/Previews/PreviewActionCombo.qml:34
111113msgid "Less..."
112−msgstr ""
114+msgstr "Vähemmän..."
113115
114116#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
115117msgid "Add a review"
po/fo.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/fr.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/gd.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n==1 || n==11) ? 0 : (n==2 || n==12) ? 1 : "
1818"(n > 2 && n < 20) ? 2 : 3;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/gl.po+5−5
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-15 04:00+0000\n"
11+"PO-Revision-Date: 2014-03-08 06:58+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -107,11 +107,11 @@ msgstr[1] "%1 opinións"
107107
108108#: qml/Dash/Previews/PreviewActionCombo.qml:34
109109msgid "More..."
110−msgstr ""
110+msgstr "Máis…"
111111
112112#: qml/Dash/Previews/PreviewActionCombo.qml:34
113113msgid "Less..."
114−msgstr ""
114+msgstr "Menos..."
115115
116116#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
117117msgid "Add a review"
po/he.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/hi.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/hr.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/hu.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/hy.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/id.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/is.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/it.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ja.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/km.po+5−5
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-02-12 07:06+0000\n"
11+"PO-Revision-Date: 2014-03-04 02:32+0000\n"
1212"Last-Translator: Khoem Sokhem <khoemsokhem@khmeros.info>\n"
1313"Language-Team: Khmer <km@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -108,11 +108,11 @@ msgstr[0] "ពិនិត្យ​មើល %1"
108108
109109#: qml/Dash/Previews/PreviewActionCombo.qml:34
110110msgid "More..."
111−msgstr ""
111+msgstr "ច្រើនជាង​..."
112112
113113#: qml/Dash/Previews/PreviewActionCombo.qml:34
114114msgid "Less..."
115−msgstr ""
115+msgstr "តិច​ជាង..."
116116
117117#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
118118msgid "Add a review"
po/kn.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ko.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ky.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/lo.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/lt.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"(n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/lv.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ml.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/mr.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ms.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/my.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/nb.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/nl.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/pl.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
1818"|| n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/pt.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/pt_BR.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ro.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=(n == 1 ? 0: (((n % 100 > 19) || ((n % 100 "
1818"== 0) && (n != 0))) ? 2: 1));\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ru.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/shn.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=(n == 1) ? 0 : 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/si.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/sl.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
1818"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2014-02-22 07:40+0000\n"
20−"X-Generator: Launchpad (build 16926)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/sq.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/sr.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/sv.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/sw.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/ta.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020"Language: ta\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
po/te.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/tr.po+15−13
@@ -8,15 +8,15 @@ msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
1010"POT-Creation-Date: 2014-02-13 18:37+0000\n"
11−"PO-Revision-Date: 2014-01-14 19:05+0000\n"
12−"Last-Translator: Osman Coşkun <Unknown>\n"
11+"PO-Revision-Date: 2014-03-05 08:54+0000\n"
12+"Last-Translator: Muhammed Yüce <muhammedyuceee@gmail.com>\n"
1313"Language-Team: Turkish <tr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -29,7 +29,7 @@ msgstr "Başlatıcıdan Ayır"
2929
3030#: qml/Components/EdgeDemoOverlay.qml:151
3131msgid "Skip intro"
32−msgstr "İntro'yu geç"
32+msgstr "Tanıtımı geç"
3333
3434#: qml/Components/EdgeDemo.qml:113
3535msgid "Right edge"
@@ -37,7 +37,7 @@ msgstr "Sağ kenar"
3737
3838#: qml/Components/EdgeDemo.qml:114
3939msgid "Try swiping from the right edge to unlock the phone"
40−msgstr "Kilidi açmak için sağ kenara sürüklemeyi deneyin"
40+msgstr "Kilidi açmak için sağ kenardan sürüklemeyi deneyin"
4141
4242#: qml/Components/EdgeDemo.qml:145
4343msgid "Top edge"
@@ -45,7 +45,7 @@ msgstr "Üst kenar"
4545
4646#: qml/Components/EdgeDemo.qml:146
4747msgid "Try swiping from the top edge to access the indicators"
48−msgstr "Bildiricilere erişmek için üst kenarı sürüklemeyi deneyin"
48+msgstr "Bildiricilere erişmek için üst kenarı sürükleyin"
4949
5050#: qml/Components/EdgeDemo.qml:171
5151msgid "Close"
@@ -73,18 +73,20 @@ msgid ""
7373"You have now mastered the edge gestures and can start using the "
7474"phone<br><br>Tap on the screen to start"
7575msgstr ""
76+"Kenar haraketlerini öğrendiniz ve telefonu kullanmaya "
77+"başlayabilirsiniz<br><br>Başlamak için ekrana dokunun"
7678
7779#: qml/Components/PageHeader.qml:340
7880msgid "Recent searches"
79−msgstr "Son Arananlar"
81+msgstr "Son aramalar"
8082
8183#: qml/Components/SeeMore.qml:35
8284msgid "See more"
83−msgstr ""
85+msgstr "Daha fazlası"
8486
8587#: qml/Components/SeeMore.qml:57
8688msgid "See less"
87−msgstr ""
89+msgstr "Daha azını gör"
8890
8991#: qml/Dash/Apps/AppPreview.qml:136 qml/Dash/Previews/PreviewRating.qml:70
9092msgid "Rate this"
@@ -106,11 +108,11 @@ msgstr[1] "%1 inceleme"
106108
107109#: qml/Dash/Previews/PreviewActionCombo.qml:34
108110msgid "More..."
109−msgstr ""
111+msgstr "Daha fazlası..."
110112
111113#: qml/Dash/Previews/PreviewActionCombo.qml:34
112114msgid "Less..."
113−msgstr ""
115+msgstr "Daha az.."
114116
115117#: qml/Dash/Previews/PreviewRating.qml:114 qml/Dash/Previews/Reviews.qml:74
116118msgid "Add a review"
@@ -167,7 +169,7 @@ msgstr "Parolayı göster"
167169
168170#: qml/Notifications/NotificationMenuItemFactory.qml:103
169171msgid "Please enter SIM PIN"
170−msgstr ""
172+msgstr "Lütfen SIM PIN'inizi girin"
171173
172174#: qml/Panel/SearchIndicator.qml:27
173175msgid "Search"
po/ug.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/uk.po+2−2
@@ -16,8 +16,8 @@ msgstr ""
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
1818"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
19−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
20−"X-Generator: Launchpad (build 16916)\n"
19+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
20+"X-Generator: Launchpad (build 16963)\n"
2121
2222#: plugins/Unity/Launcher/launcheritem.cpp:43
2323#: plugins/Unity/Launcher/launcheritem.cpp:73
po/vi.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/xh.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/zh_CN.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/zh_HK.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
po/zh_TW.po+2−2
@@ -15,8 +15,8 @@ msgstr ""
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
1717"Plural-Forms: nplurals=1; plural=0;\n"
18−"X-Launchpad-Export-Date: 2014-02-19 05:44+0000\n"
19−"X-Generator: Launchpad (build 16916)\n"
18+"X-Launchpad-Export-Date: 2014-03-15 07:34+0000\n"
19+"X-Generator: Launchpad (build 16963)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
qml/Components/Stage.qml+4−6
@@ -324,13 +324,11 @@ Showable {
324324
325325 ScriptAction {
326326 script: {
327− if (!stage.focusedApplicationWhenUsingScreenshots) {
328− // FIXME: only here to support case where application does
329− // not exist yet but is about to
330− return;
327+ // FIXME: only here to support case where application does
328+ // not exist yet but is about to
329+ if (stage.focusedApplicationWhenUsingScreenshots) {
330+ stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
331331 }
332−
333− stage.__focusApplication(stage.focusedApplicationWhenUsingScreenshots);
334332 }
335333 }
336334 }
qml/Dash/Apps/FrequentlyUsedAppsModel.qml+6−6
@@ -48,24 +48,24 @@ ListModel {
4848 metadata: "subscope:applications.scope/applications-non-click.scope"
4949 }
5050 ListElement {
51− uri: "application://camera-app.desktop"
51+ uri: "appid://com.ubuntu.camera/camera/current-user-version"
5252 icon: "../../graphics/applicationIcons/camera.png"
5353 category: 0
5454 mimetype: "application/x-desktop"
5555 title: "Camera"
5656 comment: ""
57− dndUri: "file:///usr/share/applications/camera-app.desktop"
58− metadata: "subscope:applications.scope/applications-non-click.scope"
57+ dndUri: "appid://com.ubuntu.camera/camera/current-user-version"
58+ metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.camera"
5959 }
6060 ListElement {
61− uri: "application://gallery-app.desktop"
61+ uri: "appid://com.ubuntu.gallery/gallery/current-user-version"
6262 icon: "../../graphics/applicationIcons/gallery.png"
6363 category: 0
6464 mimetype: "application/x-desktop"
6565 title: "Gallery"
6666 comment: ""
67− dndUri: "file:///usr/share/applications/gallery.desktop"
68− metadata: "subscope:applications.scope/applications-non-click.scope"
67+ dndUri: "appid://com.ubuntu.gallery/gallery/current-user-version"
68+ metadata: "subscope:applications.scope/applications-click.scope?app_id=com.ubuntu.gallery"
6969 }
7070 ListElement {
7171 uri: "appid://com.ubuntu.developer.webapps.webapp-facebook/webapp-facebook/current-user-version"
qml/Dash/Card.qml+9
@@ -44,6 +44,8 @@ Item {
4444 anchors.fill: parent
4545 image: backgroundImage.source ? backgroundImage : null
4646
47+ property real luminance: 0.2126 * color.r + 0.7152 * color.g + 0.0722 * color.b
48+
4749 property Image backgroundImage: Image {
4850 objectName: "backgroundImage"
4951 source: {
@@ -160,7 +162,12 @@ Item {
160162 title: cardData && cardData["title"] || ""
161163 subtitle: cardData && cardData["subtitle"] || ""
162164
165+ titleWeight: components && components["subtitle"] ? Font.DemiBold : Font.Normal
166+
163167 opacity: showHeader ? 1 : 0
168+ inOverlay: template["overlay"] === true
169+ fontColor: inOverlay ? "white" : summary.color
170+ useMascotShape: !background.visible && !inOverlay
164171
165172 Behavior on opacity { NumberAnimation { duration: UbuntuAnimation.SnapDuration } }
166173 }
@@ -181,5 +188,7 @@ Item {
181188 text: cardData && cardData["summary"] || ""
182189 height: text ? implicitHeight : 0
183190 fontSize: "small"
191+ // TODO karni: Change "grey" to Ubuntu.Components.Palette color once updated.
192+ color: background.visible && background.luminance < 0.7 ? "white" : "grey"
184193 }
185194}
qml/Dash/CardHeader.qml+33−59
@@ -22,16 +22,20 @@ Item {
2222 property alias mascot: mascotImage.source
2323 property alias title: titleLabel.text
2424 property alias subtitle: subtitleLabel.text
25− property alias price: priceLabel.text
26− property alias oldPrice: oldPriceLabel.text
27− property alias altPrice: altPriceLabel.text
25+
26+ property alias titleWeight: titleLabel.font.weight
27+ property alias titleSize: titleLabel.fontSize
2828
2929 // FIXME: Saviq, used to scale fonts down in Carousel
3030 property real fontScale: 1.0
3131
3232 property alias headerAlignment: titleLabel.horizontalAlignment
3333
34− visible: mascotImage.status === Image.Ready || title || price
34+ property bool inOverlay: false
35+ property bool useMascotShape: true
36+ property color fontColor: Theme.palette.selected.backgroundText
37+
38+ visible: mascotImage.status === Image.Ready || title
3539 height: row.height > 0 ? row.height + row.margins * 2 : 0
3640
3741 Row {
@@ -40,13 +44,13 @@ Item {
4044
4145 property real margins: units.gu(1)
4246
47+ spacing: mascotShape.visible || mascotImage.visible || inOverlay ? margins : 0
4348 anchors {
4449 top: parent.top; left: parent.left; right: parent.right
4550 margins: margins
4651 leftMargin: spacing
4752 rightMargin: spacing
4853 }
49− spacing: mascotShape.visible || (template && template["overlay"]) ? margins : 0
5054
5155 UbuntuShape {
5256 id: mascotShape
@@ -55,35 +59,45 @@ Item {
5559 // TODO karni: Icon aspect-ratio is 8:7.5. Revisit these values to avoid fraction of pixels.
5660 width: units.gu(6)
5761 height: units.gu(5.625)
58− visible: image.status === Image.Ready
62+ anchors.verticalCenter: parent.verticalCenter
63+ visible: useMascotShape && image && image.status === Image.Ready
5964 readonly property int maxSize: Math.max(width, height)
6065
61− image: Image {
62− id: mascotImage
66+ image: useMascotShape ? mascotImage : null
67+ }
6368
64− sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
65− fillMode: Image.PreserveAspectCrop
66− horizontalAlignment: Image.AlignHCenter
67− verticalAlignment: Image.AlignVCenter
68− }
69+ Image {
70+ id: mascotImage
71+ objectName: "mascotImage"
72+
73+ width: source ? mascotShape.width : 0
74+ height: mascotShape.height
75+ anchors.verticalCenter: parent.verticalCenter
76+ visible: !useMascotShape && status === Image.Ready
77+
78+ sourceSize { width: mascotShape.maxSize; height: mascotShape.maxSize }
79+ fillMode: Image.PreserveAspectCrop
80+ horizontalAlignment: Image.AlignHCenter
81+ verticalAlignment: Image.AlignVCenter
6982 }
7083
7184 Column {
7285 objectName: "column"
7386 width: parent.width - x
74− spacing: units.gu(0.5)
87+ spacing: units.gu(0.25)
88+ anchors.verticalCenter: parent.verticalCenter
7589
7690 Label {
7791 id: titleLabel
7892 objectName: "titleLabel"
7993 anchors { left: parent.left; right: parent.right }
8094 elide: Text.ElideRight
81− font.weight: Font.DemiBold
95+ font.weight: Font.Normal
96+ fontSize: "small"
8297 wrapMode: Text.Wrap
8398 maximumLineCount: 2
84− fontSize: "small"
8599 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
86− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
100+ color: fontColor
87101 }
88102
89103 Label {
@@ -91,51 +105,11 @@ Item {
91105 objectName: "subtitleLabel"
92106 anchors { left: parent.left; right: parent.right }
93107 elide: Text.ElideRight
108+ fontSize: "small"
94109 font.weight: Font.Light
95110 visible: titleLabel.text && text
96− fontSize: "x-small"
97111 font.pixelSize: Math.round(FontUtils.sizeToPixels(fontSize) * fontScale)
98− color: template["overlay"] === true ? "white" : Theme.palette.selected.backgroundText
99− }
100−
101− Row {
102− id: prices
103− objectName: "prices"
104− anchors { left: parent.left; right: parent.right }
105−
106− property int labels: {
107− var labels = 1; // price always visible
108− if (oldPriceLabel.text !== "") labels += 1;
109− if (altPriceLabel.text !== "") labels += 1;
110− return labels;
111− }
112− property real labelWidth: width / labels
113−
114− Label {
115− id: priceLabel
116− width: parent.labelWidth
117− elide: Text.ElideRight
118− font.weight: Font.DemiBold
119− color: Theme.palette.selected.foreground
120− visible: text
121− }
122−
123− Label {
124− id: oldPriceLabel
125− objectName: "oldPriceLabel"
126− width: parent.labelWidth
127− elide: Text.ElideRight
128− horizontalAlignment: parent.labels === 3 ? Text.AlignHCenter : Text.AlignRight
129− visible: text
130− }
131−
132− Label {
133− id: altPriceLabel
134− width: parent.labelWidth
135− elide: Text.ElideRight
136− horizontalAlignment: Text.AlignRight
137− visible: text
138− }
112+ color: fontColor
139113 }
140114 }
141115 }
qml/Dash/CardTool.qml+46−8
@@ -28,6 +28,22 @@ import QtQuick 2.0
2828
2929Item {
3030 id: cardTool
31+
32+ /*!
33+ \brief Number of cards.
34+ */
35+ property int count
36+
37+ /*!
38+ \brief Width of the category view.
39+ */
40+ property real viewWidth
41+
42+ /*!
43+ \brief Scaling factor of selected Carousel item.
44+ */
45+ readonly property real carouselSelectedItemScaleFactor: 1.38 // XXX assuming 1.38 carousel scaling factor for cards
46+
3147 /*!
3248 \brief Template supplied for the category.
3349 */
@@ -39,9 +55,15 @@ Item {
3955 property var components
4056
4157 /*!
42− \brief Width of the view, based on which carousel width is calculated.
58+ \brief The category layout for this card tool.
4359 */
44− property var viewWidth
60+ property string categoryLayout: {
61+ var layout = template["category-layout"];
62+
63+ // carousel fallback mode to grid
64+ if (layout === "carousel" && count <= Math.ceil(carouselTool.realPathItemCount)) layout = "grid";
65+ return layout;
66+ }
4567
4668 // FIXME: Saviq
4769 // Only way for the card below to actually be laid out completely.
@@ -56,7 +78,7 @@ Item {
5678 If undefined, should use implicit width of the actual card.
5779 */
5880 readonly property var cardWidth: {
59− switch (template !== undefined && template["category-layout"]) {
81+ switch (categoryLayout) {
6082 case "grid":
6183 case "vertical-journal":
6284 if (template["card-layout"] === "horizontal") return units.gu(38);
@@ -66,10 +88,7 @@ Item {
6688 }
6789 return units.gu(18.5);
6890 case "carousel":
69− if (viewWidth === undefined) return undefined
70− if (viewWidth <= units.gu(40)) return units.gu(18)
71− if (viewWidth >= units.gu(128)) return units.gu(26)
72− return units.gu(18 + Math.round((viewWidth - units.gu(40))/ units.gu(11)))
91+ return carouselTool.minimumTileWidth;
7392 case undefined:
7493 case "organic-grid":
7594 case "journal":
@@ -84,7 +103,7 @@ Item {
84103 If undefined, should use implicit height of the actual card.
85104 */
86105 readonly property var cardHeight: {
87− switch (template !== undefined && template["category-layout"]) {
106+ switch (categoryLayout) {
88107 case "journal":
89108 if (template["card-size"] >= 12 && template["card-size"] <= 38) return units.gu(template["card-size"]);
90109 return units.gu(18.5);
@@ -123,6 +142,25 @@ Item {
123142 return (template["card-layout"] === "horizontal") ? Text.AlignLeft : Text.AlignHCenter;
124143 }
125144
145+ QtObject {
146+ id: carouselTool
147+
148+ property real minimumTileWidth: {
149+ if (cardTool.viewWidth === undefined) return undefined;
150+ if (cardTool.viewWidth <= units.gu(40)) return units.gu(18);
151+ if (cardTool.viewWidth >= units.gu(128)) return units.gu(26);
152+ return units.gu(18 + Math.round((cardTool.viewWidth - units.gu(40)) / units.gu(11)));
153+ }
154+
155+ readonly property real pathItemCount: 4.8457 /// (848 / 175) reference values
156+
157+ property real realPathItemCount: {
158+ var scaledMinimumTileWidth = minimumTileWidth / cardTool.carouselSelectedItemScaleFactor;
159+ var tileWidth = Math.max(cardTool.viewWidth / pathItemCount, scaledMinimumTileWidth);
160+ return Math.min(cardTool.viewWidth / tileWidth, pathItemCount);
161+ }
162+ }
163+
126164 Card {
127165 id: card
128166 objectName: "card"
qml/Dash/Dash.qml+1−1
@@ -27,8 +27,8 @@ Showable {
2727 visible: shown
2828
2929 property ListModel searchHistory: SearchHistoryModel {}
30+ property bool searchable: !dashContent.previewOpen
3031
31− property alias contentProgress: dashContent.contentProgress
3232 property string showScopeOnLoaded: "home.scope"
3333 property real contentScale: 1.0
3434
qml/Dash/DashContent.qml+1−8
@@ -24,16 +24,14 @@ Item {
2424
2525 property var model: null
2626 property var scopes: null
27− property real contentProgress: Math.max(0, Math.min(dashContentList.contentX / (dashContentList.contentWidth - dashContentList.width), units.dp(1)))
2827 property alias currentIndex: dashContentList.currentIndex
28+ property alias previewOpen: previewListView.open
2929
3030 property ScopeDelegateMapper scopeMapper : ScopeDelegateMapper {}
3131 property ListModel searchHistory
3232
3333 signal movementStarted()
3434 signal movementEnded()
35− signal contentFlickStarted()
36− signal contentEndReached()
3735 signal scopeLoaded(string scopeId)
3836 signal positionedAtBeginning()
3937
@@ -144,11 +142,6 @@ Item {
144142 dashContent.positionedAtBeginning.connect(item.positionedAtBeginning)
145143 dashContent.scopeLoaded(item.scope.id)
146144 }
147− Connections {
148− target: item
149− ignoreUnknownSignals: true
150− onEndReached: contentEndReached()
151− }
152145
153146 Component.onDestruction: active = false
154147 }
qml/Dash/GenericScopeView.qml+1−5
@@ -33,7 +33,6 @@ FocusScope {
3333 property OpenEffect openEffect: null
3434 property Item previewListView: null
3535
36− signal endReached
3736 signal movementStarted
3837 signal positionedAtBeginning
3938
@@ -118,9 +117,6 @@ FocusScope {
118117 model: scopeView.categories
119118 forceNoClip: previewListView.onScreen
120119
121− onAtYEndChanged: if (atYEnd) endReached()
122− onMovingChanged: if (moving && atYEnd) endReached()
123−
124120 property string expandedCategoryId: ""
125121 signal correctExpandedCategory();
126122
@@ -287,7 +283,7 @@ FocusScope {
287283
288284 sectionProperty: "name"
289285 sectionDelegate: ListItems.Header {
290− objectName: "dashSectionHeader" + delegate.category
286+ objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
291287 property var delegate: categoryView.item(delegateIndex)
292288 width: categoryView.width
293289 text: section
qml/Dash/Previews/PreviewActions.qml+1−1
@@ -24,7 +24,7 @@ import QtQuick 2.1
2424PreviewWidget {
2525 id: root
2626
27− height: row.height
27+ height: row.height + units.gu(1)
2828
2929 Row {
3030 id: row
qml/Dash/Previews/PreviewHeader.qml+3−1
@@ -34,5 +34,7 @@ PreviewWidget {
3434 title: root.widgetData["title"] || ""
3535 subtitle: root.widgetData["subtitle"] || ""
3636 width: parent.width
37+
38+ titleSize: "large"
3739 }
38−}
40+}
qml/Dash/Previews/PreviewImageGallery.qml+9
@@ -33,6 +33,15 @@ PreviewWidget {
3333 cacheBuffer: width * 3
3434 model: root.widgetData["sources"]
3535
36+ // FIXME: Because of ListViews inside ListViews inside Flickables inside ListViews (and some more)
37+ // we finally reached the point where this ListView doesn't correctly get swipe input any more but
38+ // instead the parent ListView is the one that is swiped. This MouseArea sort of creates a blocking
39+ // layer to make sure this ListView can be swiped, regardless of what's behind it.
40+ MouseArea {
41+ anchors.fill: parent
42+ enabled: parent.contentWidth > parent.width
43+ }
44+
3645 LazyImage {
3746 objectName: "placeholderScreenshot"
3847 anchors {
qml/Dash/Previews/PreviewRatingDisplay.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.0
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+/*! \brief Preview widget for rating display.
22+
23+ The widget can show a rating widget and a field showing a comment.
24+ The icons used in the rating widget can be customised with
25+ widgetData["rating-icon-empty"], widgetData["rating-icon-full"]
26+ and widgetData["rating-icon-half"].
27+
28+ This widget shows reviews contained in widgetData["reviews"], each of which should be of the form:
29+
30+ \code{.json}
31+ {
32+ "rating": null,
33+ "review": null,
34+ "author": null
35+ }
36+ \endcode
37+ */
38+
39+PreviewWidget {
40+ id: root
41+ height: childrenRect.height
42+
43+ Column {
44+ anchors { left: parent.left; right: parent.right; }
45+ visible: reviewsRepeater.count > 0
46+
47+ Repeater {
48+ id: reviewsRepeater
49+ objectName: "reviewsRepeater"
50+ model: root.widgetData["reviews"]
51+
52+ delegate: Column {
53+ id: reviewItem
54+ objectName: "reviewItem" + index
55+ anchors { left: parent.left; right: parent.right;}
56+ spacing: units.gu(1)
57+
58+ Rating {
59+ id: rating
60+ objectName: "rating"
61+ size: 5
62+ value: modelData["rating"] || -1
63+ visible: value >= 0
64+
65+ property var urlIconEmpty: widgetData["rating-icon-empty"]
66+ property var urlIconFull: widgetData["rating-icon-full"]
67+ property var urlIconHalf: widgetData["rating-icon-half"]
68+ }
69+
70+ Label {
71+ id: authorLabel
72+ objectName: "authorLabel"
73+ anchors { left: parent.left; right: parent.right }
74+ color: Theme.palette.selected.backgroundText
75+ opacity: .8
76+ text: modelData["author"] || ""
77+ visible: text !== ""
78+ wrapMode: Text.Wrap
79+ }
80+
81+ Label {
82+ id: reviewLabel
83+ objectName: "reviewLabel"
84+ anchors { left: parent.left; right: parent.right }
85+ color: Theme.palette.selected.backgroundText
86+ opacity: .8
87+ text: modelData["review"] || ""
88+ visible: text !== ""
89+ wrapMode: Text.Wrap
90+ }
91+
92+ Item {
93+ id: spacing
94+ anchors { left: parent.left; right: parent.right }
95+ height: units.gu(2)
96+ visible: rating.visible || authorLabel.visible || reviewLabel.visible
97+ }
98+ }
99+ }
100+ }
101+}
qml/Dash/Previews/PreviewRating.qml → qml/Dash/Previews/PreviewRatingInput.qmlrenamed

The content is the same.

qml/Dash/Previews/PreviewTextSummary.qml+2−1
@@ -58,7 +58,8 @@ PreviewWidget {
5858 }
5959 height: (!seeMore.visible || seeMore.more) ? contentHeight : contentHeight / lineCount * (maximumCollapsedLineCount - 2)
6060 clip: true
61− fontSize: "medium"
61+ fontSize: "small"
62+ lineHeight: 1.2
6263 color: Theme.palette.selected.backgroundText
6364 opacity: .8
6465 text: widgetData["text"]
qml/Dash/Previews/PreviewWidgetFactory.qml+2−1
@@ -48,7 +48,8 @@ Loader {
4848 case "header": return "PreviewHeader.qml";
4949 case "image": return "PreviewZoomableImage.qml"
5050 case "progress": return "PreviewProgress.qml";
51− case "rating-input": return "PreviewRating.qml";
51+ case "rating-input": return "PreviewRatingInput.qml";
52+ case "reviews": return "PreviewRatingDisplay.qml";
5253 case "text": return "PreviewTextSummary.qml";
5354 case "video": return "PreviewVideoPlayback.qml";
5455 default: return "";
qml/Greeter/Greeter.qml+4
@@ -67,6 +67,10 @@ Showable {
6767
6868 source: required ? "GreeterContent.qml" : ""
6969
70+ onLoaded: {
71+ selected(currentIndex);
72+ }
73+
7074 Connections {
7175 target: greeterContentLoader.item
7276
qml/Greeter/GreeterContent.qml−1
@@ -96,7 +96,6 @@ MouseArea {
9696
9797 onLoaded: {
9898 item.currentIndex = greeterContentLoader.currentIndex;
99− selected(item.currentIndex);
10099 item.resetAuthentication();
101100 }
102101
qml/Panel/IndicatorItem.qml+13−21
@@ -19,37 +19,29 @@ import Ubuntu.Components 0.1
1919import Unity.Indicators 0.1 as Indicators
2020import "../Components"
2121
22−Item {
23− id: indicatorItem
22+Loader {
23+ id: root
2424
25− property alias widgetSource: loader.source
25+ property alias widgetSource: root.source
2626 property bool dimmed: false
2727 property var indicatorProperties: undefined
28− property bool indicatorVisible: loader.item ? loader.item.enabled : false
28+ property bool indicatorVisible: item ? item.enabled : false
2929 property string identifier
3030
3131 opacity: dimmed ? 0.4 : 1
3232 Behavior on opacity { UbuntuNumberAnimation { duration: UbuntuAnimation.BriskDuration } }
3333
34− width: loader.item ? loader.item.width : 0
35−
36− Loader {
37− id: loader
38−
39− onLoaded: {
40− item.height = Qt.binding(function() { return indicatorItem.height; });
41−
42− for(var pName in indicatorProperties) {
43− if (item.hasOwnProperty(pName)) {
44− item[pName] = indicatorProperties[pName];
45− }
34+ onLoaded: {
35+ for(var pName in indicatorProperties) {
36+ if (item.hasOwnProperty(pName)) {
37+ item[pName] = indicatorProperties[pName];
4638 }
4739 }
40+ }
4841
49− Binding {
50− target: loader.item
51− property: "objectName"
52− value: identifier + "-widget"
53− }
42+ Binding {
43+ target: item
44+ property: "objectName"
45+ value: identifier + "-widget"
5446 }
5547}
qml/Panel/Indicators.qml+1−1
@@ -32,7 +32,7 @@ Showable {
3232 property alias overFlowWidth: indicatorRow.overFlowWidth
3333 property alias showAll: indicatorRow.showAll
3434 // TODO: This should be sourced by device type (eg "desktop", "tablet", "phone"...)
35− property string profile: "phone"
35+ property string profile: indicatorProfile
3636
3737 readonly property real hintValue: panelHeight + menuContent.headerHeight
3838 readonly property int lockThreshold: openedHeight / 2
qml/Shell.qml+4−52
@@ -28,9 +28,7 @@ import "Dash"
2828import "Greeter"
2929import "Launcher"
3030import "Panel"
31−import "Hud"
3231import "Components"
33−import "Bottombar"
3432import "SideStage"
3533import "Notifications"
3634import Unity.Notifications 1.0 as NotificationBackend
@@ -405,7 +403,7 @@ FocusScope {
405403
406404 readonly property int backgroundTopMargin: -panel.panelHeight
407405
408− hides: [launcher, panel.indicators, hud]
406+ hides: [launcher, panel.indicators]
409407 shown: false
410408 enabled: true
411409 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
@@ -423,7 +421,6 @@ FocusScope {
423421 Component.onCompleted: {
424422 if (LightDM.Users.count == 1) {
425423 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
426− greeter.selected(0)
427424 }
428425 }
429426 }
@@ -461,7 +458,7 @@ FocusScope {
461458 objectName: "greeter"
462459
463460 available: true
464− hides: [launcher, panel.indicators, hud]
461+ hides: [launcher, panel.indicators]
465462 shown: true
466463
467464 defaultBackground: shell.background
@@ -499,7 +496,6 @@ FocusScope {
499496 // If there are more users, the Greeter will handle that
500497 if (LightDM.Users.count == 1) {
501498 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
502− greeter.selected(0);
503499 }
504500 greeter.forceActiveFocus();
505501 removeApplicationFocus();
@@ -550,7 +546,7 @@ FocusScope {
550546 InputFilterArea {
551547 anchors.fill: parent
552548 blockInput: !applicationFocused || greeter.shown || lockscreen.shown || launcher.shown
553− || panel.indicators.shown || hud.shown
549+ || panel.indicators.shown
554550 }
555551
556552 Connections {
@@ -599,7 +595,7 @@ FocusScope {
599595 contentEnabled: edgeDemo.panelContentEnabled
600596 }
601597 fullscreenMode: shell.fullscreenMode
602− searchVisible: !greeter.shown && !lockscreen.shown && dash.shown
598+ searchVisible: !greeter.shown && !lockscreen.shown && dash.shown && dash.searchable
603599
604600 InputFilterArea {
605601 anchors {
@@ -612,48 +608,6 @@ FocusScope {
612608 }
613609 }
614610
615− Hud {
616− id: hud
617−
618− width: parent.width > units.gu(60) ? units.gu(40) : parent.width
619− height: parent.height
620−
621− available: !greeter.shown && !panel.indicators.shown && !lockscreen.shown && edgeDemo.dashEnabled
622− shown: false
623− showAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: 0; easing.type: Easing.Linear }
624− hideAnimation: StandardAnimation { property: "y"; duration: hud.showableAnimationDuration; to: hudRevealer.closedValue; easing.type: Easing.Linear }
625−
626− Connections {
627− target: shell.applicationManager
628− onMainStageFocusedApplicationChanged: hud.hide()
629− onSideStageFocusedApplicationChanged: hud.hide()
630− }
631− }
632−
633− Revealer {
634− id: hudRevealer
635−
636− enabled: hud.shown
637− width: hud.width
638− anchors.left: hud.left
639− height: parent.height
640− target: hud.revealerTarget
641− closedValue: height
642− openedValue: 0
643− direction: Qt.RightToLeft
644− orientation: Qt.Vertical
645− handleSize: hud.handleHeight
646− onCloseClicked: target.hide()
647− }
648−
649− Bottombar {
650− id: bottombar
651− theHud: hud
652− anchors.fill: parent
653− enabled: hud.available
654− applicationIsOnForeground: applicationFocused
655− }
656−
657611 InputFilterArea {
658612 blockInput: launcher.shown
659613 anchors {
@@ -695,8 +649,6 @@ FocusScope {
695649 onShownChanged: {
696650 if (shown) {
697651 panel.indicators.hide()
698− hud.hide()
699− bottombar.hide()
700652 }
701653 }
702654 }
src/main.cpp+6
@@ -59,6 +59,11 @@ int startShell(int argc, const char** argv, void* server)
5959 application = new QGuiApplication(argc, (char**)argv);
6060 }
6161
62+ QString indicatorProfile = qgetenv("UNITY_INDICATOR_PROFILE");
63+ if (indicatorProfile.isEmpty()) {
64+ indicatorProfile = "phone";
65+ }
66+
6267 resolveIconTheme();
6368
6469 QStringList args = application->arguments();
@@ -88,6 +93,7 @@ int startShell(int argc, const char** argv, void* server)
8893 view->setTitle("Qml Phone Shell");
8994 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
9095 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
96+ view->rootContext()->setContextProperty("indicatorProfile", indicatorProfile);
9197 if (args.contains(QLatin1String("-frameless"))) {
9298 view->setFlags(Qt::FramelessWindowHint);
9399 }
tests/autopilot/unity8/__init__.py+5−2
@@ -82,7 +82,10 @@ def get_binary_path(binary="unity8"):
8282 )
8383 if not os.path.exists(binary_path):
8484 try:
85− binary_path = subprocess.check_output(['which', binary]).strip()
85+ binary_path = subprocess.check_output(
86+ ['which', binary],
87+ universal_newlines=True,
88+ ).strip()
8689 except subprocess.CalledProcessError as e:
8790 raise RuntimeError("Unable to locate %s binary: %r" % (binary, e))
8891 return binary_path
@@ -128,7 +131,7 @@ def _get_xdg_upstart_env():
128131 "get-env",
129132 "--global",
130133 "XDG_DATA_DIRS"
131− ]).rstrip()
134+ ], universal_newlines=True).rstrip()
132135 except subprocess.CalledProcessError:
133136 return None
134137
tests/autopilot/unity8/application_lifecycle/tests/test_url_dispatcher.py+5−40
@@ -20,12 +20,11 @@
2020"""Test the integration with the URL dispatcher service."""
2121
2222import os
23−import tempfile
2423
2524from autopilot import platform
2625from autopilot.matchers import Eventually
2726from testtools.matchers import Equals
28−from ubuntuuitoolkit import base as toolkit_base
27+from ubuntuuitoolkit import fixture_setup
2928
3029from unity8 import process_helpers
3130from unity8.shell import tests
@@ -47,13 +46,6 @@ MainView {
4746 text: 'Test application.'
4847 }
4948}
50−""")
51−
52− desktop_file_contents = ("""[Desktop Entry]
53−Type=Application
54−Name=test
55−Exec={qmlscene} {qml_file_path}
56−Icon=Not important
5749""")
5850
5951 def setUp(self):
@@ -66,37 +58,10 @@ Icon=Not important
6658 process_helpers.unlock_unity(unity_proxy)
6759
6860 def create_test_application(self):
69− # FIXME most of this code is duplicated in the toolkit. We should
70− # create a fixture on the toolkit for other projects to use.
71− # http://pad.lv/1277334 --elopio - 2014-02-06
72− qml_file_path = self._write_test_qml_file()
73− self.addCleanup(os.remove, qml_file_path)
74− desktop_file_path = self._write_test_desktop_file(qml_file_path)
75− self.addCleanup(os.remove, desktop_file_path)
76− return qml_file_path, desktop_file_path
77−
78− def _write_test_qml_file(self):
79− qml_file = tempfile.NamedTemporaryFile(suffix='.qml', delete=False)
80− qml_file.write(self.test_qml.encode('utf-8'))
81− qml_file.close()
82− return qml_file.name
83−
84− def _write_test_desktop_file(self, qml_file_path):
85− desktop_file_dir = self._get_local_desktop_file_directory()
86− if not os.path.exists(desktop_file_dir):
87− os.makedirs(desktop_file_dir)
88− desktop_file = tempfile.NamedTemporaryFile(
89− suffix='.desktop', dir=desktop_file_dir, delete=False)
90− contents = self.desktop_file_contents.format(
91− qmlscene=toolkit_base.get_qmlscene_launch_command(),
92− qml_file_path=qml_file_path)
93− desktop_file.write(contents.encode('utf-8'))
94− desktop_file.close()
95− return desktop_file.name
96−
97− def _get_local_desktop_file_directory(self):
98− return os.path.join(
99− os.environ.get('HOME'), '.local', 'share', 'applications')
61+ fake_application = fixture_setup.FakeApplication(self.test_qml)
62+ self.useFixture(fake_application)
63+ return (
64+ fake_application.qml_file_path, fake_application.desktop_file_path)
10065
10166 def test_swipe_out_application_started_by_url_dispatcher(self):
10267 _, desktop_file_path = self.create_test_application()
tests/autopilot/unity8/process_helpers.py+1−1
@@ -156,7 +156,7 @@ def _get_unity_status():
156156 '/sbin/initctl',
157157 'status',
158158 'unity8'
159− ])
159+ ], universal_newlines=True)
160160 except subprocess.CalledProcessError as e:
161161 raise CannotAccessUnity("Unable to get unity's status: %s" % str(e))
162162
tests/autopilot/unity8/shell/emulators/create_interactive_notification.py+2−1
@@ -1,4 +1,5 @@
11#!/usr/bin/env python
2+from __future__ import print_function
23
34# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
45#
@@ -25,7 +26,7 @@ import signal
2526
2627
2728def action_callback(notification, action_id, data):
28− print action_id
29+ print(action_id)
2930
3031
3132def quit_callback(notification):
tests/autopilot/unity8/shell/tests/__init__.py+12−13
@@ -85,12 +85,12 @@ class UnityTestCase(AutopilotTestCase):
8585 @classmethod
8686 def setUpClass(cls):
8787 try:
88− output = subprocess.check_output([
89− "/sbin/initctl",
90− "status",
91− "unity8"
92− ], stderr=subprocess.STDOUT)
93− except subprocess.CalledProcessError, e:
88+ output = subprocess.check_output(
89+ ["/sbin/initctl", "status", "unity8"],
90+ stderr=subprocess.STDOUT,
91+ universal_newlines=True,
92+ )
93+ except subprocess.CalledProcessError as e:
9494 sys.stderr.write(
9595 "Error: `initctl status unity8` failed, most probably the "
9696 "unity8 session could not be found:\n\n"
@@ -218,12 +218,11 @@ class UnityTestCase(AutopilotTestCase):
218218 def _patch_environment(self, key, value):
219219 """Wrapper for patching env for upstart environment."""
220220 try:
221− current_value = subprocess.check_output([
222− "/sbin/initctl",
223− "get-env",
224− "--global",
225− key
226− ], stderr=subprocess.STDOUT).rstrip()
221+ current_value = subprocess.check_output(
222+ ["/sbin/initctl", "get-env", "--global", key],
223+ stderr=subprocess.STDOUT,
224+ universal_newlines=True,
225+ ).rstrip()
227226 except subprocess.CalledProcessError:
228227 current_value = None
229228
@@ -305,7 +304,7 @@ class UnityTestCase(AutopilotTestCase):
305304
306305 binary_arg = "BINARY=%s" % binary_path
307306 extra_args = "ARGS=%s" % " ".join(args)
308− env_args = ["%s=%s" % (k, v) for k, v in self._environment.iteritems()]
307+ env_args = ["%s=%s" % (k, v) for k, v in self._environment.items()]
309308 all_args = [binary_arg, extra_args] + env_args
310309
311310 self.addCleanup(self._cleanup_launching_upstart_unity)
tests/autopilot/unity8/shell/tests/test_hud.py → tests/autopilot/unity8/shell/tests/disabled_test_hud.pyrenamed+2−2
@@ -163,7 +163,7 @@ class TestHud(UnityTestCase, DragMixin):
163163 self.assertThat(hud.shown, Eventually(Equals(False)))
164164
165165 def _launch_test_app_from_app_screen(self):
166− """Launches the camera app using the Dash UI.
166+ """Launches the browser app using the Dash UI.
167167
168168 Because when testing on the desktop running
169169 self.launch_application() will launch the application on the desktop
@@ -171,7 +171,7 @@ class TestHud(UnityTestCase, DragMixin):
171171
172172 """
173173 dash = self.main_window.get_dash()
174− icon = dash.get_application_icon('Camera')
174+ icon = dash.get_application_icon('Browser')
175175 self.touch.tap_object(icon)
176176
177177 # Ensure application is open
tests/autopilot/unity8/shell/tests/test_emulators.py+4−1
@@ -27,7 +27,10 @@ don't break them for those external projects.
2727
2828"""
2929
30−import mock
30+try:
31+ from unittest import mock
32+except ImportError:
33+ import mock
3134
3235from testtools.matchers import Contains, HasLength
3336
tests/autopilot/unity8/shell/tests/test_lock_screen.py+18−3
@@ -26,12 +26,18 @@ from unity8.shell.tests import UnityTestCase, _get_device_emulation_scenarios
2626
2727from autopilot.matchers import Eventually
2828from autopilot.platform import model
29+import sys
2930from testtools import skipUnless
3031from testtools.matchers import Equals
3132import logging
3233
3334logger = logging.getLogger(__name__)
3435
36+# py2 compatible alias for py3
37+if sys.version >= '3':
38+ basestring = str
39+
40+
3541class TestLockscreen(UnityTestCase):
3642
3743 """Tests for the lock screen."""
@@ -125,7 +131,10 @@ class TestLockscreen(UnityTestCase):
125131 """
126132
127133 if not isinstance(code, basestring):
128− raise TypeError("'code' parameter must be a string.")
134+ raise TypeError(
135+ "'code' parameter must be a string, not %r."
136+ % type(passphrase)
137+ )
129138 for num in code:
130139 if not num.isdigit():
131140 raise ValueError(
@@ -142,7 +151,10 @@ class TestLockscreen(UnityTestCase):
142151
143152 """
144153 if not isinstance(passphrase, basestring):
145− raise TypeError("'passphrase' parameter must be a string.")
154+ raise TypeError(
155+ "'passphrase' parameter must be a string, not %r."
156+ % type(passphrase)
157+ )
146158
147159 pinentryField = self.main_window.get_pinentryField()
148160 self.touch.tap_object(pinentryField)
@@ -161,7 +173,10 @@ class TestLockscreen(UnityTestCase):
161173
162174 """
163175 if not isinstance(passphrase, basestring):
164− raise TypeError("'passphrase' parameter must be a string.")
176+ raise TypeError(
177+ "'passphrase' parameter must be a string, not %r."
178+ % type(passphrase)
179+ )
165180
166181 prompt = self.main_window.get_greeter().get_prompt()
167182 self.touch.tap_object(prompt)
tests/autopilot/unity8/shell/tests/test_notifications.py+8−1
@@ -33,9 +33,15 @@ import os
3333import logging
3434import signal
3535import subprocess
36+import sys
3637
3738logger = logging.getLogger(__name__)
3839
40+# from __future__ import range
41+# (python3's range, is same as python2's xrange)
42+if sys.version_info < (3,):
43+ range = xrange
44+
3945
4046class NotificationsBase(UnityTestCase):
4147 """Base class for all notification tests that provides helper methods."""
@@ -261,6 +267,7 @@ class InteractiveNotificationBase(NotificationsBase):
261267 stdout=subprocess.PIPE,
262268 stderr=subprocess.PIPE,
263269 close_fds=True,
270+ universal_newlines=True,
264271 )
265272
266273 self.addCleanup(self._tidy_up_script_process)
@@ -298,7 +305,7 @@ class InteractiveNotificationBase(NotificationsBase):
298305 if self._notify_proc is None:
299306 raise AssertionError("No interactive notification was created.")
300307
301− for i in xrange(timeout):
308+ for i in range(timeout):
302309 self._notify_proc.poll()
303310 if self._notify_proc.returncode is not None:
304311 output = self._notify_proc.communicate()
tests/autopilot/unity8/shell/tests/test_upstart.py+6−1
@@ -36,6 +36,11 @@ import logging
3636
3737logger = logging.getLogger(__name__)
3838
39+# from __future__ import range
40+# (python3's range, is same as python2's xrange)
41+import sys
42+if sys.version_info < (3,):
43+ range = xrange
3944
4045class UpstartIntegrationTests(UnityTestCase):
4146
@@ -52,7 +57,7 @@ class UpstartIntegrationTests(UnityTestCase):
5257 self.process = subprocess.Popen([get_binary_path()] + self.unity_geometry_args)
5358 def ensure_stopped():
5459 self.process.terminate()
55− for i in xrange(10):
60+ for i in range(10):
5661 try:
5762 self._get_status()
5863 except OSError:
tests/mocks/AccountsService/AccountsService.cpp+1−1
@@ -20,7 +20,7 @@
2020
2121AccountsService::AccountsService(QObject* parent)
2222 : QObject(parent),
23− m_backgroundFile(TOP_SRCDIR "/graphics/phone_background.jpg"),
23+ m_backgroundFile(TOP_SRCDIR "/qml/graphics/phone_background.jpg"),
2424 m_statsWelcomeScreen(true)
2525{
2626}
tests/mocks/Unity/Indicators/CMakeLists.txt+1
@@ -16,6 +16,7 @@ set(IndicatorsFakeQml_SOURCES
1616 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/menucontentactivator.cpp
1717 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/unitymenumodelstack.cpp
1818 ${CMAKE_SOURCE_DIR}/plugins/Unity/Indicators/visibleindicatorsmodel.cpp
19+ fakeindicatorsmodel.cpp
1920)
2021
2122set(IndicatorsFakeQml_RESOURCES
tests/mocks/Unity/Indicators/IndicatorsModel.qml+3−5
@@ -17,12 +17,10 @@
1717import QtQuick 2.0
1818import Unity.Indicators 0.1 as Indicators
1919
20−ListModel {
20+Indicators.FakeIndicatorsModel {
2121
22− property var indicatorData : undefined
23−
24− function load() {
25− clear();
22+ function load(profile) {
23+ unload();
2624
2725 append({ "identifier": "indicator-fake1",
2826 "position": 0,
tests/mocks/Unity/Indicators/fakeindicatorsmodel.cppnew file+116
@@ -0,0 +1,116 @@
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:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+#include "fakeindicatorsmodel.h"
21+#include "indicators.h"
22+
23+FakeIndicatorsModel::FakeIndicatorsModel(QObject *parent)
24+ : QAbstractListModel(parent)
25+{
26+ QObject::connect(this, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
27+ QObject::connect(this, SIGNAL(rowsRemoved(const QModelIndex &, int, int)), this, SIGNAL(countChanged()));
28+ QObject::connect(this, SIGNAL(modelReset()), this, SIGNAL(countChanged()));
29+}
30+
31+/*! \internal */
32+FakeIndicatorsModel::~FakeIndicatorsModel()
33+{
34+ unload();
35+}
36+
37+int FakeIndicatorsModel::count() const
38+{
39+ return rowCount();
40+}
41+
42+void FakeIndicatorsModel::load(const QString&)
43+{
44+}
45+
46+void FakeIndicatorsModel::unload()
47+{
48+ beginResetModel();
49+
50+ qDeleteAll(m_indicators);
51+ m_indicators.clear();
52+
53+ endResetModel();
54+}
55+
56+
57+void FakeIndicatorsModel::append(const QVariantMap& row)
58+{
59+ Indicator* new_row = new QHash<int, QVariant>();
60+ for (auto iter = row.begin(); iter != row.end(); ++iter )
61+ {
62+ int key = roleNames().key(iter.key().toUtf8(), -1);
63+ if (key != -1) {
64+ new_row->insert(key, iter.value());
65+ }
66+ }
67+
68+ beginInsertRows(QModelIndex(), m_indicators.count(), m_indicators.count());
69+
70+ m_indicators.append(new_row);
71+
72+ endInsertRows();
73+}
74+
75+QHash<int, QByteArray> FakeIndicatorsModel::roleNames() const
76+{
77+ static QHash<int, QByteArray> roles;
78+ if (roles.isEmpty())
79+ {
80+ roles[IndicatorsModelRole::Identifier] = "identifier";
81+ roles[IndicatorsModelRole::Position] = "position";
82+ roles[IndicatorsModelRole::WidgetSource] = "widgetSource";
83+ roles[IndicatorsModelRole::PageSource] = "pageSource";
84+ roles[IndicatorsModelRole::IndicatorProperties] = "indicatorProperties";
85+ }
86+ return roles;
87+}
88+
89+int FakeIndicatorsModel::columnCount(const QModelIndex &) const
90+{
91+ return 1;
92+}
93+
94+Q_INVOKABLE QVariant FakeIndicatorsModel::data(int row, int role) const
95+{
96+ return data(index(row, 0), role);
97+}
98+
99+QVariant FakeIndicatorsModel::data(const QModelIndex &index, int role) const
100+{
101+ if (!index.isValid() || index.row() >= m_indicators.size())
102+ return QVariant();
103+
104+ Indicator* indicator = m_indicators[index.row()];
105+ return indicator->value(role, QVariant());
106+}
107+
108+QModelIndex FakeIndicatorsModel::parent(const QModelIndex&) const
109+{
110+ return QModelIndex();
111+}
112+
113+int FakeIndicatorsModel::rowCount(const QModelIndex&) const
114+{
115+ return m_indicators.count();
116+}
tests/mocks/Unity/Indicators/fakeindicatorsmodel.hnew file+59
@@ -0,0 +1,59 @@
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:
17+ * Nick Dedekind <nick.dedekind@canonical.com>
18+ */
19+
20+#ifndef FAKE_INDICATORSMODEL_H
21+#define FAKE_INDICATORSMODEL_H
22+
23+#include <QAbstractListModel>
24+
25+class FakeIndicatorsModel : public QAbstractListModel
26+{
27+ Q_OBJECT
28+ Q_ENUMS(Roles)
29+ Q_PROPERTY(int count READ count NOTIFY countChanged)
30+public:
31+
32+ FakeIndicatorsModel(QObject *parent=0);
33+ ~FakeIndicatorsModel();
34+
35+ Q_INVOKABLE void load(const QString& profile);
36+ Q_INVOKABLE void unload();
37+
38+ Q_INVOKABLE void append(const QVariantMap& row);
39+
40+ Q_INVOKABLE QVariant data(int row, int role) const;
41+
42+ /* QAbstractItemModel */
43+ QHash<int, QByteArray> roleNames() const;
44+ int columnCount(const QModelIndex &parent = QModelIndex()) const;
45+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
46+ QModelIndex parent (const QModelIndex &index) const;
47+ int rowCount(const QModelIndex &parent = QModelIndex()) const;
48+
49+Q_SIGNALS:
50+ void countChanged();
51+
52+private:
53+ int count() const;
54+
55+ typedef QHash<int, QVariant> Indicator;
56+ QList<Indicator*> m_indicators;
57+};
58+
59+#endif // FAKE_INDICATORSMODEL_H
tests/mocks/Unity/Indicators/fakeplugin.cpp+6
@@ -23,6 +23,7 @@
2323#include "fakeplugin.h"
2424
2525// local
26+#include "fakeindicatorsmodel.h"
2627#include "indicators.h"
2728#include "menucontentactivator.h"
2829#include "unitymenumodelstack.h"
@@ -32,10 +33,15 @@ void IndicatorsFakePlugin::registerTypes(const char * uri)
3233{
3334 Q_INIT_RESOURCE(indicators_fake);
3435
36+ // internal
37+ qmlRegisterType<FakeIndicatorsModel>(uri, 0, 1, "FakeIndicatorsModel");
38+
39+ // external
3540 qmlRegisterType<MenuContentActivator>(uri, 0, 1, "MenuContentActivator");
3641 qmlRegisterType<UnityMenuModelStack>(uri, 0, 1, "UnityMenuModelStack");
3742 qmlRegisterType<VisibleIndicatorsModel>(uri, 0, 1, "VisibleIndicatorsModel");
3843
44+ // external uncreatables
3945 qmlRegisterUncreatableType<MenuContentState>(uri, 0, 1, "MenuContentState", "Can't create MenuContentState class");
4046 qmlRegisterUncreatableType<ActionState>(uri, 0, 1, "ActionState", "Can't create ActionState class");
4147 qmlRegisterUncreatableType<NetworkActionState>(uri, 0, 1, "NetworkActionState", "Can't create NetworkActionState class");
tests/mocks/data/applications/camera-app.desktop → tests/mocks/data/applications/webbrowser-app.desktoprenamed

The content is the same.

tests/plugins/DashViews/listviewwithpageheadertest.cpp−6
@@ -1281,9 +1281,6 @@ private Q_SLOTS:
12811281
12821282 void testShowHeaderHalfShown()
12831283 {
1284−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1285− QSKIP("This test is extremely unstable in 5.0.x");
1286−#endif
12871284 changeContentY(20);
12881285
12891286 QTRY_COMPARE(lvwph->m_visibleItems.count(), 4);
@@ -1860,9 +1857,6 @@ private Q_SLOTS:
18601857 model->setProperty(4, "size", 10);
18611858 model->setProperty(5, "size", 10);
18621859 model->setProperty(6, "size", 10);
1863−#if (QT_VERSION > QT_VERSION_CHECK(5, 0, 3))
1864− QTRY_COMPARE(lvwph->m_minYExtent, 210.);
1865−#endif
18661860 QTRY_COMPARE(lvwph->m_headerItem->y(), -lvwph->m_minYExtent);
18671861 }
18681862
tests/plugins/DashViews/listviewwithpageheadertestsection.cpp−3
@@ -1486,9 +1486,6 @@ private Q_SLOTS:
14861486
14871487 void testShowHeaderHalfShown()
14881488 {
1489−#if (QT_VERSION < QT_VERSION_CHECK(5, 1, 0))
1490− QSKIP("This test is extremely unstable in 5.0.x");
1491−#endif
14921489 changeContentY(20);
14931490
14941491 QTRY_COMPARE(lvwph->m_visibleItems.count(), 3);
tests/plugins/DashViews/organicgridtest.cpp+2−1
@@ -134,11 +134,12 @@ private Q_SLOTS:
134134 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/organicgridtest.qml"));
135135
136136 view->show();
137− view->resize(470, 400);
138137 QTest::qWaitForWindowExposed(view);
138+ view->resize(470, 400);
139139
140140 grid = dynamic_cast<OrganicGrid*>(view->rootObject()->findChild<QObject*>("grid"));
141141 grid->setModel(model);
142+ QTRY_COMPARE(grid->width(), 470.);
142143
143144 checkInitialPositions();
144145 }
tests/plugins/DashViews/verticaljournaltest.cpp+2−1
@@ -135,11 +135,12 @@ private Q_SLOTS:
135135 view->setSource(QUrl::fromLocalFile(DASHVIEWSTEST_FOLDER "/verticaljournaltest.qml"));
136136
137137 view->show();
138− view->resize(470, 400);
139138 QTest::qWaitForWindowExposed(view);
139+ view->resize(470, 400);
140140
141141 vj = dynamic_cast<VerticalJournal*>(view->rootObject()->findChild<QObject*>("vj"));
142142 vj->setModel(model);
143+ QTRY_COMPARE(vj->width(), 470.);
143144
144145 checkInitialPositions();
145146 }
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+54
@@ -86,6 +86,7 @@ private Q_SLOTS:
8686 void rotated();
8787 void sceneDistance();
8888 void sceneDistance_data();
89+ void disabledWhileDragging();
8990
9091private:
9192 void passTime(qint64 timeSpan);
@@ -102,6 +103,14 @@ void tst_DirectionalDragArea::init()
102103{
103104 GestureTest::init();
104105
106+ // We shouldn't need the three lines below, but a compiz/unity7
107+ // regression means we don't pass the test without them because
108+ // the window doesn't have the proper size. Can be removed in the
109+ // future if the regression is fixed and tests pass again
110+ m_view->resize(m_view->rootObject()->width(), m_view->rootObject()->height());
111+ QTRY_COMPARE(m_view->width(), (int)m_view->rootObject()->width());
112+ QTRY_COMPARE(m_view->height(), (int)m_view->rootObject()->height());
113+
105114 fakeTimeSource.reset(new FakeTimeSource);
106115 fakeTimer = new FakeTimer(fakeTimeSource);
107116}
@@ -795,6 +804,51 @@ void tst_DirectionalDragArea::sceneDistance_data()
795804 QTest::newRow("rotated by 90 degrees") << 90. << QPointF(0., 1.);
796805}
797806
807+/*
808+ Regression test for https://bugs.launchpad.net/unity8/+bug/1276122
809+
810+ The bug:
811+ If setting "enabled: false" while the DirectionalDragArea's (DDA) dragging
812+ property is true, the DDA stays in that state and doesn't recover any more.
813+*/
814+void tst_DirectionalDragArea::disabledWhileDragging()
815+{
816+ DirectionalDragArea *edgeDragArea =
817+ m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
818+ Q_ASSERT(edgeDragArea != 0);
819+ edgeDragArea->setRecognitionTimer(fakeTimer);
820+ edgeDragArea->setTimeSource(fakeTimeSource);
821+
822+ QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
823+
824+ qreal desiredDragDistance = edgeDragArea->distanceThreshold()*2.0f;
825+ QPointF dragDirectionVector(1., 0.); // horizontal positive
826+
827+ qreal movementStepDistance = edgeDragArea->distanceThreshold() * 0.1f;
828+ QPointF touchMovement = dragDirectionVector * movementStepDistance;
829+ int totalMovementSteps = qCeil(desiredDragDistance / movementStepDistance);
830+ int movementTimeStepMs = (edgeDragArea->compositionTime() * 1.5f) / totalMovementSteps;
831+
832+ QTest::touchEvent(m_view, m_device).press(0, touchPoint.toPoint());
833+
834+ for (int i = 0; i < totalMovementSteps; ++i) {
835+ touchPoint += touchMovement;
836+ passTime(movementTimeStepMs);
837+ QTest::touchEvent(m_view, m_device).move(0, touchPoint.toPoint());
838+ }
839+
840+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::Recognized);
841+ QCOMPARE(edgeDragArea->dragging(), true);
842+
843+ // disable the dragArea while it's being dragged.
844+ edgeDragArea->setEnabled(false);
845+
846+ QCOMPARE((int)edgeDragArea->status(), (int)DirectionalDragArea::WaitingForTouch);
847+ QCOMPARE(edgeDragArea->dragging(), false);
848+
849+ QTest::touchEvent(m_view, m_device).release(0, touchPoint.toPoint());
850+}
851+
798852QTEST_MAIN(tst_DirectionalDragArea)
799853
800854#include "tst_DirectionalDragArea.moc"
tests/qmltests/CMakeLists.txt+2−1
@@ -62,7 +62,8 @@ add_qml_test(Dash/Previews PreviewAudioPlayback IMPORT_PATHS ${qmltest_DEFAULT_I
6262add_qml_test(Dash/Previews PreviewHeader IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6363add_qml_test(Dash/Previews PreviewImageGallery IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6464add_qml_test(Dash/Previews PreviewProgress IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
65−add_qml_test(Dash/Previews PreviewRating IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
65+add_qml_test(Dash/Previews PreviewRatingDisplay IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
66+add_qml_test(Dash/Previews PreviewRatingInput IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6667add_qml_test(Dash/Previews PreviewTextSummary IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6768add_qml_test(Dash/Previews PreviewVideoPlayback IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
6869add_qml_test(Dash/Previews PreviewWidgetFactory IMPORT_PATHS ${qmltest_DEFAULT_IMPORT_PATHS} ${CMAKE_BINARY_DIR}/tests/mocks)
tests/qmltests/Components/tst_DragHandle.cpp−1
@@ -126,7 +126,6 @@ QQuickView *tst_DragHandle::createView()
126126{
127127 QQuickView *window = new QQuickView(0);
128128 window->setResizeMode(QQuickView::SizeRootObjectToView);
129− window->resize(600, 600);
130129 window->engine()->addImportPath(QLatin1String(UBUNTU_GESTURES_PLUGIN_DIR));
131130 window->engine()->addImportPath(QLatin1String(TEST_DIR));
132131
tests/qmltests/Components/tst_LazyImage.qml+1−1
@@ -155,7 +155,7 @@ Rectangle {
155155
156156 if (data.transition) {
157157 // wait for the transition to complete
158− var transition = findInvisibleChild(data.image, data.transition);
158+ var transition = findChildIn(data.image, "transitions", data.transition);
159159 tryCompare(transition, "running", true);
160160 tryCompare(transition, "running", false);
161161 }
tests/qmltests/Dash/Previews/tst_PreviewRatingDisplay.qmlnew file+112
@@ -0,0 +1,112 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 0.1
20+import "../../../../qml/Dash/Previews"
21+import Unity.Test 0.1 as UT
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(40)
26+ height: units.gu(80)
27+ color: Theme.palette.selected.background
28+
29+ property var reviewsModel0: {
30+ "reviews": [ ]
31+ }
32+
33+ property var reviewsModel1: {
34+ "reviews": [ { author: "Some dude", rating: 4.5, review: "Very cool app" },
35+ { author: "Yet Another dude", rating: 5, review: "Very cool app" }, ]
36+ }
37+
38+ property var reviewsModel2: {
39+ "reviews": [ { author: "Some dude", rating: 4.5, review: "Very cool app" },
40+ { author: "Another dude", rating: 3, review: "Average app. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nPhasellus a mi vitae augue rhoncus lobortis ut rutrum metus.\nCurabitur tortor leo, tristique sed mollis quis, condimentum venenatis nibh.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\nPhasellus a mi vitae augue rhoncus lobortis ut rutrum metus.\nCurabitur tortor leo, tristique sed mollis quis, condimentum venenatis nibh." },
41+ { author: "Yet Another dude", rating: 5, review: "Very cool app" }, ]
42+ }
43+
44+ property var reviewsModelMixed: {
45+ "reviews": [ { author: "Some dude", review: "Very cool app" },
46+ { author: "" },
47+ { rating: 3, review: "Average app. Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nPhasellus a mi vitae augue rhoncus lobortis ut rutrum metus.\nCurabitur tortor leo, tristique sed mollis quis, condimentum venenatis nibh.\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit.\nPhasellus a mi vitae augue rhoncus lobortis ut rutrum metus.\nCurabitur tortor leo, tristique sed mollis quis, condimentum venenatis nibh." },
48+ { author: "Yet Another dude", rating: 5 }, ]
49+ }
50+
51+ PreviewRatingDisplay {
52+ id: previewRatingDisplay
53+ anchors.left: parent.left
54+ anchors.right: parent.right
55+ widgetData: reviewsModelMixed
56+ }
57+
58+ UT.UnityTestCase {
59+ name: "PreviewRatingDisplayTest"
60+ when: windowShown
61+
62+ function test_reviews_data() {
63+ return [
64+ {tag: "0 reviews", reviewsModel: reviewsModel0},
65+ {tag: "1 review", reviewsModel: reviewsModel1},
66+ {tag: "3 reviews", reviewsModel: reviewsModel2},
67+ {tag: "3 mixed reviews", reviewsModel: reviewsModelMixed}
68+ ];
69+ }
70+
71+ function test_reviews(data) {
72+ previewRatingDisplay.widgetData = data.reviewsModel;
73+
74+ var reviewsRepeater = findChild(previewRatingDisplay, "reviewsRepeater");
75+ compare(reviewsRepeater.count, data.reviewsModel["reviews"].length);
76+
77+ for (var i = 0; i < data.reviewsModel["reviews"].length; ++i) {
78+ var reviewItem = findChild(previewRatingDisplay, "reviewItem" + i);
79+
80+ var rating = findChild(reviewItem, "rating");
81+ if (data.reviewsModel["reviews"][i]["rating"] >= 0) {
82+ compare(rating.visible, true);
83+ compare(rating.value, data.reviewsModel["reviews"][i]["rating"]);
84+ } else {
85+ compare(rating.visible, false);
86+ }
87+
88+ var authorLabel = findChild(reviewItem, "authorLabel");
89+ if (data.reviewsModel["reviews"][i]["author"] &&
90+ data.reviewsModel["reviews"][i]["author"] !== "") {
91+ compare(authorLabel.visible, true);
92+ compare(authorLabel.text, data.reviewsModel["reviews"][i]["author"]);
93+ } else {
94+ compare(authorLabel.visible, false);
95+ }
96+
97+ var reviewLabel = findChild(reviewItem, "reviewLabel");
98+ if (data.reviewsModel["reviews"][i]["review"] &&
99+ data.reviewsModel["reviews"][i]["review"] !== "") {
100+ compare(reviewLabel.visible, true);
101+ compare(reviewLabel.text, data.reviewsModel["reviews"][i]["review"]);
102+ } else {
103+ compare(reviewLabel.visible, false);
104+ }
105+
106+ if (!rating.visible && !authorLabel.visible && !reviewLabel.visible) {
107+ verify(reviewItem.height === 0);
108+ }
109+ }
110+ }
111+ }
112+}
tests/qmltests/Dash/Previews/tst_PreviewRating.qml → tests/qmltests/Dash/Previews/tst_PreviewRatingInput.qmlrenamed+15−15
@@ -43,12 +43,12 @@ Rectangle {
4343
4444 property var widgetDataNewLabels: { "visible": "both", "required": "both", "rating-label": "TestRatingLabel", "review-label": "TestReviewLabel", "submit-label": "TestSubmitLabel" }
4545
46− PreviewRating {
47− id: previewRating
46+ PreviewRatingInput {
47+ id: previewRatingInput
4848 anchors.left: parent.left
4949 anchors.right: parent.right
5050 widgetData: widgetDataBoth
51− widgetId: "previewRating"
51+ widgetId: "previewRatingInput"
5252 }
5353
5454 SignalSpy {
@@ -57,12 +57,12 @@ Rectangle {
5757 }
5858
5959 UT.UnityTestCase {
60− name: "PreviewRatingTest"
60+ name: "PreviewRatingInputTest"
6161 when: windowShown
6262
63− property var rating: findChild(previewRating, "rating")
64− property var reviewTextArea: findChild(previewRating, "reviewTextArea")
65− property var submitButton: findChild(previewRating, "submitButton")
63+ property var rating: findChild(previewRatingInput, "rating")
64+ property var reviewTextArea: findChild(previewRatingInput, "reviewTextArea")
65+ property var submitButton: findChild(previewRatingInput, "submitButton")
6666
6767 function init() {
6868 rating.value = -1;
@@ -70,10 +70,10 @@ Rectangle {
7070 }
7171
7272 function test_labels() {
73− var ratingLabel = findChild(previewRating, "ratingLabel");
74− var reviewLabel = findChild(previewRating, "reviewLabel");
73+ var ratingLabel = findChild(previewRatingInput, "ratingLabel");
74+ var reviewLabel = findChild(previewRatingInput, "reviewLabel");
7575
76− previewRating.widgetData = widgetDataNewLabels;
76+ previewRatingInput.widgetData = widgetDataNewLabels;
7777 compare(ratingLabel.text, widgetDataNewLabels["rating-label"]);
7878 compare(reviewLabel.text, widgetDataNewLabels["review-label"]);
7979 compare(submitButton.text, widgetDataNewLabels["submit-label"]);
@@ -106,9 +106,9 @@ Rectangle {
106106
107107 function test_submit_and_visibility(data) {
108108 spy.clear();
109− spy.target = previewRating;
109+ spy.target = previewRatingInput;
110110
111− previewRating.widgetData = data.widgetData;
111+ previewRatingInput.widgetData = data.widgetData;
112112
113113 if (data.widgetData["visible"] !== "review") {
114114 verify(rating.visible === true);
@@ -161,9 +161,9 @@ Rectangle {
161161
162162 function test_triggered(data) {
163163 spy.clear();
164− spy.target = previewRating;
164+ spy.target = previewRatingInput;
165165
166− previewRating.widgetData = data.widgetData;
166+ previewRatingInput.widgetData = data.widgetData;
167167
168168 if (data.inputRating > 0) rating.value = data.inputRating;
169169 if (data.inputText !== "") {
@@ -173,7 +173,7 @@ Rectangle {
173173
174174 compare(spy.count, 1);
175175 var args = spy.signalArguments[0];
176− compare(args[0], previewRating.widgetId);
176+ compare(args[0], previewRatingInput.widgetId);
177177 compare(args[1], data.widgetData["required"]);
178178 compare(args[2]["rating"], data.triggeredData["rating"]);
179179 compare(args[2]["review"], data.triggeredData["review"]);
tests/qmltests/Dash/Previews/tst_PreviewVideoPlayback.qml−6
@@ -53,12 +53,6 @@ Rectangle {
5353 function test_loadScreenshot() {
5454 var screenshot = findChild(videoPlayback, "screenshot");
5555
56− videoPlayback.widgetData = widgetData0;
57− tryCompare(screenshot.visible, false);
58−
59− videoPlayback.widgetData = widgetData1;
60− tryCompare(screenshot.visible, true);
61−
6256 videoPlayback.widgetData = widgetData2;
6357 var screenshotSource = screenshot.source
6458 verify(screenshotSource.toString().indexOf("image://thumbnailer/") === 0)
tests/qmltests/Dash/Previews/tst_PreviewWidgetFactory.qml+2−1
@@ -81,7 +81,8 @@ Rectangle {
8181 { tag: "Header", type: "header", source: "PreviewHeader.qml" },
8282 { tag: "Image", type: "image", source: "PreviewZoomableImage.qml" },
8383 { tag: "Progress", type: "progress", source: "PreviewProgress.qml" },
84− { tag: "Rating Input", type: "rating-input", source: "PreviewRating.qml" },
84+ { tag: "Rating Input", type: "rating-input", source: "PreviewRatingInput.qml" },
85+ { tag: "Rating Display", type: "reviews", source: "PreviewRatingDisplay.qml" },
8586 { tag: "Text", type: "text", source: "PreviewTextSummary.qml" },
8687 { tag: "Video", type: "video", source: "PreviewVideoPlayback.qml" },
8788 ];
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+3−4
@@ -30,14 +30,13 @@ Rectangle {
3030 }
3131
3232 property var widgetData1: {
33− "source": "../../graphics/phone_background.jpg",
33+ "source": Qt.resolvedUrl("../artwork/checkers.png"),
3434 "zoomable": false
3535 }
3636
3737 PreviewZoomableImage {
3838 id: zoomableImage
3939 width: parent.width
40− widgetData: widgetData1
4140 }
4241
4342 UT.UnityTestCase {
@@ -48,10 +47,10 @@ Rectangle {
4847 var image = findChild(zoomableImage, "image");
4948
5049 zoomableImage.widgetData = widgetData0;
51− tryCompare(image.state, "default");
50+ tryCompare(image, "state", "default");
5251
5352 zoomableImage.widgetData = widgetData1;
54− tryCompare(image.state, "ready");
53+ tryCompare(image, "state", "ready");
5554 }
5655 }
5756}
tests/qmltests/Dash/qml/FakeScopeView.qml−5
@@ -25,11 +25,6 @@ GenericScopeView {
2525 property alias backColor : back.color
2626 property var categoryView: null
2727
28− onEndReached: {
29− if (scope != undefined && shell != undefined && shell.scopeStatus != undefined) {
30− shell.scopeStatus[scope.id].endReached++;
31− }
32− }
3328 onMovementStarted: {
3429 if (shell != undefined && shell.scopeStatus != undefined) {
3530 shell.scopeStatus[scope.id].movementStarted++;
tests/qmltests/Dash/tst_Card.qml+63
@@ -182,6 +182,7 @@ Rectangle {
182182 when: windowShown
183183
184184 property Item header: findChild(card, "cardHeader")
185+ property Item title: findChild(header, "titleLabel")
185186 property Item art: findChild(card, "artShape")
186187 property Item artImage: findChild(card, "artImage")
187188 property Item summary: findChild(card, "summaryLabel")
@@ -413,5 +414,67 @@ Rectangle {
413414 tryCompare(backgroundImage, "source", data.image);
414415 }
415416 }
417+
418+ function test_font_weights_data() {
419+ return [
420+ { tag: "Title only", index: 8, weight: Font.Normal },
421+ { tag: "Title, subtitle", index: 0, weight: Font.DemiBold },
422+ ]
423+ }
424+
425+ function test_font_weights(data) {
426+ selector.selectedIndex = data.index;
427+
428+ tryCompare(testCase.title.font, "weight", data.weight);
429+ }
430+
431+ function test_fontColor_data() {
432+ return [
433+ { tag: "#ffffff", dark: true },
434+ { tag: "#fdfdfd", dark: true },
435+ { tag: "#f9f9f9", dark: true },
436+ { tag: "#000000", dark: false },
437+ { tag: "#ef814c", dark: false },
438+ { tag: "#312f2c", dark: false },
439+ { tag: "#be332d", dark: false },
440+ { tag: "#52ace4", dark: false },
441+ { tag: "#3a5897", dark: false },
442+ { tag: "#1caeeb", dark: false },
443+ { tag: "#87c341", dark: false },
444+ { tag: "#50893b", dark: false },
445+ ];
446+ }
447+
448+ function test_fontColor(data) {
449+ selector.selectedIndex = 10;
450+
451+ background.color = data.tag;
452+
453+ var fontColor = data.dark ? "grey" : "white";
454+
455+ tryCompareFunction(function() { return Qt.colorEqual(summary.color, fontColor); }, true);
456+ tryCompareFunction(function() { return Qt.colorEqual(header.fontColor, fontColor); }, true);
457+ }
458+
459+ function test_mascotShape_data() {
460+ return [
461+ { tag: "Art and summary", shape: false, index: 0 },
462+ { tag: "No Summary", shape: true, index: 6 },
463+ { tag: "With background", shape: false, index: 10 },
464+ ];
465+ }
466+
467+ function test_mascotShape(data) {
468+ selector.selectedIndex = data.index;
469+
470+ var shape = findChild(card, "mascotShape");
471+ var image = findChild(card, "mascotImage");
472+
473+ verify(shape, "Could not find shape.");
474+ verify(image, "Could not find image.");
475+
476+ tryCompare(shape, "visible", data.shape);
477+ tryCompare(image, "visible", !data.shape);
478+ }
416479 }
417480}
tests/qmltests/Dash/tst_CardHeader.qml+1−28
@@ -46,7 +46,6 @@ Rectangle {
4646 property Item mascot: findChild(cardHeader, "mascotShape")
4747 property Item titleLabel: findChild(cardHeader, "titleLabel")
4848 property Item subtitleLabel: findChild(cardHeader, "subtitleLabel")
49− property Item prices: findChild(cardHeader, "prices")
5049 property Item oldPriceLabel: findChild(cardHeader, "oldPriceLabel")
5150 property Item outerRow: findChild(cardHeader, "outerRow")
5251 property Item column: findChild(cardHeader, "column")
@@ -55,7 +54,6 @@ Rectangle {
5554 verify(typeof testCase.mascot === "object", "Couldn't find mascot object.");
5655 verify(typeof testCase.titleLabel === "object", "Couldn't find titleLabel object.");
5756 verify(typeof testCase.subtitleLabel === "object", "Couldn't find subtitleLabel object.");
58− verify(typeof testCase.prices === "object", "Couldn't find prices object.");
5957 verify(typeof testCase.oldPriceLabel === "object", "Couldn't find oldPriceLabel object.");
6058 }
6159
@@ -63,9 +61,6 @@ Rectangle {
6361 cardHeader.mascot = "";
6462 cardHeader.title = "";
6563 cardHeader.subtitle = "";
66− cardHeader.price = "";
67− cardHeader.oldPrice = "";
68− cardHeader.altPrice = "";
6964 }
7065
7166 function test_mascot_data() {
@@ -96,33 +91,11 @@ Rectangle {
9691 tryCompare(cardHeader, "visible", data.visible);
9792 }
9893
99− function test_prices_data() {
100− return [
101− { tag: "Main", main: "$1.25", visible: true },
102− { tag: "Alt", alt: "€1.00", visible: false },
103− { tag: "Old", old: "€2.00", visible: false },
104− { tag: "Main and Alt", main: "$1.25", alt: "€1.00", visible: true },
105− { tag: "Main and Old", main: "$1.25", old: "$2.00", visible: true, oldAlign: Text.AlignRight },
106− { tag: "Alt and Old", alt: "€1.00", old: "$2.00", visible: false },
107− { tag: "All", main: "$1.25", alt: "€1.00", old: "$2.00", visible: true, oldAlign: Text.AlignHCenter },
108− ]
109− }
110−
111− function test_prices(data) {
112− cardHeader.price = data.main !== undefined ? data.main : "";
113− cardHeader.oldPrice = data.old !== undefined ? data.old : "";
114− cardHeader.altPrice = data.alt !== undefined ? data.alt : "";
115− tryCompare(cardHeader, "visible", data.visible);
116− if (data.hasOwnProperty("oldAlign")) {
117− compare(testCase.oldPriceLabel.horizontalAlignment, data.oldAlign, "Old price label is aligned wrong.")
118− }
119− }
120−
12194 function test_dimensions_data() {
12295 return [
12396 { tag: "Column width", object: column, width: cardHeader.width },
12497 { tag: "Column width with mascot", object: column, width: cardHeader.width - mascot.width - outerRow.margins * 3, mascot: "artwork/avatar.png" },
125− { tag: "Header height", object: cardHeader, height: function() { return subtitleLabel.y + subtitleLabel.height + outerRow.margins * 2 } },
98+ { tag: "Header height", object: cardHeader, height: function() { return outerRow.height + outerRow.margins * 2 } },
12699 ]
127100 }
128101
tests/qmltests/Dash/tst_CardTool.qml+20
@@ -93,6 +93,7 @@ Rectangle {
9393 CardTool {
9494 id: cardTool
9595
96+ count: 8
9697 template: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['template'];
9798 components: Helpers.update(JSON.parse(Helpers.defaultLayout), Helpers.tryParse(layoutArea.text, layoutError))['components'];
9899 viewWidth: units.gu(Math.round(widthSlider.value))
@@ -343,5 +344,24 @@ Rectangle {
343344 tryCompare(cardTool, data.property, data.value);
344345 }
345346 }
347+
348+ function test_categoryLayout_data() {
349+ return [
350+ { tag: "Default Grid", layout_index: 0, count: 2, viewWidth: units.gu(40), layout: "grid" },
351+ { tag: "Long carousel", layout_index: 4, count: 6, viewWidth: units.gu(140), layout: "carousel" },
352+ { tag: "Long carousel fallback", layout_index: 4, count: 5, viewWidth: units.gu(140), layout: "grid" },
353+ { tag: "Short carousel", layout_index: 4, count: 4, viewWidth: units.gu(30), layout: "carousel" },
354+ { tag: "Short carousel fallback", layout_index: 4, count: 3, viewWidth: units.gu(30), layout: "grid" },
355+ { tag: "Journal", layout_index: 2, count: 8, viewWidth: units.gu(30), layout: "journal" }
356+ ]
357+ }
358+
359+ function test_categoryLayout(data) {
360+ selector.selectedIndex = 0;
361+ layoutSelector.selectedIndex = data.layout_index;
362+ cardTool.viewWidth = data.viewWidth;
363+ cardTool.count = data.count;
364+ compare(cardTool.categoryLayout, data.layout);
365+ }
346366 }
347367}
tests/qmltests/Dash/tst_DashContent.qml+15−36
@@ -105,25 +105,19 @@ Item {
105105 signalName: "movementStarted"
106106 }
107107
108− SignalSpy {
109− id: contentEndReachedSpy
110− target: dashContent
111− signalName: "contentEndReached"
112− }
113−
114108 UT.UnityTestCase {
115109 name: "DashContent"
116110 when: scopesModel.loaded
117111
118112 function init() {
119113 scopesModel.clear();
114+ scopeLoadedSpy.clear();
120115 scopesModel.load();
116+ tryCompare(scopeLoadedSpy, "count", 5);
121117 }
122118
123119 function cleanup() {
124− scopeLoadedSpy.clear();
125120 movementStartedSpy.clear();
126− contentEndReachedSpy.clear();
127121 clear_scope_status();
128122 dashContent.visible = true;
129123
@@ -132,17 +126,18 @@ Item {
132126 scopesModel.clear();
133127 // wait for dash to empty scopes.
134128 tryCompare(dashContentList, "count", 0);
135− // this is the default state for empty model
136− dashContentList.currentIndex = -1;
137129 }
138130
139131 function test_current_index() {
140132 var dashContentList = findChild(dashContent, "dashContentList");
141133 verify(dashContentList != undefined)
142134
135+ scopesModel.clear();
143136 compare(dashContentList.count, 0, "DashContent should have 0 items when it starts");
144− compare(dashContentList.currentIndex, -1, "DashContent's currentIndex should be -1 while there have been no items in the model");
137+ tryCompare(dashContentList, "currentIndex", -1);
145138
139+ scopeLoadedSpy.clear();
140+ scopesModel.load();
146141 tryCompare(scopeLoadedSpy, "count", 5);
147142
148143 verify(dashContentList.currentIndex >= 0);
@@ -152,10 +147,13 @@ Item {
152147 var dashContentList = findChild(dashContent, "dashContentList");
153148 verify(dashContentList != undefined)
154149
155− compare(dashContentList.count, 0, "DashContent should have 0 items when it starts");
150+ scopesModel.clear();
151+ compare(dashContentList.count, 0, "DashContent should have 0 items after clearing");
156152 // pretend we're running after a model reset
157153 dashContentList.currentIndex = 27;
158154
155+ scopeLoadedSpy.clear();
156+ scopesModel.load();
159157 tryCompare(scopeLoadedSpy, "count", 5);
160158
161159 verify(dashContentList.currentIndex >= 0 && dashContentList.currentIndex < 5);
@@ -167,8 +165,6 @@ Item {
167165 var dashContentList = findChild(dashContent, "dashContentList");
168166 verify(dashContentList != undefined)
169167
170− tryCompare(scopeLoadedSpy, "count", 5);
171−
172168 dashContentList.movementStarted();
173169
174170 compare(movementStartedSpy.count, 1, "DashContent should have emitted movementStarted signal when content list did.");
@@ -182,8 +178,6 @@ Item {
182178 function test_positioned_at_beginning_signal() {
183179 dashContent.setCurrentScopeAtIndex(3, true, false);
184180
185− tryCompare(scopeLoadedSpy, "count", 5);
186−
187181 dashContent.positionedAtBeginning();
188182 compare(scopeStatus["MockScope1"].positionedAtBeginning, 1, "MockScope1 should have emitted positionedAtBeginning signal when DashContent did.");
189183 compare(scopeStatus["MockScope2"].positionedAtBeginning, 1, "MockScope2 should have emitted positionedAtBeginning signal when DashContent did.");
@@ -192,30 +186,17 @@ Item {
192186 compare(scopeStatus["MockScope5"].positionedAtBeginning, 1, "MockScope5 should have emitted positionedAtBeginning signal when DashContent did.");
193187 }
194188
195− function test_scope_loaded() {
196− tryCompare(scopeLoadedSpy, "count", 5);
197− }
198−
199− function test_content_end_reached() {
200− var dashContentList = findChild(dashContent, "dashContentList");
201− verify(dashContentList != undefined);
202−
203− tryCompare(scopeLoadedSpy, "count", 5);
204− dashContent.setCurrentScopeAtIndex(0, true, false);
205− dashContentList.currentItem.item.endReached();
206−
207− compare(contentEndReachedSpy.count, 1);
208− }
209−
210189 // This tests that setting the current scope index will end up at the correct index even if
211190 // the scopes are loaded asynchrounsly.
212191 function test_set_current_scope_index_async() {
192+ scopesModel.clear();
213193 verify(scopesModel.loaded == false);
214194
215− // next index is 1 if current is -1, otherwise it's current + 1
216− var next_index = ((dashContent.currentIndex == -1 ? 0 : dashContent.currentIndex) + 1) % 5
195+ tryCompare(dashContent, "currentIndex", -1);
196+ var next_index = 1
217197
218198 dashContent.setCurrentScopeAtIndex(next_index, true, false);
199+ scopesModel.load();
219200 tryCompare(dashContent, "currentIndex", next_index);
220201 verify(scopesModel.loaded == true);
221202
@@ -265,8 +246,6 @@ Item {
265246 function test_is_active(data) {
266247 var dashContentList = findChild(dashContent, "dashContentList");
267248
268− tryCompare(scopeLoadedSpy, "count", 5);
269−
270249 dashContent.setCurrentScopeAtIndex(data.select, true, false);
271250 dashContent.visible = data.visible;
272251
@@ -305,7 +284,7 @@ Item {
305284 tryCompare(scopesModel, "loaded", true);
306285 var tabbar = findChild(dashContent, "tabbar");
307286
308− compare(dashContent.currentIndex, 0);
287+ tryCompare(dashContent, "currentIndex", 0);
309288 tryCompare(tabbar, "selectedIndex", 0);
310289 tryCompare(tabbar, "selectionMode", false);
311290
tests/qmltests/Dash/tst_GenericPreview.qml+2−2
@@ -22,7 +22,7 @@ import Unity.Test 0.1 as UT
2222Item {
2323 id: root
2424 width: units.gu(60)
25− height: units.gu(80)
25+ height: units.gu(90)
2626
2727 property var calls: []
2828 property int counter: 0
@@ -81,7 +81,7 @@ Item {
8181
8282 var actions = get_actions_data();
8383 for(var i = 0; i < actions.length; i++) {
84− compare(root.calls[i], actions[i].id);
84+ tryCompare(root.calls, i, actions[i].id);
8585 }
8686 }
8787
tests/qmltests/Dash/tst_GenericScopeView.qml+3−3
@@ -67,7 +67,7 @@ Item {
6767 function init() {
6868 shell.width = units.gu(120)
6969 genericScopeView.categoryView.positionAtBeginning();
70− tryCompare(genericScopeView.categoryView.contentY, 0)
70+ tryCompare(genericScopeView.categoryView, "contentY", 0)
7171 }
7272
7373 function test_isCurrent() {
@@ -184,13 +184,13 @@ Item {
184184 categoryListView.positionAtBeginning();
185185 waitForRendering(categoryListView);
186186 categoryListView.flick(0, -units.gu(60));
187− tryCompare(categoryListView.flicking, false);
187+ tryCompare(categoryListView, "flicking", false);
188188
189189 var tile = findChild(findChild(genericScopeView, "0"), "delegate0");
190190 mouseClick(tile, tile.width / 2, tile.height - 1);
191191 tryCompare(openEffect, "gap", 1);
192192
193− verify(openEffect.positionPx >= pageHeader.height + categoryListView.stickyHeaderHeight);
193+ verify(openEffect.positionPx >= Math.round(pageHeader.height + categoryListView.stickyHeaderHeight));
194194 }
195195
196196 function test_previewCycle() {
tests/qmltests/Greeter/tst_Phone.qml+19
@@ -44,6 +44,17 @@ Item {
4444 }
4545 }
4646
47+ Component {
48+ id: greeterComponent
49+ Greeter {
50+ SignalSpy {
51+ objectName: "selectedSpy"
52+ target: parent
53+ signalName: "selected"
54+ }
55+ }
56+ }
57+
4758 SignalSpy {
4859 id: unlockSpy
4960 target: greeter
@@ -148,5 +159,13 @@ Item {
148159 tryCompareFunction(function() { return background.source.toString().indexOf(data.expected) !== -1; }, true)
149160 tryCompare(background, "status", Image.Ready)
150161 }
162+
163+ function test_initial_selected_signal() {
164+ var greeterObj = greeterComponent.createObject(this)
165+ var spy = findChild(greeterObj, "selectedSpy")
166+ spy.wait()
167+ tryCompare(spy, "count", 1)
168+ greeterObj.destroy()
169+ }
151170 }
152171}
tests/qmltests/Greeter/tst_Tablet.qml+19
@@ -31,6 +31,17 @@ Item {
3131 anchors.fill: parent
3232 }
3333
34+ Component {
35+ id: greeterComponent
36+ Greeter {
37+ SignalSpy {
38+ objectName: "selectedSpy"
39+ target: parent
40+ signalName: "selected"
41+ }
42+ }
43+ }
44+
3445 SignalSpy {
3546 id: unlockSpy
3647 target: greeter
@@ -335,5 +346,13 @@ Item {
335346 var userlist = findChild(greeter, "userList")
336347 compare(greeter.model.data(userlist.currentIndex, LightDM.UserRoles.NameRole), "has-password")
337348 }
349+
350+ function test_initial_selected_signal() {
351+ var greeterObj = greeterComponent.createObject(this)
352+ var spy = findChild(greeterObj, "selectedSpy")
353+ spy.wait()
354+ tryCompare(spy, "count", 1)
355+ greeterObj.destroy()
356+ }
338357 }
339358}
tests/qmltests/Launcher/tst_Launcher.qml+6−4
@@ -121,8 +121,7 @@ Item {
121121 revealer.dragLauncherIntoView()
122122
123123 var listView = findChild(launcher, "launcherListView");
124− listView.flick(0, units.gu(500));
125− tryCompare(listView, "flicking", false);
124+ listView.positionViewAtEnd();
126125
127126 var appIcon = findChild(launcher, "launcherDelegate0")
128127
@@ -397,8 +396,11 @@ Item {
397396
398397 // Position launcher to where we need it
399398 var listView = findChild(launcher, "launcherListView");
400− listView.flick(0, units.gu(200) * (data.flickTo === "top" ? 1 : -1));
401− tryCompare(listView, "flicking", false);
399+ if (data.flickTo == "top") {
400+ listView.positionViewAtEnd();
401+ } else {
402+ listView.positionViewAtBeginning();
403+ }
402404
403405 // Doing longpress
404406 mousePress(draggedItem, draggedItem.width / 2, draggedItem.height / 2)
tests/qmltests/Panel/tst_IndicatorRow.qml+3−3
@@ -70,13 +70,13 @@ Item {
7070 function test_set_current_item() {
7171 init_test();
7272 indicatorRow.setCurrentItemIndex(0);
73− compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake1", "Incorrect item at position 0");
73+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake1", "Incorrect item at position 0");
7474
7575 indicatorRow.setCurrentItemIndex(1);
76− compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake2", "Incorrect item at position 1");
76+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake2", "Incorrect item at position 1");
7777
7878 indicatorRow.setCurrentItemIndex(2);
79− compare(indicatorRow.indicatorsModel.get(indicatorRow.currentItemIndex).identifier, "indicator-fake3", "Incorrect item at position 2");
79+ compare(indicatorRow.indicatorsModel.data(indicatorRow.currentItemIndex, Indicators.IndicatorsModelRole.Identifier), "indicator-fake3", "Incorrect item at position 2");
8080 }
8181
8282 function test_highlight_data() {
tests/qmltests/Panel/tst_MenuContent.qml+1−1
@@ -133,7 +133,7 @@ Item {
133133 var menuIndex = i%menuCount;
134134
135135 activate_content(menuIndex);
136− testTabObjectName = indicatorsModel.get(menuIndex).identifier;
136+ testTabObjectName = indicatorsModel.data(menuIndex, Indicators.IndicatorsModelRole.Identifier);
137137 compare(tabs.selectedTabIndex, menuIndex, "Current tab index does not match selected tab index");
138138 tryCompareFunction(selected_tab_equals_test_tab, true);
139139 }
tests/qmltests/tst_Shell.qml+18−2
@@ -110,6 +110,9 @@ Item {
110110 swipeUntilScopeViewIsReached(dashHome);
111111
112112 hideIndicators();
113+
114+ var dashContent = findChild(shell, "dashContent");
115+ dashContent.previewOpen = false;
113116 }
114117
115118 function killApps(apps) {
@@ -235,8 +238,8 @@ Item {
235238
236239 var dash = findChild(shell, "dash");
237240 // check that dash has normal scale and opacity
238− tryCompare(dash.contentScale, 1.0);
239− tryCompare(dash.opacity, 1.0);
241+ tryCompare(dash, "contentScale", 1.0);
242+ tryCompare(dash, "opacity", 1.0);
240243
241244 touchFlick(shell, touchX, touchY, shell.width * 0.1, touchY,
242245 true /* beginTouch */, false /* endTouch */);
@@ -550,6 +553,19 @@ Item {
550553 tryCompare(searchIndicator, "opacity", 0)
551554 }
552555
556+ function test_searchIndicatorHideOnPreviewShown() {
557+ var searchIndicator = findChild(shell, "container");
558+ var dashContent = findChild(shell, "dashContent");
559+
560+ verify(dashContent != null);
561+
562+ tryCompare(searchIndicator, "opacity", 1);
563+
564+ dashContent.previewOpen = true;
565+
566+ tryCompare(searchIndicator, "opacity", 0);
567+ }
568+
553569 function test_focusRequestedHidesGreeter() {
554570 var greeter = findChild(shell, "greeter")
555571
tests/utils/modules/Unity/Test/UnityTestCase.qml+10−16
@@ -71,19 +71,8 @@ TestCase {
7171
7272
7373 // Find an object with the given name in the children tree of "obj"
74− function findChild(obj,objectName) {
75− var childs = new Array(0);
76− childs.push(obj)
77− while (childs.length > 0) {
78− if (childs[0].objectName == objectName) {
79− return childs[0]
80− }
81− for (var i in childs[0].children) {
82− childs.push(childs[0].children[i])
83− }
84− childs.splice(0, 1);
85− }
86− return null;
74+ function findChild(obj, objectName) {
75+ return findChildIn(obj, "children", objectName);
8776 }
8877
8978 // Find an object with the given name in the children tree of "obj"
@@ -91,15 +80,20 @@ TestCase {
9180 // Note: you should use findChild if you're not sure you need this
9281 // as this tree is much bigger and might contain stuff that goes
9382 // away randomly.
94− function findInvisibleChild(obj,objectName) {
83+ function findInvisibleChild(obj, objectName) {
84+ return findChildIn(obj, "data", objectName);
85+ }
86+
87+ // Find a child in the named property
88+ function findChildIn(obj, prop, objectName) {
9589 var childs = new Array(0);
9690 childs.push(obj)
9791 while (childs.length > 0) {
9892 if (childs[0].objectName == objectName) {
9993 return childs[0]
10094 }
101− for (var i in childs[0].data) {
102− childs.push(childs[0].data[i])
95+ for (var i in childs[0][prop]) {
96+ childs.push(childs[0][prop][i])
10397 }
10498 childs.splice(0, 1);
10599 }