on xenial help sign in
merged with trunk
commit444e2daf38fe9476cc01a1071c327de5d1443598 authorNick Dedekind <nicholas.dedekind@gmail.com> dateThu 31 Jul 2014, 14:12 (12 years ago) parente122115277cf56
171 files changed+5833−2989
tests/autopilot/.project → .project+1−1 tests/autopilot/.pydevproject → .pydevproject+3−1 .settings/Autopilot List.launch+14 .settings/Autopilot Run.launch+14 debian/changelog+79 debian/control+3−3 plugins/AccountsService/AccountsService.cpp+21−1 plugins/AccountsService/AccountsService.h+13 plugins/AccountsService/plugin.cpp+1 plugins/Dash/ScopeStyle.qml+6 plugins/Dash/listviewwithpageheader.cpp+1−6 plugins/LightDM/plugin.cpp+2 plugins/Unity/Launcher/launchermodel.cpp+3−2 plugins/Utils/CMakeLists.txt+1 plugins/Utils/easingcurve.cpp+5−1 plugins/Utils/plugin.cpp+2 plugins/Utils/windowkeysfilter.cpp+57 plugins/Utils/windowkeysfilter.h+51 po/am.po+23−15 po/ar.po+19−11 po/ast.po+20−12 po/az.po+19−11 po/bg.po+19−11 po/br.po+20−12 po/bs.po+19−11 po/ca.po+28−20 po/ckb.po+19−11 po/cs.po+19−11 po/da.po+22−14 po/de.po+19−11 po/el.po+34−26 po/en_AU.po+20−12 po/en_GB.po+20−12 po/eo.po+19−11 po/es.po+21−13 po/eu.po+20−12 po/fa.po+19−11 po/fi.po+20−12 po/fo.po+19−11 po/fr.po+21−13 po/gd.po+21−13 po/gl.po+20−12 po/he.po+20−12 po/hi.po+19−11 po/hr.po+19−11 po/hu.po+31−21 po/hy.po+19−11 po/id.po+19−11 po/is.po+19−11 po/it.po+20−12 po/ja.po+19−11 po/km.po+19−11 po/kn.po+19−11 po/ko.po+19−11 po/ky.po+19−11 po/lo.po+19−11 po/lt.po+19−11 po/lv.po+23−15 po/ml.po+20−12 po/mr.po+19−11 po/ms.po+19−11 po/my.po+19−11 po/nb.po+20−12 po/nl.po+21−13 po/pl.po+19−11 po/pt.po+21−13 po/pt_BR.po+19−11 po/ro.po+19−11 po/ru.po+28−20 po/shn.po+19−11 po/si.po+19−11 po/sl.po+28−20 po/sq.po+19−11 po/sr.po+19−11 po/sv.po+37−28 po/sw.po+19−11 po/ta.po+19−11 po/te.po+19−11 po/tr.po+19−11 po/ug.po+20−12 po/uk.po+20−12 po/unity8.pot+17−9 po/vi.po+19−11 po/xh.po+19−11 po/zh_CN.po+29−21 po/zh_HK.po+19−11 po/zh_TW.po+21−13 qml/Components/Background.qml+77 qml/Components/Dialogs.qml+217 qml/Components/DraggingArea.qml+4 qml/Components/FilterGrid.qml−124 qml/Components/InputMethod.qml+79 qml/Components/ListItems/Header.qml+17−26 qml/Components/PageHeader.qml+9−2 qml/Components/PassphraseLockscreen.qml+3 qml/Components/ResponsiveGridView.qml+2−1 qml/Dash/Apps/RunningApplicationTile.qml+42−34 qml/Dash/CardCarousel.qml+2−7 qml/Dash/CardFilterGrid.qml → qml/Dash/CardGrid.qml+22−22 qml/Dash/CardVerticalJournal.qml+3−21 qml/Dash/DashContent.qml+4 qml/Dash/DashRenderer.qml+3−10 qml/Dash/GenericScopeView.qml+128−64 qml/Dash/graphics/phone/screenshots/vkb_portrait.png qml/Launcher/Launcher.qml+1−1 qml/Panel/Indicators.qml+3−1 qml/Shell.qml+183−399 qml/Stages/Animations/BaseSurfaceAnimation.qml+93 qml/Stages/Animations/DarkenAndFadeInAnimation.qml+48 qml/Stages/Animations/SwipeFromBottomAnimation.qml+48 qml/Stages/Animations/SwipeUpAnimation.qml+49 qml/Stages/PhoneStage.qml+171−263 qml/Stages/Splash.qml+68 qml/Stages/SpreadDelegate.qml+187−23 qml/Stages/StageWithSideStage.qml−413 qml/Stages/SurfaceContainer.qml+123 qml/Stages/SwitchingApplicationImage.qml−81 qml/Stages/TabletStage.qml+568 qml/Stages/TransformedSpreadDelegate.qml+36−30 qml/Stages/TransformedTabletSpreadDelegate.qml+369 run.sh+15−6 src/CMakeLists.txt−3 src/main.cpp+14−89 tests/autopilot/unity8/shell/emulators/dash.py+12−6 tests/autopilot/unity8/shell/tests/test_emulators.py+15−5 tests/autopilot/unity8/shell/tests/test_upstart.py+13 tests/mocks/AccountsService/AccountsService.cpp+12−2 tests/mocks/AccountsService/AccountsService.h+12 tests/mocks/AccountsService/CMakeLists.txt+4−1 tests/mocks/AccountsService/plugin.cpp+1 tests/mocks/LightDM/GreeterPrivate.h+2 tests/mocks/LightDM/demo/CMakeLists.txt+4−2 tests/mocks/LightDM/demo/GreeterPrivate.cpp+202−30 tests/mocks/LightDM/demo/UsersModelPrivate.cpp+1−1 tests/mocks/LightDM/full/GreeterPrivate.cpp+1−1 tests/mocks/LightDM/single-pin/GreeterPrivate.cpp+1−1 tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp+1−1 tests/mocks/Ubuntu/Telephony/CMakeLists.txt+1−9 tests/mocks/Unity/Application/Application.qmltypes−2 tests/mocks/Unity/Application/ApplicationDBusAdaptor.cpp+75 tests/mocks/Unity/Application/ApplicationDBusAdaptor.h+43 tests/mocks/Unity/Application/ApplicationInfo.cpp+69−21 tests/mocks/Unity/Application/ApplicationInfo.h+21−8 tests/mocks/Unity/Application/ApplicationManager.cpp+60−31 tests/mocks/Unity/Application/ApplicationManager.h+15−9 tests/mocks/Unity/Application/CMakeLists.txt+6−2 tests/mocks/Unity/Application/MirSurfaceItem.cpp+172 tests/mocks/Unity/Application/MirSurfaceItem.h+121 tests/mocks/Unity/Application/SurfaceManager.cpp+73 tests/mocks/Unity/Application/SurfaceManager.h+54 tests/mocks/Unity/Application/VirtualKeyboard.cpp+55 qml/Stages/SidestageHandle.qml → tests/mocks/Unity/Application/VirtualKeyboard.h+19−6 tests/mocks/Unity/Application/plugin.cpp+16−9 tests/mocks/Unity/fake_categories.cpp+13−1 tests/mocks/Unity/fake_categories.h+2 tests/mocks/Unity/fake_scope.cpp+8−11 tests/mocks/Unity/fake_scope.h+2−2 tests/mocks/Unity/fake_scopes.cpp+1 tests/plugins/Dash/tst_ScopeStyle.qml+27−2 tests/qmltests/CMakeLists.txt+1−1 tests/qmltests/Components/tst_Background.qml+90 tests/qmltests/Components/tst_FilterGrid.qml−190 tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+23−2 tests/qmltests/Dash/tst_Dash.qml+1−1 tests/qmltests/Dash/tst_DashContent.qml+15−6 tests/qmltests/Dash/tst_GenericScopeView.qml+137−49 tests/qmltests/Greeter/tst_Lockscreen.qml+11−5 tests/qmltests/Launcher/tst_Launcher.qml+11−2 tests/qmltests/Panel/tst_ActiveCallHint.qml+1 tests/qmltests/Stages/tst_PhoneStage.qml+9−56 tests/qmltests/tst_Shell.qml+108−7
tests/autopilot/.project → .projectrenamed+1−1
@@ -1,6 +1,6 @@
11<?xml version="1.0" encoding="UTF-8"?>
22<projectDescription>
3− <name>Unity8 Autopilot</name>
3+ <name>Unity8</name>
44 <comment></comment>
55 <projects>
66 </projects>
tests/autopilot/.pydevproject → .pydevprojectrenamed+3−1
@@ -1,7 +1,9 @@
11<?xml version="1.0" encoding="UTF-8" standalone="no"?>
22<?eclipse-pydev version="1.0"?><pydev_project>
33<pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
4−<path>/Unity8 Autopilot</path>
4+<path>/Unity8/tests/autopilot</path>
5+<path>/Unity8/.bazaar</path>
6+<path>/Unity8/tests/whitespace</path>
57</pydev_pathproperty>
68<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
79<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
.settings/Autopilot List.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<stringAttribute key="bad_container_name" value="/Unity8/.pyd"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
5+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
6+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="list unity8"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
.settings/Autopilot Run.launchnew file+14
@@ -0,0 +1,14 @@
1+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2+<launchConfiguration type="org.python.pydev.debug.regularLaunchConfigurationType">
3+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"/>
4+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"/>
5+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
6+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
7+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
8+</listAttribute>
9+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/autopilot"/>
10+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_OTHER_WORKING_DIRECTORY" value=""/>
11+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="run ${string_prompt:the test suite to run:unity8}"/>
12+<stringAttribute key="org.python.pydev.debug.ATTR_INTERPRETER" value="__default"/>
13+<stringAttribute key="org.python.pydev.debug.ATTR_PROJECT" value="Unity8"/>
14+</launchConfiguration>
debian/changelog+79
@@ -1,3 +1,82 @@
1+unity8 (8.00+14.10.20140729.1-0ubuntu1) utopic; urgency=low
2+
3+ [ Michael Terry ]
4+ * Check user's pin/password using PAM, instead of a plaintext keyfile.
5+ New build dependency: libpam0g-dev for phone unlock with PAM (LP:
6+ #1234983)
7+
8+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 23:36:30 +0000
9+
10+unity8 (8.00+14.10.20140729-0ubuntu1) utopic; urgency=medium
11+
12+ [ Gerry Boland ]
13+ [ Daniel d'Andrada ]
14+ * Re-architecture unity8 to use the QtMirCompositor library so that
15+ the Qt scenegraph renderer is used as the Mir compositor, and
16+ application surfaces are added to the QML scene as items.
17+
18+ [ Michael Zanetti ]
19+ * Port phone right-edge spread code to use QtCompositor
20+ * Add right-edge spread animation for tablet
21+
22+ [ Ubuntu daily release ]
23+ * New rebuild forced
24+
25+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Tue, 29 Jul 2014 15:07:32 +0000
26+
27+unity8 (7.90+14.10.20140725-0ubuntu1) utopic; urgency=low
28+
29+ [ CI bot ]
30+ * Resync trunk
31+
32+ [ Michał Sawicz ]
33+ * Fix the ap test for applications.
34+
35+ [ Albert Astals ]
36+ * Use deleteLater instead of a direct delete We are seeing a crash in
37+ QQuickWindowPrivate::polishItems because LVWPH is deleting items to
38+ polish from it's updatePolish which means the set in
39+ QQuickWindowPrivate::polishItems may end up with some yet-to-
40+ process-but-now-deleted items. Switching to deleteLater fixes this
41+
42+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Fri, 25 Jul 2014 10:47:34 +0000
43+
44+unity8 (7.90+14.10.20140724.1-0ubuntu1) utopic; urgency=low
45+
46+ [ Michael Zanetti ]
47+ * properly parent launcher items (LP: #1347902)
48+
49+ [ Michał Sawicz ]
50+ * Move the PyDev project files to the root, supporting .py scripts
51+ outside of tests/autopilot. Add Autopilot Run and List launch
52+ configurations to easily support debugging in Eclipse. Use
53+ add_unity8_mock macro in the Telephony plugin.
54+ * Drop FilterGrid and refactor height animations in GenericScopeView.
55+ Also implement forced category expansion. (LP: #1326470)
56+ * Move expansion button from section header to category footer. (LP:
57+ #1261300)
58+ * Fix expect-sigstop enviroment variable name. (LP: #1346819)
59+ * Make headerless categories easier Instead of having no header
60+ category (which is a bit confusing since the LVWPH code was designed
61+ so that when a category has no header it is because it shares the
62+ category with the previous one) what we have for headerless
63+ categories is a header of height 0, this way everything works as it
64+ should and results in cleaner code in the LVWPH and in
65+ GenericScopeView
66+ * Add support for header links.
67+ * Add dash PageHeader styling.
68+
69+ [ Albert Astals ]
70+ * Make headerless categories easier Instead of having no header
71+ category (which is a bit confusing since the LVWPH code was designed
72+ so that when a category has no header it is because it shares the
73+ category with the previous one) what we have for headerless
74+ categories is a header of height 0, this way everything works as it
75+ should and results in cleaner code in the LVWPH and in
76+ GenericScopeView
77+
78+ -- Ubuntu daily release <ps-jenkins@lists.canonical.com> Thu, 24 Jul 2014 20:41:29 +0000
79+
180unity8 (7.90+14.10.20140723.4-0ubuntu1) utopic; urgency=low
281
382 [ thomas-voss ]
debian/control+3−3
@@ -19,12 +19,12 @@ Build-Depends: cmake,
1919 libgsettings-qt-dev,
2020 libhardware-dev,
2121 libhud-client2-dev,
22+ libpam0g-dev,
2223 libpay2-dev,
2324 libpulse-dev,
2425 libqmenumodel-dev (>= 0.2.8),
2526 libqt5xmlpatterns5-dev,
2627 libunity-api-dev (>= 7.85),
27− libunity-mir-dev,
2828 libusermetricsoutput1-dev,
2929 libxcb1-dev,
3030 pkg-config,
@@ -80,10 +80,10 @@ Provides: indicator-renderer,
8080Depends: gsettings-desktop-schemas,
8181 libcap2-bin,
8282 libglib2.0-bin,
83− libunity-mir1 (>= 0.4),
8483 qmenumodel-qml (>= 0.2.8),
8584 qml-module-qtquick-xmllistmodel,
8685 qtdeclarative5-gsettings1.0,
86+ qtdeclarative5-qtmir-plugin (>= 0.4),
8787 qtdeclarative5-ubuntu-settings-components (>= 0.3),
8888 qtdeclarative5-ubuntu-telephony0.1,
8989 unity-launcher-impl-3,
@@ -112,7 +112,7 @@ Depends: qtdeclarative5-ubuntu-thumbnailer0.1 | ubuntu-thumbnailer-impl,
112112 unity-application-impl-2,
113113 unity-notifications-impl-3,
114114 unity-plugin-scopes | unity-scopes-impl,
115− unity-scopes-impl-0,
115+ unity-scopes-impl-2,
116116 unity8-fake-env | unity-application-impl,
117117 ${misc:Depends},
118118Breaks: unity8 (<< 7.86),
plugins/AccountsService/AccountsService.cpp+21−1
@@ -26,7 +26,8 @@ AccountsService::AccountsService(QObject* parent)
2626 m_service(new AccountsServiceDBusAdaptor(this)),
2727 m_user(qgetenv("USER")),
2828 m_demoEdges(false),
29− m_statsWelcomeScreen(false)
29+ m_statsWelcomeScreen(false),
30+ m_passwordDisplayHint(Keyboard)
3031{
3132 connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
3233 this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
@@ -47,6 +48,7 @@ void AccountsService::setUser(const QString &user)
4748 updateDemoEdges();
4849 updateBackgroundFile();
4950 updateStatsWelcomeScreen();
51+ updatePasswordDisplayHint();
5052}
5153
5254bool AccountsService::demoEdges() const
@@ -70,6 +72,11 @@ bool AccountsService::statsWelcomeScreen() const
7072 return m_statsWelcomeScreen;
7173}
7274
75+AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
76+{
77+ return m_passwordDisplayHint;
78+}
79+
7380void AccountsService::updateDemoEdges()
7481{
7582 auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
@@ -97,6 +104,15 @@ void AccountsService::updateStatsWelcomeScreen()
97104 }
98105}
99106
107+void AccountsService::updatePasswordDisplayHint()
108+{
109+ PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "PasswordDisplayHint").toInt();
110+ if (m_passwordDisplayHint != passwordDisplayHint) {
111+ m_passwordDisplayHint = passwordDisplayHint;
112+ Q_EMIT passwordDisplayHintChanged();
113+ }
114+}
115+
100116void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
101117{
102118 if (m_user != user) {
@@ -111,6 +127,10 @@ void AccountsService::propertiesChanged(const QString &user, const QString &inte
111127 if (changed.contains("StatsWelcomeScreen")) {
112128 updateStatsWelcomeScreen();
113129 }
130+ } else if (interface == "com.ubuntu.AccountsService.SecurityPrivacy") {
131+ if (changed.contains("PasswordDisplayHint")) {
132+ updatePasswordDisplayHint();
133+ }
114134 }
115135}
116136
plugins/AccountsService/AccountsService.h+13
@@ -27,6 +27,7 @@ class AccountsServiceDBusAdaptor;
2727class AccountsService: public QObject
2828{
2929 Q_OBJECT
30+ Q_ENUMS(PasswordDisplayHint)
3031 Q_PROPERTY (QString user
3132 READ user
3233 WRITE setUser
@@ -41,8 +42,16 @@ class AccountsService: public QObject
4142 Q_PROPERTY (bool statsWelcomeScreen
4243 READ statsWelcomeScreen
4344 NOTIFY statsWelcomeScreenChanged)
45+ Q_PROPERTY (PasswordDisplayHint passwordDisplayHint
46+ READ passwordDisplayHint
47+ NOTIFY passwordDisplayHintChanged)
4448
4549public:
50+ enum PasswordDisplayHint {
51+ Keyboard,
52+ Numeric,
53+ };
54+
4655 explicit AccountsService(QObject *parent = 0);
4756
4857 QString user() const;
@@ -51,12 +60,14 @@ public:
5160 void setDemoEdges(bool demoEdges);
5261 QString backgroundFile() const;
5362 bool statsWelcomeScreen() const;
63+ PasswordDisplayHint passwordDisplayHint() const;
5464
5565Q_SIGNALS:
5666 void userChanged();
5767 void demoEdgesChanged();
5868 void backgroundFileChanged();
5969 void statsWelcomeScreenChanged();
70+ void passwordDisplayHintChanged();
6071
6172private Q_SLOTS:
6273 void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
@@ -66,12 +77,14 @@ private:
6677 void updateDemoEdges();
6778 void updateBackgroundFile();
6879 void updateStatsWelcomeScreen();
80+ void updatePasswordDisplayHint();
6981
7082 AccountsServiceDBusAdaptor *m_service;
7183 QString m_user;
7284 bool m_demoEdges;
7385 QString m_backgroundFile;
7486 bool m_statsWelcomeScreen;
87+ PasswordDisplayHint m_passwordDisplayHint;
7588};
7689
7790#endif
plugins/AccountsService/plugin.cpp+1
@@ -33,5 +33,6 @@ void AccountsServicePlugin::registerTypes(const char *uri)
3333{
3434 Q_ASSERT(uri == QLatin1String("AccountsService"));
3535 qDBusRegisterMetaType<QList<QVariantMap>>();
36+ qRegisterMetaType<AccountsService::PasswordDisplayHint>("AccountsService::PasswordDisplayHint");
3637 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
3738}
plugins/Dash/ScopeStyle.qml+6
@@ -70,6 +70,12 @@ QtObject {
7070 /// Source of the logo image for the header
7171 readonly property url headerLogo: "logo" in d.headerStyle ? d.headerStyle["logo"] : ""
7272
73+ /// Background style for the header
74+ readonly property url headerBackground: "background" in d.headerStyle ? d.headerStyle["background"] : ""
75+
76+ /// Foreground color for the header
77+ readonly property color headerForeground: "foreground-color" in d.headerStyle ? d.headerStyle["foreground-color"] : foreground
78+
7379 //! @cond
7480 property var d: QtObject {
7581 readonly property real foregroundLuminance: luminance(foreground)
plugins/Dash/listviewwithpageheader.cpp+1−6
@@ -141,8 +141,6 @@ void ListViewWithPageHeader::ListItem::setCulled(bool culled)
141141void ListViewWithPageHeader::ListItem::setSectionItem(QQuickItem *sectionItem)
142142{
143143 m_sectionItem = sectionItem;
144− QQmlContext *context = QQmlEngine::contextForObject(m_item)->parentContext();
145− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(sectionItem != nullptr));
146144}
147145
148146ListViewWithPageHeader::ListViewWithPageHeader()
@@ -658,7 +656,7 @@ void ListViewWithPageHeader::reallyReleaseItem(ListItem *listItem)
658656 if (flags & QQmlDelegateModel::Destroyed) {
659657 item->setParentItem(nullptr);
660658 }
661− delete listItem->sectionItem();
659+ listItem->sectionItem()->deleteLater();
662660 delete listItem;
663661}
664662
@@ -685,8 +683,6 @@ QQuickItem *ListViewWithPageHeader::getSectionItem(int modelIndex, bool alreadyI
685683 return nullptr;
686684
687685 const QString section = m_delegateModel->stringValue(modelIndex, m_sectionProperty);
688− if (section.isEmpty())
689− return nullptr;
690686
691687 if (modelIndex > 0) {
692688 const QString prevSection = m_delegateModel->stringValue(modelIndex - 1, m_sectionProperty);
@@ -877,7 +873,6 @@ void ListViewWithPageHeader::itemCreated(int modelIndex, QObject *object)
877873 QQmlContext *context = QQmlEngine::contextForObject(item)->parentContext();
878874 context->setContextProperty(QLatin1String("ListViewWithPageHeader"), this);
879875 context->setContextProperty(QLatin1String("heightToClip"), QVariant::fromValue<int>(0));
880− context->setContextProperty(QLatin1String("hasSectionHeader"), QVariant::fromValue<bool>(false));
881876 if (modelIndex == m_asyncRequestedIndex) {
882877 createItem(modelIndex, false);
883878 refill();
plugins/LightDM/plugin.cpp+2
@@ -69,6 +69,8 @@ void LightDMPlugin::registerTypes(const char *uri)
6969 qmlRegisterType<UserMetricsOutput::ColorTheme>();
7070
7171 Q_ASSERT(uri == QLatin1String("LightDM"));
72+ qRegisterMetaType<QLightDM::Greeter::MessageType>("QLightDM::Greeter::MessageType");
73+ qRegisterMetaType<QLightDM::Greeter::PromptType>("QLightDM::Greeter::PromptType");
7274 qmlRegisterSingletonType<Greeter>(uri, 0, 1, "Greeter", greeter_provider);
7375 qmlRegisterSingletonType<UsersModel>(uri, 0, 1, "Users", users_provider);
7476 qmlRegisterUncreatableType<QLightDM::UsersModel>(uri, 0, 1, "UserRoles", "Type is not instantiable");
plugins/Unity/Launcher/launchermodel.cpp+3−2
@@ -141,7 +141,8 @@ void LauncherModel::pin(const QString &appId, int index)
141141 beginInsertRows(QModelIndex(), index, index);
142142 LauncherItem *item = new LauncherItem(appId,
143143 m_backend->displayName(appId),
144− m_backend->icon(appId));
144+ m_backend->icon(appId),
145+ this);
145146 item->setPinned(true);
146147 m_list.insert(index, item);
147148 endInsertRows();
@@ -326,7 +327,7 @@ void LauncherModel::applicationAdded(const QModelIndex &parent, int row)
326327 if (found) {
327328 // Shall we paint some running/recent app highlight? If yes, do it here.
328329 } else {
329− LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString());
330+ LauncherItem *item = new LauncherItem(app->appId(), app->name(), app->icon().toString(), this);
330331 item->setRecent(true);
331332 item->setFocused(app->focused());
332333
plugins/Utils/CMakeLists.txt+1
@@ -16,6 +16,7 @@ set(QMLPLUGIN_SRC
1616 relativetimeformatter.cpp
1717 timeformatter.cpp
1818 unitymenumodelpaths.cpp
19+ windowkeysfilter.cpp
1920 easingcurve.cpp
2021 plugin.cpp
2122 )
plugins/Utils/easingcurve.cpp+5−1
@@ -34,7 +34,11 @@ QEasingCurve::Type EasingCurve::type() const
3434
3535void EasingCurve::setType(const QEasingCurve::Type &type)
3636{
37− m_easingCurve.setType(type);
37+ // FIXME: Working around bug https://bugreports.qt-project.org/browse/QTBUG-38686 here
38+ QEasingCurve newCurve;
39+ newCurve.setType(type);
40+ newCurve.setPeriod(m_easingCurve.period());
41+ m_easingCurve = newCurve;
3842 Q_EMIT typeChanged();
3943}
4044
plugins/Utils/plugin.cpp+2
@@ -31,6 +31,7 @@
3131#include "relativetimeformatter.h"
3232#include "timeformatter.h"
3333#include "unitymenumodelpaths.h"
34+#include "windowkeysfilter.h"
3435#include "easingcurve.h"
3536
3637void UtilsPlugin::registerTypes(const char *uri)
@@ -41,6 +42,7 @@ void UtilsPlugin::registerTypes(const char *uri)
4142 qmlRegisterType<QSortFilterProxyModelQML>(uri, 0, 1, "SortFilterProxyModel");
4243 qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
4344 qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
45+ qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
4446 qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
4547 qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
4648 qmlRegisterType<RelativeTimeFormatter>(uri, 0, 1, "RelativeTimeFormatter");
plugins/Utils/windowkeysfilter.cppnew file+57
@@ -0,0 +1,57 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
17+ */
18+
19+#include "windowkeysfilter.h"
20+
21+#include <QQuickWindow>
22+
23+WindowKeysFilter::WindowKeysFilter(QQuickItem *parent)
24+ : QQuickItem(parent)
25+{
26+ connect(this, &QQuickItem::windowChanged,
27+ this, &WindowKeysFilter::setupFilterOnWindow);
28+}
29+
30+bool WindowKeysFilter::eventFilter(QObject *watched, QEvent *event)
31+{
32+ Q_ASSERT(!m_filteredWindow.isNull());
33+ Q_ASSERT(watched == static_cast<QObject*>(m_filteredWindow.data()));
34+
35+ if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease) {
36+ // Let QML see this event and decide if it does not want it
37+ event->accept();
38+ QCoreApplication::sendEvent(this, event);
39+ return event->isAccepted();
40+ } else {
41+ // Not interested
42+ return false;
43+ }
44+}
45+
46+void WindowKeysFilter::setupFilterOnWindow(QQuickWindow *window)
47+{
48+ if (!m_filteredWindow.isNull()) {
49+ m_filteredWindow->removeEventFilter(this);
50+ m_filteredWindow.clear();
51+ }
52+
53+ if (window) {
54+ window->installEventFilter(this);
55+ m_filteredWindow = window;
56+ }
57+}
plugins/Utils/windowkeysfilter.hnew file+51
@@ -0,0 +1,51 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Daniel d'Andrada <daniel.dandrada@canonical.com>
17+ */
18+
19+#ifndef UNITY_WINDOWKEYSFILTER_H
20+#define UNITY_WINDOWKEYSFILTER_H
21+
22+#include <QQuickItem>
23+#include <QPointer>
24+
25+/*
26+ Receives all key events that arrive in the QQuickWindow where this item is placed.
27+
28+ Rejected key events will be allowed to be processed normally by the QQuickWindow whereas
29+ accepted ones will be filtered out. Events are accepted by default, so make sure you reject
30+ the keys you're not interested in.
31+
32+ If more than one WindowKeysFilter exist in the same QML scene (and thus in the same QQuickWindow)
33+ they will be called in the order of creation, which can be tricky to assess. So the best practice
34+ is to have at most one WindowKeysFilter per QML scene.
35+ */
36+class WindowKeysFilter : public QQuickItem
37+{
38+ Q_OBJECT
39+public:
40+ WindowKeysFilter(QQuickItem *parent = 0);
41+
42+ bool eventFilter(QObject *watched, QEvent *event);
43+
44+private Q_SLOTS:
45+ void setupFilterOnWindow(QQuickWindow *window);
46+
47+private:
48+ QPointer<QQuickWindow> m_filteredWindow;
49+};
50+
51+#endif // UNITY_WINDOWKEYSFILTER_H
po/am.po+23−15
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-20 18:16+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-27 01:25+0000\n"
1212"Last-Translator: samson <Unknown>\n"
1313"Language-Team: Amharic <am@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +28,7 @@ msgstr "አቋራጭ መለያያ"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
31−msgstr ""
31+msgstr "መግቢያውን መዝለያ"
3232
3333#: qml/Components/EdgeDemo.qml:113
3434msgid "Right edge"
@@ -80,10 +80,6 @@ msgstr "የ ድንገተኛ ጥሪ"
8080msgid "OK"
8181msgstr "እሺ"
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "በቅርብ የፈለጉዋቸው"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "ጨርሷል"
105101msgid "See more"
106102msgstr "ተጨማሪ መመልከቻ"
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr "አነስተኛ መመልከቻ"
111107
@@ -113,6 +109,10 @@ msgstr "አነስተኛ መመልከቻ"
113109msgid "Recent"
114110msgstr "የቅርብ ጊዜ"
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "ሁሉንም መመልከቻ"
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr "ተጨማሪ..."
@@ -121,15 +121,15 @@ msgstr "ተጨማሪ..."
121121msgid "Less..."
122122msgstr "አነስተኛ..."
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130−msgstr ""
130+msgstr "ግምገማ መጨመሪያ"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "መላኪያ"
135135
@@ -165,9 +165,17 @@ msgstr "የመግቢያ ቃል ማሳያ"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "ስብሰባ"
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170−msgstr ""
178+msgstr "ወረፋ በመጠበቅ ላይ…"
171179
172180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173181msgid "Downloading"
po/ar.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-05-22 08:22+0000\n"
1212"Last-Translator: Ibrahim Saed <ibraheem5000@gmail.com>\n"
1313"Language-Team: Arabic <ar@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "مكالمة طوارئ"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "عمليات البحث الأخيرة"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108104msgid "See more"
109105msgstr "شاهد المزيد"
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr "شاهد أقل"
114110
@@ -116,6 +112,10 @@ msgstr "شاهد أقل"
116112msgid "Recent"
117113msgstr "استُخدمت مؤخرًا"
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr "المزيد..."
@@ -124,15 +124,15 @@ msgstr "المزيد..."
124124msgid "Less..."
125125msgstr "أقل..."
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "قيّم ذلك"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "أضف تعليق"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "أرسل"
138138
@@ -168,6 +168,14 @@ msgstr "عرض كلمة السر"
168168msgid "Please enter SIM PIN"
169169msgstr "من فضلك أدخِل رقم التعريف الشخصي لبطاقة SIM"
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr ""
po/ast.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-15 16:32+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 16:51+0000\n"
1212"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
1313"Language-Team: Asturian <ast@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Llamada d'emerxencia"
8484msgid "OK"
8585msgstr "Aceutar"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Busques recientes"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "FECHO"
109105msgid "See more"
110106msgstr "Ver más"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Ver menos"
115111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117113msgid "Recent"
118114msgstr "Reciente"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ver too"
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Más…"
@@ -125,15 +125,15 @@ msgstr "Más…"
125125msgid "Less..."
126126msgstr "Menos…"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Valorar esto"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Amestar una reseña"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Unviar"
139139
@@ -169,6 +169,14 @@ msgstr "Amosar contraseña"
169169msgid "Please enter SIM PIN"
170170msgstr "Escribi'l PIN de la SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Tocar pa tornar a la llamada..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Conferencia"
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr "N'espera…"
po/az.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-15 09:50+0000\n"
1212"Last-Translator: Turan Mahmudov <turan.mahmudov@gmail.com>\n"
1313"Language-Team: Azerbaijani <az@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -81,10 +81,6 @@ msgstr "Zərurət zəngi"
8181msgid "OK"
8282msgstr ""
8383
84−#: qml/Components/PageHeader.qml:366
85−msgid "Recent searches"
86−msgstr "Son axtarışlar"
87−
8884#: qml/Components/PassphraseLockscreen.qml:60
8985#, qt-format
9086msgid "Hello %1"
@@ -106,7 +102,7 @@ msgstr ""
106102msgid "See more"
107103msgstr ""
108104
109−#: qml/Components/SeeMore.qml:58
105+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
110106msgid "See less"
111107msgstr ""
112108
@@ -114,6 +110,10 @@ msgstr ""
114110msgid "Recent"
115111msgstr ""
116112
113+#: qml/Dash/GenericScopeView.qml:330
114+msgid "See all"
115+msgstr ""
116+
117117#: qml/Dash/Previews/PreviewActionCombo.qml:34
118118msgid "More..."
119119msgstr ""
@@ -122,15 +122,15 @@ msgstr ""
122122msgid "Less..."
123123msgstr ""
124124
125−#: qml/Dash/Previews/PreviewRatingInput.qml:82
125+#: qml/Dash/Previews/PreviewRatingInput.qml:81
126126msgid "Rate this"
127127msgstr "Qiymət ver"
128128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:128
129+#: qml/Dash/Previews/PreviewRatingInput.qml:126
130130msgid "Add a review"
131131msgstr "Rəy yaz"
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:168
133+#: qml/Dash/Previews/PreviewRatingInput.qml:166
134134msgid "Send"
135135msgstr "Göndər"
136136
@@ -166,6 +166,14 @@ msgstr "Parolu göstər"
166166msgid "Please enter SIM PIN"
167167msgstr ""
168168
169+#: qml/Panel/ActiveCallHint.qml:77
170+msgid "Tap to return to call..."
171+msgstr ""
172+
173+#: qml/Panel/ActiveCallHint.qml:90
174+msgid "Conference"
175+msgstr ""
176+
169177#: qml/Panel/Indicators/MenuItemFactory.qml:583
170178msgid "In queue…"
171179msgstr ""
po/bg.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-04-01 14:08+0000\n"
1212"Last-Translator: Atanas Kovachki <Unknown>\n"
1313"Language-Team: Bulgarian <bg@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Спешно повикване"
8787msgid "OK"
8888msgstr ""
8989
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Последни търсения"
93−
9490#: qml/Components/PassphraseLockscreen.qml:60
9591#, qt-format
9692msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr ""
112108msgid "See more"
113109msgstr ""
114110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116112msgid "See less"
117113msgstr ""
118114
@@ -120,6 +116,10 @@ msgstr ""
120116msgid "Recent"
121117msgstr "Последни"
122118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr ""
122+
123123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124124msgid "More..."
125125msgstr ""
@@ -128,15 +128,15 @@ msgstr ""
128128msgid "Less..."
129129msgstr "По-малко..."
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132132msgid "Rate this"
133133msgstr "Оценете това"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136136msgid "Add a review"
137137msgstr "Добави отзив"
138138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140140msgid "Send"
141141msgstr "Изпрати"
142142
@@ -172,6 +172,14 @@ msgstr "Покажи паролата"
172172msgid "Please enter SIM PIN"
173173msgstr ""
174174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr ""
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr ""
182+
175183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176184msgid "In queue…"
177185msgstr ""
po/br.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-15 06:44+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-28 06:44+0000\n"
1212"Last-Translator: Fohanno Thierry <thierry.fohanno@ofis-bzh.org>\n"
1313"Language-Team: Breton <br@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-29 06:54+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Pellgomzadenn vallus"
8787msgid "OK"
8888msgstr "Mat eo"
8989
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Enklaskoù graet nevez zo"
93−
9490#: qml/Components/PassphraseLockscreen.qml:60
9591#, qt-format
9692msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr "ECHU"
112108msgid "See more"
113109msgstr "Gwelet muioc'h"
114110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116112msgid "See less"
117113msgstr "Gwelet nebeutoc'h"
118114
@@ -120,6 +116,10 @@ msgstr "Gwelet nebeutoc'h"
120116msgid "Recent"
121117msgstr "Nevez zo"
122118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Gwelet pep tra"
122+
123123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124124msgid "More..."
125125msgstr "Muioc'h..."
@@ -128,15 +128,15 @@ msgstr "Muioc'h..."
128128msgid "Less..."
129129msgstr "Nebeutoc'h..."
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132132msgid "Rate this"
133133msgstr "Priziit an dra-mañ"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136136msgid "Add a review"
137137msgstr "Ouzhpennañ un ali"
138138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140140msgid "Send"
141141msgstr "Kas"
142142
@@ -172,6 +172,14 @@ msgstr "Diskouez ar ger-tremen"
172172msgid "Please enter SIM PIN"
173173msgstr "Ebarzhit kod PIN ho kartenn SIM, mar plij"
174174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr "Touchit evit distreiñ d'ar bellgomzadenn..."
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Kendiviz"
182+
175183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176184msgid "In queue…"
177185msgstr "El lostennad..."
po/bs.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-16 22:33+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Bosnian <bs@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/ca.po+28−20
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-06-13 07:47+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 10:21+0000\n"
1212"Last-Translator: David Planella <david.planella@ubuntu.com>\n"
1313"Language-Team: Catalan <ca@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Enganxa la drecera"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Desenganxa la drecera"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -88,10 +88,6 @@ msgstr "Trucada d'emergència"
8888msgid "OK"
8989msgstr "D'acord"
9090
91−#: qml/Components/PageHeader.qml:366
92−msgid "Recent searches"
93−msgstr "Cerques recents"
94−
9591#: qml/Components/PassphraseLockscreen.qml:60
9692#, qt-format
9793msgid "Hello %1"
@@ -113,7 +109,7 @@ msgstr "Fet"
113109msgid "See more"
114110msgstr "Mostra'n més"
115111
116−#: qml/Components/SeeMore.qml:58
112+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
117113msgid "See less"
118114msgstr "Mostra'n menys"
119115
@@ -121,6 +117,10 @@ msgstr "Mostra'n menys"
121117msgid "Recent"
122118msgstr "Recents"
123119
120+#: qml/Dash/GenericScopeView.qml:330
121+msgid "See all"
122+msgstr "Mostra-ho tot"
123+
124124#: qml/Dash/Previews/PreviewActionCombo.qml:34
125125msgid "More..."
126126msgstr "Més..."
@@ -129,15 +129,15 @@ msgstr "Més..."
129129msgid "Less..."
130130msgstr "Menys..."
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:82
132+#: qml/Dash/Previews/PreviewRatingInput.qml:81
133133msgid "Rate this"
134134msgstr "Puntueu-ho"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:128
136+#: qml/Dash/Previews/PreviewRatingInput.qml:126
137137msgid "Add a review"
138138msgstr "Afegiu una ressenya"
139139
140−#: qml/Dash/Previews/PreviewRatingInput.qml:168
140+#: qml/Dash/Previews/PreviewRatingInput.qml:166
141141msgid "Send"
142142msgstr "Envia"
143143
@@ -173,29 +173,37 @@ msgstr "Mostra la contrasenya"
173173msgid "Please enter SIM PIN"
174174msgstr "Introduïu el PIN de la targeta SIM"
175175
176+#: qml/Panel/ActiveCallHint.qml:77
177+msgid "Tap to return to call..."
178+msgstr "Feu un toc per tornar a la trucada..."
179+
180+#: qml/Panel/ActiveCallHint.qml:90
181+msgid "Conference"
182+msgstr "Conferència"
183+
176184#: qml/Panel/Indicators/MenuItemFactory.qml:583
177185msgid "In queue…"
178−msgstr ""
186+msgstr "A la cua..."
179187
180188#: qml/Panel/Indicators/MenuItemFactory.qml:587
181189msgid "Downloading"
182−msgstr ""
190+msgstr "S'està baixant"
183191
184192#: qml/Panel/Indicators/MenuItemFactory.qml:589
185193msgid "Paused, tap to resume"
186−msgstr ""
194+msgstr "En pausa, feu un toc per continuar"
187195
188196#: qml/Panel/Indicators/MenuItemFactory.qml:591
189197msgid "Canceled"
190−msgstr ""
198+msgstr "S'ha cancel·lat"
191199
192200#: qml/Panel/Indicators/MenuItemFactory.qml:593
193201msgid "Finished"
194−msgstr ""
202+msgstr "S'ha finalitzat"
195203
196204#: qml/Panel/Indicators/MenuItemFactory.qml:595
197205msgid "Failed, tap to retry"
198−msgstr ""
206+msgstr "Ha fallat, feu un toc per tornar-ho a intentar"
199207
200208#: qml/Panel/SearchIndicator.qml:27
201209msgid "Search"
po/ckb.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-21 11:05+0000\n"
1212"Last-Translator: Aras <aras.noori@gmail.com>\n"
1313"Language-Team: Kurdish (Sorani) <ckb@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "هێڵی فریاگوزاری"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "دوایین گەڕانەکان"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "پلە دابنی بۆی"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "پێداچوونەوە زۆر بکە"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "ناردن"
135135
@@ -165,6 +165,14 @@ msgstr "تێپەڕەوشە پیشان بدە"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/cs.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-08 10:11+0000\n"
1212"Last-Translator: Tadeáš Pařík <tadeas.parik@gmail.com>\n"
1313"Language-Team: Czech <cs@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "Tísňové volání"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Poslední vyhledávání"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "Ohodnoťte to"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "Přidat recenzi"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "Odeslat"
135135
@@ -165,6 +165,14 @@ msgstr "Zobrazit heslo"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/da.po+22−14
@@ -8,15 +8,15 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
11−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
12−"PO-Revision-Date: 2014-07-22 15:46+0000\n"
13−"Last-Translator: Kenneth Ramsussen <kentora@kentora.dk>\n"
11+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
12+"PO-Revision-Date: 2014-07-30 12:37+0000\n"
13+"Last-Translator: Ask Hjorth Larsen <asklarsen@gmail.com>\n"
1414"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
1515"MIME-Version: 1.0\n"
1616"Content-Type: text/plain; charset=UTF-8\n"
1717"Content-Transfer-Encoding: 8bit\n"
18−"X-Launchpad-Export-Date: 2014-07-23 07:01+0000\n"
19−"X-Generator: Launchpad (build 17114)\n"
18+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
19+"X-Generator: Launchpad (build 17131)\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
2222#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -72,7 +72,7 @@ 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−"Du mestrer nu kantgestusserne og kan begynde at bruge telefonen<br><br>Tryk "
75+"Du mestrer nu kantbevægelserne og kan begynde at bruge telefonen<br><br>Tryk "
7676"på skærmen for at starte"
7777
7878#: qml/Components/Lockscreen.qml:214
@@ -83,10 +83,6 @@ msgstr "Nødopkald"
8383msgid "OK"
8484msgstr "O.k."
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Seneste søgninger"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr "FÆRDIG"
108104msgid "See more"
109105msgstr "Vis mere"
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr "Vis mindre"
114110
@@ -116,6 +112,10 @@ msgstr "Vis mindre"
116112msgid "Recent"
117113msgstr "Seneste"
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Se alle"
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr "Mere..."
@@ -124,15 +124,15 @@ msgstr "Mere..."
124124msgid "Less..."
125125msgstr "Mindre..."
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "Bedøm dette"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "Tilføj en forhåndsvisning"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "Send"
138138
@@ -168,6 +168,14 @@ msgstr "Vis adgangskode"
168168msgid "Please enter SIM PIN"
169169msgstr "Indtast venligst PIN for SIM"
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tryk for at besvare opkaldet..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Konference"
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr "I kø…"
po/de.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-15 13:20+0000\n"
1212"Last-Translator: Phillip Sz <Unknown>\n"
1313"Language-Team: German <de@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Notruf"
8585msgid "OK"
8686msgstr "OK"
8787
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Zuletzt verwendete Suchbegriffe"
91−
9288#: qml/Components/PassphraseLockscreen.qml:60
9389#, qt-format
9490msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "ERLEDIGT"
110106msgid "See more"
111107msgstr "Mehr ansehen"
112108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114110msgid "See less"
115111msgstr "Weniger ansehen"
116112
@@ -118,6 +114,10 @@ msgstr "Weniger ansehen"
118114msgid "Recent"
119115msgstr "Kürzlich"
120116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr ""
120+
121121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122122msgid "More..."
123123msgstr "Mehr …"
@@ -126,15 +126,15 @@ msgstr "Mehr …"
126126msgid "Less..."
127127msgstr "Weniger …"
128128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130130msgid "Rate this"
131131msgstr "Bewerten"
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134134msgid "Add a review"
135135msgstr "Bewertung hinzufügen"
136136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138138msgid "Send"
139139msgstr "Senden"
140140
@@ -170,6 +170,14 @@ msgstr "Passwort anzeigen"
170170msgid "Please enter SIM PIN"
171171msgstr "Bitte die PIN der SIM eingeben"
172172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr ""
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr ""
180+
173181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174182msgid "In queue…"
175183msgstr "In Warteschlange …"
po/el.po+34−26
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-02-26 09:58+0000\n"
12−"Last-Translator: j3lc <x_nikos@yahoo.gr>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-28 16:06+0000\n"
12+"Last-Translator: Chris Taklis (aka Kailor) <ctaklis@gmail.com>\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"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-29 06:54+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Καρφίτσωμα συντόμευσης"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Ξεκαρφίτσωμα συντόμευσης"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -82,11 +82,7 @@ msgstr "Κλήση έκτακτης ανάγκης"
8282
8383#: qml/Components/Lockscreen.qml:231
8484msgid "OK"
85−msgstr ""
86−
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Πρόσφατες αναζητήσεις"
85+msgstr "OK"
9086
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
@@ -99,47 +95,51 @@ msgstr "Γεια σας"
9995
10096#: qml/Components/PinLockscreen.qml:198
10197msgid "CANCEL"
102−msgstr ""
98+msgstr "ΑΚΥΡΩΣΗ"
10399
104100#: qml/Components/PinLockscreen.qml:216
105101msgid "DONE"
106−msgstr ""
102+msgstr "ΟΛΟΚΛΗΡΩΣΗ"
107103
108104#: qml/Components/SeeMore.qml:35
109105msgid "See more"
110106msgstr "Περρισότερα"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Λιγότερα"
115111
116112#: qml/Dash/DashApps.qml:37
117113msgid "Recent"
118−msgstr ""
114+msgstr "Πρόσφατα"
115+
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Εμφάνιση όλων"
119119
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122−msgstr ""
122+msgstr "Περισσότερα..."
123123
124124#: qml/Dash/Previews/PreviewActionCombo.qml:34
125125msgid "Less..."
126−msgstr ""
126+msgstr "Λιγότερα..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Βαθμολογήστε το"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Προσθέστε την αξιολόγησή σας"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Αποστολή"
139139
140140#: qml/Greeter/Greeter.qml:157
141141msgid "Swipe to unlock"
142−msgstr ""
142+msgstr "Σύρετε για να ξεκλειδώσετε"
143143
144144#: qml/Hud/HudParametrizedActionsPage.qml:132
145145msgid "Confirm"
@@ -169,25 +169,33 @@ msgstr "Εμφάνιση κωδικού"
169169msgid "Please enter SIM PIN"
170170msgstr "Παρακαλώ εισάγετε το PIN της κάρτας SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr ""
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Συνδιάσκεψη"
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr ""
175183
176184#: qml/Panel/Indicators/MenuItemFactory.qml:587
177185msgid "Downloading"
178−msgstr ""
186+msgstr "Λήψη σε εξέλιξη"
179187
180188#: qml/Panel/Indicators/MenuItemFactory.qml:589
181189msgid "Paused, tap to resume"
182−msgstr ""
190+msgstr "Σταματημένο, αγγίξτε για συνέχιση"
183191
184192#: qml/Panel/Indicators/MenuItemFactory.qml:591
185193msgid "Canceled"
186−msgstr ""
194+msgstr "Ακυρώθηκε"
187195
188196#: qml/Panel/Indicators/MenuItemFactory.qml:593
189197msgid "Finished"
190−msgstr ""
198+msgstr "Ολοκληρώθηκε"
191199
192200#: qml/Panel/Indicators/MenuItemFactory.qml:595
193201msgid "Failed, tap to retry"
po/en_AU.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-18 10:38+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-27 12:14+0000\n"
1212"Last-Translator: Jared Norris <jarednorris@ubuntu.com>\n"
1313"Language-Team: English (Australia) <en_AU@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Emergency Call"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recent searches"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "DONE"
107103msgid "See more"
108104msgstr "See more"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "See less"
113109
@@ -115,6 +111,10 @@ msgstr "See less"
115111msgid "Recent"
116112msgstr "Recent"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "See all"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "More..."
@@ -123,15 +123,15 @@ msgstr "More..."
123123msgid "Less..."
124124msgstr "Less..."
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "Rate this"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "Add a review"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "Send"
137137
@@ -167,6 +167,14 @@ msgstr "Show password"
167167msgid "Please enter SIM PIN"
168168msgstr "Please enter SIM PIN"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tap to return to call..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Conference"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "In queue…"
po/en_GB.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-10 10:59+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-27 14:09+0000\n"
1212"Last-Translator: Alan Pope ㋛ <alan@ubuntu.com>\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"
17−"X-Launchpad-Export-Date: 2014-07-11 06:15+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Emergency Call"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recent searches"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "DONE"
107103msgid "See more"
108104msgstr "See more"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "See less"
113109
@@ -115,6 +111,10 @@ msgstr "See less"
115111msgid "Recent"
116112msgstr "Recent"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "See all"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "More..."
@@ -123,15 +123,15 @@ msgstr "More..."
123123msgid "Less..."
124124msgstr "Less..."
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "Rate this"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "Add a review"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "Send"
137137
@@ -167,6 +167,14 @@ msgstr "Show password"
167167msgid "Please enter SIM PIN"
168168msgstr "Please enter SIM PIN"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tap to return to call..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Conference"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "In queue…"
po/eo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Esperanto <eo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/es.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-12 05:24+0000\n"
12−"Last-Translator: Adolfo Jayme <fitoschido@gmail.com>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-26 06:22+0000\n"
12+"Last-Translator: Paco Molinero <paco@byasl.com>\n"
1313"Language-Team: Spanish <es@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-13 06:33+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Llamada de emergencia"
8585msgid "OK"
8686msgstr "Aceptar"
8787
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Búsquedas recientes"
91−
9288#: qml/Components/PassphraseLockscreen.qml:60
9389#, qt-format
9490msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "HECHO"
110106msgid "See more"
111107msgstr "Ver más"
112108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114110msgid "See less"
115111msgstr "Ver menos"
116112
@@ -118,6 +114,10 @@ msgstr "Ver menos"
118114msgid "Recent"
119115msgstr "Recientes"
120116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Ver todo"
120+
121121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122122msgid "More..."
123123msgstr "Más…"
@@ -126,15 +126,15 @@ msgstr "Más…"
126126msgid "Less..."
127127msgstr "Menos…"
128128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130130msgid "Rate this"
131131msgstr "Valorar esto"
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134134msgid "Add a review"
135135msgstr "Añadir una reseña"
136136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138138msgid "Send"
139139msgstr "Enviar"
140140
@@ -170,6 +170,14 @@ msgstr "Mostrar contraseña"
170170msgid "Please enter SIM PIN"
171171msgstr "Escriba el PIN de la SIM"
172172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Toque para volver a llamar..."
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Conferencia"
180+
173181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174182msgid "In queue…"
175183msgstr "En espera…"
po/eu.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-16 18:11+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 12:38+0000\n"
1212"Last-Translator: Ibai Oihanguren Sala <Unknown>\n"
1313"Language-Team: Basque <eu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Larrialdi-deia"
8484msgid "OK"
8585msgstr "Ados"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Azken bilaketak"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "EGINDA"
109105msgid "See more"
110106msgstr "Ikusi gehiago"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Ikusi gutxiago"
115111
@@ -117,6 +113,10 @@ msgstr "Ikusi gutxiago"
117113msgid "Recent"
118114msgstr "Azkenak"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ikusi guztiak"
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Gehiago..."
@@ -125,15 +125,15 @@ msgstr "Gehiago..."
125125msgid "Less..."
126126msgstr "Gutxiago..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Puntuatu hau"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Gehitu kritika"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Bidali"
139139
@@ -169,6 +169,14 @@ msgstr "Erakutsi pasahitza"
169169msgid "Please enter SIM PIN"
170170msgstr "Sartu SIMaren PINa"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Sakatu deia itzultzeko..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferentzia"
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr "Ilaran..."
po/fa.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-10-31 19:02+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Persian <fa@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/fi.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-09 17:26+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 16:07+0000\n"
1212"Last-Translator: Jiri Grönroos <Unknown>\n"
1313"Language-Team: Finnish <fi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Hätäpuhelu"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Viimeisimmät haut"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "VALMIS"
107103msgid "See more"
108104msgstr "Näytä lisää"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "Näytä vähemmän"
113109
@@ -115,6 +111,10 @@ msgstr "Näytä vähemmän"
115111msgid "Recent"
116112msgstr "Viimeisimmät"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Näytä kaikki"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "Lisää..."
@@ -123,15 +123,15 @@ msgstr "Lisää..."
123123msgid "Less..."
124124msgstr "Vähemmän..."
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "Arvioi tämä"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "Lisää arvostelu"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "Lähetä"
137137
@@ -167,6 +167,14 @@ msgstr "Näytä salasana"
167167msgid "Please enter SIM PIN"
168168msgstr "Anna SIM-kortin PIN-koodi"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Napauta palataksesi puheluun..."
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Ryhmäpuhelu"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "Jonossa…"
po/fo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-14 20:08+0000\n"
1212"Last-Translator: Jógvan Olsen <jeggy@jebster.net>\n"
1313"Language-Team: Faroese <fo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/fr.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-18 18:31+0000\n"
12−"Last-Translator: Nicolas Delvaux <Unknown>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-26 20:52+0000\n"
12+"Last-Translator: Anne <anneonyme017@gmail.com>\n"
1313"Language-Team: French <fr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -89,10 +89,6 @@ msgstr "Appel d'urgence"
8989msgid "OK"
9090msgstr "OK"
9191
92−#: qml/Components/PageHeader.qml:366
93−msgid "Recent searches"
94−msgstr "Recherches récentes"
95−
9692#: qml/Components/PassphraseLockscreen.qml:60
9793#, qt-format
9894msgid "Hello %1"
@@ -114,7 +110,7 @@ msgstr "VALIDER"
114110msgid "See more"
115111msgstr "Voir plus"
116112
117−#: qml/Components/SeeMore.qml:58
113+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
118114msgid "See less"
119115msgstr "Voir moins"
120116
@@ -122,6 +118,10 @@ msgstr "Voir moins"
122118msgid "Recent"
123119msgstr "Récent"
124120
121+#: qml/Dash/GenericScopeView.qml:330
122+msgid "See all"
123+msgstr "Tout voir"
124+
125125#: qml/Dash/Previews/PreviewActionCombo.qml:34
126126msgid "More..."
127127msgstr "Plus..."
@@ -130,15 +130,15 @@ msgstr "Plus..."
130130msgid "Less..."
131131msgstr "Moins..."
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:82
133+#: qml/Dash/Previews/PreviewRatingInput.qml:81
134134msgid "Rate this"
135135msgstr "Evaluez ceci"
136136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:128
137+#: qml/Dash/Previews/PreviewRatingInput.qml:126
138138msgid "Add a review"
139139msgstr "Ajouter un avis"
140140
141−#: qml/Dash/Previews/PreviewRatingInput.qml:168
141+#: qml/Dash/Previews/PreviewRatingInput.qml:166
142142msgid "Send"
143143msgstr "Envoyer"
144144
@@ -174,6 +174,14 @@ msgstr "Afficher le mot de passe"
174174msgid "Please enter SIM PIN"
175175msgstr "Entrez le code PIN"
176176
177+#: qml/Panel/ActiveCallHint.qml:77
178+msgid "Tap to return to call..."
179+msgstr "Appuyez pour revenir à l'appel…"
180+
181+#: qml/Panel/ActiveCallHint.qml:90
182+msgid "Conference"
183+msgstr "Conférence"
184+
177185#: qml/Panel/Indicators/MenuItemFactory.qml:583
178186msgid "In queue…"
179187msgstr "Dans la file d'attente..."
po/gd.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-16 14:48+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 22:02+0000\n"
1212"Last-Translator: GunChleoc <Unknown>\n"
1313"Language-Team: Fòram na Gàidhlig http://www.foramnagaidhlig.net\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919"Language: gd\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -87,11 +87,7 @@ msgstr "Gairm èiginn"
8787
8888#: qml/Components/Lockscreen.qml:231
8989msgid "OK"
90−msgstr "Ceart ma-hà"
91−
92−#: qml/Components/PageHeader.qml:366
93−msgid "Recent searches"
94−msgstr "Na lorg thu o chionn goirid"
90+msgstr "Ceart ma-thà"
9591
9692#: qml/Components/PassphraseLockscreen.qml:60
9793#, qt-format
@@ -114,7 +110,7 @@ msgstr "DÈANTA"
114110msgid "See more"
115111msgstr "Seall barrachd"
116112
117−#: qml/Components/SeeMore.qml:58
113+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
118114msgid "See less"
119115msgstr "Seall nas lugha"
120116
@@ -122,6 +118,10 @@ msgstr "Seall nas lugha"
122118msgid "Recent"
123119msgstr "O chionn goirid"
124120
121+#: qml/Dash/GenericScopeView.qml:330
122+msgid "See all"
123+msgstr "Seall na h-uile"
124+
125125#: qml/Dash/Previews/PreviewActionCombo.qml:34
126126msgid "More..."
127127msgstr "Barrachd..."
@@ -130,15 +130,15 @@ msgstr "Barrachd..."
130130msgid "Less..."
131131msgstr "Nas lugha..."
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:82
133+#: qml/Dash/Previews/PreviewRatingInput.qml:81
134134msgid "Rate this"
135135msgstr "Rangaich seo"
136136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:128
137+#: qml/Dash/Previews/PreviewRatingInput.qml:126
138138msgid "Add a review"
139139msgstr "Cuir lèirmheas ris"
140140
141−#: qml/Dash/Previews/PreviewRatingInput.qml:168
141+#: qml/Dash/Previews/PreviewRatingInput.qml:166
142142msgid "Send"
143143msgstr "Cuir"
144144
@@ -174,6 +174,14 @@ msgstr "Seall am facal-faire"
174174msgid "Please enter SIM PIN"
175175msgstr "Cuir a-steach SIM PIN"
176176
177+#: qml/Panel/ActiveCallHint.qml:77
178+msgid "Tap to return to call..."
179+msgstr "Gnog gus tilleadh dhan ghairm..."
180+
181+#: qml/Panel/ActiveCallHint.qml:90
182+msgid "Conference"
183+msgstr "Gairm co-labhairt"
184+
177185#: qml/Panel/Indicators/MenuItemFactory.qml:583
178186msgid "In queue…"
179187msgstr "Air a' chiudha…"
po/gl.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-21 16:08+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 17:22+0000\n"
1212"Last-Translator: Marcos Lans <Unknown>\n"
1313"Language-Team: Galician <gl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-22 07:17+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Chamada de emerxencia"
8484msgid "OK"
8585msgstr "Aceptar"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Buscas recentes"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "FEITO"
109105msgid "See more"
110106msgstr "Ver máis"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Ver menos"
115111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117113msgid "Recent"
118114msgstr "Recentes"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Ver todo"
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Máis…"
@@ -125,15 +125,15 @@ msgstr "Máis…"
125125msgid "Less..."
126126msgstr "Menos..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Valore isto"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Engadir unha opinión"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Enviar"
139139
@@ -169,6 +169,14 @@ msgstr "Mostrar contrasinal"
169169msgid "Please enter SIM PIN"
170170msgstr "Introduza o PIN da SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Toque para volver a chamar..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Conferencia"
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr "Na cola..."
po/he.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-15 13:20+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 16:26+0000\n"
1212"Last-Translator: Yaron <sh.yaron@gmail.com>\n"
1313"Language-Team: Hebrew <he@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "שיחת חירום"
8282msgid "OK"
8383msgstr "אישור"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "חיפושים אחרונים"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "בוצע"
107103msgid "See more"
108104msgstr "לראות עוד"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "לראות פחות"
113109
@@ -115,6 +111,10 @@ msgstr "לראות פחות"
115111msgid "Recent"
116112msgstr "בשימוש לאחרונה"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "להציג הכול"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "עוד…"
@@ -123,15 +123,15 @@ msgstr "עוד…"
123123msgid "Less..."
124124msgstr "פחות…"
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "דירוג היישום"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "הוספת סקירה"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "שליחה"
137137
@@ -167,6 +167,14 @@ msgstr "הצגת הססמה"
167167msgid "Please enter SIM PIN"
168168msgstr "נא להזין את קוד ה־<U+200F>SIM"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "יש לגעת כדי להחזיר שיחה…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "ועידה"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "בתור…"
po/hi.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-15 01:49+0000\n"
1212"Last-Translator: Siddhanathan S. <Unknown>\n"
1313"Language-Team: Hindi <hi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "आपातकालीन कॉल"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "पिछले खोजों"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "समीक्षा दे"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "भेजें"
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/hr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 04:14+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Croatian <hr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Nedavne pretrage"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/hu.po+31−21
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-23 10:07+0000\n"
12−"Last-Translator: Úr Balázs <urbalazs@gmail.com>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-30 18:42+0000\n"
12+"Last-Translator: Richard Somlói <ricsipontaz@gmail.com>\n"
1313"Language-Team: Hungarian <hu@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-24 06:32+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Indító rögzítése"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Indító feloldása"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -73,6 +73,8 @@ 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+"Elsajátította a gesztusokat, és megkezdheti a telefon "
77+"használatát.<br><br>Koppintson a képernyőre a kezdéshez."
7678
7779#: qml/Components/Lockscreen.qml:214
7880msgid "Emergency Call"
@@ -80,11 +82,7 @@ msgstr "Vészhívás"
8082
8183#: qml/Components/Lockscreen.qml:231
8284msgid "OK"
83−msgstr "OK"
84−
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Legutóbbi keresések"
85+msgstr "Oké"
8886
8987#: qml/Components/PassphraseLockscreen.qml:60
9088#, qt-format
@@ -105,16 +103,20 @@ msgstr "KÉSZ"
105103
106104#: qml/Components/SeeMore.qml:35
107105msgid "See more"
108−msgstr ""
106+msgstr "Több"
109107
110−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111109msgid "See less"
112−msgstr ""
110+msgstr "Kevesebb"
113111
114112#: qml/Dash/DashApps.qml:37
115113msgid "Recent"
116114msgstr "Legutóbbi"
117115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr "Összes megtekintése"
119+
118120#: qml/Dash/Previews/PreviewActionCombo.qml:34
119121msgid "More..."
120122msgstr "Több…"
@@ -123,21 +125,21 @@ msgstr "Több…"
123125msgid "Less..."
124126msgstr "Kevesebb…"
125127
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127129msgid "Rate this"
128−msgstr "Osztályzás"
130+msgstr "Értékelje"
129131
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131133msgid "Add a review"
132134msgstr "Értékelés hozzáadása"
133135
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135137msgid "Send"
136138msgstr "Küldés"
137139
138140#: qml/Greeter/Greeter.qml:157
139141msgid "Swipe to unlock"
140−msgstr ""
142+msgstr "Csúsztasson a feloldáshoz"
141143
142144#: qml/Hud/HudParametrizedActionsPage.qml:132
143145msgid "Confirm"
@@ -167,9 +169,17 @@ msgstr "Jelszó megjelenítése"
167169msgid "Please enter SIM PIN"
168170msgstr "Adja meg a SIM PIN kódját"
169171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Érintse meg, hogy visszatérjen a híváshoz..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferencia"
179+
170180#: qml/Panel/Indicators/MenuItemFactory.qml:583
171181msgid "In queue…"
172−msgstr ""
182+msgstr "Sorban…"
173183
174184#: qml/Panel/Indicators/MenuItemFactory.qml:587
175185msgid "Downloading"
po/hy.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 04:43+0000\n"
1212"Last-Translator: iAbaS <sosabazyan@yandex.ru>\n"
1313"Language-Team: Armenian <hy@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Վերջին որոնումներ"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/id.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:35+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Indonesian <id@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/is.po+19−11
@@ -9,15 +9,15 @@ msgid ""
99msgstr ""
1010"Project-Id-Version: po_unity8-is\n"
1111"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
12−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
12+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1313"PO-Revision-Date: 2014-07-23 05:57+0000\n"
1414"Last-Translator: Sveinn í Felli <sv1@fellsnet.is>\n"
1515"Language-Team: Icelandic <translation-team-is@lists.sourceforge.net>\n"
1616"MIME-Version: 1.0\n"
1717"Content-Type: text/plain; charset=UTF-8\n"
1818"Content-Transfer-Encoding: 8bit\n"
19−"X-Launchpad-Export-Date: 2014-07-24 06:32+0000\n"
20−"X-Generator: Launchpad (build 17114)\n"
19+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
20+"X-Generator: Launchpad (build 17131)\n"
2121"Language: is\n"
2222
2323#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -86,10 +86,6 @@ msgstr "Neyðarsímtal"
8686msgid "OK"
8787msgstr "Í lagi"
8888
89−#: qml/Components/PageHeader.qml:366
90−msgid "Recent searches"
91−msgstr "Nýlegar leitir"
92−
9389#: qml/Components/PassphraseLockscreen.qml:60
9490#, qt-format
9591msgid "Hello %1"
@@ -111,7 +107,7 @@ msgstr "BÚIÐ"
111107msgid "See more"
112108msgstr "Sjá meira"
113109
114−#: qml/Components/SeeMore.qml:58
110+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
115111msgid "See less"
116112msgstr "Sjá minna"
117113
@@ -119,6 +115,10 @@ msgstr "Sjá minna"
119115msgid "Recent"
120116msgstr "Nýlegt"
121117
118+#: qml/Dash/GenericScopeView.qml:330
119+msgid "See all"
120+msgstr ""
121+
122122#: qml/Dash/Previews/PreviewActionCombo.qml:34
123123msgid "More..."
124124msgstr "Meira..."
@@ -127,15 +127,15 @@ msgstr "Meira..."
127127msgid "Less..."
128128msgstr "Minna..."
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:82
130+#: qml/Dash/Previews/PreviewRatingInput.qml:81
131131msgid "Rate this"
132132msgstr "Gefa þessu einkunn"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:128
134+#: qml/Dash/Previews/PreviewRatingInput.qml:126
135135msgid "Add a review"
136136msgstr "Gefa umsögn"
137137
138−#: qml/Dash/Previews/PreviewRatingInput.qml:168
138+#: qml/Dash/Previews/PreviewRatingInput.qml:166
139139msgid "Send"
140140msgstr "Senda"
141141
@@ -171,6 +171,14 @@ msgstr "Birta lykilorð"
171171msgid "Please enter SIM PIN"
172172msgstr "Settu inn PIN fyrir SIM"
173173
174+#: qml/Panel/ActiveCallHint.qml:77
175+msgid "Tap to return to call..."
176+msgstr ""
177+
178+#: qml/Panel/ActiveCallHint.qml:90
179+msgid "Conference"
180+msgstr ""
181+
174182#: qml/Panel/Indicators/MenuItemFactory.qml:583
175183msgid "In queue…"
176184msgstr "Í biðröð..."
po/it.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-09 07:07+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 16:09+0000\n"
1212"Last-Translator: Claudio Arseni <claudio.arseni@gmail.com>\n"
1313"Language-Team: Italian <it@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-10 07:29+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -87,10 +87,6 @@ msgstr "Chiamata di emergenza"
8787msgid "OK"
8888msgstr "OK"
8989
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Ricerche recenti"
93−
9490#: qml/Components/PassphraseLockscreen.qml:60
9591#, qt-format
9692msgid "Hello %1"
@@ -112,7 +108,7 @@ msgstr "Fatto"
112108msgid "See more"
113109msgstr "Mostra di più"
114110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116112msgid "See less"
117113msgstr "Mostra meno"
118114
@@ -120,6 +116,10 @@ msgstr "Mostra meno"
120116msgid "Recent"
121117msgstr "Recenti"
122118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Mostra tutto"
122+
123123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124124msgid "More..."
125125msgstr "Altro..."
@@ -128,15 +128,15 @@ msgstr "Altro..."
128128msgid "Less..."
129129msgstr "Meno..."
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132132msgid "Rate this"
133133msgstr "Valuta"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136136msgid "Add a review"
137137msgstr "Aggiungi una recensione"
138138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140140msgid "Send"
141141msgstr "Invia"
142142
@@ -172,6 +172,14 @@ msgstr "Mostra password"
172172msgid "Please enter SIM PIN"
173173msgstr "Inserire il codice PIN"
174174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr "Tocca per tornare alla chiamata..."
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Conferenza"
182+
175183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176184msgid "In queue…"
177185msgstr "In coda..."
po/ja.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-18 07:01+0000\n"
1212"Last-Translator: Shushi Kurose <md81bird@hitaki.net>\n"
1313"Language-Team: Japanese <ja@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近の検索"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "送信"
135135
@@ -165,6 +165,14 @@ msgstr "パスワードを表示"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/km.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-16 01:37+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"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "ការ​ហៅ​ពេល​អាសន្ន"
8484msgid "OK"
8585msgstr "យល់ព្រម"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "ការ​ស្វែងរក​ថ្មី"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "រួចរាល់"
109105msgid "See more"
110106msgstr "មើល​ច្រើន​ទៀត"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "មើល​តិច​ជាង"
115111
@@ -117,6 +113,10 @@ msgstr "មើល​តិច​ជាង"
117113msgid "Recent"
118114msgstr "បច្ចុប្បន្ន"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr ""
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "ច្រើនជាង​..."
@@ -125,15 +125,15 @@ msgstr "ច្រើនជាង​..."
125125msgid "Less..."
126126msgstr "តិច​ជាង..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "វាយតម្លៃ​វា"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "បន្ថែម​ការ​ពិនិត្យ"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "ផ្ញើ"
139139
@@ -169,6 +169,14 @@ msgstr "បង្ហាញ​ពាក្យ​សម្ងាត់"
169169msgid "Please enter SIM PIN"
170170msgstr "បញ្ចូល​កូដ PIN របស់​ស៊ីមកាត"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr ""
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr ""
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr "ក្នុងជួរ…"
po/kn.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 05:43+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kannada <kn@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/ko.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-17 03:56+0000\n"
1212"Last-Translator: MinSik CHO <Unknown>\n"
1313"Language-Team: Korean <ko@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-18 05:28+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "긴급 통화"
8282msgid "OK"
8383msgstr "확인"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "최근 검색"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "완료"
107103msgid "See more"
108104msgstr "더 보기"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "간단히 표시하기"
113109
@@ -115,6 +111,10 @@ msgstr "간단히 표시하기"
115111msgid "Recent"
116112msgstr "최근"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr ""
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "더 보기..."
@@ -123,15 +123,15 @@ msgstr "더 보기..."
123123msgid "Less..."
124124msgstr "간단하게..."
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "이 애플리케이션 평가하기"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "평가 제출하기"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "보내기"
137137
@@ -167,6 +167,14 @@ msgstr "비밀 번호 보기"
167167msgid "Please enter SIM PIN"
168168msgstr "심카드의 PIN 번호를 입력하세요."
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr ""
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr ""
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "재생 중..."
po/ky.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 06:17+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Kirghiz <ky@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Соңку издөөлөр"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/lo.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-10-02 10:00+0000\n"
1212"Last-Translator: Anousak <anousak@gmail.com>\n"
1313"Language-Team: Lao <lo@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "ສົ່ງ"
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/lt.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-05-19 17:15+0000\n"
1212"Last-Translator: Mantas Kriaučiūnas <mantas@akl.lt>\n"
1313"Language-Team: Lithuanian <lt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Pagalbos skambutis"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Paskiausios paieškos"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108104msgid "See more"
109105msgstr ""
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr ""
114110
@@ -116,6 +112,10 @@ msgstr ""
116112msgid "Recent"
117113msgstr "Paskiausieji"
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr "Daugiau..."
@@ -124,15 +124,15 @@ msgstr "Daugiau..."
124124msgid "Less..."
125125msgstr "Mažiau..."
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "Įvertinkite tai"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "Pridėkite apžvalgą"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "Siųsti"
138138
@@ -168,6 +168,14 @@ msgstr "Rodyti slaptažodį"
168168msgid "Please enter SIM PIN"
169169msgstr "Įveskite SIM kortelės PIN kodą"
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr ""
po/lv.po+23−15
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-15 12:13+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-26 16:21+0000\n"
1212"Last-Translator: Jānis-Marks Gailis <jm-gailis@fai-vianet.fr>\n"
1313"Language-Team: Latvian <lv@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-16 07:27+0000\n"
18−"X-Generator: Launchpad (build 17112)\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "Neatliekamās Palīdzības zvans"
8080msgid "OK"
8181msgstr "LABI"
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Nesen veiktās meklēšanas"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "IZDARĪTS"
105101msgid "See more"
106102msgstr "Redzēt vairāk"
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr "Redzēt mazāk"
111107
@@ -113,6 +109,10 @@ msgstr "Redzēt mazāk"
113109msgid "Recent"
114110msgstr "Nesens"
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "Skatīt visus"
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr "Vairāk..."
@@ -121,15 +121,15 @@ msgstr "Vairāk..."
121121msgid "Less..."
122122msgstr "Mazāk..."
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "Novērtēt šo"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "Komentēt"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "Sūtīt"
135135
@@ -165,13 +165,21 @@ msgstr "Rādīt paroli"
165165msgid "Please enter SIM PIN"
166166msgstr "Lūdzu ievadiet SIM PIN"
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "Konference"
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
171179
172180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173181msgid "Downloading"
174−msgstr ""
182+msgstr "Lejupielādē"
175183
176184#: qml/Panel/Indicators/MenuItemFactory.qml:589
177185msgid "Paused, tap to resume"
@@ -179,11 +187,11 @@ msgstr ""
179187
180188#: qml/Panel/Indicators/MenuItemFactory.qml:591
181189msgid "Canceled"
182−msgstr ""
190+msgstr "Atcelts"
183191
184192#: qml/Panel/Indicators/MenuItemFactory.qml:593
185193msgid "Finished"
186−msgstr ""
194+msgstr "Pabeigts"
187195
188196#: qml/Panel/Indicators/MenuItemFactory.qml:595
189197msgid "Failed, tap to retry"
po/ml.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-11-23 11:44+0000\n"
12−"Last-Translator: Stym alfaZ <Unknown>\n"
12+"Last-Translator: ST Alfas <Unknown>\n"
1313"Language-Team: Malayalam <ml@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "അടിയന്തിര വിളി"
8282msgid "OK"
8383msgstr ""
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "സമീപകാല തിരയലുകള്‍"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr ""
107103msgid "See more"
108104msgstr ""
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr ""
113109
@@ -115,6 +111,10 @@ msgstr ""
115111msgid "Recent"
116112msgstr ""
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr ""
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr ""
@@ -123,15 +123,15 @@ msgstr ""
123123msgid "Less..."
124124msgstr ""
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "ഇത് അവലോകനം ചെയ്യുക"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "ഒരു അവലോകനം ചേര്‍ക്കുക"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "അയയ്‌ക്കുക"
137137
@@ -167,6 +167,14 @@ msgstr "രഹസ്യവാക്ക് കാണിക്കുക"
167167msgid "Please enter SIM PIN"
168168msgstr ""
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr ""
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr ""
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr ""
po/mr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-14 19:54+0000\n"
1212"Last-Translator: Rohan Deshmukh <Unknown>\n"
1313"Language-Team: Marathi <mr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/ms.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-17 09:05+0000\n"
1212"Last-Translator: abuyop <Unknown>\n"
1313"Language-Team: Malay <ms@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "panggilan Kecemasan"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Gelintar baru-baru ini"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "Kadar ini"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "Tambah ulasan"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "Hantar"
135135
@@ -165,6 +165,14 @@ msgstr "Tunjuk kata laluan"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/my.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-12-12 11:12+0000\n"
1212"Last-Translator: Pyae Sone <Unknown>\n"
1313"Language-Team: Burmese <my@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "အရေးပေါ်ခေါ်မည်"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "မကြာသေးခင်က ရှာဖွေခြင်း"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "ဒီဟာကိုအမှတ်ပေးမည်"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "ပို့မည်"
135135
@@ -165,6 +165,14 @@ msgstr "စကားဝှက်ကိုပြ"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/nb.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-11 07:01+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-26 12:05+0000\n"
1212"Last-Translator: Åka Sikrom <Unknown>\n"
1313"Language-Team: Norwegian Bokmal <nb@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-12 06:58+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Nødanrop"
8282msgid "OK"
8383msgstr "OK"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Nylige søk"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "FERDIG"
107103msgid "See more"
108104msgstr "Vis mer"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "Vis mindre"
113109
@@ -115,6 +111,10 @@ msgstr "Vis mindre"
115111msgid "Recent"
116112msgstr "Nylig"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Vis alt"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "Mer …"
@@ -123,15 +123,15 @@ msgstr "Mer …"
123123msgid "Less..."
124124msgstr "Mindre …"
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "Vurder dette"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "Skriv en anmeldelse"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "Send"
137137
@@ -167,6 +167,14 @@ msgstr "Vis passord"
167167msgid "Please enter SIM PIN"
168168msgstr "Skriv inn PIN-koden til SIM-kortet"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Trykk for å gå tilbake til anrop …"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Konferanse"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "I kø …"
po/nl.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-20 17:25+0000\n"
12−"Last-Translator: Hannie Dumoleyn <Unknown>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-27 19:12+0000\n"
12+"Last-Translator: rob <linuxned@gmail.com>\n"
1313"Language-Team: Dutch <nl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-28 06:44+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "Noodoproep"
8282msgid "OK"
8383msgstr "Ok"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Recente zoekopdrachten"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "KLAAR"
107103msgid "See more"
108104msgstr "Meer zien"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "Minder zien"
113109
@@ -115,6 +111,10 @@ msgstr "Minder zien"
115111msgid "Recent"
116112msgstr "Recent"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "Alles zien"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "Meer…"
@@ -123,15 +123,15 @@ msgstr "Meer…"
123123msgid "Less..."
124124msgstr "Minder…"
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "Beoordeel dit"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "Voeg recensie toe"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "Versturen"
137137
@@ -167,6 +167,14 @@ msgstr "Wachtwoord tonen"
167167msgid "Please enter SIM PIN"
168168msgstr "Voer SIM-pincode in"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "Tik om terug te keren naar gesprek…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "Groepsgesprek"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "In wachtrij…"
po/pl.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-19 14:10+0000\n"
1212"Last-Translator: GTriderXC <gtriderxc@yahoo.com>\n"
1313"Language-Team: Polish <pl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-20 06:18+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Telefon ratunkowy"
8484msgid "OK"
8585msgstr "OK"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Ostatnie wyszukiwania"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "ZROBIONE"
109105msgid "See more"
110106msgstr "Zobacz więcej"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Zobacz mniej"
115111
@@ -117,6 +113,10 @@ msgstr "Zobacz mniej"
117113msgid "Recent"
118114msgstr "Ostatnio używane"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr ""
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Więcej..."
@@ -125,15 +125,15 @@ msgstr "Więcej..."
125125msgid "Less..."
126126msgstr "Mniej..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Oceń to"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Dodaj recenzję"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Wyślij"
139139
@@ -169,6 +169,14 @@ msgstr "Wyświetl hasło"
169169msgid "Please enter SIM PIN"
170170msgstr "Wprowadź kod PIN karty SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr ""
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr ""
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr "W kolejce..."
po/pt.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-18 22:56+0000\n"
12−"Last-Translator: Hugo Cardoso <hugocardoso94@gmail.com>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 12:04+0000\n"
12+"Last-Translator: Ivo Xavier <ivofernandes12@gmail.com>\n"
1313"Language-Team: Portuguese <pt@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Chamada de emergência"
8383msgid "OK"
8484msgstr "OK"
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Pesquisas recentes"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr "FEITO"
108104msgid "See more"
109105msgstr "Ver mais"
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr "Ver menos"
114110
@@ -116,6 +112,10 @@ msgstr "Ver menos"
116112msgid "Recent"
117113msgstr "Recentes"
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Ver todos"
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr "Mais..."
@@ -124,15 +124,15 @@ msgstr "Mais..."
124124msgid "Less..."
125125msgstr "Menos..."
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "Classifique isto"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "Adicione uma crítica"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "Enviar"
138138
@@ -168,6 +168,14 @@ msgstr "Mostrar palavra-passe"
168168msgid "Please enter SIM PIN"
169169msgstr "Por favor insira o PIN"
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tocar para ligar de volta..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Conferência"
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr "Em fila..."
po/pt_BR.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-17 05:46+0000\n"
1212"Last-Translator: Tiago Hillebrandt <tiagohillebrandt@gmail.com>\n"
1313"Language-Team: Brazilian Portuguese <pt_BR@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-18 05:28+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -84,10 +84,6 @@ msgstr "Chamada de emergência"
8484msgid "OK"
8585msgstr "OK"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Pesquisas recentes"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr ""
109105msgid "See more"
110106msgstr "Ver mais"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Ver menos"
115111
@@ -117,6 +113,10 @@ msgstr "Ver menos"
117113msgid "Recent"
118114msgstr "Recentes"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr ""
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Mais..."
@@ -125,15 +125,15 @@ msgstr "Mais..."
125125msgid "Less..."
126126msgstr "Menos..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Avaliar isto"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Adicionar uma análise"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Enviar"
139139
@@ -169,6 +169,14 @@ msgstr "Exibir senha"
169169msgid "Please enter SIM PIN"
170170msgstr "Por favor, digite o PIN do cartão SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr ""
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr ""
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174182msgstr ""
po/ro.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 07:53+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Romanian <ro@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Căutări recente"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/ru.po+28−20
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-05-15 12:57+0000\n"
12−"Last-Translator: Zonov Roman <Unknown>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-30 12:49+0000\n"
12+"Last-Translator: Jay ZDLin <Unknown>\n"
1313"Language-Team: Russian <ru@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,11 +85,7 @@ msgstr "Экстренный вызов"
8585
8686#: qml/Components/Lockscreen.qml:231
8787msgid "OK"
88−msgstr ""
89−
90−#: qml/Components/PageHeader.qml:366
91−msgid "Recent searches"
92−msgstr "Последние поисковые запросы"
88+msgstr "ОК"
9389
9490#: qml/Components/PassphraseLockscreen.qml:60
9591#, qt-format
@@ -102,17 +98,17 @@ msgstr "Привет"
10298
10399#: qml/Components/PinLockscreen.qml:198
104100msgid "CANCEL"
105−msgstr ""
101+msgstr "ОТМЕНИТЬ"
106102
107103#: qml/Components/PinLockscreen.qml:216
108104msgid "DONE"
109−msgstr ""
105+msgstr "ГОТОВО"
110106
111107#: qml/Components/SeeMore.qml:35
112108msgid "See more"
113109msgstr "Подробнее"
114110
115−#: qml/Components/SeeMore.qml:58
111+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
116112msgid "See less"
117113msgstr "Вкратце"
118114
@@ -120,6 +116,10 @@ msgstr "Вкратце"
120116msgid "Recent"
121117msgstr "Недавние"
122118
119+#: qml/Dash/GenericScopeView.qml:330
120+msgid "See all"
121+msgstr "Показать всё"
122+
123123#: qml/Dash/Previews/PreviewActionCombo.qml:34
124124msgid "More..."
125125msgstr "Ещё..."
@@ -128,15 +128,15 @@ msgstr "Ещё..."
128128msgid "Less..."
129129msgstr "Меньше..."
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:82
131+#: qml/Dash/Previews/PreviewRatingInput.qml:81
132132msgid "Rate this"
133133msgstr "Оцените это"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:128
135+#: qml/Dash/Previews/PreviewRatingInput.qml:126
136136msgid "Add a review"
137137msgstr "Добавьте отзыв"
138138
139−#: qml/Dash/Previews/PreviewRatingInput.qml:168
139+#: qml/Dash/Previews/PreviewRatingInput.qml:166
140140msgid "Send"
141141msgstr "Отправить"
142142
@@ -172,13 +172,21 @@ msgstr "Показать пароль"
172172msgid "Please enter SIM PIN"
173173msgstr "Введите PIN код"
174174
175+#: qml/Panel/ActiveCallHint.qml:77
176+msgid "Tap to return to call..."
177+msgstr ""
178+
179+#: qml/Panel/ActiveCallHint.qml:90
180+msgid "Conference"
181+msgstr "Конференция"
182+
175183#: qml/Panel/Indicators/MenuItemFactory.qml:583
176184msgid "In queue…"
177−msgstr ""
185+msgstr "В очереди..."
178186
179187#: qml/Panel/Indicators/MenuItemFactory.qml:587
180188msgid "Downloading"
181−msgstr ""
189+msgstr "Загрузка"
182190
183191#: qml/Panel/Indicators/MenuItemFactory.qml:589
184192msgid "Paused, tap to resume"
@@ -186,11 +194,11 @@ msgstr ""
186194
187195#: qml/Panel/Indicators/MenuItemFactory.qml:591
188196msgid "Canceled"
189−msgstr ""
197+msgstr "Отменено"
190198
191199#: qml/Panel/Indicators/MenuItemFactory.qml:593
192200msgid "Finished"
193−msgstr ""
201+msgstr "Завершено"
194202
195203#: qml/Panel/Indicators/MenuItemFactory.qml:595
196204msgid "Failed, tap to retry"
po/shn.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-10-07 11:46+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Shan <shn@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/si.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-26 22:36+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Sinhalese <si@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/sl.po+28−20
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-06-23 09:29+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-28 12:32+0000\n"
1212"Last-Translator: Damir Jerovšek <Unknown>\n"
1313"Language-Team: Slovenian <sl@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-29 06:54+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "Pripni bližnjico"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "Odpni bližnjico"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -84,10 +84,6 @@ msgstr "Klic v sili"
8484msgid "OK"
8585msgstr "V REDU"
8686
87−#: qml/Components/PageHeader.qml:366
88−msgid "Recent searches"
89−msgstr "Nedavna iskanja"
90−
9187#: qml/Components/PassphraseLockscreen.qml:60
9288#, qt-format
9389msgid "Hello %1"
@@ -109,7 +105,7 @@ msgstr "KONČANO"
109105msgid "See more"
110106msgstr "Pokaži več"
111107
112−#: qml/Components/SeeMore.qml:58
108+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
113109msgid "See less"
114110msgstr "Pokaži manj"
115111
@@ -117,6 +113,10 @@ msgstr "Pokaži manj"
117113msgid "Recent"
118114msgstr "Nedavno"
119115
116+#: qml/Dash/GenericScopeView.qml:330
117+msgid "See all"
118+msgstr ""
119+
120120#: qml/Dash/Previews/PreviewActionCombo.qml:34
121121msgid "More..."
122122msgstr "Več ..."
@@ -125,15 +125,15 @@ msgstr "Več ..."
125125msgid "Less..."
126126msgstr "Manj ..."
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:82
128+#: qml/Dash/Previews/PreviewRatingInput.qml:81
129129msgid "Rate this"
130130msgstr "Ocenite"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:128
132+#: qml/Dash/Previews/PreviewRatingInput.qml:126
133133msgid "Add a review"
134134msgstr "Dodaj oceno"
135135
136−#: qml/Dash/Previews/PreviewRatingInput.qml:168
136+#: qml/Dash/Previews/PreviewRatingInput.qml:166
137137msgid "Send"
138138msgstr "Pošlji"
139139
@@ -169,29 +169,37 @@ msgstr "Pokaži geslo"
169169msgid "Please enter SIM PIN"
170170msgstr "Vnesite PIN kartice SIM"
171171
172+#: qml/Panel/ActiveCallHint.qml:77
173+msgid "Tap to return to call..."
174+msgstr "Tapnite za vrnitev v klic ..."
175+
176+#: qml/Panel/ActiveCallHint.qml:90
177+msgid "Conference"
178+msgstr "Konferenca"
179+
172180#: qml/Panel/Indicators/MenuItemFactory.qml:583
173181msgid "In queue…"
174−msgstr ""
182+msgstr "V vrsti ..."
175183
176184#: qml/Panel/Indicators/MenuItemFactory.qml:587
177185msgid "Downloading"
178−msgstr ""
186+msgstr "Prejemanje"
179187
180188#: qml/Panel/Indicators/MenuItemFactory.qml:589
181189msgid "Paused, tap to resume"
182−msgstr ""
190+msgstr "Premor, tapnite za nadaljevanje"
183191
184192#: qml/Panel/Indicators/MenuItemFactory.qml:591
185193msgid "Canceled"
186−msgstr ""
194+msgstr "Preklicano"
187195
188196#: qml/Panel/Indicators/MenuItemFactory.qml:593
189197msgid "Finished"
190−msgstr ""
198+msgstr "Končano"
191199
192200#: qml/Panel/Indicators/MenuItemFactory.qml:595
193201msgid "Failed, tap to retry"
194−msgstr ""
202+msgstr "Spodletelo, tapnite za ponovni poskus"
195203
196204#: qml/Panel/SearchIndicator.qml:27
197205msgid "Search"
po/sq.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-15 13:51+0000\n"
1212"Last-Translator: Besmir Zanaj <besmirzanaj@gmail.com>\n"
1313"Language-Team: Albanian <sq@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:36+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:16+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -81,10 +81,6 @@ msgstr ""
8181msgid "OK"
8282msgstr ""
8383
84−#: qml/Components/PageHeader.qml:366
85−msgid "Recent searches"
86−msgstr ""
87−
8884#: qml/Components/PassphraseLockscreen.qml:60
8985#, qt-format
9086msgid "Hello %1"
@@ -106,7 +102,7 @@ msgstr ""
106102msgid "See more"
107103msgstr ""
108104
109−#: qml/Components/SeeMore.qml:58
105+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
110106msgid "See less"
111107msgstr ""
112108
@@ -114,6 +110,10 @@ msgstr ""
114110msgid "Recent"
115111msgstr ""
116112
113+#: qml/Dash/GenericScopeView.qml:330
114+msgid "See all"
115+msgstr ""
116+
117117#: qml/Dash/Previews/PreviewActionCombo.qml:34
118118msgid "More..."
119119msgstr ""
@@ -122,15 +122,15 @@ msgstr ""
122122msgid "Less..."
123123msgstr ""
124124
125−#: qml/Dash/Previews/PreviewRatingInput.qml:82
125+#: qml/Dash/Previews/PreviewRatingInput.qml:81
126126msgid "Rate this"
127127msgstr "Vlerësoje këtë"
128128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:128
129+#: qml/Dash/Previews/PreviewRatingInput.qml:126
130130msgid "Add a review"
131131msgstr "Shto një rishikim"
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:168
133+#: qml/Dash/Previews/PreviewRatingInput.qml:166
134134msgid "Send"
135135msgstr ""
136136
@@ -166,6 +166,14 @@ msgstr ""
166166msgid "Please enter SIM PIN"
167167msgstr ""
168168
169+#: qml/Panel/ActiveCallHint.qml:77
170+msgid "Tap to return to call..."
171+msgstr ""
172+
173+#: qml/Panel/ActiveCallHint.qml:90
174+msgid "Conference"
175+msgstr ""
176+
169177#: qml/Panel/Indicators/MenuItemFactory.qml:583
170178msgid "In queue…"
171179msgstr ""
po/sr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-06-27 09:19+0000\n"
1212"Last-Translator: Michał Sawicz <michal.sawicz@canonical.com>\n"
1313"Language-Team: Serbian <sr@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "Скорашње претраге"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/sv.po+37−28
@@ -1,21 +1,22 @@
11# Swedish translation for unity
2−# Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013
2+# Copyright © 2013-2014 Rosetta Contributors and Canonical Ltd 2013-2014
33# This file is distributed under the same license as the unity package.
4−# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
4+# Josef Andersson <josef.andersson@fripost.org>, 2014.
55#
66msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-20 19:14+0000\n"
12−"Last-Translator: Gunnar Hjalmarsson <Unknown>\n"
13−"Language-Team: Swedish <sv@li.org>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-25 14:27+0000\n"
12+"Last-Translator: Josef Andersson <Unknown>\n"
13+"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-21 07:05+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
19+"Language: sv\n"
1920
2021#: plugins/Unity/Launcher/launcheritem.cpp:43
2122#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -28,7 +29,7 @@ msgstr "Släpp genväg"
2829
2930#: qml/Components/EdgeDemoOverlay.qml:151
3031msgid "Skip intro"
31−msgstr "Skippa intro"
32+msgstr "Hoppa över introduktion"
3233
3334#: qml/Components/EdgeDemo.qml:113
3435msgid "Right edge"
@@ -36,7 +37,7 @@ msgstr "Högerkant"
3637
3738#: qml/Components/EdgeDemo.qml:114
3839msgid "Try swiping from the right edge to unlock the phone"
39−msgstr "Dra med fingret från höger för att låsa upp telefonen"
40+msgstr "Svep från höger för att låsa upp telefonen"
4041
4142#: qml/Components/EdgeDemo.qml:145
4243msgid "Top edge"
@@ -71,8 +72,8 @@ msgid ""
7172"You have now mastered the edge gestures and can start using the "
7273"phone<br><br>Tap on the screen to start"
7374msgstr ""
74−"Du har nu bemästrat kantgesterna och kan börja använda telefonen<br><br>Peka "
75−"på skärmen för att starta"
75+"Du har nu bemästrat kantgesterna och kan börja använda "
76+"telefonen<br><br>Tryck på skärmen för att starta"
7677
7778#: qml/Components/Lockscreen.qml:214
7879msgid "Emergency Call"
@@ -82,10 +83,6 @@ msgstr "Nödsamtal"
8283msgid "OK"
8384msgstr "Ok"
8485
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "Senaste sökningar"
88−
8986#: qml/Components/PassphraseLockscreen.qml:60
9087#, qt-format
9188msgid "Hello %1"
@@ -107,7 +104,7 @@ msgstr "KLAR"
107104msgid "See more"
108105msgstr "Se mer"
109106
110−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111108msgid "See less"
112109msgstr "Se mindre"
113110
@@ -115,23 +112,27 @@ msgstr "Se mindre"
115112msgid "Recent"
116113msgstr "Senaste"
117114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr "Visa alla"
118+
118119#: qml/Dash/Previews/PreviewActionCombo.qml:34
119120msgid "More..."
120−msgstr "Mer..."
121+msgstr "Mer…"
121122
122123#: qml/Dash/Previews/PreviewActionCombo.qml:34
123124msgid "Less..."
124−msgstr "Mindre..."
125+msgstr "Mindre…"
125126
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127128msgid "Rate this"
128129msgstr "Betygsätt detta"
129130
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131132msgid "Add a review"
132133msgstr "Lägg till en recension"
133134
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135136msgid "Send"
136137msgstr "Skicka"
137138
@@ -149,15 +150,15 @@ msgstr "Skriv eller tala in ett kommando"
149150
150151#: qml/Hud/Hud.qml:84
151152msgid "Loading. Please Wait..."
152−msgstr "Laddar. Var god vänta..."
153+msgstr "Läser in. Var god vänta…"
153154
154155#: qml/Hud/Hud.qml:89
155156msgid "Speak Now..."
156−msgstr "Tala nu..."
157+msgstr "Tala nu…"
157158
158159#: qml/Hud/Hud.qml:94
159160msgid "Speaking..."
160−msgstr "Talar..."
161+msgstr "Talar…"
161162
162163#: qml/Notifications/NotificationMenuItemFactory.qml:91
163164msgid "Show password"
@@ -167,9 +168,17 @@ msgstr "Visa lösenord"
167168msgid "Please enter SIM PIN"
168169msgstr "Ange SIM PIN-kod"
169170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr "Tryck för att återgå till samtal..."
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr "Konferens"
178+
170179#: qml/Panel/Indicators/MenuItemFactory.qml:583
171180msgid "In queue…"
172−msgstr "I kö..."
181+msgstr "I kö…"
173182
174183#: qml/Panel/Indicators/MenuItemFactory.qml:587
175184msgid "Downloading"
@@ -177,7 +186,7 @@ msgstr "Hämtar"
177186
178187#: qml/Panel/Indicators/MenuItemFactory.qml:589
179188msgid "Paused, tap to resume"
180−msgstr "Pausad, peka för att fortsätta"
189+msgstr "Pausad, tryck för att fortsätta"
181190
182191#: qml/Panel/Indicators/MenuItemFactory.qml:591
183192msgid "Canceled"
@@ -189,7 +198,7 @@ msgstr "Klart"
189198
190199#: qml/Panel/Indicators/MenuItemFactory.qml:595
191200msgid "Failed, tap to retry"
192−msgstr "Misslyckades, peka för att försöka igen"
201+msgstr "Misslyckades, tryck för att försöka igen"
193202
194203#: qml/Panel/SearchIndicator.qml:27
195204msgid "Search"
po/sw.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-14 19:28+0000\n"
1212"Last-Translator: Damas <Unknown>\n"
1313"Language-Team: Swahili <sw@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "Tuma"
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/ta.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-10-24 11:36+0000\n"
1212"Last-Translator: Arun Kumar - அருண் குமார் <thangam.arunx@gmail.com>\n"
1313"Language-Team: Ubuntu Tamil Team/Free Tamil Computing/Thamizha\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919"Language: ta\n"
2020
2121#: plugins/Unity/Launcher/launcheritem.cpp:43
@@ -83,10 +83,6 @@ msgstr "அவசர அழைப்பு"
8383msgid "OK"
8484msgstr ""
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "கடையாக தேடப்பட்டவைகள்"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr ""
108104msgid "See more"
109105msgstr ""
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr ""
114110
@@ -116,6 +112,10 @@ msgstr ""
116112msgid "Recent"
117113msgstr ""
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr ""
@@ -124,15 +124,15 @@ msgstr ""
124124msgid "Less..."
125125msgstr ""
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "இதை மதிப்பிடு"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "ஒரு பரிசீலனையை சேர்"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "அனுப்பு"
138138
@@ -168,6 +168,14 @@ msgstr ""
168168msgid "Please enter SIM PIN"
169169msgstr ""
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr ""
po/te.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-19 10:04+0000\n"
1212"Last-Translator: Praveen Illa <mail2ipn@gmail.com>\n"
1313"Language-Team: Telugu <te@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-20 06:18+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "అత్యవసర పిలుపు"
8080msgid "OK"
8181msgstr "సరే"
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "ఇటీవలి వెతుకులాటలు"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "పూర్తయ్యింది"
105101msgid "See more"
106102msgstr "మరింత చూడండి"
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr "ఇటీవలివి"
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr "మరిన్ని..."
@@ -121,15 +121,15 @@ msgstr "మరిన్ని..."
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "ఒక సమీక్షను వ్రాయండి"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "పంపు"
135135
@@ -165,6 +165,14 @@ msgstr "సంకేతపదాన్ని చూపించు"
165165msgid "Please enter SIM PIN"
166166msgstr "దయచేసి సిమ్ పిన్ ఇవ్వండి"
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/tr.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-07-16 17:58+0000\n"
1212"Last-Translator: Volkan Gezer <Unknown>\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"
17−"X-Launchpad-Export-Date: 2014-07-17 06:38+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -83,10 +83,6 @@ msgstr "Acil Arama"
8383msgid "OK"
8484msgstr "Tamam"
8585
86−#: qml/Components/PageHeader.qml:366
87−msgid "Recent searches"
88−msgstr "Son aramalar"
89−
9086#: qml/Components/PassphraseLockscreen.qml:60
9187#, qt-format
9288msgid "Hello %1"
@@ -108,7 +104,7 @@ msgstr "BİTTİ"
108104msgid "See more"
109105msgstr "Daha fazlası"
110106
111−#: qml/Components/SeeMore.qml:58
107+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
112108msgid "See less"
113109msgstr "Daha azını gör"
114110
@@ -116,6 +112,10 @@ msgstr "Daha azını gör"
116112msgid "Recent"
117113msgstr "En son"
118114
115+#: qml/Dash/GenericScopeView.qml:330
116+msgid "See all"
117+msgstr ""
118+
119119#: qml/Dash/Previews/PreviewActionCombo.qml:34
120120msgid "More..."
121121msgstr "Daha fazlası..."
@@ -124,15 +124,15 @@ msgstr "Daha fazlası..."
124124msgid "Less..."
125125msgstr "Daha az.."
126126
127−#: qml/Dash/Previews/PreviewRatingInput.qml:82
127+#: qml/Dash/Previews/PreviewRatingInput.qml:81
128128msgid "Rate this"
129129msgstr "Oyla"
130130
131−#: qml/Dash/Previews/PreviewRatingInput.qml:128
131+#: qml/Dash/Previews/PreviewRatingInput.qml:126
132132msgid "Add a review"
133133msgstr "Bir inceleme ekle"
134134
135−#: qml/Dash/Previews/PreviewRatingInput.qml:168
135+#: qml/Dash/Previews/PreviewRatingInput.qml:166
136136msgid "Send"
137137msgstr "Gönder"
138138
@@ -168,6 +168,14 @@ msgstr "Parolayı göster"
168168msgid "Please enter SIM PIN"
169169msgstr "Lütfen SIM PIN'inizi girin"
170170
171+#: qml/Panel/ActiveCallHint.qml:77
172+msgid "Tap to return to call..."
173+msgstr ""
174+
175+#: qml/Panel/ActiveCallHint.qml:90
176+msgid "Conference"
177+msgstr ""
178+
171179#: qml/Panel/Indicators/MenuItemFactory.qml:583
172180msgid "In queue…"
173181msgstr "Beklemede..."
po/ug.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-21 02:30+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-29 04:06+0000\n"
1212"Last-Translator: Gheyret T.Kenji <Unknown>\n"
1313"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-22 07:17+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -82,10 +82,6 @@ msgstr "جىددىي تېلېفون"
8282msgid "OK"
8383msgstr "تامام"
8484
85−#: qml/Components/PageHeader.qml:366
86−msgid "Recent searches"
87−msgstr "يېقىنقى ئىزدەشلەر"
88−
8985#: qml/Components/PassphraseLockscreen.qml:60
9086#, qt-format
9187msgid "Hello %1"
@@ -107,7 +103,7 @@ msgstr "تامام"
107103msgid "See more"
108104msgstr "جىقراق كۆرۈش"
109105
110−#: qml/Components/SeeMore.qml:58
106+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
111107msgid "See less"
112108msgstr "ئازراق كۆرۈش"
113109
@@ -115,6 +111,10 @@ msgstr "ئازراق كۆرۈش"
115111msgid "Recent"
116112msgstr "يېقىنقى"
117113
114+#: qml/Dash/GenericScopeView.qml:330
115+msgid "See all"
116+msgstr "ھەممىنى كۆرۈش…"
117+
118118#: qml/Dash/Previews/PreviewActionCombo.qml:34
119119msgid "More..."
120120msgstr "تېخىمۇ كۆپ…"
@@ -123,15 +123,15 @@ msgstr "تېخىمۇ كۆپ…"
123123msgid "Less..."
124124msgstr "ئازراق..."
125125
126−#: qml/Dash/Previews/PreviewRatingInput.qml:82
126+#: qml/Dash/Previews/PreviewRatingInput.qml:81
127127msgid "Rate this"
128128msgstr "بۇنى باھالاڭ"
129129
130−#: qml/Dash/Previews/PreviewRatingInput.qml:128
130+#: qml/Dash/Previews/PreviewRatingInput.qml:126
131131msgid "Add a review"
132132msgstr "باھا قوشۇش"
133133
134−#: qml/Dash/Previews/PreviewRatingInput.qml:168
134+#: qml/Dash/Previews/PreviewRatingInput.qml:166
135135msgid "Send"
136136msgstr "ئەۋەت"
137137
@@ -167,6 +167,14 @@ msgstr "ئىم كۆرسەت"
167167msgid "Please enter SIM PIN"
168168msgstr "سىم(SIM) كارتىڭىزنىڭ PIN نومۇرىنى كىرگۈزۈڭ"
169169
170+#: qml/Panel/ActiveCallHint.qml:77
171+msgid "Tap to return to call..."
172+msgstr "سۆزلىشىشكە قايتىش ئۈچۈن چېكىڭ…"
173+
174+#: qml/Panel/ActiveCallHint.qml:90
175+msgid "Conference"
176+msgstr "يىغىن"
177+
170178#: qml/Panel/Indicators/MenuItemFactory.qml:583
171179msgid "In queue…"
172180msgstr "قاتاردا…"
po/uk.po+20−12
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-13 17:03+0000\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-29 07:53+0000\n"
1212"Last-Translator: Yuri Chornoivan <yurchor@gmail.com>\n"
1313"Language-Team: Ukrainian <uk@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-14 07:10+0000\n"
18−"X-Generator: Launchpad (build 17111)\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -85,10 +85,6 @@ msgstr "Терміновий виклик"
8585msgid "OK"
8686msgstr "Гаразд"
8787
88−#: qml/Components/PageHeader.qml:366
89−msgid "Recent searches"
90−msgstr "Нещодавні пошуки"
91−
9288#: qml/Components/PassphraseLockscreen.qml:60
9389#, qt-format
9490msgid "Hello %1"
@@ -110,7 +106,7 @@ msgstr "Виконано"
110106msgid "See more"
111107msgstr "Докладніше"
112108
113−#: qml/Components/SeeMore.qml:58
109+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
114110msgid "See less"
115111msgstr "Стисліше"
116112
@@ -118,6 +114,10 @@ msgstr "Стисліше"
118114msgid "Recent"
119115msgstr "Нещодавні"
120116
117+#: qml/Dash/GenericScopeView.qml:330
118+msgid "See all"
119+msgstr "Детальніше"
120+
121121#: qml/Dash/Previews/PreviewActionCombo.qml:34
122122msgid "More..."
123123msgstr "Більше…"
@@ -126,15 +126,15 @@ msgstr "Більше…"
126126msgid "Less..."
127127msgstr "Менше..."
128128
129−#: qml/Dash/Previews/PreviewRatingInput.qml:82
129+#: qml/Dash/Previews/PreviewRatingInput.qml:81
130130msgid "Rate this"
131131msgstr "Оцінити"
132132
133−#: qml/Dash/Previews/PreviewRatingInput.qml:128
133+#: qml/Dash/Previews/PreviewRatingInput.qml:126
134134msgid "Add a review"
135135msgstr "Додати рецензію"
136136
137−#: qml/Dash/Previews/PreviewRatingInput.qml:168
137+#: qml/Dash/Previews/PreviewRatingInput.qml:166
138138msgid "Send"
139139msgstr "Надіслати"
140140
@@ -170,6 +170,14 @@ msgstr "Показати пароль"
170170msgid "Please enter SIM PIN"
171171msgstr "Введіть PIN-код SIM-картки"
172172
173+#: qml/Panel/ActiveCallHint.qml:77
174+msgid "Tap to return to call..."
175+msgstr "Торкніться, щоб повернутися до дзвінка…"
176+
177+#: qml/Panel/ActiveCallHint.qml:90
178+msgid "Conference"
179+msgstr "Конференція"
180+
173181#: qml/Panel/Indicators/MenuItemFactory.qml:583
174182msgid "In queue…"
175183msgstr "У черзі…"
po/unity8.pot+17−9
@@ -8,7 +8,7 @@ msgid ""
88msgstr ""
99"Project-Id-Version: unity8\n"
1010"Report-Msgid-Bugs-To: \n"
11−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1212"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1313"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1414"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/vi.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-15 01:19+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Vietnamese <vi@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/xh.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2013-09-28 13:20+0000\n"
1212"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313"Language-Team: Xhosa <xh@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr ""
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr ""
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr ""
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr ""
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr ""
135135
@@ -165,6 +165,14 @@ msgstr ""
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/zh_CN.po+29−21
@@ -7,24 +7,24 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-06-12 08:55+0000\n"
12−"Last-Translator: Shengjing Zhu <Unknown>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-29 02:48+0000\n"
12+"Last-Translator: Luo Lei <luolei@ubuntukylin.com>\n"
1313"Language-Team: Chinese (Simplified) <zh_CN@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-31 07:15+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
2222msgid "Pin shortcut"
23−msgstr ""
23+msgstr "固定快捷方式"
2424
2525#: plugins/Unity/Launcher/launcheritem.cpp:73
2626msgid "Unpin shortcut"
27−msgstr ""
27+msgstr "取消固定快捷方式"
2828
2929#: qml/Components/EdgeDemoOverlay.qml:151
3030msgid "Skip intro"
@@ -80,10 +80,6 @@ msgstr "紧急电话"
8080msgid "OK"
8181msgstr "确定"
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "近期搜索"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "完成"
105101msgid "See more"
106102msgstr "了解更多"
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr "显示更少"
111107
@@ -113,6 +109,10 @@ msgstr "显示更少"
113109msgid "Recent"
114110msgstr "最近使用过的"
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "查看全部"
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr "更多..."
@@ -121,15 +121,15 @@ msgstr "更多..."
121121msgid "Less..."
122122msgstr "更少..."
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "评分"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "添加评论"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "发送"
135135
@@ -165,29 +165,37 @@ msgstr "显示密码"
165165msgid "Please enter SIM PIN"
166166msgstr "请输入 SIM PIN"
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr "点击回到通话..."
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "会议"
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170−msgstr ""
178+msgstr "排队中..."
171179
172180#: qml/Panel/Indicators/MenuItemFactory.qml:587
173181msgid "Downloading"
174−msgstr ""
182+msgstr "正在下载"
175183
176184#: qml/Panel/Indicators/MenuItemFactory.qml:589
177185msgid "Paused, tap to resume"
178−msgstr ""
186+msgstr "已暂停,点击继续"
179187
180188#: qml/Panel/Indicators/MenuItemFactory.qml:591
181189msgid "Canceled"
182−msgstr ""
190+msgstr "已取消"
183191
184192#: qml/Panel/Indicators/MenuItemFactory.qml:593
185193msgid "Finished"
186−msgstr ""
194+msgstr "已完成"
187195
188196#: qml/Panel/Indicators/MenuItemFactory.qml:595
189197msgid "Failed, tap to retry"
190−msgstr ""
198+msgstr "下载失败,请点击重试"
191199
192200#: qml/Panel/SearchIndicator.qml:27
193201msgid "Search"
po/zh_HK.po+19−11
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity8\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
1111"PO-Revision-Date: 2014-01-25 13:32+0000\n"
1212"Last-Translator: Daniel Cheung <daniel.2345@hotmail.com>\n"
1313"Language-Team: Chinese (Hong Kong) <zh_HK@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-09 06:37+0000\n"
18−"X-Generator: Launchpad (build 17100)\n"
17+"X-Launchpad-Export-Date: 2014-07-26 07:17+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "緊急電話"
8080msgid "OK"
8181msgstr ""
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近的搜尋"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr ""
105101msgid "See more"
106102msgstr ""
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr ""
111107
@@ -113,6 +109,10 @@ msgstr ""
113109msgid "Recent"
114110msgstr ""
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr ""
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr ""
@@ -121,15 +121,15 @@ msgstr ""
121121msgid "Less..."
122122msgstr ""
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "評價"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "新增評論"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "傳送"
135135
@@ -165,6 +165,14 @@ msgstr "顯示密碼"
165165msgid "Please enter SIM PIN"
166166msgstr ""
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr ""
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr ""
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr ""
po/zh_TW.po+21−13
@@ -7,15 +7,15 @@ msgid ""
77msgstr ""
88"Project-Id-Version: unity\n"
99"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10−"POT-Creation-Date: 2014-07-07 12:15+0100\n"
11−"PO-Revision-Date: 2014-07-18 10:14+0000\n"
12−"Last-Translator: Henry Yang <henry9846@hotmail.com>\n"
10+"POT-Creation-Date: 2014-07-11 14:59+0200\n"
11+"PO-Revision-Date: 2014-07-26 16:21+0000\n"
12+"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
1313"Language-Team: Chinese (Traditional) <zh_TW@li.org>\n"
1414"MIME-Version: 1.0\n"
1515"Content-Type: text/plain; charset=UTF-8\n"
1616"Content-Transfer-Encoding: 8bit\n"
17−"X-Launchpad-Export-Date: 2014-07-19 06:19+0000\n"
18−"X-Generator: Launchpad (build 17114)\n"
17+"X-Launchpad-Export-Date: 2014-07-27 06:35+0000\n"
18+"X-Generator: Launchpad (build 17131)\n"
1919
2020#: plugins/Unity/Launcher/launcheritem.cpp:43
2121#: plugins/Unity/Launcher/launcheritem.cpp:73
@@ -80,10 +80,6 @@ msgstr "緊急通話"
8080msgid "OK"
8181msgstr "確定"
8282
83−#: qml/Components/PageHeader.qml:366
84−msgid "Recent searches"
85−msgstr "最近搜尋"
86−
8783#: qml/Components/PassphraseLockscreen.qml:60
8884#, qt-format
8985msgid "Hello %1"
@@ -105,7 +101,7 @@ msgstr "完成"
105101msgid "See more"
106102msgstr "查看更多"
107103
108−#: qml/Components/SeeMore.qml:58
104+#: qml/Components/SeeMore.qml:58 qml/Dash/GenericScopeView.qml:330
109105msgid "See less"
110106msgstr "縮減查看"
111107
@@ -113,6 +109,10 @@ msgstr "縮減查看"
113109msgid "Recent"
114110msgstr "最近"
115111
112+#: qml/Dash/GenericScopeView.qml:330
113+msgid "See all"
114+msgstr "查看全部"
115+
116116#: qml/Dash/Previews/PreviewActionCombo.qml:34
117117msgid "More..."
118118msgstr "更多…"
@@ -121,15 +121,15 @@ msgstr "更多…"
121121msgid "Less..."
122122msgstr "縮減…"
123123
124−#: qml/Dash/Previews/PreviewRatingInput.qml:82
124+#: qml/Dash/Previews/PreviewRatingInput.qml:81
125125msgid "Rate this"
126126msgstr "給予評等"
127127
128−#: qml/Dash/Previews/PreviewRatingInput.qml:128
128+#: qml/Dash/Previews/PreviewRatingInput.qml:126
129129msgid "Add a review"
130130msgstr "新增評論"
131131
132−#: qml/Dash/Previews/PreviewRatingInput.qml:168
132+#: qml/Dash/Previews/PreviewRatingInput.qml:166
133133msgid "Send"
134134msgstr "發送"
135135
@@ -165,6 +165,14 @@ msgstr "顯示密碼"
165165msgid "Please enter SIM PIN"
166166msgstr "請輸入 SIM 卡 PIN 碼"
167167
168+#: qml/Panel/ActiveCallHint.qml:77
169+msgid "Tap to return to call..."
170+msgstr "輕觸可返回通話…"
171+
172+#: qml/Panel/ActiveCallHint.qml:90
173+msgid "Conference"
174+msgstr "會議"
175+
168176#: qml/Panel/Indicators/MenuItemFactory.qml:583
169177msgid "In queue…"
170178msgstr "佇列中…"
qml/Components/Background.qmlnew file+77
@@ -0,0 +1,77 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+Loader {
20+ id: root
21+ anchors.fill: parent
22+
23+ property url style
24+ readonly property var parsedStyle: String(style)
25+ .match(/^(color|gradient):\/\/\/(?:(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))(?:\/(#(?:[0-9a-f]{3,4}){1,2}|[a-z]{3,}))?\/?$/i)
26+
27+ sourceComponent: {
28+ if (style == "") return null;
29+ if (!parsedStyle) return image;
30+ if (parsedStyle[1] === "color") return solid
31+ if (parsedStyle[1] === "gradient") return gradient
32+ }
33+
34+ onLoaded: if (item.hasOwnProperty("parsedStyle")) {
35+ item.parsedStyle = Qt.binding(function() { return root.parsedStyle } );
36+ }
37+
38+ Component {
39+ id: solid
40+
41+ Rectangle {
42+ objectName: "solid"
43+
44+ property var parsedStyle
45+
46+ color: parsedStyle ? parsedStyle[2] : "#ffffff"
47+ }
48+ }
49+
50+ Component {
51+ id: gradient
52+
53+ Rectangle {
54+ objectName: "gradient"
55+
56+ property var parsedStyle
57+
58+ gradient: Gradient {
59+ GradientStop { position: 0; color: parsedStyle ? parsedStyle[2] : "#000000" }
60+ GradientStop { position: 1; color: parsedStyle ? parsedStyle[3] : "#000000" }
61+ }
62+ }
63+ }
64+
65+ Component {
66+ id: image
67+
68+ Image {
69+ objectName: "image"
70+
71+ source: width > 0 && height > 0 && root.style
72+
73+ sourceSize.width: width
74+ sourceSize.height: height
75+ }
76+ }
77+}
qml/Components/Dialogs.qmlnew file+217
@@ -0,0 +1,217 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+import Unity.Application 0.1
20+import Unity.Session 0.1
21+import Ubuntu.Components 0.1
22+import Ubuntu.Components.Popups 0.1
23+
24+Item {
25+ id: root
26+
27+ function onPowerKeyPressed() {
28+ if (!powerKeyTimer.running) {
29+ powerKeyTimer.start();
30+ }
31+ }
32+
33+ function onPowerKeyReleased() {
34+ powerKeyTimer.stop();
35+ }
36+
37+ signal powerOffClicked();
38+
39+ QtObject {
40+ id: d // private stuff
41+
42+ property bool dialogShown: false
43+
44+ function showPowerDialog() {
45+ if (!d.dialogShown) {
46+ d.dialogShown = true;
47+ PopupUtils.open(powerDialog, root, {"z": root.z});
48+ }
49+ }
50+ }
51+
52+ Timer {
53+ id: powerKeyTimer
54+ interval: 2000
55+ repeat: false
56+ triggeredOnStart: false
57+
58+ onTriggered: {
59+ d.showPowerDialog();
60+ }
61+ }
62+
63+ Component {
64+ id: logoutDialog
65+ Dialog {
66+ id: dialogueLogout
67+ title: "Logout"
68+ text: "Are you sure that you want to logout?"
69+ Button {
70+ text: "Cancel"
71+ onClicked: {
72+ PopupUtils.close(dialogueLogout);
73+ d.dialogShown = false;
74+ }
75+ }
76+ Button {
77+ text: "Yes"
78+ onClicked: {
79+ DBusUnitySessionService.Logout();
80+ PopupUtils.close(dialogueLogout);
81+ d.dialogShown = false;
82+ }
83+ }
84+ }
85+ }
86+
87+ Component {
88+ id: shutdownDialog
89+ Dialog {
90+ id: dialogueShutdown
91+ title: "Shutdown"
92+ text: "Are you sure that you want to shutdown?"
93+ Button {
94+ text: "Cancel"
95+ onClicked: {
96+ PopupUtils.close(dialogueShutdown);
97+ d.dialogShown = false;
98+ }
99+ }
100+ Button {
101+ text: "Yes"
102+ onClicked: {
103+ dBusUnitySessionServiceConnection.closeAllApps();
104+ DBusUnitySessionService.Shutdown();
105+ PopupUtils.close(dialogueShutdown);
106+ d.dialogShown = false;
107+ }
108+ }
109+ }
110+ }
111+
112+ Component {
113+ id: rebootDialog
114+ Dialog {
115+ id: dialogueReboot
116+ title: "Reboot"
117+ text: "Are you sure that you want to reboot?"
118+ Button {
119+ text: "Cancel"
120+ onClicked: {
121+ PopupUtils.close(dialogueReboot)
122+ d.dialogShown = false;
123+ }
124+ }
125+ Button {
126+ text: "Yes"
127+ onClicked: {
128+ dBusUnitySessionServiceConnection.closeAllApps();
129+ DBusUnitySessionService.Reboot();
130+ PopupUtils.close(dialogueReboot);
131+ d.dialogShown = false;
132+ }
133+ }
134+ }
135+ }
136+
137+ Component {
138+ id: powerDialog
139+ Dialog {
140+ id: dialoguePower
141+ title: "Power"
142+ text: i18n.tr("Are you sure you would like to turn power off?")
143+ Button {
144+ text: i18n.tr("Power off")
145+ onClicked: {
146+ dBusUnitySessionServiceConnection.closeAllApps();
147+ PopupUtils.close(dialoguePower);
148+ d.dialogShown = false;
149+ root.powerOffClicked();
150+ }
151+ }
152+ Button {
153+ text: i18n.tr("Restart")
154+ onClicked: {
155+ dBusUnitySessionServiceConnection.closeAllApps();
156+ DBusUnitySessionService.Reboot();
157+ PopupUtils.close(dialoguePower);
158+ d.dialogShown = false;
159+ }
160+ }
161+ Button {
162+ text: i18n.tr("Cancel")
163+ onClicked: {
164+ PopupUtils.close(dialoguePower);
165+ d.dialogShown = false;
166+ }
167+ }
168+ }
169+ }
170+
171+
172+ Connections {
173+ id: dBusUnitySessionServiceConnection
174+ objectName: "dBusUnitySessionServiceConnection"
175+ target: DBusUnitySessionService
176+
177+ function closeAllApps() {
178+ while (true) {
179+ var app = ApplicationManager.get(0);
180+ if (app === null) {
181+ break;
182+ }
183+ ApplicationManager.stopApplication(app.appId);
184+ }
185+ }
186+
187+ onLogoutRequested: {
188+ // Display a dialog to ask the user to confirm.
189+ if (!d.dialogShown) {
190+ d.dialogShown = true;
191+ PopupUtils.open(logoutDialog, root, {"z": root.z});
192+ }
193+ }
194+
195+ onShutdownRequested: {
196+ // Display a dialog to ask the user to confirm.
197+ if (!d.dialogShown) {
198+ d.dialogShown = true;
199+ PopupUtils.open(shutdownDialog, root, {"z": root.z});
200+ }
201+ }
202+
203+ onRebootRequested: {
204+ // Display a dialog to ask the user to confirm.
205+ if (!d.dialogShown) {
206+ d.dialogShown = true;
207+ PopupUtils.open(rebootDialog, root, {"z": root.z});
208+ }
209+ }
210+
211+ onLogoutReady: {
212+ closeAllApps();
213+ Qt.quit();
214+ }
215+ }
216+
217+}
qml/Components/DraggingArea.qml+4
@@ -117,4 +117,8 @@ MouseArea {
117117 dragging = false
118118 __pressedPosition = Qt.point(mouse.x, mouse.y)
119119 }
120+
121+ onCanceled: {
122+ dragging = false
123+ }
120124}
qml/Components/FilterGrid.qmldeleted−124
@@ -1,124 +0,0 @@
1−/*
2− * Copyright (C) 2013 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import Utils 0.1
20−import "../Components"
21−
22−/*
23− A ResponsiveGridView that can optionally have the number of rows being displayed
24− reduced to collapsedRowCount, in which case a button saying "View all (123)"
25− will be shown at the bottom. If clicked, FilterGrid will them expand vertically
26− to display all rows.
27− */
28−Item {
29− id: root
30−
31− /* Whether, when collapsed, a button should be displayed enabling the user to expand
32− the grid to its full size. */
33− readonly property bool expandable: model.count > rowsWhenCollapsed * iconTileGrid.columns
34−
35− property var model: null
36−
37− /* Maximum number of rows to be show when filter=true. */
38− property int collapsedRowCount: 2
39− property int uncollapsedRowCount: Math.ceil(model.count / columns)
40− /* Never show more rows than model would fill up. */
41− readonly property int rowsWhenCollapsed: Math.min(collapsedRowCount, uncollapsedRowCount)
42− readonly property int collapsedHeight: iconTileGrid.contentHeightForRows(rowsWhenCollapsed)
43− readonly property int uncollapsedHeight: iconTileGrid.contentHeightForRows(uncollapsedRowCount)
44−
45− property alias minimumHorizontalSpacing: iconTileGrid.minimumHorizontalSpacing
46− property alias maximumNumberOfColumns: iconTileGrid.maximumNumberOfColumns
47− property alias columns: iconTileGrid.columns
48− property alias delegateWidth: iconTileGrid.delegateWidth
49− property alias delegateHeight: iconTileGrid.delegateHeight
50− property alias verticalSpacing: iconTileGrid.verticalSpacing
51− readonly property alias margins: iconTileGrid.margins
52− property alias delegate: iconTileGrid.delegate
53− property alias cellWidth: iconTileGrid.cellWidth
54− property alias cellHeight: iconTileGrid.cellHeight
55− property alias displayMarginBeginning: iconTileGrid.displayMarginBeginning
56− property alias displayMarginEnd: iconTileGrid.displayMarginEnd
57− readonly property alias originY: iconTileGrid.originY
58− readonly property alias flicking: iconTileGrid.flicking
59− readonly property alias moving: iconTileGrid.moving
60− readonly property alias pressDelay: iconTileGrid.pressDelay
61− property alias highlightIndex: iconTileGrid.highlightIndex
62− readonly property alias currentItem: iconTileGrid.currentItem
63− readonly property alias filtered: d.filter
64−
65− QtObject {
66− id: d
67− // We do have filter and collapsed properties because we need to decouple
68− // the real filtering with the animation since the closing animation
69− // i.e. setFilter(false. true) we still need to not be filtering until
70− // the animation finishes otherwise we hide the items when the animation
71− // is still running
72− property bool filter: true
73− property bool collapsed: true
74− }
75−
76− height: d.collapsed ? root.collapsedHeight : root.uncollapsedHeight
77− clip: filterAnimation.running
78−
79− Behavior on height {
80− id: heightBehaviour
81− enabled: false
82− NumberAnimation {
83− id: filterAnimation
84− // Duration and easing here match the ListViewWithPageHeader::m_contentYAnimation
85− // otherwise since both animations can run at the same time you'll get
86− // some visual weirdness.
87− duration: 200
88− easing.type: Easing.InOutQuad
89− onRunningChanged: {
90− if (!running) {
91− d.filter = d.collapsed;
92− }
93− heightBehaviour.enabled = false;
94− }
95− }
96− }
97−
98− function setFilter(filter, animate) {
99− heightBehaviour.enabled = animate;
100− d.collapsed = filter;
101− if (!animate || !filter) {
102− d.filter = filter;
103− }
104− }
105−
106− ResponsiveGridView {
107− id: iconTileGrid
108−
109− anchors { left: parent.left; right: parent.right }
110− height: totalContentHeight
111− interactive: false
112−
113− minimumHorizontalSpacing: units.gu(0.5)
114− maximumNumberOfColumns: 6
115− delegateWidth: units.gu(11)
116− delegateHeight: units.gu(9.5)
117− verticalSpacing: units.gu(2)
118−
119− model: LimitProxyModel {
120− model: root.model
121− limit: d.filter ? rowsWhenCollapsed * iconTileGrid.columns : -1
122− }
123− }
124−}
qml/Components/InputMethod.qmlnew file+79
@@ -0,0 +1,79 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Unity.Application 0.1
19+import Ubuntu.Components 0.1
20+
21+Item {
22+ id: root
23+
24+ property var surface: null
25+
26+ property int transitionDuration: UbuntuAnimation.FastDuration
27+
28+ state: {
29+ if (surface && surface.state != MirSurfaceItem.Minimized) {
30+ return "shown";
31+ } else {
32+ return "hidden";
33+ }
34+ }
35+
36+ states: [
37+ State {
38+ name: "shown"
39+ PropertyChanges {
40+ target: root
41+ visible: true
42+ y: 0
43+ }
44+ },
45+ State {
46+ name: "hidden"
47+ PropertyChanges {
48+ target: root
49+ visible: false
50+ // half-way down because the vkb occupies only the lower half of the surface
51+ // TODO: consider keyboard rotation
52+ y: root.parent.height / 2.0
53+ }
54+ }
55+ ]
56+
57+ transitions: [
58+ Transition {
59+ from: "*"; to: "*"
60+ PropertyAction { property: "visible"; value: true }
61+ UbuntuNumberAnimation { property: "y"; duration: transitionDuration }
62+ }
63+ ]
64+
65+ onSurfaceChanged: {
66+ if (surface) {
67+ surface.parent = root;
68+ surface.anchors.fill = root;
69+ }
70+ }
71+
72+ Component.onDestruction: {
73+ if (surface) {
74+ surface.parent = null;
75+ surface.release();
76+ surface = null;
77+ }
78+ }
79+}
qml/Components/ListItems/Header.qml+17−26
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,54 +15,45 @@
1515 */
1616
1717import QtQuick 2.0
18+import QtQuick.Layouts 1.1
1819import Ubuntu.Components 0.1
1920
2021Item {
21− /*!
22− \preliminary
23− The text that is shown as the header text.
24− \qmlproperty string text
25− */
2622 property alias text: label.text
27− property alias textColor: label.color
28− property alias image: image.source
23+ property alias color: label.color
24+ property alias iconName: icon.name
2925
3026 signal clicked(variant mouse)
3127
3228 height: units.gu(5)
3329
34− Item {
30+ RowLayout {
31+ spacing: units.gu(.5)
3532 anchors {
3633 left: parent.left
3734 right: parent.right
38− rightMargin: units.gu(0.5)
39− top: parent.top
40− bottom: parent.bottom
35+ verticalCenter: parent.verticalCenter
36+ margins: units.gu(1)
4137 }
4238
4339 Label {
4440 id: label
45− anchors {
46− left: parent.left
47− leftMargin: units.gu(2)
48− verticalCenter: parent.verticalCenter
49− }
41+ Layout.fillWidth: true
5042
51− color: "grey" // TODO karni: Update Ubuntu.Compoonents.Themes.Palette.
5243 font.family: "Ubuntu"
5344 fontSize: "medium"
5445 elide: Text.ElideRight
46+ maximumLineCount: 1
5547 textFormat: Text.PlainText
56− width: parent.width - image.width - image.leftMargin - anchors.leftMargin
48+ width: Math.min(parent.width - units.gu(4), implicitWidth)
5749 }
5850
59− Image {
60− id: image
61− readonly property double leftMargin: units.gu(1)
62− x: label.x + label.contentWidth + leftMargin
63− anchors {
64− verticalCenter: parent.verticalCenter
65− }
51+ Icon {
52+ id: icon
53+ visible: name != ""
54+ height: units.gu(2)
55+ width: height
56+ color: label.color
6657 }
6758 }
6859
qml/Components/PageHeader.qml+9−2
@@ -117,7 +117,7 @@ Item {
117117 Flickable {
118118 id: headerContainer
119119 objectName: "headerContainer"
120− clip: true
120+ clip: openSearchAnimation.running
121121 anchors { left: parent.left; top: parent.top; right: parent.right }
122122 height: units.gu(6.5)
123123 contentHeight: headersColumn.height
@@ -127,6 +127,11 @@ Item {
127127 property bool showSearch: false
128128 property var popover: null
129129
130+ Background {
131+ objectName: "headerBackground"
132+ style: scopeStyle.headerBackground
133+ }
134+
130135 Behavior on contentY {
131136 UbuntuNumberAnimation {
132137 id: openSearchAnimation
@@ -150,6 +155,7 @@ Item {
150155 anchors { left: parent.left; right: parent.right }
151156 height: headerContainer.height
152157 contentHeight: height
158+ opacity: headerContainer.clip || headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
153159 separatorSource: ""
154160 // Required to keep PageHeadStyle noise down as it expects the Page's properties around.
155161 property var styledItem: searchHeader
@@ -224,8 +230,9 @@ Item {
224230 anchors { left: parent.left; right: parent.right }
225231 height: headerContainer.height
226232 contentHeight: height
233+ opacity: headerContainer.clip || !headerContainer.showSearch ? 1 : 0 // setting visible false cause column to relayout
227234 separatorSource: ""
228− textColor: root.scopeStyle ? root.scopeStyle.foreground : "grey"
235+ textColor: root.scopeStyle ? root.scopeStyle.headerForeground : "grey"
229236 property var styledItem: header
230237 property string title: root.title
231238 property var config: PageHeadConfiguration {
qml/Components/PassphraseLockscreen.qml+3
@@ -31,8 +31,10 @@ Item {
3131
3232 function clear(playAnimation) {
3333 pinentryField.text = "";
34+ pinentryField.enabled = true
3435 if (playAnimation) {
3536 wrongPasswordAnimation.start();
37+ pinentryField.forceActiveFocus();
3638 } else {
3739 pinentryField.focus = false
3840 }
@@ -78,6 +80,7 @@ Item {
7880
7981 onAccepted: {
8082 if (pinentryField.text) {
83+ pinentryField.enabled = false;
8184 root.entered(pinentryField.text);
8285 }
8386 }
qml/Components/ResponsiveGridView.qml+2−1
@@ -44,10 +44,11 @@ Item {
4444 property alias displayMarginBeginning: gridView.displayMarginBeginning
4545 property alias displayMarginEnd: gridView.displayMarginEnd
4646 property alias highlightIndex: gridView.highlightIndex
47+ property alias cacheBuffer: gridView.cacheBuffer
4748 readonly property alias currentItem: gridView.currentItem
4849
4950 function contentHeightForRows(rows) {
50− return rows * cellHeight + verticalSpacing
51+ return rows * cellHeight;
5152 }
5253
5354 GridView {
qml/Dash/Apps/RunningApplicationTile.qml+42−34
@@ -29,11 +29,8 @@ AbstractButton {
2929 signal requestedActivationMode()
3030 signal requestedTerminationMode()
3131
32− // Was: childrenRect.height
33− // To avoid "binding loop" warning
34− height: shapedApplicationImage.height + labelContainer.height
35−
36− width: shapedApplicationImage.width <= units.gu(11) ? units.gu(11) : height
32+ width: thumbnail.width
33+ height: thumbnail.height + labelContainer.height
3734
3835 property bool terminationModeEnabled: false
3936
@@ -50,42 +47,53 @@ AbstractButton {
5047 }
5148 }
5249
53− UbuntuShape {
54− id: shapedApplicationImage
55− anchors { top: parent.top; horizontalCenter: parent.horizontalCenter }
56−
57− height: units.gu(17)
58− width: applicationImage.width
59− radius: "medium"
60−
61− image: Image {
62− id: applicationImage
63− source: application.screenshot
64− // height : width = ss.height : ss.width
65− height: shapedApplicationImage.height
66− fillMode: Image.PreserveAspectCrop
67− width: Math.min(height, height * sourceSize.width / sourceSize.height)
68− }
50+ Item {
51+ id: thumbnail
52+
53+ width: shapedApplicationImage.width
54+ height: shapedApplicationImage.height
55+
56+ UbuntuShape {
57+ id: shapedApplicationImage
58+ x: 0
59+ y: 0
60+ height: applicationImage.height
61+ width: applicationImage.width
62+ radius: "medium"
63+
64+ image: Image {
65+ id: applicationImage
66+ source: application.screenshot
67+ // height : width = ss.height : ss.width
68+
69+ property bool isLandscape: sourceSize.width > sourceSize.height
70+ property real maxDimension: units.gu(17)
71+
72+ width: isLandscape ? Math.min(sourceSize.width, maxDimension) : height * (sourceSize.width / sourceSize.height)
73+ height: isLandscape ? width * (sourceSize.height / sourceSize.width) : Math.min(sourceSize.height, maxDimension)
74+ fillMode: Image.Stretch
75+ }
6976
70− }
77+ }
7178
72− UbuntuShape {
73− id: borderPressed
79+ UbuntuShape {
80+ id: borderPressed
7481
75− anchors.fill: shapedApplicationImage
76− radius: "medium"
77− borderSource: "radius_pressed.sci"
78− opacity: root.pressed ? 1.0 : 0.0
79− Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
82+ anchors.fill: shapedApplicationImage
83+ radius: "medium"
84+ borderSource: "radius_pressed.sci"
85+ opacity: root.pressed ? 1.0 : 0.0
86+ Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutQuint } }
87+ }
8088 }
8189
8290 // FIXME: label code duplicated with Tile
8391 Item {
8492 id: labelContainer
8593 anchors {
86− left: parent.left
87− right: parent.right
88− top: shapedApplicationImage.bottom
94+ left: thumbnail.left
95+ right: thumbnail.right
96+ top: thumbnail.bottom
8997 }
9098 height: units.gu(2)
9199
@@ -110,9 +118,9 @@ AbstractButton {
110118 CloseIcon {
111119 objectName: "closeIcon " + model.name
112120 anchors {
113− left: shapedApplicationImage.left
121+ left: thumbnail.left
114122 leftMargin: -units.gu(1)
115− top: parent.top
123+ top: thumbnail.top
116124 topMargin: -units.gu(1)
117125 }
118126 height: units.gu(6)
qml/Dash/CardCarousel.qml+2−7
@@ -21,13 +21,8 @@ import "../Components"
2121DashRenderer {
2222 id: cardCarousel
2323
24− property alias cacheBuffer: carousel.cacheBuffer
25− property alias itemComponent: carousel.itemComponent
26− property alias minimumTileWidth: carousel.minimumTileWidth
27− property alias selectedItemScaleFactor: carousel.selectedItemScaleFactor
28− property alias tileAspectRatio: carousel.tileAspectRatio
29−
30− height: carousel.implicitHeight + units.gu(6)
24+ expandedHeight: carousel.implicitHeight + units.gu(6)
25+ collapsedHeight: expandedHeight
3126
3227 Carousel {
3328 id: carousel
qml/Dash/CardFilterGrid.qml → qml/Dash/CardGrid.qmlrenamed+22−22
@@ -18,33 +18,33 @@ import QtQuick 2.0
1818import "../Components"
1919
2020DashRenderer {
21− id: genericFilterGrid
21+ id: root
2222
23− expandable: filterGrid.expandable
24− collapsedHeight: filterGrid.collapsedHeight
25− uncollapsedHeight: filterGrid.uncollapsedHeight
26− originY: filterGrid.originY
27− height: filterGrid.height
28− filtered: filterGrid.filtered
29−
30− function setFilter(filter, animate) {
31− filterGrid.setFilter(filter, animate)
23+ readonly property int collapsedRows: {
24+ if (!cardTool || !cardTool.template || typeof cardTool.template["collapsed-rows"] != "number") return 2;
25+ return cardTool.template["collapsed-rows"];
3226 }
3327
34− FilterGrid {
35− id: filterGrid
36− width: genericFilterGrid.width
28+ expandedHeight: grid.totalContentHeight
29+ collapsedHeight: Math.min(grid.contentHeightForRows(collapsedRows), expandedHeight)
30+ collapsedItemCount: collapsedRows * grid.columns
31+ originY: grid.originY
32+
33+ ResponsiveGridView {
34+ id: grid
35+ anchors.fill: parent
3736 minimumHorizontalSpacing: units.gu(1)
3837 delegateWidth: cardTool.cardWidth
3938 delegateHeight: cardTool.cardHeight
4039 verticalSpacing: units.gu(1)
41− model: genericFilterGrid.model
42− collapsedRowCount: Math.min(2, cardTool && cardTool.template && cardTool.template["collapsed-rows"] || 2)
43− displayMarginBeginning: genericFilterGrid.displayMarginBeginning
44− displayMarginEnd: genericFilterGrid.displayMarginEnd
40+ model: root.model
41+ displayMarginBeginning: root.displayMarginBeginning
42+ displayMarginEnd: root.displayMarginEnd
43+ cacheBuffer: 0
44+ interactive: false
4545 delegate: Item {
46− width: filterGrid.cellWidth
47− height: filterGrid.cellHeight
46+ width: grid.cellWidth
47+ height: grid.cellHeight
4848 Loader {
4949 id: loader
5050 sourceComponent: cardTool.cardComponent
@@ -58,12 +58,12 @@ DashRenderer {
5858 item.template = Qt.binding(function() { return cardTool.template; });
5959 item.components = Qt.binding(function() { return cardTool.components; });
6060 item.headerAlignment = Qt.binding(function() { return cardTool.headerAlignment; });
61− item.scopeStyle = genericFilterGrid.scopeStyle;
61+ item.scopeStyle = root.scopeStyle;
6262 }
6363 Connections {
6464 target: loader.item
65− onClicked: genericFilterGrid.clicked(index, result)
66− onPressAndHold: genericFilterGrid.pressAndHold(index)
65+ onClicked: root.clicked(index, result)
66+ onPressAndHold: root.pressAndHold(index)
6767 }
6868 }
6969 }
qml/Dash/CardVerticalJournal.qml+3−21
@@ -23,33 +23,15 @@ DashRenderer {
2323
2424 readonly property double collapseLimit: units.gu(35)
2525
26− uncollapsedHeight: cardVerticalJournal.implicitHeight
27− collapsedHeight: Math.min(collapseLimit, cardVerticalJournal.implicitHeight)
28− expandable: uncollapsedHeight > collapseLimit
26+ expandedHeight: Math.max(cardVerticalJournal.implicitHeight, minHeight)
27+ collapsedHeight: Math.max(Math.min(collapseLimit, cardVerticalJournal.implicitHeight), minHeight)
28+ // TODO: implement collapsedItemCount
2929
3030 // This minHeight is used as bootstrapper for the height. Vertical Journal
3131 // is special by the fact that it doesn't know how to calculate its implicit height unless we give it
3232 // enough height that it can start creating its children so we make sure it has enough height for that
3333 // in case the model is non empty
3434 readonly property double minHeight: root.model.count >= 1 ? cardVerticalJournal.rowSpacing + 1 : 0
35− height: filtered ? Math.max(collapsedHeight, minHeight) : uncollapsedHeight
36−
37− Behavior on height {
38− id: heightBehaviour
39− enabled: false
40− animation: UbuntuNumberAnimation {
41− onRunningChanged: {
42− if (!running) {
43− heightBehaviour.enabled = false
44− }
45− }
46− }
47− }
48−
49− function setFilter(filter, animate) {
50− heightBehaviour.enabled = animate;
51− filtered = filter;
52− }
5335
5436 ResponsiveVerticalJournal {
5537 id: cardVerticalJournal
qml/Dash/DashContent.qml+4
@@ -121,6 +121,10 @@ Item {
121121 Loader {
122122 width: ListView.view.width
123123 height: ListView.view.height
124+ opacity: { // hide delegate if offscreen
125+ var xPositionRelativetoView = ListView.view.contentX - x
126+ return (xPositionRelativetoView > -width && xPositionRelativetoView < width) ? 1 : 0
127+ }
124128 asynchronous: true
125129 // TODO This if will eventually go away since we're killing DashApps.qml
126130 // once we move app closing to the spread
qml/Dash/DashRenderer.qml+3−10
@@ -17,15 +17,11 @@
1717import QtQuick 2.0
1818
1919Item {
20− // Can the item be expanded?
21− property bool expandable: false
20+ property int collapsedHeight
2221
23− // In case it can be expanded, is it filtered
24− property bool filtered: true
22+ property int expandedHeight
2523
26− property int collapsedHeight: height
27−
28− property int uncollapsedHeight: height
24+ property int collapsedItemCount: -1
2925
3026 property int displayMarginBeginning: 0
3127
@@ -50,7 +46,4 @@ Item {
5046 /// Emitted when the user pressed and held on an item
5147 /// @param index is the index of the held item
5248 signal pressAndHold(int index)
53−
54− function setFilter(filter, animate) {
55− }
5649}
qml/Dash/GenericScopeView.qml+128−64
@@ -119,6 +119,7 @@ FocusScope {
119119
120120 model: scopeView.categories
121121 forceNoClip: previewListView.open
122+ pixelAligned: true
122123
123124 property string expandedCategoryId: ""
124125
@@ -128,11 +129,22 @@ FocusScope {
128129 highlightWhenPressed: false
129130 showDivider: false
130131
131− readonly property bool expandable: rendererLoader.item ? rendererLoader.item.expandable : false
132− readonly property bool filtered: rendererLoader.item ? rendererLoader.item.filtered : true
132+ readonly property bool expandable: {
133+ if (categoryView.model.count === 1) return false;
134+ if (cardTool.template && cardTool.template["collapsed-rows"] === 0) return false;
135+ if (item && item.expandedHeight > item.collapsedHeight) return true;
136+ return false;
137+ }
138+ property bool expanded: false
133139 readonly property string category: categoryId
140+ readonly property string headerLink: model.headerLink
134141 readonly property var item: rendererLoader.item
135142
143+ function expand(expand, animate) {
144+ heightBehaviour.enabled = animate;
145+ expanded = expand;
146+ }
147+
136148 CardTool {
137149 id: cardTool
138150 objectName: "cardTool"
@@ -142,22 +154,49 @@ FocusScope {
142154 viewWidth: parent.width
143155 }
144156
157+ onExpandableChanged: {
158+ // This can happen with the VJ that doesn't know how height it will be on creation
159+ // so doesn't set expandable until a bit too late for onLoaded
160+ if (expandable) {
161+ var shouldExpand = baseItem.category === categoryView.expandedCategoryId;
162+ baseItem.expand(shouldExpand, false /*animate*/);
163+ }
164+ }
165+
166+ onHeightChanged: rendererLoader.updateDelegateCreationRange();
167+ onYChanged: rendererLoader.updateDelegateCreationRange();
168+
145169 Loader {
146170 id: rendererLoader
147171 anchors {
148172 top: parent.top
149173 left: parent.left
150174 right: parent.right
151− topMargin: hasSectionHeader ? 0 : units.gu(2)
175+ topMargin: name != "" ? 0 : units.gu(2)
176+ }
177+
178+ Behavior on height {
179+ id: heightBehaviour
180+ enabled: false
181+ animation: UbuntuNumberAnimation {
182+ onRunningChanged: {
183+ if (!running) {
184+ heightBehaviour.enabled = false
185+ }
186+ }
187+ }
152188 }
153189
190+ readonly property bool expanded: baseItem.expanded || !baseItem.expandable
191+ height: expanded ? item.expandedHeight : item.collapsedHeight
192+
154193 source: {
155194 switch (cardTool.categoryLayout) {
156195 case "carousel": return "CardCarousel.qml";
157196 case "vertical-journal": return "CardVerticalJournal.qml";
158197 case "running-apps": return "Apps/RunningApplicationsGrid.qml";
159198 case "grid":
160− default: return "CardFilterGrid.qml";
199+ default: return "CardGrid.qml";
161200 }
162201 }
163202
@@ -176,9 +215,9 @@ FocusScope {
176215 }
177216 item.objectName = Qt.binding(function() { return categoryId })
178217 item.scopeStyle = scopeView.scopeStyle;
179− if (item.expandable) {
180− var shouldFilter = categoryId != categoryView.expandedCategoryId;
181− item.setFilter(shouldFilter, false /*animate*/);
218+ if (baseItem.expandable) {
219+ var shouldExpand = categoryId === categoryView.expandedCategoryId;
220+ baseItem.expand(shouldExpand, false /*animate*/);
182221 }
183222 updateDelegateCreationRange();
184223 item.cardTool = cardTool;
@@ -199,25 +238,22 @@ FocusScope {
199238 // so it's not implemented
200239 scopeView.scope.activate(result)
201240 } else {
202− previewListView.model = target.model;
203− previewListView.currentIndex = -1
204− previewListView.currentIndex = index;
205− previewListView.open = true
241+ openPreview(index);
206242 }
207243 }
208− onPressAndHold: {
209− previewListView.model = target.model;
210− previewListView.currentIndex = -1
211− previewListView.currentIndex = index;
212− previewListView.open = true
213− }
214− onExpandableChanged: {
215− // This can happen with the VJ that doesn't know how height it will be on creation
216− // so doesn't set expandable until a bit too late for onLoaded
217− if (rendererLoader.item.expandable) {
218− var shouldFilter = baseItem.category != categoryView.expandedCategoryId;
219− rendererLoader.item.setFilter(shouldFilter, false /*animate*/);
244+ onPressAndHold: openPreview(index)
245+
246+ function openPreview(index) {
247+ if (!rendererLoader.expanded && !seeAllLabel.visible && target.collapsedItemCount > 0) {
248+ previewLimitModel.model = target.model;
249+ previewLimitModel.limit = target.collapsedItemCount;
250+ previewListView.model = previewLimitModel;
251+ } else {
252+ previewListView.model = target.model;
220253 }
254+ previewListView.currentIndex = -1;
255+ previewListView.currentIndex = index;
256+ previewListView.open = true;
221257 }
222258 }
223259 Connections {
@@ -227,17 +263,17 @@ FocusScope {
227263 }
228264 function collapseAllButExpandedCategory() {
229265 var item = rendererLoader.item;
230− if (item.expandable) {
231− var shouldFilter = categoryId != categoryView.expandedCategoryId;
232− if (shouldFilter != item.filter) {
266+ if (baseItem.expandable) {
267+ var shouldExpand = categoryId === categoryView.expandedCategoryId;
268+ if (shouldExpand != baseItem.expanded) {
233269 // If the filter animation will be seen start it, otherwise, just flip the switch
234− var shrinkingVisible = shouldFilter && y + item.collapsedHeight < categoryView.height;
235− var growingVisible = !shouldFilter && y + height < categoryView.height;
236− if (!previewListView.open || !shouldFilter) {
270+ var shrinkingVisible = !shouldExpand && y + item.collapsedHeight + seeAll.height < categoryView.height;
271+ var growingVisible = shouldExpand && y + height < categoryView.height;
272+ if (!previewListView.open || shouldExpand) {
237273 var animate = shrinkingVisible || growingVisible;
238− item.setFilter(shouldFilter, animate)
239− if (!shouldFilter && !previewListView.open) {
240− categoryView.maximizeVisibleArea(index, item.uncollapsedHeight);
274+ baseItem.expand(shouldExpand, animate)
275+ if (shouldExpand && !previewListView.open) {
276+ categoryView.maximizeVisibleArea(index, item.expandedHeight + seeAll.height);
241277 }
242278 }
243279 }
@@ -274,58 +310,82 @@ FocusScope {
274310 item.displayMarginEnd = -baseItem.height;
275311 } else {
276312 item.displayMarginBeginning = -Math.max(-baseItem.y, 0);
277− item.displayMarginEnd = -Math.max(baseItem.height - categoryView.height + baseItem.y, 0)
313+ item.displayMarginEnd = -Math.max(baseItem.height - seeAll.height
314+ - categoryView.height + baseItem.y, 0)
278315 }
279316 }
280317 }
318+ }
281319
282− Image {
283− visible: index != 0
284− anchors {
285− top: parent.top
286− left: parent.left
287− right: parent.right
320+ AbstractButton {
321+ id: seeAll
322+ objectName: "seeAll"
323+ anchors {
324+ top: rendererLoader.bottom
325+ left: parent.left
326+ right: parent.right
327+ }
328+ height: seeAllLabel.visible ? seeAllLabel.font.pixelSize + units.gu(6) : 0
329+
330+ onClicked: {
331+ if (categoryView.expandedCategoryId != baseItem.category) {
332+ categoryView.expandedCategoryId = baseItem.category;
333+ } else {
334+ categoryView.expandedCategoryId = "";
288335 }
289− fillMode: Image.Stretch
290− source: "graphics/dash_divider_top_lightgrad.png"
291− z: -1
292336 }
293337
294− Image {
295− // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
296− visible: index != categoryView.model.count - 1
338+ Label {
339+ id: seeAllLabel
340+ text: baseItem.expanded ? i18n.tr("See less") : i18n.tr("See all")
297341 anchors {
298− bottom: parent.bottom
299− left: parent.left
300− right: parent.right
342+ centerIn: parent
343+ verticalCenterOffset: units.gu(-0.5)
301344 }
302− fillMode: Image.Stretch
303− source: "graphics/dash_divider_top_darkgrad.png"
304− z: -1
345+ fontSize: "small"
346+ font.weight: Font.Bold
347+ color: scopeStyle ? scopeStyle.foreground : "grey"
348+ visible: baseItem.expandable && !baseItem.headerLink
305349 }
306350 }
307351
308− onHeightChanged: rendererLoader.updateDelegateCreationRange();
309− onYChanged: rendererLoader.updateDelegateCreationRange();
352+ Image {
353+ visible: index != 0
354+ anchors {
355+ top: parent.top
356+ left: parent.left
357+ right: parent.right
358+ }
359+ fillMode: Image.Stretch
360+ source: "graphics/dash_divider_top_lightgrad.png"
361+ z: -1
362+ }
363+
364+ Image {
365+ // FIXME Should not rely on model.count but view.count, but ListViewWithPageHeader doesn't expose it yet.
366+ visible: index != categoryView.model.count - 1
367+ anchors {
368+ bottom: seeAll.bottom
369+ left: parent.left
370+ right: parent.right
371+ }
372+ fillMode: Image.Stretch
373+ source: "graphics/dash_divider_top_darkgrad.png"
374+ z: -1
375+ }
310376 }
311377
312378 sectionProperty: "name"
313379 sectionDelegate: ListItems.Header {
314380 objectName: "dashSectionHeader" + (delegate ? delegate.category : "")
315− property var delegate: categoryView.item(delegateIndex)
381+ readonly property var delegate: categoryView.item(delegateIndex)
316382 width: categoryView.width
383+ height: section != "" ? units.gu(5) : 0
317384 text: section
318− textColor: scopeStyle ? scopeStyle.foreground : "grey"
319− image: {
320− if (delegate && delegate.expandable)
321− return delegate.filtered ? "graphics/header_handlearrow.png" : "graphics/header_handlearrow2.png"
322− return "";
323− }
385+ color: scopeStyle ? scopeStyle.foreground : "grey"
386+ iconName: delegate && delegate.headerLink ? "go-next" : ""
324387 onClicked: {
325− if (categoryView.expandedCategoryId != delegate.category)
326− categoryView.expandedCategoryId = delegate.category;
327− else
328− categoryView.expandedCategoryId = "";
388+ if (delegate.headerLink) scopeView.scope.performQuery(delegate.headerLink);
329389 }
330390 }
331391
@@ -352,6 +412,10 @@ FocusScope {
352412 }
353413 }
354414
415+ LimitProxyModel {
416+ id: previewLimitModel
417+ }
418+
355419 PreviewListView {
356420 id: previewListView
357421 objectName: "previewListView"
qml/Dash/graphics/phone/screenshots/vkb_portrait.pngnew file

Binary file not shown.

qml/Launcher/Launcher.qml+1−1
@@ -181,7 +181,7 @@ Item {
181181 bottom: parent.bottom
182182 }
183183 x: -width
184− opacity: (x == -width && dragArea.status === DirectionalDragArea.WaitingForTouch) ? 0 : 1
184+ visible: x > -width || dragArea.status === DirectionalDragArea.Undecided
185185 model: LauncherModel
186186
187187 property bool animate: true
qml/Panel/Indicators.qml+3−1
@@ -37,6 +37,7 @@ Showable {
3737 readonly property int lockThreshold: openedHeight / 2
3838 property bool fullyOpened: height == openedHeight
3939 property bool partiallyOpened: height > panelHeight && !fullyOpened
40+ property bool fullyClosed: height <= panelHeight
4041 property bool contentEnabled: true
4142 property bool initalizeItem: true
4243 readonly property alias content: menuContent
@@ -187,7 +188,7 @@ Showable {
187188 bottom: handle.top
188189 }
189190 indicatorsModel: visibleIndicators.model
190− visible: indicators.fullyOpened || indicators.partiallyOpened
191+ visible: indicators.partiallyOpened || indicators.fullyOpened
191192 clip: indicators.partiallyOpened
192193 enabled: contentEnabled
193194
@@ -219,6 +220,7 @@ Showable {
219220 }
220221 height: Math.max(Math.min(handleImage.height, indicators.height - handleImage.height), 0)
221222 clip: height < handleImage.height
223+ visible: menuContent.visible
222224
223225 BorderImage {
224226 id: handleImage
qml/Shell.qml+183−399
@@ -19,9 +19,9 @@ import AccountsService 0.1
1919import GSettings 1.0
2020import Unity.Application 0.1
2121import Ubuntu.Components 0.1
22−import Ubuntu.Components.Popups 0.1
2322import Ubuntu.Gestures 0.1
2423import Unity.Launcher 0.1
24+import Utils 0.1
2525import LightDM 0.1 as LightDM
2626import Powerd 0.1
2727import SessionBroadcast 0.1
@@ -31,10 +31,11 @@ import "Launcher"
3131import "Panel"
3232import "Components"
3333import "Notifications"
34+import "Stages"
3435import Unity.Notifications 1.0 as NotificationBackend
3536import Unity.Session 0.1
3637
37−FocusScope {
38+Item {
3839 id: shell
3940
4041 // this is only here to select the width / height of the window if not running fullscreen
@@ -47,7 +48,7 @@ FocusScope {
4748 property url background
4849 readonly property real panelHeight: panel.panelHeight
4950
50− property bool dashShown: dash.shown
51+ property bool dashShown: dash.shown && dash.available && underlay.visible
5152
5253 property bool sideStageEnabled: shell.width >= units.gu(100)
5354 readonly property string focusedApplicationId: ApplicationManager.focusedApplicationId
@@ -55,14 +56,10 @@ FocusScope {
5556 function activateApplication(appId) {
5657 if (ApplicationManager.findApplication(appId)) {
5758 ApplicationManager.requestFocusApplication(appId);
58− stages.show(true);
59− if (stages.locked && ApplicationManager.focusedApplicationId == appId) {
60− applicationsDisplayLoader.item.select(appId);
61− }
6259 } else {
6360 var execFlags = shell.sideStageEnabled ? ApplicationManager.NoFlag : ApplicationManager.ForceMainStage;
6461 ApplicationManager.startApplication(appId, execFlags);
65− stages.show(false);
62+ stages.show();
6663 }
6764 }
6865
@@ -89,82 +86,74 @@ FocusScope {
8986 id: volumeControl
9087 }
9188
92− Keys.onVolumeUpPressed: volumeControl.volumeUp()
93− Keys.onVolumeDownPressed: volumeControl.volumeDown()
89+ WindowKeysFilter {
90+ // Handle but do not filter out volume keys
91+ Keys.onVolumeUpPressed: { volumeControl.volumeUp(); event.accepted = false; }
92+ Keys.onVolumeDownPressed: { volumeControl.volumeDown(); event.accepted = false; }
9493
95− Item {
96− id: underlayClipper
97− anchors.fill: parent
98− anchors.rightMargin: stages.overlayWidth
99− clip: stages.overlayMode && !stages.painting
94+ Keys.onPressed: {
95+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
96+ dialogs.onPowerKeyPressed();
97+ event.accepted = true;
98+ } else {
99+ event.accepted = false;
100+ }
101+ }
100102
101− InputFilterArea {
102− anchors.fill: parent
103− blockInput: parent.clip
103+ Keys.onReleased: {
104+ if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
105+ dialogs.onPowerKeyReleased();
106+ event.accepted = true;
107+ } else {
108+ event.accepted = false;
109+ }
104110 }
111+ }
105112
106− Item {
107− id: underlay
108− objectName: "underlay"
109− anchors.fill: parent
110− anchors.rightMargin: -parent.anchors.rightMargin
113+ Item {
114+ id: underlay
115+ objectName: "underlay"
116+ anchors.fill: parent
111117
112− // Whether the underlay is fully covered by opaque UI elements.
113− property bool fullyCovered: panel.indicators.fullyOpened && shell.width <= panel.indicators.width
118+ // Whether the underlay is fully covered by opaque UI elements.
119+ property bool fullyCovered: (panel.indicators.fullyOpened && shell.width <= panel.indicatorsMenuWidth)
120+ || stages.fullyShown || greeterWrapper.fullyShown
121+ visible: !fullyCovered
114122
115− // Whether the user should see the topmost application surface (if there's one at all).
116− readonly property bool applicationSurfaceShouldBeSeen: stages.shown && !stages.painting && !stages.overlayMode
123+ Image {
124+ anchors.fill: dash
125+ source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
126+ fillMode: Image.PreserveAspectCrop
127+ horizontalAlignment: Image.AlignRight
128+ verticalAlignment: Image.AlignTop
129+ }
117130
118− // NB! Application surfaces are stacked behind the shell one. So they can only be seen by the user
119− // through the translucent parts of the shell surface.
120− visible: !fullyCovered && !applicationSurfaceShouldBeSeen
131+ Dash {
132+ id: dash
133+ objectName: "dash"
121134
122− Rectangle {
123− anchors.fill: parent
124− color: "black"
125− opacity: dash.disappearingAnimationProgress
126− }
135+ available: !LightDM.Greeter.active
136+ hides: [stages, launcher, panel.indicators]
137+ shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0 &&
138+ !(panel.indicators.fullyOpened && !sideStageEnabled)
139+ enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
127140
128− Image {
129− anchors.fill: dash
130− source: shell.width > shell.height ? "Dash/graphics/paper_landscape.png" : "Dash/graphics/paper_portrait.png"
131− fillMode: Image.PreserveAspectCrop
132− horizontalAlignment: Image.AlignRight
133− verticalAlignment: Image.AlignTop
141+ anchors {
142+ fill: parent
143+ topMargin: panel.panelHeight
134144 }
135145
136− Dash {
137− id: dash
138− objectName: "dash"
139−
140− available: !LightDM.Greeter.active
141− hides: [stages, launcher, panel.indicators]
142− shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0
143− enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled
144−
145− anchors {
146− fill: parent
147− topMargin: panel.panelHeight
148− }
149−
150− contentScale: 1.0 - 0.2 * disappearingAnimationProgress
151− opacity: 1.0 - disappearingAnimationProgress
152− property real disappearingAnimationProgress: {
153− if (stages.overlayMode) {
154− return 0;
155− } else {
156− return stages.showProgress
157− }
158− }
146+ contentScale: 1.0 - 0.2 * disappearingAnimationProgress
147+ opacity: 1.0 - disappearingAnimationProgress
148+ property real disappearingAnimationProgress: stages.showProgress
159149
160− // FIXME: only necessary because stages.showProgress is not animated
161− Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
162− }
150+ // FIXME: only necessary because stages.showProgress is not animated
151+ Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }}
163152 }
164153 }
165154
166155 EdgeDragArea {
167− id: stagesDragHandle
156+ id: stagesDragArea
168157 direction: Direction.Leftwards
169158
170159 anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
@@ -174,20 +163,20 @@ FocusScope {
174163
175164 onTouchXChanged: {
176165 if (status == DirectionalDragArea.Recognized) {
177− if (ApplicationManager.count == 0) {
178− progress = Math.max(stages.width - stagesDragHandle.width + touchX, stages.width * .3)
166+ if (ApplicationManager.empty) {
167+ progress = Math.max(stages.width - stagesDragArea.width + touchX, stages.width * .3);
179168 } else {
180− progress = stages.width - stagesDragHandle.width + touchX
169+ progress = stages.width - stagesDragArea.width + touchX;
181170 }
182171 }
183172 }
184173
185174 onDraggingChanged: {
186175 if (!dragging) {
187− if (ApplicationManager.count > 0 && progress < stages.width - units.gu(10)) {
188− stages.show(true)
176+ if (!ApplicationManager.empty && progress < stages.width - units.gu(10)) {
177+ stages.show();
189178 }
190− stagesDragHandle.progress = stages.width;
179+ stagesDragArea.progress = Qt.binding(function () { return stages.width; });
191180 }
192181 }
193182 }
@@ -198,253 +187,93 @@ FocusScope {
198187 width: parent.width
199188 height: parent.height
200189
190+ visible: !fullyHidden && !ApplicationManager.empty
191+
201192 x: {
202193 if (shown) {
203− if (overlayMode || locked || greeter.fakeActiveForApp !== "") {
194+ if (locked || greeter.fakeActiveForApp !== "") {
204195 return 0;
205196 }
206− return launcher.progress
197+ return launcher.progress;
207198 } else {
208− return stagesDragHandle.progress
199+ return stagesDragArea.progress
209200 }
210201 }
211−
212202 Behavior on x { SmoothedAnimation { velocity: 600; duration: UbuntuAnimation.FastDuration } }
213203
214204 property bool shown: false
205+ onShownChanged: {
206+ if (shown) {
207+ if (ApplicationManager.count > 0) {
208+ ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
209+ }
210+ } else {
211+ if (ApplicationManager.focusedApplicationId) {
212+ ApplicationManager.updateScreenshot(ApplicationManager.focusedApplicationId);
213+ ApplicationManager.unfocusCurrentApplication();
214+ }
215+ }
216+ }
215217
216− property real showProgress: overlayMode ? 0 : MathUtils.clamp(1 - x / shell.width, 0, 1)
218+ // Avoid a silent "divide by zero -> NaN" situation during init as shell.width will be
219+ // zero. That breaks the property binding and the function won't be reevaluated once
220+ // shell.width is set, with the NaN result staying there for good.
221+ property real showProgress: shell.width ? MathUtils.clamp(1 - x / shell.width, 0, 1) : 0
217222
218223 property bool fullyShown: x == 0
219224 property bool fullyHidden: x == width
220225
221− property bool painting: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.painting : false
222− property bool fullscreen: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.fullscreen : false
223− property bool overlayMode: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayMode : false
224− property int overlayWidth: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.overlayWidth : false
225226 property bool locked: applicationsDisplayLoader.item ? applicationsDisplayLoader.item.locked : false
226227
227− function show(focusApp) {
228+ // It might technically not be fullyShown but visually it just looks so.
229+ property bool roughlyFullyShown: x >= 0 && x <= units.gu(1)
230+
231+ function show() {
228232 shown = true;
229− panel.indicators.hide();
230− edgeDemo.stopDemo();
231− greeter.hide();
232− if (!ApplicationManager.focusedApplicationId && ApplicationManager.count > 0 && focusApp) {
233− ApplicationManager.focusApplication(ApplicationManager.get(0).appId);
234− }
235233 }
236234
237235 function hide() {
238236 shown = false;
239− if (ApplicationManager.focusedApplicationId) {
240− ApplicationManager.unfocusCurrentApplication();
241− }
242237 }
243238
244239 Connections {
245240 target: ApplicationManager
246−
247241 onFocusRequested: {
248242 if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== appId) {
249243 lockscreen.show();
250244 }
251245 greeter.hide();
252− stages.show(true);
246+ stages.show();
253247 }
254248
255249 onFocusedApplicationIdChanged: {
256250 if (greeter.fakeActiveForApp !== "" && greeter.fakeActiveForApp !== ApplicationManager.focusedApplicationId) {
257251 lockscreen.show();
258252 }
259− if (ApplicationManager.focusedApplicationId.length > 0) {
260− stages.show(false);
261− } else {
262− if (!stages.overlayMode) {
263− stages.hide();
264− }
265− }
253+ panel.indicators.hide();
266254 }
267255
268256 onApplicationAdded: {
269− stages.show(false);
270− }
271−
272− onApplicationRemoved: {
273− if (ApplicationManager.focusedApplicationId.length == 0) {
274− stages.hide();
275− }
276− }
277− }
278−
279− property bool dialogShown: false
280−
281− Component {
282− id: logoutDialog
283− Dialog {
284− id: dialogueLogout
285− title: "Logout"
286− text: "Are you sure that you want to logout?"
287− Button {
288− text: "Cancel"
289− onClicked: {
290− PopupUtils.close(dialogueLogout);
291− stages.dialogShown = false;
292− }
293− }
294− Button {
295− text: "Yes"
296− onClicked: {
297− DBusUnitySessionService.Logout();
298− PopupUtils.close(dialogueLogout);
299− stages.dialogShown = false;
300− }
301− }
302− }
303− }
304−
305− Component {
306− id: shutdownDialog
307− Dialog {
308− id: dialogueShutdown
309− title: "Shutdown"
310− text: "Are you sure that you want to shutdown?"
311− Button {
312− text: "Cancel"
313− onClicked: {
314− PopupUtils.close(dialogueShutdown);
315− stages.dialogShown = false;
316− }
317− }
318− Button {
319− text: "Yes"
320− onClicked: {
321− dBusUnitySessionServiceConnection.closeAllApps();
322− DBusUnitySessionService.Shutdown();
323− PopupUtils.close(dialogueShutdown);
324− stages.dialogShown = false;
325− }
326− }
327− }
328− }
329−
330− Component {
331− id: rebootDialog
332− Dialog {
333− id: dialogueReboot
334− title: "Reboot"
335− text: "Are you sure that you want to reboot?"
336− Button {
337− text: "Cancel"
338− onClicked: {
339− PopupUtils.close(dialogueReboot)
340− stages.dialogShown = false;
341− }
342− }
343− Button {
344− text: "Yes"
345− onClicked: {
346− dBusUnitySessionServiceConnection.closeAllApps();
347− DBusUnitySessionService.Reboot();
348− PopupUtils.close(dialogueReboot);
349− stages.dialogShown = false;
350− }
351− }
352− }
353− }
354−
355− Component {
356− id: powerDialog
357− Dialog {
358− id: dialoguePower
359− title: "Power"
360− text: i18n.tr("Are you sure you would like to turn power off?")
361− Button {
362− text: i18n.tr("Power off")
363− onClicked: {
364− dBusUnitySessionServiceConnection.closeAllApps();
365− PopupUtils.close(dialoguePower);
366− stages.dialogShown = false;
367− shutdownFadeOutRectangle.enabled = true;
368− shutdownFadeOutRectangle.visible = true;
369− shutdownFadeOut.start();
370− }
371− }
372− Button {
373− text: i18n.tr("Restart")
374− onClicked: {
375− dBusUnitySessionServiceConnection.closeAllApps();
376− DBusUnitySessionService.Reboot();
377− PopupUtils.close(dialoguePower);
378− stages.dialogShown = false;
379− }
380− }
381− Button {
382− text: i18n.tr("Cancel")
383− onClicked: {
384− PopupUtils.close(dialoguePower);
385− stages.dialogShown = false;
386− }
387− }
388− }
389− }
390−
391− function showPowerDialog() {
392− if (!stages.dialogShown) {
393− stages.dialogShown = true;
394− PopupUtils.open(powerDialog);
395− }
396− }
397−
398− Connections {
399− id: dBusUnitySessionServiceConnection
400− objectName: "dBusUnitySessionServiceConnection"
401− target: DBusUnitySessionService
402−
403− function closeAllApps() {
404− while (true) {
405− var app = ApplicationManager.get(0);
406− if (app === null) {
407− break;
408− }
409− ApplicationManager.stopApplication(app.appId);
410− }
411− }
412−
413− onLogoutRequested: {
414− // Display a dialog to ask the user to confirm.
415− if (!stages.dialogShown) {
416− stages.dialogShown = true;
417− PopupUtils.open(logoutDialog);
257+ if (greeter.shown) {
258+ greeter.hide();
418259 }
419− }
420−
421− onShutdownRequested: {
422− // Display a dialog to ask the user to confirm.
423− if (!stages.dialogShown) {
424− stages.dialogShown = true;
425− PopupUtils.open(shutdownDialog);
260+ if (!stages.shown) {
261+ stages.show();
426262 }
427263 }
428264
429− onRebootRequested: {
430− // Display a dialog to ask the user to confirm.
431− if (!stages.dialogShown) {
432− stages.dialogShown = true;
433− PopupUtils.open(rebootDialog);
265+ onEmptyChanged: {
266+ if (ApplicationManager.empty) {
267+ stages.hide();
434268 }
435269 }
436−
437− onLogoutReady: {
438− closeAllApps();
439− Qt.quit();
440− }
441270 }
442271
443272 Loader {
444273 id: applicationsDisplayLoader
445274 anchors.fill: parent
446275
447− source: shell.sideStageEnabled ? "Stages/StageWithSideStage.qml" : "Stages/PhoneStage.qml"
276+ source: shell.sideStageEnabled ? "Stages/TabletStage.qml" : "Stages/PhoneStage.qml"
448277
449278 Binding {
450279 target: applicationsDisplayLoader.item
@@ -453,18 +282,20 @@ FocusScope {
453282 }
454283 Binding {
455284 target: applicationsDisplayLoader.item
456− property: "moving"
457− value: !stages.fullyShown
285+ property: "dragAreaWidth"
286+ value: shell.edgeSize
458287 }
459288 Binding {
460289 target: applicationsDisplayLoader.item
461− property: "shown"
462− value: stages.shown
290+ property: "maximizedAppTopMargin"
291+ // Not just using panel.panelHeight as that changes depending on the focused app.
292+ value: panel.indicators.panelHeight
463293 }
464294 Binding {
465295 target: applicationsDisplayLoader.item
466− property: "dragAreaWidth"
467− value: shell.edgeSize
296+ property: "interactive"
297+ value: stages.roughlyFullyShown && !greeter.shown && !lockscreen.shown
298+ && panel.indicators.fullyClosed
468299 }
469300 Binding {
470301 target: applicationsDisplayLoader.item
@@ -474,6 +305,33 @@ FocusScope {
474305 }
475306 }
476307
308+ InputMethod {
309+ id: inputMethod
310+ objectName: "inputMethod"
311+ anchors { fill: parent; topMargin: panel.panelHeight }
312+ z: notifications.useModal || panel.indicators.shown ? overlay.z + 1 : overlay.z - 1
313+ }
314+
315+ Connections {
316+ target: SurfaceManager
317+ onSurfaceCreated: {
318+ if (surface.type == MirSurfaceItem.InputMethod) {
319+ inputMethod.surface = surface;
320+ }
321+ }
322+
323+ onSurfaceDestroyed: {
324+ if (inputMethod.surface == surface) {
325+ inputMethod.surface = null;
326+ surface.parent = null;
327+ }
328+ if (!surface.parent) {
329+ // there's no one displaying it. delete it right away
330+ surface.release();
331+ }
332+ }
333+ }
334+
477335 Lockscreen {
478336 id: lockscreen
479337 objectName: "lockscreen"
@@ -486,10 +344,11 @@ FocusScope {
486344 showAnimation: StandardAnimation { property: "opacity"; to: 1 }
487345 hideAnimation: StandardAnimation { property: "opacity"; to: 0 }
488346 y: panel.panelHeight
489− x: required ? 0 : - width
347+ visible: required
490348 width: parent.width
491349 height: parent.height - panel.panelHeight
492350 background: shell.background
351+ alphaNumeric: AccountsService.passwordDisplayHint === AccountsService.Keyboard
493352 minPinLength: 4
494353 maxPinLength: 4
495354
@@ -504,7 +363,7 @@ FocusScope {
504363 onShownChanged: if (shown) greeter.fakeActiveForApp = ""
505364
506365 Component.onCompleted: {
507− if (LightDM.Users.count == 1) {
366+ if (greeter.narrowMode) {
508367 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
509368 }
510369 }
@@ -516,14 +375,17 @@ FocusScope {
516375 onShowGreeter: greeter.show()
517376
518377 onShowPrompt: {
519− if (LightDM.Users.count == 1) {
520− // TODO: There's no better way for now to determine if its a PIN or a passphrase.
521− if (text == "PIN") {
522− lockscreen.alphaNumeric = false
523− } else {
524− lockscreen.alphaNumeric = true
525− }
526− lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text);
378+ if (greeter.narrowMode) {
379+ lockscreen.placeholderText = i18n.tr("Please enter %1").arg(text.toLowerCase());
380+ lockscreen.show();
381+ }
382+ }
383+
384+ onPromptlessChanged: {
385+ if (LightDM.Greeter.promptless) {
386+ lockscreen.hide()
387+ } else {
388+ lockscreen.reset();
527389 lockscreen.show();
528390 }
529391 }
@@ -537,6 +399,9 @@ FocusScope {
537399 greeter.login();
538400 } else {
539401 lockscreen.clear(true);
402+ if (greeter.narrowMode) {
403+ LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole))
404+ }
540405 }
541406 }
542407 }
@@ -566,6 +431,7 @@ FocusScope {
566431 StandardAnimation {}
567432 }
568433
434+ property bool fullyShown: showProgress === 1.0
569435 readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1)
570436 onShowProgressChanged: if (LightDM.Greeter.promptless && showProgress === 0) greeter.login()
571437
@@ -590,25 +456,24 @@ FocusScope {
590456
591457 function login() {
592458 enabled = false;
593− LightDM.Greeter.startSessionSync();
594− sessionStarted();
595− greeter.hide();
596− lockscreen.hide();
597− launcher.hide();
459+ if (LightDM.Greeter.startSessionSync()) {
460+ sessionStarted();
461+ greeter.hide();
462+ lockscreen.hide();
463+ launcher.hide();
464+ }
598465 enabled = true;
599466 }
600467
601468 onShownChanged: {
602469 if (shown) {
603− lockscreen.reset();
604− if (!LightDM.Greeter.promptless) {
605− lockscreen.show();
606− }
607− // If there is only one user, we start authenticating with that one here.
608− // If there are more users, the Greeter will handle that
609− if (LightDM.Users.count == 1) {
470+ if (greeter.narrowMode) {
610471 LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole));
611472 }
473+ if (!LightDM.Greeter.promptless) {
474+ lockscreen.reset();
475+ lockscreen.show();
476+ }
612477 greeter.fakeActiveForApp = "";
613478 greeter.forceActiveFocus();
614479 }
@@ -632,12 +497,6 @@ FocusScope {
632497 }
633498 }
634499
635− InputFilterArea {
636− anchors.fill: parent
637− blockInput: ApplicationManager.focusedApplicationId.length === 0 || greeter.shown || lockscreen.shown || launcher.shown
638− || panel.indicators.shown
639− }
640−
641500 Connections {
642501 id: powerConnection
643502 target: Powerd
@@ -680,7 +539,7 @@ FocusScope {
680539 return;
681540 }
682541
683− if (stages.shown && !stages.overlayMode && !stages.locked) {
542+ if (!stages.locked) {
684543 stages.hide();
685544 launcher.fadeOut();
686545 } else {
@@ -695,6 +554,7 @@ FocusScope {
695554
696555 Item {
697556 id: overlay
557+ z: 10
698558
699559 anchors.fill: parent
700560
@@ -709,29 +569,13 @@ FocusScope {
709569 width: parent.width > units.gu(60) ? units.gu(40) : parent.width
710570 panelHeight: units.gu(3)
711571 }
712− property string focusedAppId: ApplicationManager.focusedApplicationId
713− property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
714− fullscreenMode: (focusedApplication && stages.fullscreen && !LightDM.Greeter.active) || greeter.fakeActiveForApp !== ""
715572
716− InputFilterArea {
717− anchors {
718− top: parent.top
719− left: parent.left
720− right: parent.right
721− }
722− height: (panel.fullscreenMode) ? shell.edgeSize : panel.panelHeight
723− blockInput: true
724− }
725− }
573+ property bool topmostApplicationIsFullscreen:
574+ ApplicationManager.focusedApplicationId &&
575+ ApplicationManager.findApplication(ApplicationManager.focusedApplicationId).fullscreen
726576
727− InputFilterArea {
728− blockInput: launcher.shown
729− anchors {
730− top: parent.top
731− bottom: parent.bottom
732− left: parent.left
733− }
734− width: launcher.width
577+ fullscreenMode: (stages.roughlyFullyShown && topmostApplicationIsFullscreen
578+ && !LightDM.Greeter.active) || greeter.fakeActiveForApp !== ""
735579 }
736580
737581 Launcher {
@@ -774,11 +618,6 @@ FocusScope {
774618 MouseArea {
775619 anchors.fill: parent
776620 }
777−
778− InputFilterArea {
779− anchors.fill: parent
780− blockInput: modalNotificationBackground.visible
781− }
782621 }
783622
784623 Notifications {
@@ -804,36 +643,7 @@ FocusScope {
804643 PropertyChanges { target: notifications; width: units.gu(38) }
805644 }
806645 ]
807−
808− InputFilterArea {
809− anchors { left: parent.left; right: parent.right }
810− height: parent.contentHeight
811− blockInput: height > 0
812− }
813− }
814− }
815−
816− focus: true
817− onFocusChanged: if (!focus) forceActiveFocus();
818−
819− InputFilterArea {
820− anchors {
821− top: parent.top
822− bottom: parent.bottom
823− left: parent.left
824− }
825− width: shell.edgeSize
826− blockInput: true
827− }
828−
829− InputFilterArea {
830− anchors {
831− top: parent.top
832− bottom: parent.bottom
833− right: parent.right
834646 }
835− width: shell.edgeSize
836− blockInput: true
837647 }
838648
839649 Binding {
@@ -842,24 +652,22 @@ FocusScope {
842652 value: "unity8"
843653 }
844654
845− OSKController {
846− anchors.topMargin: panel.panelHeight
847− anchors.fill: parent // as needs to know the geometry of the shell
848− }
849−
850− //FIXME: This should be handled in the input stack, keyboard shouldnt propagate
851− MouseArea {
852− anchors.bottom: parent.bottom
853− anchors.left: parent.left
854− anchors.right: parent.right
855− height: ApplicationManager.keyboardVisible ? ApplicationManager.keyboardHeight : 0
856−
857− enabled: ApplicationManager.keyboardVisible
655+ Dialogs {
656+ id: dialogs
657+ anchors.fill: parent
658+ z: overlay.z + 10
659+ onPowerOffClicked: {
660+ shutdownFadeOutRectangle.enabled = true;
661+ shutdownFadeOutRectangle.visible = true;
662+ shutdownFadeOut.start();
663+ }
858664 }
859665
860666 Label {
667+ id: alphaDisclaimerLabel
861668 anchors.centerIn: parent
862669 visible: ApplicationManager.fake ? ApplicationManager.fake : false
670+ z: dialogs.z + 10
863671 text: "EARLY ALPHA\nNOT READY FOR USE"
864672 color: "lightgrey"
865673 opacity: 0.2
@@ -873,6 +681,7 @@ FocusScope {
873681
874682 EdgeDemo {
875683 id: edgeDemo
684+ z: alphaDisclaimerLabel.z + 10
876685 greeter: greeter
877686 launcher: launcher
878687 dash: dash
@@ -885,35 +694,9 @@ FocusScope {
885694 onShowHome: showHome()
886695 }
887696
888− Keys.onPressed: {
889− if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
890− if (!powerKeyTimer.running) {
891− powerKeyTimer.start();
892− }
893− event.accepted = true;
894− }
895− }
896−
897− Keys.onReleased: {
898− if (event.key == Qt.Key_PowerOff || event.key == Qt.Key_PowerDown) {
899− powerKeyTimer.stop();
900− event.accepted = true;
901− }
902− }
903−
904− Timer {
905− id: powerKeyTimer
906− interval: 2000
907− repeat: false
908− triggeredOnStart: false
909−
910− onTriggered: {
911− stages.showPowerDialog();
912− }
913− }
914−
915697 Rectangle {
916698 id: shutdownFadeOutRectangle
699+ z: edgeDemo.z + 10
917700 enabled: false
918701 visible: false
919702 color: "black"
@@ -930,4 +713,5 @@ FocusScope {
930713 }
931714 }
932715 }
716+
933717}
qml/Stages/Animations/BaseSurfaceAnimation.qmlnew file+93
@@ -0,0 +1,93 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+/* This is the base case for surface animations, used when adding/removing * child surfaces.
20+ * The class is meant to be overridden and changes/animations provided for state changes.
21+ * NB. It is important to release the surface at the end of the "out" animation.
22+ *
23+ * Example - Simple fade in/out
24+ *
25+ * BaseSurfaceAnimation {
26+ * outChanges: [ PropertyChanges { target: animation.surface; opacity: 0.0 } ]
27+ * outAnimations: [
28+ SequentialAnimation {
29+ * NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 }
30+ * ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
31+ * }
32+ * ]
33+ *
34+ * inChanges: [ PropertyChanges { target: animation.surface; opacity: 1.0 } ]
35+ * inAnimations: [ NumberAnimation { target: animation.surface; property: "opacity"; duration: 300 } ]
36+ * }
37+ */
38+Item {
39+ id: base
40+ property Item surface: null
41+
42+ // changes applied when state changes to "in"
43+ property list<QtObject> outChanges
44+ // transition animations when changing state to "in"
45+ property list<QtObject> outAnimations
46+
47+ // changes applied when state changes to "out"
48+ property list<QtObject> inChanges
49+ // transition animations when changing state to "out"
50+ property list<QtObject> inAnimations
51+
52+ function start() {
53+ // "prep" state forces outChanges without transition animations.
54+ state = "prep"
55+ state = "in";
56+ }
57+ function end() {
58+ state = "out";
59+ }
60+
61+ states: [
62+ State {
63+ name: "baseAnimation"
64+ PropertyChanges { target: base.surface; anchors.fill: undefined }
65+ },
66+
67+ State {
68+ name: "prep"
69+ extend: "baseAnimation"
70+ changes: outChanges
71+ },
72+ State {
73+ name: "out"
74+ extend: "prep"
75+ },
76+ State {
77+ name: "in"
78+ extend: "baseAnimation"
79+ changes: inChanges
80+ }
81+ ]
82+
83+ transitions: [
84+ Transition {
85+ to: "out"
86+ animations: outAnimations
87+ },
88+ Transition {
89+ to: "in"
90+ animations: inAnimations
91+ }
92+ ]
93+}
qml/Stages/Animations/DarkenAndFadeInAnimation.qmlnew file+48
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 1.1
19+
20+BaseSurfaceAnimation {
21+ id: animation
22+
23+ property Rectangle darkenItem: Rectangle {
24+ parent: animation.surface.parent
25+ anchors.fill: parent
26+ color: Qt.rgba(0,0,0,0.0)
27+ }
28+
29+ outChanges: [ PropertyChanges { target: animation.surface; opacity: 0.0 } ]
30+ outAnimations: [
31+ SequentialAnimation {
32+ UbuntuNumberAnimation { target: animation.surface; property: "opacity"; duration: UbuntuAnimation.FastDuration }
33+ ColorAnimation { target: darkenItem; duration: UbuntuAnimation.FastDuration }
34+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
35+ }
36+ ]
37+
38+ inChanges: [
39+ PropertyChanges { target: darkenItem; color: Qt.rgba(0,0,0,0.7) },
40+ PropertyChanges { target: animation.surface; opacity: 1.0 }
41+ ]
42+ inAnimations: [
43+ SequentialAnimation {
44+ ColorAnimation { target: darkenItem; duration: UbuntuAnimation.FastDuration }
45+ UbuntuNumberAnimation { target: animation.surface; property: "opacity"; duration: UbuntuAnimation.FastDuration }
46+ }
47+ ]
48+}
qml/Stages/Animations/SwipeFromBottomAnimation.qmlnew file+48
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+BaseSurfaceAnimation {
20+ id: animation
21+
22+ outChanges: [ AnchorChanges { target: animation.surface; anchors.top: animation.parent.bottom } ]
23+ outAnimations: [
24+ SequentialAnimation {
25+ PropertyAction { target: animation.parent; property: "clip"; value: true }
26+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
27+ PropertyAction { target: animation.surface; property: "visible"; value: !animation.parent.removing }
28+ PropertyAction { target: animation.parent; property: "clip"; value: false }
29+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
30+ }
31+ ]
32+
33+ inChanges: [
34+ AnchorChanges {
35+ target: animation.surface;
36+ anchors.top: animation.parent.top
37+ anchors.right: undefined
38+ anchors.bottom: undefined
39+ anchors.left: undefined
40+ } ]
41+ inAnimations: [
42+ SequentialAnimation {
43+ PropertyAction { target: animation.parent; property: "clip"; value: true }
44+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
45+ PropertyAction { target: animation.parent; property: "clip"; value: false }
46+ }
47+ ]
48+}
qml/Stages/Animations/SwipeUpAnimation.qmlnew file+49
@@ -0,0 +1,49 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+BaseSurfaceAnimation {
20+ id: animation
21+
22+ outAnimations: [
23+ SequentialAnimation {
24+ PropertyAction { target: animation.parent; property: "clip"; value: true }
25+ PropertyAction { target: animation.surface; property: "visible"; value: true }
26+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
27+ PropertyAction { target: animation.parent; property: "clip"; value: false }
28+ ScriptAction { script: { if (animation.parent.removing) animation.surface.release(); } }
29+ }
30+ ]
31+
32+ inChanges: [
33+ AnchorChanges {
34+ target: animation.surface;
35+ anchors.top: undefined
36+ anchors.right: undefined
37+ anchors.bottom: animation.parent.top
38+ anchors.left: undefined
39+ }
40+ ]
41+ inAnimations: [
42+ SequentialAnimation {
43+ PropertyAction { target: animation.parent; property: "clip"; value: true }
44+ AnchorAnimation { easing.type: Easing.InOutQuad; duration: 400 }
45+ PropertyAction { target: animation.surface; property: "visible"; value: false}
46+ PropertyAction { target: animation.parent; property: "clip"; value: false }
47+ }
48+ ]
49+}
qml/Stages/PhoneStage.qml+171−263
@@ -18,7 +18,6 @@ import QtQuick 2.0
1818import Ubuntu.Components 0.1
1919import Ubuntu.Gestures 0.1
2020import Unity.Application 0.1
21−import LightDM 0.1 as LightDM
2221import Utils 0.1
2322import "../Components"
2423
@@ -26,88 +25,51 @@ Item {
2625 id: root
2726
2827 // Controls to be set from outside
29− property bool shown: false
30− property bool moving: false
3128 property int dragAreaWidth
29+ property real maximizedAppTopMargin
30+ property bool interactive
31+ property bool spreadEnabled: true // If false, animations and right edge will be disabled
3232
3333 // State information propagated to the outside
34− readonly property bool painting: mainScreenshotImage.visible || fadeInScreenshotImage.visible || appSplash.visible || spreadView.visible
35− property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
36− property bool locked: spreadView.visible
37− property bool spreadEnabled: true
38−
39− // Not used for PhoneStage, only useful for SideStage and similar
40− property bool overlayMode: false
41− property int overlayWidth: 0
34+ readonly property bool locked: spreadView.phase == 2
4235
4336 function select(appId) {
44− spreadView.snapTo(priv.indexOf(appId))
37+ spreadView.snapTo(priv.indexOf(appId));
4538 }
4639
47− onMovingChanged: {
48− if (moving) {
49− if (ApplicationManager.focusedApplicationId) {
50− priv.requestNewScreenshot();
51− } else {
52− mainScreenshotImage.anchors.leftMargin = 0;
53− mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
54− mainScreenshotImage.visible = true;
55− }
56− } else {
57− mainScreenshotImage.visible = false;
58− }
40+ onWidthChanged: {
41+ spreadView.selectedIndex = -1;
42+ spreadView.phase = 0;
43+ spreadView.contentX = -spreadView.shift;
5944 }
6045
6146 Connections {
6247 target: ApplicationManager
6348
6449 onFocusRequested: {
65− if (spreadView.visible) {
50+ if (spreadView.phase > 0) {
6651 spreadView.snapTo(priv.indexOf(appId));
6752 } else {
6853 priv.switchToApp(appId);
6954 }
7055 }
7156
72− onFocusedApplicationIdChanged: {
73− if (ApplicationManager.focusedApplicationId.length > 0) {
74− if (priv.secondApplicationStarting || priv.applicationStarting) {
75− appSplashTimer.restart();
76− } else {
77− var application = priv.focusedApplication;
78− root.fullscreen = application.fullscreen;
79− mainScreenshotImage.source = application.screenshot;
80− }
57+ onApplicationAdded: {
58+ if (spreadView.phase == 2) {
59+ spreadView.snapTo(ApplicationManager.count - 1);
8160 } else {
82− spreadView.selectedIndex = -1;
8361 spreadView.phase = 0;
8462 spreadView.contentX = -spreadView.shift;
85− }
86− }
87−
88− onApplicationAdded: {
89− if (!priv.focusedApplication) {
90− mainScreenshotImage.source = "";
91− mainScreenshotImage.visible = false;
92− priv.applicationStarting = true;
93− } else {
94− mainScreenshotImage.source = "";
95− priv.newFocusedAppId = appId;
96− priv.secondApplicationStarting = true;
97− priv.requestNewScreenshot();
98− }
99−
100− if (spreadView.visible) {
101− spreadView.snapTo(0);
63+ priv.switchToApp(appId);
10264 }
10365 }
10466
10567 onApplicationRemoved: {
106− if (ApplicationManager.count == 0) {
107− mainScreenshotImage.source = ""
108− mainScreenshotImage.visible = false;
109− } else {
110− mainScreenshotImage.source = ApplicationManager.get(0).screenshot;
68+ // Unless we're closing the app ourselves in the spread,
69+ // lets make sure the spread doesn't mess up by the changing app list.
70+ if (spreadView.closingIndex == -1) {
71+ spreadView.phase = 0;
72+ spreadView.contentX = -spreadView.shift;
11173 }
11274 }
11375 }
@@ -117,46 +79,11 @@ Item {
11779
11880 property string focusedAppId: ApplicationManager.focusedApplicationId
11981 property var focusedApplication: ApplicationManager.findApplication(focusedAppId)
120− property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
121−
122− property bool waitingForScreenshot: false
123−
124− property bool applicationStarting: false
125− property bool secondApplicationStarting: false
126−
127− property string newFocusedAppId
128−
129− onFocusedScreenshotChanged: {
130− if (root.moving && priv.waitingForScreenshot) {
131− mainScreenshotImage.anchors.leftMargin = 0;
132− mainScreenshotImage.source = priv.focusedScreenshot
133− mainScreenshotImage.visible = true;
134− } else if (priv.secondApplicationStarting && priv.waitingForScreenshot) {
135− applicationSwitchingAnimation.start();
136− if (LightDM.Greeter.active && !LightDM.Greeter.promptless) {
137− // When greeter is up, no fancy animations, since user may
138− // glimpse an app they shouldn't
139− applicationSwitchingAnimation.complete();
140− }
141− }
142− waitingForScreenshot = false;
143− }
144−
145− function requestNewScreenshot() {
146− waitingForScreenshot = true;
147− ApplicationManager.updateScreenshot(focusedAppId);
148− }
14982
15083 function switchToApp(appId) {
15184 if (priv.focusedAppId) {
152− priv.newFocusedAppId = appId;
153− root.fullscreen = ApplicationManager.findApplication(appId).fullscreen;
154− applicationSwitchingAnimation.start();
155− if (LightDM.Greeter.active && !LightDM.Greeter.promptless) {
156− // When greeter is up, no fancy animations, since user may
157− // glimpse an app they shouldn't
158− applicationSwitchingAnimation.complete();
159− }
85+ spreadView.focusChanging = true;
86+ ApplicationManager.focusApplication(appId);
16087 } else {
16188 ApplicationManager.focusApplication(appId);
16289 }
@@ -173,158 +100,6 @@ Item {
173100
174101 }
175102
176− // FIXME: the signal connections seems to get lost.
177− Connections {
178− target: priv.focusedApplication
179− onScreenshotChanged: priv.focusedScreenshot = priv.focusedApplication.screenshot
180− }
181− Binding {
182− target: root
183− property: "fullscreen"
184− value: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
185− }
186−
187− Timer {
188− id: appSplashTimer
189− // FIXME: We really need to show something meaningful in the app surface instead of guessing
190− // when it might be ready
191− interval: 500
192− repeat: false
193− onTriggered: {
194− priv.applicationStarting = false;
195− priv.secondApplicationStarting = false;
196− }
197− }
198−
199− SequentialAnimation {
200− id: applicationSwitchingAnimation
201− // setup
202− PropertyAction { target: mainScreenshotImage; property: "anchors.leftMargin"; value: 0 }
203− PropertyAction { target: mainScreenshotImage; property: "source"; value: priv.focusedScreenshot }
204− PropertyAction { targets: [mainScreenshotImage, fadeInScreenshotImage]; property: "visible"; value: true }
205− PropertyAction { target: fadeInScreenshotImage; property: "source"; value: {
206− var newFocusedApp = ApplicationManager.findApplication(priv.newFocusedAppId);
207− return newFocusedApp ? newFocusedApp.screenshot : "" }
208− }
209− PropertyAction { target: fadeInScreenshotImage; property: "opacity"; value: 0 }
210− PropertyAction { target: fadeInScreenshotImage; property: "scale"; value: .8 }
211−
212−
213− // The actual animation
214− ParallelAnimation {
215− UbuntuNumberAnimation { target: mainScreenshotImage; property: "anchors.leftMargin"; to: root.width; duration: UbuntuAnimation.SlowDuration }
216− UbuntuNumberAnimation { target: fadeInScreenshotImage; properties: "opacity,scale"; to: 1; duration: UbuntuAnimation.SlowDuration }
217− }
218−
219− // restore stuff
220− ScriptAction { script: ApplicationManager.focusApplication(priv.newFocusedAppId); }
221− PropertyAction { target: fadeInScreenshotImage; property: "visible"; value: false }
222− PropertyAction { target: mainScreenshotImage; property: "visible"; value: false }
223− }
224−
225− // FIXME: Drop this and make the imageprovider show a splashscreen instead
226− Rectangle {
227− id: appSplash2
228− anchors.fill: parent
229− color: "black"
230− visible: priv.secondApplicationStarting
231− }
232− Image {
233− id: fadeInScreenshotImage
234− anchors { left: parent.left; bottom: parent.bottom }
235− width: parent.width
236− scale: .7
237− visible: false
238− }
239−
240− Rectangle {
241− id: appSplash
242− anchors.fill: parent
243− color: "black"
244− visible: priv.applicationStarting
245−
246− WaitingDots {
247− }
248− }
249− Image {
250− id: mainScreenshotImage
251− anchors { left: parent.left; bottom: parent.bottom }
252− width: parent.width
253− visible: false
254− }
255−
256− EdgeDragArea {
257− id: spreadDragArea
258− direction: Direction.Leftwards
259− enabled: ApplicationManager.count > 1 && spreadView.phase != 2 && root.spreadEnabled
260−
261− anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
262− width: root.dragAreaWidth
263−
264− // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
265− // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
266− // spreadView and make the spreadView snap to positionMarker4.
267− property bool attachedToView: true
268−
269− property var gesturePoints: new Array()
270−
271− onTouchXChanged: {
272− if (!dragging && !priv.waitingForScreenshot) {
273− // Initial touch. Let's update the screenshot and reset the spreadView to the starting position.
274− priv.requestNewScreenshot();
275− spreadView.phase = 0;
276− spreadView.contentX = -spreadView.shift;
277− }
278− if (dragging && attachedToView) {
279− // Gesture recognized. Let's move the spreadView with the finger
280− spreadView.contentX = -touchX - spreadView.shift;
281− }
282− if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
283− // We passed positionMarker3. Detach from spreadView and snap it.
284− attachedToView = false;
285− spreadView.snap();
286− }
287− gesturePoints.push(touchX);
288− }
289−
290− onStatusChanged: {
291− if (status == DirectionalDragArea.Recognized) {
292− attachedToView = true;
293− }
294− }
295−
296− onDraggingChanged: {
297− if (dragging) {
298− // Gesture recognized. Start recording this gesture
299− gesturePoints = [];
300− return;
301− }
302−
303− // Ok. The user released. Find out if it was a one-way movement.
304− var oneWayFlick = true;
305− var smallestX = spreadDragArea.width;
306− for (var i = 0; i < gesturePoints.length; i++) {
307− if (gesturePoints[i] >= smallestX) {
308− oneWayFlick = false;
309− break;
310− }
311− smallestX = gesturePoints[i];
312− }
313− gesturePoints = [];
314−
315− if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
316− spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
317− // If it was a short one-way movement, do the Alt+Tab switch
318− // no matter if we didn't cross positionMarker1 yet.
319− spreadView.snapTo(1);
320− } else if (!dragging && attachedToView) {
321− // otherwise snap to the closest snap position we can find
322− // (might be back to start, to app 1 or to spread)
323− spreadView.snap();
324− }
325− }
326− }
327−
328103 Rectangle {
329104 id: coverFlipBackground
330105 anchors.fill: parent
@@ -332,16 +107,12 @@ Item {
332107 visible: spreadView.visible
333108 }
334109
335− InputFilterArea {
336− anchors.fill: root
337− blockInput: spreadView.visible
338− }
339110
340111 Flickable {
341112 id: spreadView
342113 objectName: "spreadView"
343114 anchors.fill: parent
344− visible: spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1 || snapAnimation.running
115+ interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1) && draggedIndex == -1
345116 contentWidth: spreadRow.width - shift
346117 contentX: -shift
347118
@@ -350,8 +121,8 @@ Item {
350121 // that, the beginning of the gesture starts with a negative value for contentX
351122 // so the flickable wants to pull it into the view already. "shift" tunes the
352123 // distance where to "lock" the content.
353− property real shift: width / 2
354− property real shiftedContentX: contentX + shift
124+ readonly property real shift: width / 2
125+ readonly property real shiftedContentX: contentX + shift
355126
356127 property int tileDistance: width / 4
357128
@@ -375,6 +146,10 @@ Item {
375146 property int phase: 0
376147
377148 property int selectedIndex: -1
149+ property int draggedIndex: -1
150+ property int closingIndex: -1
151+
152+ property bool focusChanging: false
378153
379154 onShiftedContentXChanged: {
380155 switch (phase) {
@@ -398,9 +173,9 @@ Item {
398173 snapAnimation.targetContentX = -shift;
399174 snapAnimation.start();
400175 } else if (shiftedContentX < positionMarker2 * width) {
401− snapTo(1)
176+ snapTo(1);
402177 } else if (shiftedContentX < positionMarker3 * width) {
403− snapTo(1)
178+ snapTo(1);
404179 } else if (phase < 2){
405180 // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
406181 snapAnimation.targetContentX = width * positionMarker4 + 1 - shift;
@@ -408,9 +183,18 @@ Item {
408183 }
409184 }
410185 function snapTo(index) {
186+ if (ApplicationManager.count <= index) {
187+ // In case we're trying to snap to some non existing app, lets snap back to the first one
188+ index = 0;
189+ }
411190 spreadView.selectedIndex = index;
412− root.fullscreen = ApplicationManager.get(index).fullscreen;
413− snapAnimation.targetContentX = -shift;
191+ // If we're not in full spread mode yet, always unwind to start pos
192+ // otherwise unwind up to progress 0 of the selected index
193+ if (spreadView.phase < 2) {
194+ snapAnimation.targetContentX = -shift;
195+ } else {
196+ snapAnimation.targetContentX = -shift + index * spreadView.tileDistance;
197+ }
414198 snapAnimation.start();
415199 }
416200
@@ -429,7 +213,8 @@ Item {
429213 script: {
430214 if (spreadView.selectedIndex >= 0) {
431215 ApplicationManager.focusApplication(ApplicationManager.get(spreadView.selectedIndex).appId);
432− spreadView.selectedIndex = -1
216+
217+ spreadView.selectedIndex = -1;
433218 spreadView.phase = 0;
434219 spreadView.contentX = -spreadView.shift;
435220 }
@@ -443,6 +228,15 @@ Item {
443228 // tileDistance * app count (with a minimum of 3 apps, in order to also allow moving 1 and 2 apps a bit)
444229 // + some constant value (still scales with the screen width) which looks good and somewhat fills the screen
445230 width: Math.max(3, ApplicationManager.count) * spreadView.tileDistance + (spreadView.width - spreadView.tileDistance) * 1.5
231+ Behavior on width {
232+ enabled: spreadView.closingIndex >= 0
233+ UbuntuNumberAnimation {}
234+ }
235+ onWidthChanged: {
236+ if (spreadView.closingIndex >= 0) {
237+ spreadView.contentX = Math.min(spreadView.contentX, width - spreadView.width - spreadView.shift);
238+ }
239+ }
446240
447241 x: spreadView.contentX
448242
@@ -462,18 +256,55 @@ Item {
462256 height: spreadView.height
463257 selected: spreadView.selectedIndex == index
464258 otherSelected: spreadView.selectedIndex >= 0 && !selected
259+ interactive: !spreadView.interactive && spreadView.phase === 0
260+ && spreadView.shiftedContentX === 0 && root.interactive && index === 0
261+ swipeToCloseEnabled: spreadView.interactive
262+ maximizedAppTopMargin: root.maximizedAppTopMargin
263+ dropShadow: spreadView.shiftedContentX > 0 || spreadDragArea.status == DirectionalDragArea.Undecided
465264
466− z: index
265+ z: behavioredIndex
467266 x: index == 0 ? 0 : spreadView.width + (index - 1) * spreadView.tileDistance
267+ property real behavioredIndex: index
268+ Behavior on behavioredIndex {
269+ enabled: spreadView.closingIndex >= 0
270+ UbuntuNumberAnimation {
271+ onRunningChanged: {
272+ if (!running) {
273+ spreadView.closingIndex = -1;
274+ }
275+ }
276+ }
277+ }
278+
279+ Behavior on x {
280+ enabled: spreadView.focusChanging && index == 0 && root.spreadEnabled
281+ UbuntuNumberAnimation {
282+ duration: UbuntuAnimation.FastDuration
283+ onRunningChanged: {
284+ if (!running) {
285+ spreadView.focusChanging = false;
286+ }
287+ }
288+ }
289+ }
468290
469291 // Each tile has a different progress value running from 0 to 1.
470− // A progress value of 0 means the tile is at the right edge. 1 means the tile has reched the left edge.
292+ // 0: means the tile is at the right edge.
293+ // 1: means the tile has finished the main animation towards the left edge.
294+ // >1: after the main animation has finished, tiles will continue to move very slowly to the left
471295 progress: {
472− var tileProgress = (spreadView.shiftedContentX - index * spreadView.tileDistance) / spreadView.width;
296+ var tileProgress = (spreadView.shiftedContentX - behavioredIndex * spreadView.tileDistance) / spreadView.width;
473297 // Tile 1 needs to move directly from the beginning...
474− if (index == 1 && spreadView.phase < 2) {
298+ if (behavioredIndex == 1 && spreadView.phase < 2) {
475299 tileProgress += spreadView.tileDistance / spreadView.width;
476300 }
301+ // Limiting progress to ~0 and 1.7 to avoid binding calculations when tiles are not
302+ // visible.
303+ // < 0 : The tile is outside the screen on the right
304+ // > 1.7: The tile is *very* close to the left edge and covered by other tiles now.
305+ // Using 0.0001 to differentiate when a tile should still be visible (==0)
306+ // or we can hide it (< 0)
307+ tileProgress = Math.max(-0.0001, Math.min(1.7, tileProgress));
477308 return tileProgress;
478309 }
479310
@@ -493,7 +324,7 @@ Item {
493324
494325 EasingCurve {
495326 id: snappingCurve
496− type: EasingCurve.OutQuad
327+ type: EasingCurve.Linear
497328 period: 0.05
498329 progress: appDelegate.progress - spreadView.positionMarker1
499330 }
@@ -507,7 +338,84 @@ Item {
507338 }
508339 }
509340 }
341+
342+ onClosed: {
343+ spreadView.draggedIndex = -1;
344+ spreadView.closingIndex = index;
345+ ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
346+ }
347+ }
348+ }
349+ }
350+ }
351+
352+ EdgeDragArea {
353+ id: spreadDragArea
354+ direction: Direction.Leftwards
355+ enabled: spreadView.phase != 2 && root.spreadEnabled
356+
357+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
358+ width: root.dragAreaWidth
359+
360+ // Sitting at the right edge of the screen, this EdgeDragArea directly controls the spreadView when
361+ // attachedToView is true. When the finger movement passes positionMarker3 we detach it from the
362+ // spreadView and make the spreadView snap to positionMarker4.
363+ property bool attachedToView: true
364+
365+ property var gesturePoints: new Array()
366+
367+ onTouchXChanged: {
368+ if (!dragging) {
369+ // Initial touch. Let's reset the spreadView to the starting position.
370+ spreadView.phase = 0;
371+ spreadView.contentX = -spreadView.shift;
372+ }
373+ if (dragging && attachedToView) {
374+ // Gesture recognized. Let's move the spreadView with the finger
375+ spreadView.contentX = -touchX + spreadDragArea.width - spreadView.shift;
376+ }
377+ if (attachedToView && spreadView.shiftedContentX >= spreadView.width * spreadView.positionMarker3) {
378+ // We passed positionMarker3. Detach from spreadView and snap it.
379+ attachedToView = false;
380+ spreadView.snap();
381+ }
382+ gesturePoints.push(touchX);
383+ }
384+
385+ onStatusChanged: {
386+ if (status == DirectionalDragArea.Recognized) {
387+ attachedToView = true;
388+ }
389+ }
390+
391+ onDraggingChanged: {
392+ if (dragging) {
393+ // Gesture recognized. Start recording this gesture
394+ gesturePoints = [];
395+ return;
396+ }
397+
398+ // Ok. The user released. Find out if it was a one-way movement.
399+ var oneWayFlick = true;
400+ var smallestX = spreadDragArea.width;
401+ for (var i = 0; i < gesturePoints.length; i++) {
402+ if (gesturePoints[i] >= smallestX) {
403+ oneWayFlick = false;
404+ break;
510405 }
406+ smallestX = gesturePoints[i];
407+ }
408+ gesturePoints = [];
409+
410+ if (oneWayFlick && spreadView.shiftedContentX > units.gu(2) &&
411+ spreadView.shiftedContentX < spreadView.positionMarker1 * spreadView.width) {
412+ // If it was a short one-way movement, do the Alt+Tab switch
413+ // no matter if we didn't cross positionMarker1 yet.
414+ spreadView.snapTo(1);
415+ } else if (!dragging && attachedToView) {
416+ // otherwise snap to the closest snap position we can find
417+ // (might be back to start, to app 1 or to spread)
418+ spreadView.snap();
511419 }
512420 }
513421 }
qml/Stages/Splash.qmlnew file+68
@@ -0,0 +1,68 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import "../Components"
20+
21+Rectangle {
22+ id: root
23+ color: "black"
24+
25+ property string name: ""
26+ property url image: ""
27+
28+ UbuntuShape {
29+ id: iconShape
30+ anchors.horizontalCenter: parent.horizontalCenter
31+ anchors.verticalCenter: parent.verticalCenter
32+ anchors.verticalCenterOffset: -units.gu(4)
33+ width: units.gu(8)
34+ height: units.gu(7.5)
35+
36+ radius: "medium"
37+ borderSource: "none"
38+
39+ image: Image {
40+ id: iconImage
41+ sourceSize.width: iconShape.width
42+ sourceSize.height: iconShape.height
43+ source: root.image
44+ fillMode: Image.PreserveAspectCrop
45+ }
46+ }
47+
48+ Label {
49+ text: root.name
50+ anchors.horizontalCenter: parent.horizontalCenter
51+ anchors.top: iconShape.bottom
52+ anchors.topMargin: units.gu(2)
53+ fontSize: "large"
54+ }
55+
56+ WaitingDots {
57+ visible: parent.visible
58+ anchors.horizontalCenter: parent.horizontalCenter
59+ anchors.bottom: parent.bottom
60+ anchors.bottomMargin: units.gu(12)
61+ }
62+
63+ MouseArea {
64+ anchors.fill: parent
65+ enabled: parent.visible
66+ // absorb all mouse events
67+ }
68+}
qml/Stages/SpreadDelegate.qml+187−23
@@ -17,39 +17,203 @@
1717*/
1818
1919import QtQuick 2.0
20+import Unity.Application 0.1
21+import Ubuntu.Components 1.1
22+import "../Components"
2023
2124Item {
2225 id: root
2326
27+ // to be set from outside
28+ property bool interactive: true
29+ property bool dropShadow: true
30+ property real maximizedAppTopMargin
31+ property alias swipeToCloseEnabled: dragArea.enabled
32+
33+ readonly property bool isFullscreen: surface !== null && surfaceContainer.surface.anchors.topMargin == 0
34+
2435 signal clicked()
36+ signal closed()
37+
38+ SurfaceContainer {
39+ id: surfaceContainer
40+ anchors.fill: parent
41+ surface: model.surface
42+ property bool appHasCreatedASurface: false
43+
44+ onSurfaceChanged: {
45+ if (surface) {
46+ if (!appHasCreatedASurface) {
47+ surface.visible = false; // hide until splash screen removed
48+ appHasCreatedASurface = true;
49+ }
50+ }
51+ }
52+
53+ function revealSurface() {
54+ surface.visible = true;
55+ splashLoader.source = "";
56+ }
57+
58+ Binding {
59+ target: surfaceContainer.surface
60+ property: "anchors.topMargin"
61+ value: {
62+ return surfaceContainer.surface.state === MirSurfaceItem.Fullscreen ? 0 : maximizedAppTopMargin;
63+ }
64+ }
2565
26− property real topMarginProgress
66+ Binding {
67+ target: surface
68+ property: "enabled"
69+ value: root.interactive
70+ }
71+ Binding {
72+ target: surface
73+ property: "focus"
74+ value: root.interactive
75+ }
76+
77+ Timer { //FIXME - need to delay removing splash screen to allow surface resize to complete
78+ id: surfaceRevealDelay
79+ interval: 100
80+ onTriggered: surfaceContainer.revealSurface()
81+ }
82+
83+ Connections {
84+ target: surface
85+ // FIXME: I would rather not need to do this, but currently it doesn't get
86+ // active focus without it and I don't know why.
87+ onFocusChanged: forceSurfaceActiveFocusIfReady();
88+ onParentChanged: forceSurfaceActiveFocusIfReady();
89+ onEnabledChanged: forceSurfaceActiveFocusIfReady();
90+ function forceSurfaceActiveFocusIfReady() {
91+ if (surface.focus && surface.parent === surfaceContainer && surface.enabled) {
92+ surface.forceActiveFocus();
93+ }
94+ }
95+ }
96+
97+ BorderImage {
98+ id: dropShadowImage
99+ anchors {
100+ fill: parent
101+ leftMargin: -units.gu(2)
102+ rightMargin: -units.gu(2)
103+ bottomMargin: -units.gu(2)
104+ topMargin: -units.gu(2) + (root.isFullscreen ? 0 : maximizedAppTopMargin)
105+ }
106+ source: "graphics/dropshadow.png"
107+ border { left: 50; right: 50; top: 50; bottom: 50 }
108+ opacity: root.dropShadow ? .4 : 0
109+ Behavior on opacity { UbuntuNumberAnimation {} }
110+ }
27111
28− QtObject {
29− id: priv
30− property real heightDifference: root.height - appImage.implicitHeight
112+ transform: Translate {
113+ y: dragArea.distance
114+ }
31115 }
32116
33− Image {
34− id: dropShadow
35− anchors.fill: appImage
36− anchors.margins: -units.gu(2)
37− source: "graphics/dropshadow.png"
38− opacity: .4
117+
118+ StateGroup {
119+ id: appSurfaceState
120+ states: [
121+ State {
122+ name: "noSurfaceYet"
123+ when: !surfaceContainer.appHasCreatedASurface
124+ StateChangeScript {
125+ script: { splashLoader.setSource("Splash.qml", { "name": model.name, "image": model.icon }); }
126+ }
127+ },
128+ State {
129+ name: "hasSurface"
130+ when: surfaceContainer.appHasCreatedASurface && (surfaceContainer.surface !== null)
131+ StateChangeScript { script: { surfaceRevealDelay.start(); } }
132+ },
133+ State {
134+ name: "surfaceLostButAppStillAlive"
135+ when: surfaceContainer.appHasCreatedASurface && (surfaceContainer.surface === null)
136+ // TODO - use app snapshot
137+ }
138+ ]
139+ state: "noSurfaceYet"
39140 }
40− Image {
41− id: appImage
42− anchors {
43− left: parent.left;
44− bottom: parent.bottom;
45− top: parent.top;
46− topMargin: priv.heightDifference * Math.max(0, 1 - root.topMarginProgress)
47− }
48− source: model.screenshot
49− antialiasing: true
141+
142+ Loader {
143+ id: splashLoader
144+ anchors.fill: surfaceContainer
50145 }
51− MouseArea {
52− anchors.fill: appImage
53− onClicked: root.clicked()
146+
147+ DraggingArea {
148+ id: dragArea
149+ anchors.fill: parent
150+
151+ property bool moving: false
152+ property real distance: 0
153+
154+ onMovingChanged: {
155+ spreadView.draggedIndex = moving ? index : -1
156+ }
157+
158+ onDragValueChanged: {
159+ if (!dragging) {
160+ return;
161+ }
162+ moving = moving || Math.abs(dragValue) > units.gu(1)
163+ if (moving) {
164+ distance = dragValue;
165+ }
166+ }
167+
168+ onClicked: {
169+ if (!moving) {
170+ root.clicked();
171+ }
172+ }
173+
174+ onDragEnd: {
175+ // velocity and distance values specified by design prototype
176+ if ((dragVelocity < -units.gu(40) && distance < -units.gu(8)) || distance < -root.height / 2) {
177+ animation.animate("up")
178+ } else if ((dragVelocity > units.gu(40) && distance > units.gu(8)) || distance > root.height / 2) {
179+ animation.animate("down")
180+ } else {
181+ animation.animate("center")
182+ }
183+ }
184+
185+ UbuntuNumberAnimation {
186+ id: animation
187+ target: dragArea
188+ property: "distance"
189+ property bool requestClose: false
190+
191+ function animate(direction) {
192+ animation.from = dragArea.distance;
193+ switch (direction) {
194+ case "up":
195+ animation.to = -root.height * 1.5;
196+ requestClose = true;
197+ break;
198+ case "down":
199+ animation.to = root.height * 1.5;
200+ requestClose = true;
201+ break;
202+ default:
203+ animation.to = 0
204+ }
205+ animation.start();
206+ }
207+
208+ onRunningChanged: {
209+ if (!running) {
210+ dragArea.moving = false;
211+ dragArea.distance = 0;
212+ if (requestClose) {
213+ root.closed();
214+ }
215+ }
216+ }
217+ }
54218 }
55219}
qml/Stages/StageWithSideStage.qmldeleted−413
@@ -1,413 +0,0 @@
1−/*
2− * Copyright (C) 2014 Canonical, Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
19−import "../Components"
20−import Unity.Application 0.1
21−import Ubuntu.Gestures 0.1
22−
23−Item {
24− id: root
25− objectName: "stages"
26− anchors.fill: parent
27−
28− // Controls to be set from outside
29− property bool shown: false
30− property bool moving: false
31− property int dragAreaWidth
32−
33− // State information propagated to the outside
34− readonly property bool painting: mainStageImage.visible || sideStageImage.visible || sideStageSnapAnimation.running
35− property bool fullscreen: priv.focusedApplication ? priv.focusedApplication.fullscreen : false
36− property bool overlayMode: (sideStageImage.shown && priv.mainStageAppId.length == 0) || priv.overlayOverride
37− || (priv.mainStageAppId.length == 0 && sideStageSnapAnimation.running)
38−
39− readonly property int overlayWidth: priv.overlayOverride ? 0 : priv.sideStageWidth
40−
41− onShownChanged: {
42− if (!shown) {
43− priv.mainStageAppId = "";
44− }
45− }
46−
47− onMovingChanged: {
48− if (moving) {
49− if (!priv.mainStageAppId && !priv.sideStageAppId) {
50− // Pulling in from the right, make the last used (topmost) app visible
51− var application = ApplicationManager.get(0);
52− if (application.stage == ApplicationInfoInterface.SideStage) {
53− sideStageImage.application = application;
54− sideStageImage.x = root.width - sideStageImage.width
55− sideStageImage.visible = true;
56− } else {
57− mainStageImage.application = application;
58− mainStageImage.visible = true;
59− }
60− } else {
61− priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
62− if (priv.focusedApplicationId == priv.sideStageAppId) {
63− priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
64− }
65− }
66− } else {
67− mainStageImage.visible = false;
68− sideStageImage.visible = false;
69− }
70− }
71−
72− QtObject {
73− id: priv
74−
75− property int sideStageWidth: units.gu(40)
76−
77−
78− property string sideStageAppId
79− property string mainStageAppId
80−
81−
82− property var sideStageApp: ApplicationManager.findApplication(sideStageAppId)
83− property var mainStageApp: ApplicationManager.findApplication(mainStageAppId)
84−
85− property string sideStageScreenshot: sideStageApp ? sideStageApp.screenshot : ""
86− property string mainStageScreenshot: mainStageApp ? mainStageApp.screenshot : ""
87−
88− property string focusedApplicationId: ApplicationManager.focusedApplicationId
89− property var focusedApplication: ApplicationManager.findApplication(focusedApplicationId)
90− property url focusedScreenshot: focusedApplication ? focusedApplication.screenshot : ""
91−
92− property bool waitingForMainScreenshot: false
93− property bool waitingForSideScreenshot: false
94− property bool waitingForScreenshots: waitingForMainScreenshot || waitingForSideScreenshot
95−
96− property string startingAppId: ""
97−
98− // Keep overlayMode even if there is no focused app (to allow pulling in the sidestage from the right)
99− property bool overlayOverride: false
100−
101− onFocusedApplicationChanged: {
102− if (focusedApplication) {
103− if (focusedApplication.stage == ApplicationInfoInterface.MainStage) {
104− mainStageAppId = focusedApplicationId;
105− priv.overlayOverride = false;
106− if (priv.startingAppId == focusedApplicationId && sideStageImage.shown) {
107− // There was already a sidestage app on top. bring it back!
108− ApplicationManager.focusApplication(priv.sideStageAppId)
109− priv.startingAppId = "";
110− }
111− } else if (focusedApplication.stage == ApplicationInfoInterface.SideStage) {
112− sideStageAppId = focusedApplicationId;
113− if (priv.startingAppId == focusedApplicationId && !sideStageImage.shown) {
114− sideStageImage.snapToApp(focusedApplication);
115− priv.startingAppId = "";
116− }
117− }
118− } else if (root.overlayMode){
119− sideStageImage.snapTo(root.width)
120− }
121− }
122−
123− onMainStageScreenshotChanged: {
124− waitingForMainScreenshot = false;
125− }
126−
127− onSideStageScreenshotChanged: {
128− waitingForSideScreenshot = false;
129− }
130−
131− onFocusedScreenshotChanged: {
132− waitingForSideScreenshot = false;
133− }
134−
135− onWaitingForScreenshotsChanged: {
136− if (waitingForScreenshots) {
137− return;
138− }
139−
140− if (root.moving) {
141− if (mainStageAppId) {
142− mainStageImage.application = mainStageApp
143− mainStageImage.visible = true;
144− }
145− if (sideStageAppId && focusedApplicationId == sideStageAppId) {
146− sideStageImage.application = sideStageApp;
147− sideStageImage.x = root.width - sideStageImage.width
148− sideStageImage.visible = true;
149− }
150− }
151− if (sideStageHandleMouseArea.pressed) {
152− if (sideStageAppId) {
153− sideStageImage.application = sideStageApp;
154− sideStageImage.x = root.width - sideStageImage.width
155− sideStageImage.visible = true;
156− }
157− if (mainStageAppId) {
158− mainStageImage.application = mainStageApp
159− mainStageImage.visible = true;
160− }
161− }
162− }
163−
164− function requestNewScreenshot(stage) {
165− if (stage == ApplicationInfoInterface.MainStage && mainStageAppId) {
166− waitingForMainScreenshot = true;
167− ApplicationManager.updateScreenshot(mainStageAppId);
168− } else if (stage == ApplicationInfoInterface.SideStage && sideStageAppId) {
169− waitingForSideScreenshot = true;
170− ApplicationManager.updateScreenshot(sideStageAppId);
171− }
172− }
173−
174− }
175− // FIXME: the signal connection seems to get lost with the fake application manager.
176− Connections {
177− target: priv.sideStageApp
178− onScreenshotChanged: priv.sideStageScreenshot = priv.sideStageApp.screenshot
179− }
180− Connections {
181− target: priv.mainStageApp
182− onScreenshotChanged: priv.mainStageScreenshot = priv.mainStageApp.screenshot
183− }
184−
185− Connections {
186− target: ApplicationManager
187−
188− onApplicationAdded: {
189− priv.startingAppId = appId;
190− splashScreenTimer.start();
191− var application = ApplicationManager.findApplication(appId)
192− if (application.stage == ApplicationInfoInterface.SideStage) {
193− sideStageSplash.visible = true;
194− } else if (application.stage == ApplicationInfoInterface.MainStage) {
195− mainStageSplash.visible = true;
196− }
197− }
198−
199− onFocusRequested: {
200− var application = ApplicationManager.findApplication(appId)
201− if (application.stage == ApplicationInfoInterface.SideStage) {
202− if (!root.shown) {
203− priv.mainStageAppId = "";
204− mainStageImage.application = null
205− }
206− if (sideStageImage.shown) {
207− sideStageImage.switchTo(application);
208− if (priv.mainStageAppId) {
209− mainStageImage.application = priv.mainStageApp;
210− mainStageImage.visible = true;
211− }
212− } else {
213− sideStageImage.application = application;
214− sideStageImage.snapToApp(application);
215− }
216− } else if (application.stage == ApplicationInfoInterface.MainStage) {
217− if (root.shown) {
218− if (sideStageImage.shown) {
219− sideStageImage.application = priv.sideStageApp;
220− sideStageImage.visible = true;
221− }
222− priv.mainStageAppId = application.appId;
223− mainStageImage.switchTo(application)
224− ApplicationManager.focusApplication(appId)
225− if (sideStageImage.shown) {
226− // There was already a focused SS app. Bring it back
227− ApplicationManager.focusApplication(priv.sideStageAppId)
228− }
229− } else {
230− if (sideStageImage.shown) {
231− sideStageImage.visible = false;
232− sideStageImage.x = root.width;
233− }
234−
235− mainStageImage.application = application;
236− ApplicationManager.focusApplication(appId)
237− }
238− }
239− }
240−
241− onApplicationRemoved: {
242− if (priv.mainStageAppId == appId) {
243− priv.mainStageAppId = "";
244− }
245− if (priv.sideStageAppId == appId) {
246− priv.sideStageAppId = "";
247− }
248− if (priv.sideStageAppId.length == 0) {
249− sideStageImage.shown = false;
250− priv.overlayOverride = false;
251− }
252− }
253−
254− }
255−
256− Timer {
257− id: splashScreenTimer
258− // FIXME: apart from removing this completely in the future and make the app surface paint
259− // meaningful stuff, also check for colin's stuff to land so we can shape 1.4 secs away from here
260− // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-manifest/+merge/210520
261− // https://code.launchpad.net/~cjwatson/upstart-app-launch/libclick-pkgdir/+merge/209909
262− interval: 1700
263− repeat: false
264− onTriggered: {
265− mainStageSplash.visible = false;
266− sideStageSplash.visible = false;
267− }
268− }
269−
270− SwitchingApplicationImage {
271− id: mainStageImage
272− anchors.bottom: parent.bottom
273− width: parent.width
274− visible: false
275−
276− onSwitched: {
277− sideStageImage.visible = false;
278− }
279− }
280−
281− Rectangle {
282− id: mainStageSplash
283− anchors.fill: root
284− anchors.rightMargin: root.width - sideStageImage.x
285− color: "black"
286−
287− WaitingDots {
288− }
289− }
290−
291− SidestageHandle {
292− id: sideStageHandle
293− anchors { top: parent.top; right: sideStageImage.left; bottom: parent.bottom }
294− width: root.dragAreaWidth
295− visible: root.shown && priv.sideStageAppId && sideStageImage.x < root.width
296−
297− }
298− MouseArea {
299− id: sideStageHandleMouseArea
300− anchors { top: parent.top; right: parent.right; bottom: parent.bottom; rightMargin: sideStageImage.shown ? sideStageImage.width : 0}
301− width: root.dragAreaWidth
302− visible: priv.sideStageAppId
303−
304− property var dragPoints: new Array()
305−
306− onPressed: {
307− priv.requestNewScreenshot(ApplicationInfoInterface.SideStage)
308− if (priv.mainStageAppId) {
309− priv.requestNewScreenshot(ApplicationInfoInterface.MainStage)
310− }
311− }
312−
313− onMouseXChanged: {
314− dragPoints.push(mouseX)
315−
316− var dragPoint = root.width + mouseX;
317− if (sideStageImage.shown) {
318− dragPoint -= sideStageImage.width
319− }
320− sideStageImage.x = Math.max(root.width - sideStageImage.width, dragPoint)
321− }
322−
323− onReleased: {
324− var distance = 0;
325− var lastX = dragPoints[0];
326− var oneWayFlick = true;
327− for (var i = 0; i < dragPoints.length; ++i) {
328− if (dragPoints[i] < lastX) {
329− oneWayFlick = false;
330− }
331− distance += dragPoints[i] - lastX;
332− lastX = dragPoints[i];
333− }
334− dragPoints = [];
335−
336− if (oneWayFlick || distance > sideStageImage.width / 2) {
337− sideStageImage.snapTo(root.width)
338− } else {
339− sideStageImage.snapToApp(priv.sideStageApp)
340− }
341− }
342− }
343−
344− SwitchingApplicationImage {
345− id: sideStageImage
346− width: priv.sideStageWidth
347− height: root.height
348− x: root.width
349− anchors.bottom: parent.bottom
350− visible: true
351− property bool shown: false
352−
353− onSwitched: {
354− mainStageImage.visible = false;
355− ApplicationManager.focusApplication(application.appId)
356− }
357−
358− function snapTo(targetX) {
359− sideStageSnapAnimation.targetX = targetX
360− sideStageImage.visible = true;
361− if (priv.mainStageAppId) {
362− mainStageImage.application = priv.mainStageApp
363− mainStageImage.visible = true;
364− }
365− sideStageSnapAnimation.start();
366− }
367−
368− function snapToApp(application) {
369− sideStageImage.application = application
370− sideStageSnapAnimation.snapToId = application.appId;
371− snapTo(root.width - sideStageImage.width);
372− }
373−
374− SequentialAnimation {
375− id: sideStageSnapAnimation
376− property int targetX: root.width
377− property string snapToId
378−
379− UbuntuNumberAnimation { target: sideStageImage; property: "x"; to: sideStageSnapAnimation.targetX; duration: UbuntuAnimation.SlowDuration }
380− ScriptAction {
381− script: {
382− if (sideStageSnapAnimation.targetX == root.width) {
383− if (priv.mainStageAppId) {
384− ApplicationManager.focusApplication(priv.mainStageAppId)
385− } else {
386− priv.overlayOverride = true;
387− ApplicationManager.unfocusCurrentApplication();
388− }
389− sideStageImage.shown = false;
390− }
391− if (sideStageSnapAnimation.snapToId) {
392− ApplicationManager.focusApplication(sideStageSnapAnimation.snapToId)
393− sideStageSnapAnimation.snapToId = "";
394− sideStageImage.shown = true;
395− priv.overlayOverride = false;
396− }
397− sideStageImage.visible = false;
398− mainStageImage.visible = false;
399− }
400− }
401− }
402− }
403−
404− Rectangle {
405− id: sideStageSplash
406− anchors.fill: parent
407− anchors.leftMargin: sideStageImage.x
408− color: "black"
409−
410− WaitingDots {
411− }
412− }
413−}
qml/Stages/SurfaceContainer.qmlnew file+123
@@ -0,0 +1,123 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+*/
16+
17+import QtQuick 2.0
18+import "Animations"
19+
20+Item {
21+ id: container
22+ property Item surface: null
23+ property bool removing: false
24+
25+ onSurfaceChanged: {
26+ if (surface) {
27+ surface.parent = container;
28+ surface.z = 1;
29+ state = "initial"
30+ }
31+ }
32+
33+ Connections {
34+ target: surface
35+ onRemoved: {
36+ container.removing = true;
37+
38+ var childSurfaces = surface.childSurfaces;
39+ for (var i=0; i<childSurfaces.length; i++) {
40+ childSurfaces[i].removed();
41+ }
42+
43+ //if we don't have children, nothing will tell us to animate out, so do it.
44+ if (childSurfaces.length === 0) {
45+ animateOut();
46+ }
47+ // tell our parent to animate out.
48+ if (surface.parentSurface) {
49+ surface.parentSurface.parent.animateOut();
50+ }
51+ }
52+ }
53+
54+ Repeater {
55+ model: container.surface ? container.surface.childSurfaces : 0
56+
57+ delegate: Loader {
58+ z: 2
59+ anchors {
60+ fill: container
61+ topMargin: container.surface.anchors.topMargin
62+ rightMargin: container.surface.anchors.rightMargin
63+ bottomMargin: container.surface.anchors.bottomMargin
64+ leftMargin: container.surface.anchors.leftMargin
65+ }
66+
67+ // Only way to do recursive qml items.
68+ source: Qt.resolvedUrl("SurfaceContainer.qml")
69+ onLoaded: {
70+ item.surface = modelData;
71+ item.animateIn(swipeFromBottom);
72+ container.animateIn(swipeUp);
73+ }
74+ }
75+ }
76+
77+ function animateIn(component) {
78+ var animation = component.createObject(container, { "surface": container.surface });
79+ animation.start();
80+
81+ var tmp = d.animations;
82+ tmp.push(animation);
83+ d.animations = tmp;
84+ }
85+
86+ function animateOut() {
87+ if (d.animations.length > 0) {
88+ var tmp = d.animations;
89+ var popped = tmp.pop();
90+ popped.end();
91+ d.animations = tmp;
92+ } else {
93+ container.state = "initial";
94+ }
95+ }
96+
97+ QtObject {
98+ id: d
99+ property var animations: []
100+ property var currentAnimation: animations.length > 0 ? animations[animations.length-1] : undefined
101+ }
102+
103+ Component {
104+ id: swipeFromBottom
105+ SwipeFromBottomAnimation {}
106+ }
107+ Component {
108+ id: swipeUp
109+ SwipeUpAnimation {}
110+ }
111+ Component {
112+ id: darkenFade
113+ DarkenAndFadeInAnimation {}
114+ }
115+
116+ states: [
117+ State {
118+ name: "initial"
119+ PropertyChanges { target: surface; anchors.fill: container }
120+ }
121+ // TODO: more animations!
122+ ]
123+}
qml/Stages/SwitchingApplicationImage.qmldeleted−81
@@ -1,81 +0,0 @@
1−/*
2− * Copyright 2014 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU Lesser General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU Lesser General Public License for more details.
12− *
13− * You should have received a copy of the GNU Lesser General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− *
16− * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17−*/
18−
19−import QtQuick 2.0
20−import Ubuntu.Components 0.1
21−
22−Rectangle {
23− id: root
24− implicitHeight: image.implicitHeight
25− implicitWidth: image.implicitWidth
26− color: "black"
27−
28− property var application
29−
30− signal switched()
31−
32− function switchTo(application) {
33− if (root.application == application) {
34− root.switched();
35− return;
36− }
37−
38− priv.newApplication = application
39− root.visible = true;
40− switchToAnimation.start()
41− }
42−
43− QtObject {
44− id: priv
45− property var newApplication
46− }
47−
48− Image {
49− id: newImage
50− anchors.bottom: parent.bottom
51− width: root.width
52− source: priv.newApplication ? priv.newApplication.screenshot : ""
53− }
54−
55− Image {
56− id: image
57− visible: true
58− source: root.application ? root.application.screenshot : ""
59− width: root.width
60− height: sourceSize.height
61− anchors.bottom: parent.bottom
62−
63− }
64−
65− SequentialAnimation {
66− id: switchToAnimation
67− ParallelAnimation {
68− UbuntuNumberAnimation { target: image; property: "x"; from: 0; to: root.width; duration: UbuntuAnimation.SlowDuration }
69− UbuntuNumberAnimation { target: newImage; property: "scale"; from: 0.7; to: 1; duration: UbuntuAnimation.SlowDuration }
70− }
71− ScriptAction {
72− script: {
73− image.x = 0
74− root.application = priv.newApplication
75− root.visible = false;
76− priv.newApplication = null
77− root.switched();
78− }
79− }
80− }
81−}
qml/Stages/TabletStage.qmlnew file+568
@@ -0,0 +1,568 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 0.1
19+import Ubuntu.Gestures 0.1
20+import Unity.Application 0.1
21+import Utils 0.1
22+import "../Components"
23+
24+Item {
25+ id: root
26+ objectName: "stages"
27+ anchors.fill: parent
28+
29+ // Controls to be set from outside
30+ property bool shown: false
31+ property bool moving: false
32+ property int dragAreaWidth
33+ property real maximizedAppTopMargin
34+ property bool interactive
35+
36+ // State information propagated to the outside
37+ readonly property bool locked: spreadView.phase == 2
38+
39+ QtObject {
40+ id: priv
41+
42+ property string focusedAppId: ApplicationManager.focusedApplicationId
43+ property string oldFocusedAppId: ""
44+
45+ property string mainStageAppId
46+ property string sideStageAppId
47+
48+ // For convenience, keep properties of the first two apps in the model
49+ property string appId0
50+ property string appId1
51+
52+ onFocusedAppIdChanged: {
53+ if (priv.focusedAppId.length > 0) {
54+ var focusedApp = ApplicationManager.findApplication(focusedAppId);
55+ if (focusedApp.stage == ApplicationInfoInterface.SideStage) {
56+ priv.sideStageAppId = focusedAppId;
57+ } else {
58+ priv.mainStageAppId = focusedAppId;
59+ }
60+ }
61+
62+ appId0 = ApplicationManager.count >= 1 ? ApplicationManager.get(0).appId : "";
63+ appId1 = ApplicationManager.count > 1 ? ApplicationManager.get(1).appId : "";
64+ }
65+
66+ function indexOf(appId) {
67+ for (var i = 0; i < ApplicationManager.count; i++) {
68+ if (ApplicationManager.get(i).appId == appId) {
69+ return i;
70+ }
71+ }
72+ return -1;
73+ }
74+
75+ function evaluateOneWayFlick(gesturePoints) {
76+ // Need to have at least 3 points to recognize it as a flick
77+ if (gesturePoints.length < 3) {
78+ return false;
79+ }
80+ // Need to have a movement of at least 2 grid units to recognize it as a flick
81+ if (Math.abs(gesturePoints[gesturePoints.length - 1] - gesturePoints[0]) < units.gu(2)) {
82+ return false;
83+ }
84+
85+ var oneWayFlick = true;
86+ var smallestX = gesturePoints[0];
87+ var leftWards = gesturePoints[1] < gesturePoints[0];
88+ for (var i = 1; i < gesturePoints.length; i++) {
89+ if ((leftWards && gesturePoints[i] >= smallestX)
90+ || (!leftWards && gesturePoints[i] <= smallestX)) {
91+ oneWayFlick = false;
92+ break;
93+ }
94+ smallestX = gesturePoints[i];
95+ }
96+ return oneWayFlick;
97+ }
98+ }
99+
100+ Connections {
101+ target: ApplicationManager
102+ onFocusRequested: {
103+ if (spreadView.interactive) {
104+ spreadView.snapTo(priv.indexOf(appId));
105+ } else {
106+ ApplicationManager.focusApplication(appId);
107+ }
108+ }
109+
110+ onApplicationRemoved: {
111+ if (priv.mainStageAppId == appId) {
112+ priv.mainStageAppId = "";
113+ }
114+ if (priv.sideStageAppId == appId) {
115+ priv.sideStageAppId = "";
116+ }
117+ if (ApplicationManager.count == 0) {
118+ spreadView.phase = 0;
119+ spreadView.contentX = 0;
120+ }
121+ }
122+ }
123+
124+ Flickable {
125+ id: spreadView
126+ anchors.fill: parent
127+ contentWidth: spreadRow.width
128+ interactive: (spreadDragArea.status == DirectionalDragArea.Recognized || phase > 1) && draggedIndex == -1
129+
130+ property int tileDistance: units.gu(20)
131+ property int sideStageWidth: units.gu(40)
132+ property bool sideStageVisible: priv.sideStageAppId
133+
134+ // Phase of the animation:
135+ // 0: Starting from right edge, a new app (index 1) comes in from the right
136+ // 1: The app has reached the first snap position.
137+ // 2: The list is dragged further and snaps into the spread view when entering phase 2
138+ property int phase
139+
140+ readonly property int phase0Width: sideStageWidth
141+ readonly property int phase1Width: sideStageWidth
142+
143+ // Those markers mark the various positions in the spread (ratio to screen width from right to left):
144+ // 0 - 1: following finger, snap back to the beginning on release
145+ readonly property real positionMarker1: 0.2
146+ // 1 - 2: curved snapping movement, snap to nextInStack on release
147+ readonly property real positionMarker2: sideStageWidth / spreadView.width
148+ // 2 - 3: movement follows finger, snaps to phase 2 (full spread) on release
149+ readonly property real positionMarker3: 0.6
150+ // passing 3, we detach movement from the finger and snap to phase 2 (full spread)
151+ readonly property real positionMarker4: 0.8
152+
153+ readonly property int startSnapPosition: phase0Width * 0.5
154+ readonly property int endSnapPosition: phase0Width * 0.75
155+ readonly property real snapPosition: 0.75
156+
157+ property int selectedIndex: -1
158+ property int draggedIndex: -1
159+ property int closingIndex: -1
160+
161+ property bool sideStageDragging: sideStageDragHandle.dragging
162+ property real sideStageDragProgress: sideStageDragHandle.progress
163+
164+ onSideStageDragProgressChanged: {
165+ if (sideStageDragProgress == 1) {
166+ ApplicationManager.focusApplication(priv.mainStageAppId);
167+ priv.sideStageAppId = "";
168+ }
169+ }
170+
171+ property int nextInStack: {
172+ switch (state) {
173+ case "main":
174+ if (ApplicationManager.count > 1) {
175+ return 1;
176+ }
177+ return -1;
178+ case "mainAndOverlay":
179+ if (ApplicationManager.count <= 2) {
180+ return -1;
181+ }
182+ if (priv.appId0 == priv.mainStageAppId || priv.appId0 == priv.sideStageAppId) {
183+ if (priv.appId1 == priv.mainStageAppId || priv.appId1 == priv.sideStageAppId) {
184+ return 2;
185+ }
186+ return 1;
187+ }
188+ return 0;
189+ case "overlay":
190+ return 1;
191+ }
192+ print("Unhandled nextInStack case! This shouldn't happen any more when the Dash is an app!");
193+ return -1;
194+ }
195+ property int nextZInStack: indexToZIndex(nextInStack)
196+
197+ states: [
198+ State {
199+ name: "empty"
200+ },
201+ State {
202+ name: "main"
203+ },
204+ State { // Side Stage only in overlay mode
205+ name: "overlay"
206+ },
207+ State { // Main Stage and Side Stage in overlay mode
208+ name: "mainAndOverlay"
209+ },
210+ State { // Main Stage and Side Stage in split mode
211+ name: "mainAndSplit"
212+ }
213+ ]
214+ state: {
215+ if (priv.mainStageAppId && !priv.sideStageAppId) {
216+ return "main";
217+ }
218+ if (!priv.mainStageAppId && priv.sideStageAppId) {
219+ return "overlay";
220+ }
221+ if (priv.mainStageAppId && priv.sideStageAppId) {
222+ return "mainAndOverlay";
223+ }
224+ return "empty";
225+ }
226+
227+ onContentXChanged: {
228+ if (spreadView.phase == 0 && spreadView.contentX > spreadView.width * spreadView.positionMarker2) {
229+ spreadView.phase = 1;
230+ } else if (spreadView.phase == 1 && spreadView.contentX > spreadView.width * spreadView.positionMarker4) {
231+ spreadView.phase = 2;
232+ } else if (spreadView.phase == 1 && spreadView.contentX < spreadView.width * spreadView.positionMarker2) {
233+ spreadView.phase = 0;
234+ }
235+ }
236+
237+ function snap() {
238+ if (contentX < phase0Width) {
239+ snapAnimation.targetContentX = 0;
240+ snapAnimation.start();
241+ } else if (contentX < phase1Width) {
242+ snapTo(1);
243+ } else {
244+ // Add 1 pixel to make sure we definitely hit positionMarker4 even with rounding errors of the animation.
245+ snapAnimation.targetContentX = spreadView.width * spreadView.positionMarker4 + 1;
246+ snapAnimation.start();
247+ }
248+ }
249+ function snapTo(index) {
250+ spreadView.selectedIndex = index;
251+ snapAnimation.targetContentX = 0;
252+ snapAnimation.start();
253+ }
254+
255+ // We need to shuffle z ordering a bit in order to keep side stage apps above main stage apps.
256+ // We don't want to really reorder them in the model because that allows us to keep track
257+ // of the last focused order.
258+ function indexToZIndex(index) {
259+ var app = ApplicationManager.get(index);
260+ if (!app) {
261+ return index;
262+ }
263+
264+ var isActive = app.appId == priv.mainStageAppId || app.appId == priv.sideStageAppId;
265+ if (isActive && app.stage == ApplicationInfoInterface.MainStage) {
266+ // if this app is active, and its the MainStage, always put it to index 0
267+ return 0;
268+ }
269+ if (isActive && app.stage == ApplicationInfoInterface.SideStage) {
270+ if (!priv.mainStageAppId) {
271+ // Only have SS apps running. Put the active one at 0
272+ return 0;
273+ }
274+
275+ // Precondition now: There's an active MS app and this is SS app:
276+ if (spreadView.nextInStack >= 0 && ApplicationManager.get(spreadView.nextInStack).stage == ApplicationInfoInterface.MainStage) {
277+ // If the next app coming from the right is a MS app, we need to elevate this SS ap above it.
278+ // Put it to at least level 2, or higher if there's more apps coming in before this one.
279+ return Math.max(index, 2);
280+ } else {
281+ // if this is no next app to come in from the right, place this one at index 1, just on top the active MS app.
282+ return 1;
283+ }
284+ }
285+ if (index <= 2 && app.stage == ApplicationInfoInterface.MainStage && priv.sideStageAppId) {
286+ // Ok, this is an inactive MS app. If there's an active SS app around, we need to place this one
287+ // in between the active MS app and the active SS app, so that it comes in from there when dragging from the right.
288+ // If there's now active SS app, just leave it where it is.
289+ return priv.indexOf(priv.sideStageAppId) < index ? index - 1 : index;
290+ }
291+ if (index == spreadView.nextInStack && app.stage == ApplicationInfoInterface.SideStage) {
292+ // This is a SS app and the next one to come in from the right:
293+ if (priv.sideStageAppId && priv.mainStageAppId) {
294+ // If there's both, an active MS and an active SS app, put this one right on top of that
295+ return 2;
296+ }
297+ // Or if there's only one other active app, put it on top of that.
298+ // The case that there isn't any other active app is already handled above.
299+ return 1;
300+ }
301+ if (index == 2 && spreadView.nextInStack == 1 && priv.sideStageAppId) {
302+ // If its index 2 but not the next one to come in, it means
303+ // we've pulled another one down to index 2. Move this one up to 2 instead.
304+ return 3;
305+ }
306+ // don't touch all others... (mostly index > 3 + simple cases where the above doesn't shuffle much)
307+ return index;
308+ }
309+
310+ SequentialAnimation {
311+ id: snapAnimation
312+ property int targetContentX: 0
313+
314+ UbuntuNumberAnimation {
315+ target: spreadView
316+ property: "contentX"
317+ to: snapAnimation.targetContentX
318+ duration: UbuntuAnimation.FastDuration
319+ }
320+
321+ ScriptAction {
322+ script: {
323+ if (spreadView.selectedIndex >= 0) {
324+ var newIndex = spreadView.selectedIndex;
325+ spreadView.selectedIndex = -1;
326+ ApplicationManager.focusApplication(ApplicationManager.get(newIndex).appId);
327+ spreadView.phase = 0;
328+ spreadView.contentX = 0;
329+ }
330+ }
331+ }
332+ }
333+
334+ Rectangle {
335+ id: spreadRow
336+ color: "black"
337+ x: spreadView.contentX
338+ height: root.height
339+ width: spreadView.width + Math.max(spreadView.width, ApplicationManager.count * spreadView.tileDistance)
340+
341+ Rectangle {
342+ id: sideStageBackground
343+ color: "black"
344+ anchors.fill: parent
345+ anchors.leftMargin: spreadView.width - (1 - sideStageDragHandle.progress) * spreadView.sideStageWidth
346+ z: spreadView.indexToZIndex(priv.indexOf(priv.sideStageAppId))
347+ opacity: spreadView.phase == 0 ? 1 : 0
348+ Behavior on opacity { UbuntuNumberAnimation {} }
349+ }
350+
351+ Item {
352+ id: sideStageDragHandle
353+ anchors { top: parent.top; bottom: parent.bottom; left: parent.left; leftMargin: spreadView.width - spreadView.sideStageWidth - width }
354+ width: units.gu(2)
355+ z: sideStageBackground.z
356+ opacity: spreadView.phase <= 0 && spreadView.sideStageVisible ? 1 : 0
357+ property real progress: 0
358+ property bool dragging: false
359+
360+ Behavior on opacity { UbuntuNumberAnimation {} }
361+
362+ Connections {
363+ target: spreadView
364+ onSideStageVisibleChanged: {
365+ if (spreadView.sideStageVisible) {
366+ sideStageDragHandle.progress = 0;
367+ }
368+ }
369+ }
370+
371+ Image {
372+ anchors.centerIn: parent
373+ anchors.horizontalCenterOffset: parent.progress * spreadView.sideStageWidth - (width - parent.width) / 2
374+ width: sideStageDragHandleMouseArea.pressed ? parent.width * 2 : parent.width
375+ height: parent.height
376+ source: "graphics/sidestage_handle@20.png"
377+ Behavior on width { UbuntuNumberAnimation {} }
378+ }
379+
380+ MouseArea {
381+ id: sideStageDragHandleMouseArea
382+ anchors.fill: parent
383+ enabled: spreadView.contentX == 0
384+ property int startX
385+ property var gesturePoints: new Array()
386+
387+ onPressed: {
388+ gesturePoints = [];
389+ startX = mouseX;
390+ sideStageDragHandle.progress = 0;
391+ sideStageDragHandle.dragging = true;
392+ }
393+ onMouseXChanged: {
394+ if (priv.mainStageAppId) {
395+ sideStageDragHandle.progress = Math.max(0, (-startX + mouseX) / spreadView.sideStageWidth);
396+ }
397+ gesturePoints.push(mouseX);
398+ }
399+ onReleased: {
400+ if (priv.mainStageAppId) {
401+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
402+ sideStageDragSnapAnimation.to = sideStageDragHandle.progress > 0.5 || oneWayFlick ? 1 : 0;
403+ sideStageDragSnapAnimation.start();
404+ } else {
405+ sideStageDragHandle.dragging = false;
406+ }
407+ }
408+ }
409+ UbuntuNumberAnimation {
410+ id: sideStageDragSnapAnimation
411+ target: sideStageDragHandle
412+ property: "progress"
413+
414+ onRunningChanged: {
415+ if (!running) {
416+ sideStageDragHandle.dragging = false;;
417+ }
418+ }
419+ }
420+ }
421+
422+ Repeater {
423+ id: spreadRepeater
424+ model: ApplicationManager
425+
426+ delegate: TransformedTabletSpreadDelegate {
427+ id: spreadTile
428+ height: spreadView.height
429+ width: model.stage == ApplicationInfoInterface.MainStage ? spreadView.width : spreadView.sideStageWidth
430+ x: spreadView.width
431+ z: spreadView.indexToZIndex(index)
432+ active: model.appId == priv.mainStageAppId || model.appId == priv.sideStageAppId
433+ zIndex: z
434+ selected: spreadView.selectedIndex == index
435+ otherSelected: spreadView.selectedIndex >= 0 && !selected
436+ isInSideStage: priv.sideStageAppId == model.appId
437+ interactive: !spreadView.interactive && spreadView.phase === 0 && root.interactive
438+ swipeToCloseEnabled: spreadView.interactive
439+ maximizedAppTopMargin: root.maximizedAppTopMargin
440+ dropShadow: spreadView.contentX > 0 || spreadDragArea.status == DirectionalDragArea.Undecided
441+
442+ property real behavioredZIndex: zIndex
443+ Behavior on behavioredZIndex {
444+ enabled: spreadView.closingIndex >= 0
445+ UbuntuNumberAnimation {}
446+ }
447+
448+ // This is required because none of the bindings are triggered in some cases:
449+ // When an app is closed, it might happen that ApplicationManager.get(nextInStack)
450+ // returns a different app even though the nextInStackIndex and all the related
451+ // bindings (index, mainStageApp, sideStageApp, etc) don't change. Let's force a
452+ // binding update in that case.
453+ Connections {
454+ target: ApplicationManager
455+ onApplicationRemoved: spreadTile.z = Qt.binding(function() {
456+ return spreadView.indexToZIndex(index);
457+ })
458+ }
459+
460+ progress: {
461+ var tileProgress = (spreadView.contentX - behavioredZIndex * spreadView.tileDistance) / spreadView.width;
462+ // Some tiles (nextInStack, active) need to move directly from the beginning, normalize progress to immediately start at 0
463+ if ((index == spreadView.nextInStack && spreadView.phase < 2) || (active && spreadView.phase < 1)) {
464+ tileProgress += behavioredZIndex * spreadView.tileDistance / spreadView.width;
465+ }
466+ return tileProgress;
467+ }
468+
469+ animatedProgress: {
470+ if (spreadView.phase == 0 && (spreadTile.active || spreadView.nextInStack == index)) {
471+ if (progress < spreadView.positionMarker1) {
472+ return progress;
473+ } else if (progress < spreadView.positionMarker1 + snappingCurve.period) {
474+ return spreadView.positionMarker1 + snappingCurve.value * 3;
475+ } else {
476+ return spreadView.positionMarker2;
477+ }
478+ }
479+ return progress;
480+ }
481+
482+ onClicked: {
483+ if (spreadView.phase == 2) {
484+ if (ApplicationManager.focusedApplicationId == ApplicationManager.get(index).appId) {
485+ spreadView.snapTo(index);
486+ } else {
487+ ApplicationManager.requestFocusApplication(ApplicationManager.get(index).appId);
488+ }
489+ }
490+ }
491+
492+ onClosed: {
493+ spreadView.draggedIndex = -1;
494+ spreadView.closingIndex = index;
495+ ApplicationManager.stopApplication(ApplicationManager.get(index).appId);
496+ }
497+
498+ EasingCurve {
499+ id: snappingCurve
500+ type: EasingCurve.Linear
501+ period: (spreadView.positionMarker2 - spreadView.positionMarker1) / 3
502+ progress: spreadTile.progress - spreadView.positionMarker1
503+ }
504+ }
505+ }
506+ }
507+ }
508+
509+ EdgeDragArea {
510+ id: spreadDragArea
511+ anchors { top: parent.top; right: parent.right; bottom: parent.bottom }
512+ width: root.dragAreaWidth
513+ direction: Direction.Leftwards
514+
515+ property bool attachedToView: false
516+ property var gesturePoints: new Array()
517+
518+ onTouchXChanged: {
519+ if (!dragging) {
520+ spreadView.phase = 0;
521+ spreadView.contentX = 0;
522+ }
523+
524+ if (attachedToView) {
525+ spreadView.contentX = -touchX + spreadDragArea.width;
526+ if (spreadView.contentX > spreadView.phase0Width + spreadView.phase1Width / 2) {
527+ attachedToView = false;
528+ spreadView.snap();
529+ }
530+ }
531+ gesturePoints.push(touchX);
532+ }
533+
534+ onStatusChanged: {
535+ if (status == DirectionalDragArea.Recognized) {
536+ attachedToView = true;
537+ }
538+ }
539+
540+ onDraggingChanged: {
541+ if (dragging) {
542+ // Gesture recognized. Start recording this gesture
543+ gesturePoints = [];
544+ return;
545+ }
546+
547+ // Ok. The user released. Find out if it was a one-way movement.
548+ var oneWayFlick = priv.evaluateOneWayFlick(gesturePoints);
549+ gesturePoints = [];
550+
551+ if (oneWayFlick && spreadView.contentX < spreadView.positionMarker1 * spreadView.width) {
552+ // If it was a short one-way movement, do the Alt+Tab switch
553+ // no matter if we didn't cross positionMarker1 yet.
554+ spreadView.snapTo(spreadView.nextInStack);
555+ } else if (!dragging && attachedToView) {
556+ if (spreadView.contentX < spreadView.width * spreadView.positionMarker1) {
557+ spreadView.snap();
558+ } else if (spreadView.contentX < spreadView.width * spreadView.positionMarker2) {
559+ spreadView.snapTo(spreadView.nextInStack);
560+ } else {
561+ // otherwise snap to the closest snap position we can find
562+ // (might be back to start, to app 1 or to spread)
563+ spreadView.snap();
564+ }
565+ }
566+ }
567+ }
568+}
qml/Stages/TransformedSpreadDelegate.qml+36−30
@@ -23,7 +23,9 @@ import Ubuntu.Components 0.1
2323SpreadDelegate {
2424 id: root
2525
26+ // Set this to true when this tile is selected in the spread. The animation will change to bring the tile to front.
2627 property bool selected: false
28+ // Set this to true when another tile in the spread is selected. The animation will change to fade this tile out.
2729 property bool otherSelected: false
2830
2931 // The progress animates the tiles. A value > 0 makes it appear from the right edge. At 1 it reaches the end position.
@@ -44,6 +46,9 @@ SpreadDelegate {
4446 property real startDistance: units.gu(5)
4547 property real endDistance: units.gu(.5)
4648
49+ // Hiding tiles when their progress is negative or reached the maximum
50+ visible: progress >= 0 && progress < 1.7
51+
4752 onSelectedChanged: {
4853 if (selected) {
4954 priv.snapshot();
@@ -106,16 +111,6 @@ SpreadDelegate {
106111 selectedTopMarginProgress = topMarginProgress;
107112 }
108113
109− // This calculates how much negative progress there can be if unwinding the spread completely
110− // the progress for each tile starts at 0 when it crosses the right edge, so the later a tile comes in,
111− // the bigger its negativeProgress can be.
112− property real negativeProgress: {
113− if (index == 1 && spreadView.phase < 2) {
114− return 0;
115− }
116− return -index * spreadView.tileDistance / spreadView.width;
117− }
118−
119114 function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
120115 // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
121116 return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
@@ -127,22 +122,20 @@ SpreadDelegate {
127122 return helperEasingCurve.value * (endValue - startValue) + startValue;
128123 }
129124
130− property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
131−
132125 // The following blocks handle the animation of the tile in the spread.
133126 // At the beginning, each tile is attached at the right edge, outside the screen.
134127 // The progress for each tile starts at 0 and it reaches its end position at a progress of 1.
135− // The first phases are handled special for the first 2 tiles. as we do the alt-tab and snapping in there
136− // Once we reached phase 3, the animation is the same for all tiles.
137− // When a tile is selected, the animation state is snapshotted, and the spreadView is unwound (progress animates
138− // back to negativeProgress). All tiles are kept in place and faded out to 0 opacity except
128+ // The first phases are handled special for the first 2 tiles. as we do the alt-tab and snapping
129+ // in there. Once we reached phase 3, the animation is the same for all tiles.
130+ // When a tile is selected, the animation state is snapshotted, and the spreadView is unwound.
131+ // All tiles are kept in place and faded out to 0 opacity except
139132 // the selected tile, which is animated from the snapshotted position to be fullscreen.
140133
141− property real xTranslate: {
134+ readonly property real xTranslate: {
142135 if (otherSelected) {
143136 if (spreadView.phase < 2 && index == 0) {
144− return linearAnimation(selectedProgress, negativeProgress,
145− selectedXTranslate, selectedXTranslate - spreadView.tileDistance, root.progress);
137+ return linearAnimation(selectedProgress, 0, selectedXTranslate,
138+ selectedXTranslate - spreadView.tileDistance, root.progress);
146139 }
147140
148141 return selectedXTranslate;
@@ -160,7 +153,7 @@ SpreadDelegate {
160153 // Apply the same animation as with the rest but add spreadView.width to align it with the others.
161154 return -easingCurve.value * spreadView.width + spreadView.width;
162155 } else if (priv.isSelected) {
163− return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, 0, root.progress);
156+ return linearAnimation(selectedProgress, 0, selectedXTranslate, 0, root.progress);
164157 }
165158
166159 case 1:
@@ -177,23 +170,28 @@ SpreadDelegate {
177170 if (priv.isSelected) {
178171 // Distance to left edge
179172 var targetTranslate = -spreadView.width - ((index - 1) * root.startDistance);
180− return linearAnimation(selectedProgress, negativeProgress,
173+ return linearAnimation(selectedProgress, 0,
181174 selectedXTranslate, targetTranslate, root.progress);
182175 }
183176
184177 // Fix it at the right edge...
185178 var rightEdgeOffset = -((index - 1) * root.startDistance);
186179 // ...and use our easing to move them to the left. Stop a bit earlier for each tile
180+ var animatedEndDistance = linearAnimation(0, 2, root.endDistance, 0, root.progress);
187181 return -easingCurve.value * spreadView.width + (index * animatedEndDistance) + rightEdgeOffset;
188182
189183 }
190184
191− property real angle: {
185+ readonly property real angle: {
186+ if (spreadView.focusChanging) {
187+ return 0;
188+ }
189+
192190 if (priv.otherSelected) {
193191 return priv.selectedAngle;
194192 }
195193 if (priv.isSelected) {
196− return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
194+ return linearAnimation(selectedProgress, 0, selectedAngle, 0, root.progress);
197195 }
198196 switch (index) {
199197 case 0:
@@ -217,12 +215,15 @@ SpreadDelegate {
217215 return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
218216 }
219217
220− property real scale: {
218+ readonly property real scale: {
219+ if (spreadView.focusChanging) {
220+ return 1;
221+ }
221222 if (priv.otherSelected) {
222223 return priv.selectedScale;
223224 }
224225 if (priv.isSelected) {
225− return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
226+ return linearAnimation(selectedProgress, 0, selectedScale, 1, root.progress);
226227 }
227228
228229 switch (index) {
@@ -247,7 +248,7 @@ SpreadDelegate {
247248 return root.startScale - easingCurve.value * (root.startScale - root.endScale);
248249 }
249250
250− property real opacity: {
251+ readonly property real opacity: {
251252 if (priv.otherSelected) {
252253 return linearAnimation (selectedProgress, Math.max(0, selectedProgress - .5),
253254 selectedOpacity, 0, root.progress);
@@ -265,9 +266,9 @@ SpreadDelegate {
265266 return 1;
266267 }
267268
268− property real topMarginProgress: {
269+ readonly property real topMarginProgress: {
269270 if (priv.isSelected) {
270− return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
271+ return linearAnimation(selectedProgress, 0, selectedTopMarginProgress, 0, root.progress);
271272 }
272273
273274 switch (index) {
@@ -290,6 +291,7 @@ SpreadDelegate {
290291
291292 return easingCurve.value;
292293 }
294+
293295 }
294296
295297 transform: [
@@ -303,18 +305,22 @@ SpreadDelegate {
303305 xScale: priv.scale
304306 yScale: xScale
305307 },
308+ Scale {
309+ origin { x: 0; y: (spreadView.height * priv.scale) + maximizedAppTopMargin * 3 }
310+ xScale: 1
311+ yScale: isFullscreen ? 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height : 1
312+ },
306313 Translate {
307314 x: priv.xTranslate
308315 }
309316 ]
310317 opacity: priv.opacity
311− topMarginProgress: priv.topMarginProgress
312318
313319 EasingCurve {
314320 id: easingCurve
315321 type: EasingCurve.OutSine
316322 period: 1 - spreadView.positionMarker2
317− progress: root.animatedProgress
323+ progress: root.progress
318324 }
319325
320326 // This is used as a calculation helper to figure values for progress other than the current one
qml/Stages/TransformedTabletSpreadDelegate.qmlnew file+369
@@ -0,0 +1,369 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU Lesser General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU Lesser General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU Lesser General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Zanetti <michael.zanetti@canonical.com>
17+*/
18+
19+import QtQuick 2.0
20+import Utils 0.1
21+import Ubuntu.Components 0.1
22+import Unity.Application 0.1
23+
24+SpreadDelegate {
25+ id: root
26+
27+ // Set this to true when this tile is selected in the spread. The animation will change to bring the tile to front.
28+ property bool selected: false
29+ // Set this to true when another tile in the spread is selected. The animation will change to fade this tile out.
30+ property bool otherSelected: false
31+ // Set this to true when this tile a currently active on either the MS or the SS.
32+ property bool active: false
33+
34+ property int zIndex
35+ property real progress: 0
36+ property real animatedProgress: 0
37+
38+ property real startDistance: units.gu(5)
39+ property real endDistance: units.gu(.5)
40+
41+ property real startScale: 1.1
42+ property real endScale: 0.7
43+ property real dragStartScale: startScale + .2
44+
45+ property real startAngle: 15
46+ property real endAngle: 5
47+
48+ property bool isInSideStage: false
49+
50+ onSelectedChanged: {
51+ if (selected) {
52+ priv.snapshot();
53+ }
54+ priv.isSelected = selected;
55+ }
56+
57+ onOtherSelectedChanged: {
58+ if (otherSelected) {
59+ priv.snapshot();
60+ }
61+ priv.otherSelected = otherSelected;
62+ }
63+
64+ Connections {
65+ target: spreadView
66+
67+ onPhaseChanged: {
68+ if (spreadView.phase == 1) {
69+ var phase2Progress = spreadView.positionMarker4 - (root.zIndex * spreadView.tileDistance / spreadView.width);
70+ priv.phase2StartTranslate = priv.easingAnimation(0, 1, 0, -spreadView.width + (root.zIndex * root.endDistance), phase2Progress);
71+ priv.phase2StartScale = priv.easingAnimation(0, 1, root.startScale, root.endScale, phase2Progress);
72+ priv.phase2StartAngle = priv.easingAnimation(0, 1, root.startAngle, root.endAngle, phase2Progress);
73+ priv.phase2StartTopMarginProgress = priv.easingAnimation(0, 1, 0, 1, phase2Progress);
74+ }
75+ }
76+ }
77+
78+ // Required to be an item because we're using states on it.
79+ Item {
80+ id: priv
81+
82+ // true if this is the next tile on the stack that comes in when dragging from the right
83+ property bool nextInStack: spreadView.nextZInStack == zIndex
84+ // true if the next tile in the stack is the nextInStack one. This one will be moved a bit to the left
85+ property bool movedActive: spreadView.nextZInStack == zIndex + 1
86+ property real animatedEndDistance: linearAnimation(0, 2, root.endDistance, 0, root.progress)
87+
88+ property real phase2StartTranslate
89+ property real phase2StartScale
90+ property real phase2StartAngle
91+ property real phase2StartTopMarginProgress
92+
93+ property bool isSelected: false
94+ property bool otherSelected: false
95+ property real selectedProgress
96+ property real selectedXTranslate
97+ property real selectedAngle
98+ property real selectedScale
99+ property real selectedOpacity
100+ property real selectedTopMarginProgress
101+
102+ function snapshot() {
103+ selectedProgress = root.progress;
104+ selectedXTranslate = xTranslate;
105+ selectedAngle = angle;
106+ selectedScale = priv.scale;
107+ selectedOpacity = priv.opacityTransform;
108+ selectedTopMarginProgress = topMarginProgress;
109+ }
110+
111+ // This calculates how much negative progress there can be if unwinding the spread completely
112+ // the progress for each tile starts at 0 when it crosses the right edge, so the later a tile comes in,
113+ // the bigger its negativeProgress can be.
114+ property real negativeProgress: {
115+ if (nextInStack && spreadView.phase < 2) {
116+ return 0;
117+ }
118+ return -root.zIndex * spreadView.tileDistance / spreadView.width;
119+ }
120+
121+ function linearAnimation(startProgress, endProgress, startValue, endValue, progress) {
122+ // progress : progressDiff = value : valueDiff => value = progress * valueDiff / progressDiff
123+ return (progress - startProgress) * (endValue - startValue) / (endProgress - startProgress) + startValue;
124+ }
125+
126+ function easingAnimation(startProgress, endProgress, startValue, endValue, progress) {
127+ helperEasingCurve.progress = progress - startProgress;
128+ helperEasingCurve.period = endProgress - startProgress;
129+ return helperEasingCurve.value * (endValue - startValue) + startValue;
130+ }
131+
132+ property real xTranslate: {
133+ var newTranslate = 0;
134+
135+ if (otherSelected) {
136+ return priv.selectedXTranslate;
137+ }
138+
139+ if (isSelected) {
140+ if (model.stage == ApplicationInfoInterface.MainStage) {
141+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.width, root.progress);
142+ } else {
143+ return linearAnimation(selectedProgress, negativeProgress, selectedXTranslate, -spreadView.sideStageWidth, root.progress);
144+ }
145+ }
146+
147+ // The tile should move a bit to the left if a new one comes on top of it, but not for the Side Stage and not
148+ // when we're only dragging the side stage in on top of a main stage app
149+ var shouldMoveAway = spreadView.nextInStack >= 0 && priv.movedActive && model.stage === ApplicationInfoInterface.MainStage &&
150+ ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage;
151+
152+ if (active) {
153+ newTranslate -= root.width
154+ // Only do the hide animation for active apps in the mainstage, and not if we only drag the ss in
155+ if (spreadView.phase == 0 && shouldMoveAway) {
156+ newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -units.gu(4), root.animatedProgress);
157+ }
158+ }
159+ if (nextInStack && spreadView.phase == 0) {
160+ if (model.stage == ApplicationInfoInterface.MainStage) {
161+ if (spreadView.sideStageVisible && root.progress > 0) {
162+ // Move it so it appears from behind the side stage immediately
163+ newTranslate += -spreadView.sideStageWidth;
164+ }
165+ }
166+
167+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
168+ // This is when we only drag the side stage in, without rotation or snapping
169+ newTranslate = linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth, root.progress);
170+ } else {
171+ newTranslate += linearAnimation(0, spreadView.positionMarker2, 0, -spreadView.sideStageWidth * spreadView.snapPosition, root.animatedProgress);
172+ }
173+ }
174+
175+ if (spreadView.phase == 1) {
176+ if (nextInStack) {
177+ if (model.stage == ApplicationInfoInterface.MainStage) {
178+ var startValue = -spreadView.sideStageWidth * spreadView.snapPosition + (spreadView.sideStageVisible ? -spreadView.sideStageWidth : 0);
179+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startValue, priv.phase2StartTranslate, root.animatedProgress);
180+ } else {
181+ var endValue = -spreadView.width + spreadView.width * root.zIndex / 6;
182+ if (!spreadView.sideStageVisible) {
183+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.sideStageWidth, priv.phase2StartTranslate, root.progress);
184+ } else {
185+ newTranslate += linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, -spreadView.sideStageWidth * spreadView.snapPosition, priv.phase2StartTranslate, root.animatedProgress);
186+ }
187+ }
188+ } else if (root.active) {
189+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
190+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
191+ var startTranslate = -root.width + (shouldMoveAway ? -units.gu(4) : 0);
192+ newTranslate = linearAnimation(startProgress, endProgress, startTranslate, priv.phase2StartTranslate, root.progress);
193+ } else {
194+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
195+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
196+ newTranslate = linearAnimation(startProgress, endProgress, 0, priv.phase2StartTranslate, root.progress);
197+ }
198+ }
199+
200+ if (spreadView.phase == 2) {
201+ newTranslate = -easingCurve.value * (spreadView.width - root.zIndex * animatedEndDistance);
202+ }
203+
204+ return newTranslate;
205+ }
206+
207+ property real scale: {
208+ if (otherSelected) {
209+ return selectedScale;
210+ }
211+
212+ if (isSelected) {
213+ return linearAnimation(selectedProgress, negativeProgress, selectedScale, 1, root.progress);
214+ }
215+
216+ if (spreadView.phase == 0) {
217+ if (nextInStack) {
218+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
219+ return 1;
220+ } else {
221+ var targetScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
222+ return linearAnimation(0, spreadView.positionMarker2, root.dragStartScale, targetScale, root.animatedProgress);
223+ }
224+ } else if (active) {
225+ return 1;
226+ } else {
227+ return linearAnimation(0, spreadView.positionMarker2, root.startScale, root.endScale, root.progress);
228+ }
229+ }
230+
231+ if (spreadView.phase == 1) {
232+ if (nextInStack) {
233+ var startScale = 1;
234+ if (model.stage !== ApplicationInfoInterface.SideStage || spreadView.sideStageVisible) {
235+ startScale = root.dragStartScale - ((root.dragStartScale - 1) * spreadView.snapPosition);
236+ }
237+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, startScale, priv.phase2StartScale, root.animatedProgress);
238+ }
239+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
240+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
241+ return linearAnimation(startProgress, endProgress, 1, priv.phase2StartScale, root.animatedProgress);
242+ }
243+
244+ if (spreadView.phase == 2) {
245+ return root.startScale - easingCurve.value * (root.startScale - root.endScale);
246+ }
247+
248+ return 1;
249+ }
250+
251+ property real angle: {
252+ if (otherSelected) {
253+ return selectedAngle;
254+ }
255+ if (isSelected) {
256+ return linearAnimation(selectedProgress, negativeProgress, selectedAngle, 0, root.progress);
257+ }
258+
259+ // The tile should rotate a bit when another one comes on top, but not when only dragging the side stage in
260+ var shouldMoveAway = spreadView.nextInStack >= 0 && movedActive &&
261+ (ApplicationManager.get(spreadView.nextInStack).stage === ApplicationInfoInterface.MainStage ||
262+ model.stage == ApplicationInfoInterface.SideStage);
263+
264+ if (spreadView.phase == 0) {
265+ if (nextInStack) {
266+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
267+ return 0;
268+ } else {
269+ return linearAnimation(0, spreadView.positionMarker2, root.startAngle, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
270+ }
271+ }
272+ if (shouldMoveAway) {
273+ return linearAnimation(0, spreadView.positionMarker2, 0, root.startAngle * (1-spreadView.snapPosition), root.animatedProgress);
274+ }
275+ }
276+ if (spreadView.phase == 1) {
277+ if (nextInStack) {
278+ if (model.stage == ApplicationInfoInterface.SideStage && !spreadView.sideStageVisible) {
279+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, 0, priv.phase2StartAngle, root.animatedProgress);
280+ } else {
281+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4, root.startAngle * (1-spreadView.snapPosition), priv.phase2StartAngle, root.animatedProgress);
282+ }
283+ }
284+ var startProgress = spreadView.positionMarker2 - (zIndex * spreadView.positionMarker2 / 2);
285+ var endProgress = spreadView.positionMarker4 - (zIndex * spreadView.tileDistance / spreadView.width);
286+ var startAngle = shouldMoveAway ? root.startAngle * (1-spreadView.snapPosition) : 0;
287+ return linearAnimation(startProgress, endProgress, startAngle, priv.phase2StartAngle, root.progress);
288+ }
289+ if (spreadView.phase == 2) {
290+ return root.startAngle - easingCurve.value * (root.startAngle - root.endAngle);
291+ }
292+
293+ return 0;
294+ }
295+
296+ property real opacityTransform: {
297+ if (otherSelected && spreadView.phase == 2) {
298+ return linearAnimation(selectedProgress, negativeProgress, selectedOpacity, 0, root.progress);
299+ }
300+
301+ return 1;
302+ }
303+
304+ property real topMarginProgress: {
305+ if (priv.isSelected) {
306+ return linearAnimation(selectedProgress, negativeProgress, selectedTopMarginProgress, 0, root.progress);
307+ }
308+ switch (spreadView.phase) {
309+ case 0:
310+ return 0;
311+ case 1:
312+ return linearAnimation(spreadView.positionMarker2, spreadView.positionMarker4,
313+ 0, priv.phase2StartTopMarginProgress, root.progress);
314+ }
315+ return 1;
316+ }
317+
318+ states: [
319+ State {
320+ name: "sideStageDragging"; when: spreadView.sideStageDragging && root.isInSideStage
321+ PropertyChanges { target: priv; xTranslate: -spreadView.sideStageWidth + spreadView.sideStageWidth * spreadView.sideStageDragProgress }
322+ }
323+ ]
324+ }
325+
326+ transform: [
327+ Rotation {
328+ origin { x: 0; y: spreadView.height / 2 }
329+ axis { x: 0; y: 1; z: 0 }
330+ angle: priv.angle
331+ },
332+ Scale {
333+ origin { x: 0; y: spreadView.height / 2 }
334+ xScale: priv.scale
335+ yScale: xScale
336+ },
337+ Scale {
338+ origin { x: 0; y: (spreadView.height * priv.scale) + maximizedAppTopMargin * 3 }
339+ xScale: 1
340+ yScale: isFullscreen ? 1 - priv.topMarginProgress * maximizedAppTopMargin / spreadView.height : 1
341+ },
342+ Translate {
343+ x: priv.xTranslate
344+ }
345+ ]
346+ opacity: priv.opacityTransform
347+
348+ UbuntuNumberAnimation {
349+ id: fadeBackInAnimation
350+ target: root
351+ property: "opacity"
352+ duration: UbuntuAnimation.SlowDuration
353+ from: 0
354+ to: 1
355+ }
356+
357+ EasingCurve {
358+ id: easingCurve
359+ type: EasingCurve.OutSine
360+ period: 1
361+ progress: root.progress
362+ }
363+
364+ EasingCurve {
365+ id: helperEasingCurve
366+ type: easingCurve.type
367+ period: easingCurve.period
368+ }
369+}
run.sh+15−6
@@ -8,6 +8,7 @@ GDB=false
88FAKE=false
99PINLOCK=false
1010KEYLOCK=false
11+USE_MOCKS=false
1112MOUSE_TOUCH=true
1213
1314usage() {
@@ -31,9 +32,9 @@ eval set -- "$ARGS"
3132while [ $# -gt 0 ]
3233do
3334 case "$1" in
34− -f|--fake) FAKE=true;;
35− -p|--pinlock) PINLOCK=true;;
36− -k|--keylock) KEYLOCK=true;;
35+ -f|--fake) FAKE=true; USE_MOCKS=true;;
36+ -p|--pinlock) PINLOCK=true; USE_MOCKS=true;;
37+ -k|--keylock) KEYLOCK=true; USE_MOCKS=true;;
3738 -g|--gdb) GDB=true;;
3839 -h|--help) usage;;
3940 -m|--nomousetouch) MOUSE_TOUCH=false;;
@@ -43,20 +44,28 @@ do
4344done
4445
4546if $FAKE; then
46− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
4747 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single
4848fi
4949
5050if $PINLOCK; then
51− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
5251 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-pin
5352fi
5453
5554if $KEYLOCK; then
56− export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
5755 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/libusermetrics:$PWD/builddir/tests/mocks/LightDM/single-passphrase
5856fi
5957
58+if $USE_MOCKS; then
59+ rm -f $PWD/builddir/nonmirplugins/LightDM # undo symlink (from below) for cleanliness
60+ export QML2_IMPORT_PATH=$QML2_IMPORT_PATH:$PWD/builddir/tests/mocks:$PWD/builddir/plugins:$PWD/builddir/modules
61+else
62+ # Still fake no-login user for convenience (it's annoying to be prompted for your password when testing)
63+ # And in particular, just link our LightDM mock into the nonmirplugins folder. We don't want the rest of
64+ # our plugins to be used.
65+ ln -s $PWD/builddir/tests/mocks/LightDM $PWD/builddir/nonmirplugins/
66+ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/builddir/tests/mocks/LightDM/single
67+fi
68+
6069QML_PHONE_SHELL_ARGS=""
6170if $MOUSE_TOUCH; then
6271 QML_PHONE_SHELL_ARGS="$QML_PHONE_SHELL_ARGS -mousetouch"
src/CMakeLists.txt−3
@@ -1,8 +1,5 @@
1−pkg_check_modules(UNITY-MIR REQUIRED unity-mir)
2−
31include_directories(
42 ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
5− ${UNITY-MIR_INCLUDE_DIRS}
63)
74
85file(GLOB_RECURSE QML_FILES
src/main.cpp+14−89
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2012 Canonical, Ltd.
2+ * Copyright (C) 2012-2014 Canonical, Ltd.
33 *
44 * Authors:
55 * Gerry Boland <gerry.boland@canonical.com>
@@ -23,12 +23,9 @@
2323#include <QtGui/QGuiApplication>
2424#include <QtQml/QQmlEngine>
2525#include <QtQml/QQmlContext>
26−#include <qpa/qplatformnativeinterface.h>
2726#include <QLibrary>
2827#include <QDebug>
2928#include <libintl.h>
30−#include <dlfcn.h>
31−#include <csignal>
3229
3330// local
3431#include <paths.h>
@@ -36,11 +33,13 @@
3633#include "ApplicationArguments.h"
3734#include "CachingNetworkManagerFactory.h"
3835
39−#include <unity-mir/qmirserver.h>
40−
41−int startShell(int argc, const char** argv, void* server)
36+int main(int argc, const char *argv[])
4237{
43− const bool isUbuntuMirServer = qgetenv("QT_QPA_PLATFORM") == "ubuntumirserver";
38+ bool isMirServer = false;
39+ if (qgetenv("QT_QPA_PLATFORM") == "ubuntumirclient") {
40+ setenv("QT_QPA_PLATFORM", "mirserver", 1 /* overwrite */);
41+ isMirServer = true;
42+ }
4443
4544 QGuiApplication::setApplicationName("unity8");
4645 QGuiApplication *application;
@@ -70,21 +69,7 @@ int startShell(int argc, const char** argv, void* server)
7069Load the testability driver");
7170 parser.addOption(testabilityOption);
7271
73− if (isUbuntuMirServer) {
74− QLibrary unityMir("unity-mir", 1);
75− unityMir.load();
76−
77− typedef QGuiApplication* (*createServerApplication_t)(int&, const char **, void*);
78− createServerApplication_t createQMirServerApplication = (createServerApplication_t) unityMir.resolve("createQMirServerApplication");
79− if (!createQMirServerApplication) {
80− qDebug() << "unable to resolve symbol: createQMirServerApplication";
81− return 4;
82− }
83−
84− application = createQMirServerApplication(argc, argv, server);
85− } else {
86− application = new QGuiApplication(argc, (char**)argv);
87− }
72+ application = new QGuiApplication(argc, (char**)argv);
8873
8974 // Treat args with single dashes the same as arguments with two dashes
9075 // Ex: -fullscreen == --fullscreen
@@ -100,8 +85,8 @@ Load the testability driver");
10085 if (parser.isSet(windowGeometryOption) &&
10186 parser.value(windowGeometryOption).split('x').size() == 2)
10287 {
103− QStringList geom = parser.value(windowGeometryOption).split('x');
104− qmlArgs.setSize(geom.at(0).toInt(), geom.at(1).toInt());
88+ QStringList geom = parser.value(windowGeometryOption).split('x');
89+ qmlArgs.setSize(geom.at(0).toInt(), geom.at(1).toInt());
10590 }
10691
10792 // The testability driver is only loaded by QApplication but not by QGuiApplication.
@@ -125,7 +110,8 @@ Load the testability driver");
125110
126111 QQuickView* view = new QQuickView();
127112 view->setResizeMode(QQuickView::SizeRootObjectToView);
128− view->setTitle("Qml Phone Shell");
113+ view->setColor("black");
114+ view->setTitle("Unity8 Shell");
129115 view->engine()->setBaseUrl(QUrl::fromLocalFile(::qmlDirectory()));
130116 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
131117 view->rootContext()->setContextProperty("indicatorProfile", indicatorProfile);
@@ -141,18 +127,9 @@ Load the testability driver");
141127 application->installNativeEventFilter(mouseTouchAdaptor);
142128 }
143129
144− QPlatformNativeInterface* nativeInterface = QGuiApplication::platformNativeInterface();
145− /* Shell is declared as a system session so that it always receives all
146− input events.
147− FIXME: use the enum value corresponding to SYSTEM_SESSION_TYPE (= 1)
148− when it becomes available.
149− */
150− nativeInterface->setProperty("ubuntuSessionType", 1);
151− view->setProperty("role", 2); // INDICATOR_ACTOR_ROLE
152−
153130 QUrl source(::qmlDirectory()+"Shell.qml");
154131 prependImportPaths(view->engine(), ::overrideImportPaths());
155− if (!isUbuntuMirServer) {
132+ if (!isMirServer) {
156133 prependImportPaths(view->engine(), ::nonMirImportPaths());
157134 }
158135 appendImportPaths(view->engine(), ::fallbackImportPaths());
@@ -161,10 +138,9 @@ Load the testability driver");
161138 view->engine()->setNetworkAccessManagerFactory(managerFactory);
162139
163140 view->setSource(source);
164− view->setColor("transparent");
165141 QObject::connect(view->engine(), SIGNAL(quit()), application, SLOT(quit()));
166142
167− if (qgetenv("QT_QPA_PLATFORM") == "ubuntu" || isUbuntuMirServer || parser.isSet(fullscreenOption)) {
143+ if (isMirServer || parser.isSet(fullscreenOption)) {
168144 view->showFullScreen();
169145 } else {
170146 view->show();
@@ -178,54 +154,3 @@ Load the testability driver");
178154
179155 return result;
180156}
181−
182−int main(int argc, const char *argv[])
183−{
184− /* Workaround Qt platform integration plugin not advertising itself
185− as having the following capabilities:
186− - QPlatformIntegration::ThreadedOpenGL
187− - QPlatformIntegration::BufferQueueingOpenGL
188− */
189− setenv("QML_FORCE_THREADED_RENDERER", "1", 1);
190− setenv("QML_FIXED_ANIMATION_STEP", "1", 1);
191−
192− // For ubuntumirserver/ubuntumirclient
193− if (qgetenv("QT_QPA_PLATFORM").startsWith("ubuntumir")) {
194− setenv("QT_QPA_PLATFORM", "ubuntumirserver", 1);
195−
196− // If we use unity-mir directly, we automatically link to the Mir-server
197− // platform-api bindings, which result in unexpected behaviour when
198− // running the non-Mir scenario.
199− QLibrary unityMir("unity-mir", 1);
200− unityMir.load();
201− if (!unityMir.isLoaded()) {
202− qDebug() << "Library unity-mir not found/loaded";
203− return 1;
204− }
205−
206− typedef QMirServer* (*createServer_t)(int, const char **);
207− createServer_t createQMirServer = (createServer_t) unityMir.resolve("createQMirServer");
208− if (!createQMirServer) {
209− qDebug() << "unable to resolve symbol: createQMirServer";
210− return 2;
211− }
212−
213− QMirServer* mirServer = createQMirServer(argc, argv);
214−
215− typedef int (*runWithClient_t)(QMirServer*, std::function<int(int, const char**, void*)>);
216− runWithClient_t runWithClient = (runWithClient_t) unityMir.resolve("runQMirServerWithClient");
217− if (!runWithClient) {
218− qDebug() << "unable to resolve symbol: runWithClient";
219− return 3;
220− }
221−
222− return runWithClient(mirServer, startShell);
223− } else {
224− if (qgetenv("UPSTART_JOB") == "unity8") {
225− // Emit SIGSTOP as expected by upstart, under Mir it's unity-mir that will raise it.
226− // see http://upstart.ubuntu.com/cookbook/#expect-stop
227− raise(SIGSTOP);
228− }
229− return startShell(argc, argv, nullptr);
230− }
231−}
tests/autopilot/unity8/shell/emulators/dash.py+12−6
@@ -18,6 +18,7 @@
1818#
1919
2020import logging
21+import ubuntuuitoolkit
2122
2223from unity8.shell import emulators
2324
@@ -40,7 +41,7 @@ class Dash(emulators.UnityEmulatorBase):
4041
4142 def get_applications_grid(self):
4243 get_grid = self.get_scope('clickscope').wait_select_single(
43− 'CardFilterGrid', objectName='local')
44+ 'CardGrid', objectName='local')
4445 return get_grid
4546
4647 def get_application_icon(self, text):
@@ -128,9 +129,9 @@ class Dash(emulators.UnityEmulatorBase):
128129 def enter_search_query(self, query):
129130 current_header = self._get_current_page_header()
130131 self.pointing_device.move(current_header.globalRect.x +
131− current_header.width - current_header.height / 2,
132+ current_header.width - current_header.height / 4,
132133 current_header.globalRect.y +
133− current_header.height / 2)
134+ current_header.height / 4)
134135 self.pointing_device.click()
135136 headerContainer = current_header.select_single(objectName="headerContainer")
136137 headerContainer.contentY.wait_for(0)
@@ -151,6 +152,10 @@ class Dash(emulators.UnityEmulatorBase):
151152 return None
152153
153154
155+class ListViewWithPageHeader(ubuntuuitoolkit.QQuickFlickable):
156+ pass
157+
158+
154159class GenericScopeView(emulators.UnityEmulatorBase):
155160 """Autopilot emulator for generic scopes."""
156161
@@ -194,16 +199,17 @@ class DashApps(GenericScopeView):
194199
195200 """
196201 category_element = self._get_category_element(category)
202+ see_all = category_element.select_single(objectName='seeAll')
197203 application_cards = category_element.select_many('AbstractButton')
198204
199− # sort by y, x
200205 application_cards = sorted(
201− application_cards,
206+ (card for card in application_cards
207+ if card.globalRect.y < see_all.globalRect.y),
202208 key=lambda card: (card.globalRect.y, card.globalRect.x))
203209
204210 result = []
205211 for card in application_cards:
206− if card.objectName != 'cardToolCard':
212+ if card.objectName not in ('cardToolCard', 'seeAll'):
207213 result.append(card.title)
208214 return result
209215
tests/autopilot/unity8/shell/tests/test_emulators.py+15−5
@@ -16,6 +16,7 @@
1616# You should have received a copy of the GNU General Public License
1717# along with this program. If not, see <http://www.gnu.org/licenses/>.
1818#
19+from unity8.shell.emulators.dash import ListViewWithPageHeader
1920
2021"""Tests for the Dash autopilot emulators.
2122
@@ -182,18 +183,27 @@ class DashAppsEmulatorTestCase(DashBaseTestCase):
182183
183184 def test_get_applications_should_return_correct_applications(self):
184185 category = '2'
186+ category_element = self.applications_scope._get_category_element(
187+ category)
188+ list_view = self.dash.get_scope('clickscope')\
189+ .select_single(ListViewWithPageHeader)
185190 expected_apps_count = self._get_number_of_application_slots(category)
186191 expected_applications = self.available_applications[
187192 :expected_apps_count]
193+ x_center = list_view.globalRect.x + list_view.width / 2
194+ y_center = list_view.globalRect.y + list_view.height / 2
195+ y_diff = category_element.y - list_view.height + category_element.height
196+ list_view._slow_drag(x_center, x_center,
197+ y_center, y_center - y_diff)
188198 applications = self.applications_scope.get_applications(category)
189199 self.assertEqual(expected_applications, applications)
190200
191201 def _get_number_of_application_slots(self, category):
192202 category_element = self.applications_scope._get_category_element(
193203 category)
194− grid = category_element.select_single('CardFilterGrid')
195− filtergrid = grid.select_single('FilterGrid')
196− if (grid.filtered):
197− return filtergrid.collapsedRowCount * filtergrid.columns
204+ cardgrid = category_element.select_single('CardGrid')
205+ if (category_element.expanded):
206+ return cardgrid.select_single('QQuickGridView').count
198207 else:
199− return filtergrid.uncollapsedRowCount * filtergrid.columns
208+ return cardgrid.collapsedRows \
209+ * cardgrid.select_single('ResponsiveGridView').columns
tests/autopilot/unity8/shell/tests/test_upstart.py+13
@@ -20,6 +20,7 @@
2020"""Tests for upstart integration."""
2121
2222import os
23+import stat
2324import signal
2425import subprocess
2526import time
@@ -57,6 +58,18 @@ class UpstartIntegrationTests(UnityTestCase):
5758
5859 def _launch_unity(self):
5960 self.patch_environment("QT_LOAD_TESTABILITY", "1")
61+
62+ try:
63+ host_socket = os.getenv("MIR_SOCKET", "/run/mir_socket")
64+ if stat.S_ISSOCK(os.stat(host_socket).st_mode):
65+ self.patch_environment("MIR_SERVER_HOST_SOCKET",
66+ host_socket)
67+ socket = os.path.join(os.getenv("XDG_RUNTIME_DIR", "/tmp"),
68+ "mir_socket")
69+ self.patch_environment("MIR_SERVER_FILE", socket)
70+ except OSError:
71+ pass
72+
6073 self.process = subprocess.Popen(
6174 [get_binary_path()] + self.unity_geometry_args)
6275
tests/mocks/AccountsService/AccountsService.cpp+12−2
@@ -29,12 +29,14 @@ AccountsService::AccountsService(QObject* parent)
2929
3030QString AccountsService::user() const
3131{
32− return "testuser";
32+ return m_user;
3333}
3434
3535void AccountsService::setUser(const QString &user)
3636{
37− Q_UNUSED(user)
37+ m_user = user;
38+ Q_EMIT userChanged();
39+ Q_EMIT passwordDisplayHintChanged();
3840}
3941
4042bool AccountsService::demoEdges() const
@@ -68,3 +70,11 @@ void AccountsService::setStatsWelcomeScreen(bool statsWelcomeScreen)
6870 m_statsWelcomeScreen = statsWelcomeScreen;
6971 statsWelcomeScreenChanged();
7072}
73+
74+AccountsService::PasswordDisplayHint AccountsService::passwordDisplayHint() const
75+{
76+ if (m_user == "has-pin")
77+ return PasswordDisplayHint::Numeric;
78+ else
79+ return PasswordDisplayHint::Keyboard;
80+}
tests/mocks/AccountsService/AccountsService.h+12
@@ -27,6 +27,7 @@
2727class AccountsService: public QObject
2828{
2929 Q_OBJECT
30+ Q_ENUMS(PasswordDisplayHint)
3031 Q_PROPERTY (QString user
3132 READ user
3233 WRITE setUser
@@ -43,8 +44,16 @@ class AccountsService: public QObject
4344 READ statsWelcomeScreen
4445 WRITE setStatsWelcomeScreen // only available in mock
4546 NOTIFY statsWelcomeScreenChanged)
47+ Q_PROPERTY (PasswordDisplayHint passwordDisplayHint
48+ READ passwordDisplayHint
49+ NOTIFY passwordDisplayHintChanged)
4650
4751public:
52+ enum PasswordDisplayHint {
53+ Keyboard,
54+ Numeric,
55+ };
56+
4857 explicit AccountsService(QObject *parent = 0);
4958
5059 QString user() const;
@@ -55,15 +64,18 @@ public:
5564 void setBackgroundFile(const QString &backgroundFile);
5665 bool statsWelcomeScreen() const;
5766 void setStatsWelcomeScreen(bool statsWelcomeScreen);
67+ PasswordDisplayHint passwordDisplayHint() const;
5868
5969Q_SIGNALS:
6070 void userChanged();
6171 void demoEdgesChanged();
6272 void backgroundFileChanged();
6373 void statsWelcomeScreenChanged();
74+ void passwordDisplayHintChanged();
6475
6576private:
6677 QString m_backgroundFile;
78+ QString m_user;
6779 bool m_statsWelcomeScreen;
6880};
6981
tests/mocks/AccountsService/CMakeLists.txt+4−1
@@ -5,4 +5,7 @@ add_library(MockAccountsService-qml MODULE
55
66qt5_use_modules(MockAccountsService-qml DBus Qml)
77
8−add_unity8_mock(AccountsService 0.1 AccountsService TARGETS MockAccountsService-qml)
8+add_unity8_mock(AccountsService 0.1 AccountsService
9+ PREFIX mocks
10+ TARGETS MockAccountsService-qml
11+ )
tests/mocks/AccountsService/plugin.cpp+1
@@ -32,5 +32,6 @@ static QObject *service_provider(QQmlEngine *engine, QJSEngine *scriptEngine)
3232void AccountsServicePlugin::registerTypes(const char *uri)
3333{
3434 Q_ASSERT(uri == QLatin1String("AccountsService"));
35+ qRegisterMetaType<AccountsService::PasswordDisplayHint>("AccountsService::PasswordDisplayHint");
3536 qmlRegisterSingletonType<AccountsService>(uri, 0, 1, "AccountsService", service_provider);
3637}
tests/mocks/LightDM/GreeterPrivate.h+2
@@ -24,6 +24,7 @@
2424namespace QLightDM
2525{
2626class Greeter;
27+class GreeterImpl;
2728
2829class GreeterPrivate
2930{
@@ -40,6 +41,7 @@ public:
4041 void handleRespond(const QString &response);
4142
4243protected:
44+ GreeterImpl *m_impl; // if the backend needs more private data
4345 Greeter * const q_ptr;
4446
4547private:
tests/mocks/LightDM/demo/CMakeLists.txt+4−2
@@ -11,11 +11,13 @@ set(LibLightDM_SOURCES
1111add_library(MockLightDM-demo STATIC ${LibLightDM_SOURCES})
1212
1313include_directories(
14+ ${CMAKE_CURRENT_BINARY_DIR}
1415 ${LIBUSERMETRICSOUTPUT_INCLUDE_DIRS}
1516)
1617
1718target_link_libraries(MockLightDM-demo
1819 ${LIBUSERMETRICSOUTPUT_LDFLAGS}
19− )
20+ -lpam
21+)
2022
21−qt5_use_modules(MockLightDM-demo Gui)
23+qt5_use_modules(MockLightDM-demo Concurrent Gui)
tests/mocks/LightDM/demo/GreeterPrivate.cpp+202−30
@@ -18,53 +18,225 @@
1818
1919#include "../Greeter.h"
2020#include "../GreeterPrivate.h"
21−#include <QtCore/QDir>
22−#include <QtCore/QSettings>
21+#include <QFuture>
22+#include <QFutureInterface>
23+#include <QFutureWatcher>
24+#include <QQueue>
25+#include <QtConcurrent>
26+#include <QVector>
27+#include <security/pam_appl.h>
2328
2429namespace QLightDM
2530{
2631
32+class GreeterImpl : public QObject
33+{
34+ Q_OBJECT
35+
36+ typedef QFutureInterface<QString> ResponseFuture;
37+
38+public:
39+ explicit GreeterImpl(Greeter *parent, GreeterPrivate *greeterPrivate)
40+ : QObject(parent),
41+ greeter(parent),
42+ greeterPrivate(greeterPrivate),
43+ pamHandle(NULL)
44+ {
45+ qRegisterMetaType<QLightDM::GreeterImpl::ResponseFuture>("QLightDM::GreeterImpl::ResponseFuture");
46+
47+ connect(&futureWatcher, SIGNAL(finished()),
48+ this, SLOT(finishPam()));
49+ connect(this, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)),
50+ greeter, SIGNAL(showMessage(QString, QLightDM::Greeter::MessageType)));
51+ // This next connect is how we pass ResponseFutures between threads
52+ connect(this, SIGNAL(showPrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
53+ this, SLOT(handlePrompt(QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
54+ }
55+
56+ void start(QString username)
57+ {
58+ // Clear out any existing PAM interactions first (we can't simply
59+ // cancel our QFuture because QtConcurrent::run doesn't support cancel)
60+ if (pamHandle != NULL) {
61+ pam_handle *handle = pamHandle;
62+ pamHandle = NULL; // to disable normal finishPam() handling
63+ while (respond(QString())); // clear our local queue of QFutures
64+ pam_end(handle, PAM_CONV_ERR);
65+ }
66+
67+ // Now actually start a new conversation with PAM
68+ pam_conv conversation;
69+ conversation.conv = converseWithPam;
70+ conversation.appdata_ptr = static_cast<void*>(this);
71+
72+ if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
73+ futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
74+ } else {
75+ greeterPrivate->authenticated = false;
76+ Q_EMIT greeter->showMessage("Internal error: could not start PAM authentication", QLightDM::Greeter::MessageTypeError);
77+ Q_EMIT greeter->authenticationComplete();
78+ }
79+ }
80+
81+ static int authenticateWithPam(pam_handle* pamHandle)
82+ {
83+ int pamStatus = pam_authenticate(pamHandle, 0);
84+ if (pamStatus == PAM_SUCCESS) {
85+ pamStatus = pam_acct_mgmt(pamHandle, 0);
86+ }
87+ if (pamStatus == PAM_NEW_AUTHTOK_REQD) {
88+ pamStatus = pam_chauthtok(pamHandle, PAM_CHANGE_EXPIRED_AUTHTOK);
89+ }
90+ if (pamStatus == PAM_SUCCESS) {
91+ pam_setcred(pamHandle, PAM_REINITIALIZE_CRED);
92+ }
93+ return pamStatus;
94+ }
95+
96+ static int converseWithPam(int num_msg, const pam_message** msg,
97+ pam_response** resp, void* appdata_ptr)
98+ {
99+ if (num_msg <= 0)
100+ return PAM_CONV_ERR;
101+
102+ auto* tmp_response = static_cast<pam_response*>(calloc(num_msg, sizeof(pam_response)));
103+ if (!tmp_response)
104+ return PAM_CONV_ERR;
105+
106+ GreeterImpl* impl = static_cast<GreeterImpl*>(appdata_ptr);
107+
108+ int count;
109+ QVector<ResponseFuture> responses;
110+
111+ for (count = 0; count < num_msg; ++count)
112+ {
113+ switch (msg[count]->msg_style)
114+ {
115+ case PAM_PROMPT_ECHO_ON:
116+ {
117+ QString message(msg[count]->msg);
118+ responses.append(ResponseFuture());
119+ responses.last().reportStarted();
120+ Q_EMIT impl->showPrompt(message, Greeter::PromptTypeQuestion, responses.last());
121+ break;
122+ }
123+ case PAM_PROMPT_ECHO_OFF:
124+ {
125+ QString message(msg[count]->msg);
126+ responses.append(ResponseFuture());
127+ responses.last().reportStarted();
128+ Q_EMIT impl->showPrompt(message, Greeter::PromptTypeSecret, responses.last());
129+ break;
130+ }
131+ case PAM_TEXT_INFO:
132+ {
133+ QString message(msg[count]->msg);
134+ Q_EMIT impl->showMessage(message, Greeter::MessageTypeInfo);
135+ break;
136+ }
137+ default:
138+ {
139+ QString message(msg[count]->msg);
140+ Q_EMIT impl->showMessage(message, Greeter::MessageTypeError);
141+ break;
142+ }
143+ }
144+ }
145+
146+ int i = 0;
147+ bool raise_error = false;
148+
149+ for (auto &response : responses)
150+ {
151+ pam_response* resp_item = &tmp_response[i++];
152+ resp_item->resp_retcode = 0;
153+ resp_item->resp = strdup(response.future().result().toUtf8());
154+
155+ if (!resp_item->resp)
156+ {
157+ raise_error = true;
158+ break;
159+ }
160+ }
161+
162+ if (raise_error)
163+ {
164+ for (int i = 0; i < count; ++i)
165+ free(tmp_response[i].resp);
166+
167+ free(tmp_response);
168+ return PAM_CONV_ERR;
169+ }
170+ else
171+ {
172+ *resp = tmp_response;
173+ return PAM_SUCCESS;
174+ }
175+ }
176+
177+public Q_SLOTS:
178+ bool respond(QString response)
179+ {
180+ if (!futures.isEmpty()) {
181+ futures.dequeue().reportFinished(&response);
182+ return true;
183+ } else {
184+ return false;
185+ }
186+ }
187+
188+Q_SIGNALS:
189+ void showMessage(QString text, QLightDM::Greeter::MessageType type);
190+ void showPrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture response);
191+
192+private Q_SLOTS:
193+ void finishPam()
194+ {
195+ if (pamHandle == NULL) {
196+ return;
197+ }
198+
199+ int pamStatus = futureWatcher.result();
200+
201+ pam_end(pamHandle, pamStatus);
202+ pamHandle = NULL;
203+
204+ greeterPrivate->authenticated = (pamStatus == PAM_SUCCESS);
205+ Q_EMIT greeter->authenticationComplete();
206+ }
207+
208+ void handlePrompt(QString text, QLightDM::Greeter::PromptType type, QLightDM::GreeterImpl::ResponseFuture future)
209+ {
210+ futures.enqueue(future);
211+ Q_EMIT greeter->showPrompt(text, type);
212+ }
213+
214+private:
215+ Greeter *greeter;
216+ GreeterPrivate *greeterPrivate;
217+ pam_handle* pamHandle;
218+ QFutureWatcher<int> futureWatcher;
219+ QQueue<ResponseFuture> futures;
220+};
221+
27222GreeterPrivate::GreeterPrivate(Greeter* parent)
28223 : authenticated(false),
29224 authenticationUser(),
225+ m_impl(new GreeterImpl(parent, this)),
30226 q_ptr(parent)
31227{
32228}
33229
34230void GreeterPrivate::handleAuthenticate()
35231{
36− Q_Q(Greeter);
37−
38− QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
39− settings.beginGroup(authenticationUser);
40− QVariant password = settings.value("password", "none");
41−
42− if (password == "pin") {
43− Q_EMIT q->showPrompt("PIN", Greeter::PromptTypeSecret);
44− } else if (password == "keyboard") {
45− Q_EMIT q->showPrompt("Password", Greeter::PromptTypeSecret);
46− } else {
47− authenticated = true;
48− Q_EMIT q->authenticationComplete();
49− }
232+ m_impl->start(authenticationUser);
50233}
51234
52235void GreeterPrivate::handleRespond(const QString &response)
53236{
54− Q_Q(Greeter);
55−
56− QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
57− settings.beginGroup(authenticationUser);
58− QVariant password = settings.value("password", "none");
59−
60− QString passwordValue;
61− if (password == "pin") {
62− passwordValue = settings.value("passwordValue", "1234").toString();
63− } else {
64− passwordValue = settings.value("passwordValue", "password").toString();
65− }
66− authenticated = (response == passwordValue);
67− Q_EMIT q->authenticationComplete();
237+ m_impl->respond(response);
68238}
69239
70240}
241+
242+#include "GreeterPrivate.moc"
tests/mocks/LightDM/demo/UsersModelPrivate.cpp+1−1
@@ -29,7 +29,7 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
2929 : q_ptr(parent)
3030{
3131 QSettings settings(QDir::homePath() + "/.unity8-greeter-demo", QSettings::NativeFormat);
32− QStringList users = settings.value("users", QStringList() << "phablet").toStringList();
32+ QStringList users = settings.value("users", QStringList() << qgetenv("USER")).toStringList();
3333
3434 Q_FOREACH(const QString &user, users)
3535 {
tests/mocks/LightDM/full/GreeterPrivate.cpp+1−1
@@ -54,7 +54,7 @@ void GreeterPrivate::handleAuthenticate()
5454 authenticated = true;
5555 Q_EMIT q->authenticationComplete();
5656 } else if (authenticationUser == "has-pin"){
57− Q_EMIT q->showPrompt("PIN", Greeter::PromptTypeSecret);
57+ Q_EMIT q->showPrompt("Password:", Greeter::PromptTypeSecret);
5858 } else if (authenticationUser == "auth-error") {
5959 authenticated = false;
6060 Q_EMIT q->authenticationComplete();
tests/mocks/LightDM/single-pin/GreeterPrivate.cpp+1−1
@@ -32,7 +32,7 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
3232void GreeterPrivate::handleAuthenticate()
3333{
3434 Q_Q(Greeter);
35− Q_EMIT q->showPrompt("PIN", Greeter::PromptTypeSecret);
35+ Q_EMIT q->showPrompt("Password:", Greeter::PromptTypeSecret);
3636}
3737
3838void GreeterPrivate::handleRespond(const QString &response)
tests/mocks/LightDM/single-pin/UsersModelPrivate.cpp+1−1
@@ -26,7 +26,7 @@ UsersModelPrivate::UsersModelPrivate(UsersModel* parent)
2626{
2727 entries =
2828 {
29− { "single", "Has PIN", 0, 0, false, false, 0, 0 },
29+ { "has-pin", "Has PIN", 0, 0, false, false, 0, 0 },
3030 };
3131}
3232
tests/mocks/Ubuntu/Telephony/CMakeLists.txt+1−9
@@ -11,12 +11,4 @@ add_library(FakeUbuntuTelephonyQml MODULE ${FakeUbuntuTelephonyQml_SOURCES})
1111
1212qt5_use_modules(FakeUbuntuTelephonyQml Core Quick)
1313
14−# copy files into build directory for shadow builds
15−add_custom_target(UbuntuTelephonyQmlDirFile ALL
16− COMMAND cp "${CMAKE_CURRENT_SOURCE_DIR}/qmldir" ${CMAKE_CURRENT_BINARY_DIR}
17− DEPENDS qmldir
18−)
19−
20−install(TARGETS FakeUbuntuTelephonyQml
21− DESTINATION ${SHELL_INSTALL_QML}/mocks/Ubuntu/Telephony
22− )
14+add_unity8_mock(Ubuntu.Telephony 0.1 Ubuntu/Telephony TARGETS FakeUbuntuTelephonyQml)
tests/mocks/Unity/Application/Application.qmltypes−2
@@ -102,8 +102,6 @@ Module {
102102 "ForceMainStage": 1
103103 }
104104 }
105− Property { name: "keyboardHeight"; type: "int"; isReadonly: true }
106− Property { name: "keyboardVisible"; type: "bool"; isReadonly: true }
107105 Property { name: "sideStageWidth"; type: "int"; isReadonly: true }
108106 Property { name: "stageHint"; type: "StageHint"; isReadonly: true }
109107 Property { name: "formFactorHint"; type: "FormFactorHint"; isReadonly: true }
tests/mocks/Unity/Application/ApplicationDBusAdaptor.cppnew file+75
@@ -0,0 +1,75 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "ApplicationInfo.h"
18+#include "ApplicationDBusAdaptor.h"
19+#include "ApplicationManager.h"
20+#include "SurfaceManager.h"
21+#include "MirSurfaceItem.h"
22+
23+quint32 nextId = 0;
24+
25+ApplicationDBusAdaptor::ApplicationDBusAdaptor(ApplicationManager* applicationManager)
26+ : QDBusAbstractAdaptor(applicationManager)
27+ , m_applicationManager(applicationManager)
28+{
29+}
30+
31+MirSurfaceItem* topSurface(MirSurfaceItem* surface)
32+{
33+ if (!surface)
34+ return nullptr;
35+
36+ MirSurfaceItem* child = NULL;
37+ Q_FOREACH (MirSurfaceItem *childSurface, surface->childSurfaceList()) {
38+ child = topSurface(childSurface);
39+ if (child) {
40+ break;
41+ }
42+ }
43+ return child ? child : surface;
44+}
45+
46+quint32 ApplicationDBusAdaptor::addChildSurface(const QString &appId, const QString &surfaceImage)
47+{
48+ qDebug() << "ApplicationDBusAdaptor::addChildSurface - " << appId;
49+
50+ ApplicationInfo* application = m_applicationManager->findApplication(appId);
51+ if (!application) {
52+ qDebug() << "ApplicationDBusAdaptor::addChildSurface - No application found for " << appId;
53+ return 0;
54+ }
55+ quint32 surfaceId = ++nextId;
56+ MirSurfaceItem* surface = new MirSurfaceItem(QString("ChildSurface%1").arg(surfaceId),
57+ MirSurfaceItem::Normal,
58+ MirSurfaceItem::Maximized,
59+ QUrl(surfaceImage));
60+ m_childItems[surfaceId] = surface;
61+ surface->setParentSurface(topSurface(application->surface()));
62+ return surfaceId;
63+}
64+
65+void ApplicationDBusAdaptor::removeChildSurface(int surfaceId)
66+{
67+ qDebug() << "ApplicationDBusAdaptor::removeChildSurface - " << surfaceId;
68+
69+ if (!m_childItems.contains(surfaceId)) {
70+ qDebug() << "ApplicationDBusAdaptor::removeChildSurface - No added surface for " << surfaceId;
71+ return;
72+ }
73+ MirSurfaceItem* surface = m_childItems.take(surfaceId);
74+ Q_EMIT surface->removed();
75+}
tests/mocks/Unity/Application/ApplicationDBusAdaptor.hnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef APPLICATIONDBUSADAPTOR_H
18+#define APPLICATIONDBUSADAPTOR_H
19+
20+#include <QtDBus/QtDBus>
21+
22+class ApplicationManager;
23+class SurfaceManager;
24+class MirSurfaceItem;
25+
26+class ApplicationDBusAdaptor : public QDBusAbstractAdaptor
27+{
28+ Q_OBJECT
29+ Q_CLASSINFO("D-Bus Interface", "com.canonical.Unity8.Mocks.Application")
30+public:
31+ ApplicationDBusAdaptor(ApplicationManager* applicationManager);
32+
33+public Q_SLOTS:
34+ quint32 addChildSurface(const QString& appId, const QString& surfaceImage);
35+ void removeChildSurface(int surfaceId);
36+
37+private:
38+ ApplicationManager* m_applicationManager;
39+
40+ QHash<quint32, MirSurfaceItem*> m_childItems;
41+};
42+
43+#endif // APPLICATIONDBUSADAPTOR_H
tests/mocks/Unity/Application/ApplicationInfo.cpp+69−21
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,6 +15,8 @@
1515 */
1616
1717#include "ApplicationInfo.h"
18+#include "MirSurfaceItem.h"
19+#include "SurfaceManager.h"
1820
1921#include <QGuiApplication>
2022#include <QQuickItem>
@@ -24,29 +26,39 @@
2426
2527ApplicationInfo::ApplicationInfo(const QString &appId, QObject *parent)
2628 : ApplicationInfoInterface(appId, parent)
27− ,m_appId(appId)
28− ,m_stage(MainStage)
29− ,m_state(Starting)
30− ,m_focused(false)
31− ,m_fullscreen(false)
32− ,m_windowItem(0)
33− ,m_windowComponent(0)
34− ,m_parentItem(0)
29+ , m_appId(appId)
30+ , m_stage(MainStage)
31+ , m_state(Starting)
32+ , m_focused(false)
33+ , m_fullscreen(false)
34+ , m_windowItem(0)
35+ , m_windowComponent(0)
36+ , m_parentItem(0)
37+ , m_surface(0)
3538{
36− QTimer::singleShot(300, this, SLOT(setRunning()));
39+ connect(this, &ApplicationInfo::stateChanged, this, &ApplicationInfo::onStateChanged);
3740}
3841
3942ApplicationInfo::ApplicationInfo(QObject *parent)
4043 : ApplicationInfoInterface(QString(), parent)
41− ,m_stage(MainStage)
42− ,m_state(Starting)
43− ,m_focused(false)
44− ,m_fullscreen(false)
45− ,m_windowItem(0)
46− ,m_windowComponent(0)
47− ,m_parentItem(0)
44+ , m_stage(MainStage)
45+ , m_state(Starting)
46+ , m_focused(false)
47+ , m_fullscreen(false)
48+ , m_windowItem(0)
49+ , m_windowComponent(0)
50+ , m_parentItem(0)
51+ , m_surface(0)
4852{
49− QTimer::singleShot(300, this, SLOT(setRunning()));
53+ connect(this, &ApplicationInfo::stateChanged, this, &ApplicationInfo::onStateChanged);
54+}
55+
56+ApplicationInfo::~ApplicationInfo()
57+{
58+ if (m_surface) {
59+ Q_EMIT SurfaceManager::singleton()->surfaceDestroyed(m_surface);
60+ m_surface->deleteLater();
61+ }
5062}
5163
5264void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status status)
@@ -55,10 +67,46 @@ void ApplicationInfo::onWindowComponentStatusChanged(QQmlComponent::Status statu
5567 doCreateWindowItem();
5668}
5769
58−void ApplicationInfo::setRunning()
70+void ApplicationInfo::onStateChanged(State state)
71+{
72+ if (state == ApplicationInfo::Running) {
73+ QTimer::singleShot(1000, this, SLOT(createSurface()));
74+ } else if (state == ApplicationInfo::Stopped) {
75+ setSurface(nullptr);
76+ }
77+}
78+
79+void ApplicationInfo::createSurface()
5980{
60− m_state = Running;
61− Q_EMIT stateChanged();
81+ if (m_surface || state() == ApplicationInfo::Stopped) return;
82+
83+ setSurface(new MirSurfaceItem(name(),
84+ MirSurfaceItem::Normal,
85+ fullscreen() ? MirSurfaceItem::Fullscreen : MirSurfaceItem::Maximized,
86+ screenshot()));
87+}
88+
89+void ApplicationInfo::setSurface(MirSurfaceItem* surface)
90+{
91+ if (m_surface == surface)
92+ return;
93+
94+ if (m_surface) {
95+ m_surface->setApplication(nullptr);
96+ m_surface->setParent(nullptr);
97+ SurfaceManager::singleton()->unregisterSurface(m_surface);
98+ }
99+
100+ m_surface = surface;
101+
102+ if (m_surface) {
103+ m_surface->setApplication(this);
104+ m_surface->setParent(this);
105+ SurfaceManager::singleton()->registerSurface(m_surface);
106+ }
107+
108+ Q_EMIT surfaceChanged(m_surface);
109+ SurfaceManager::singleton()->registerSurface(m_surface);
62110}
63111
64112void ApplicationInfo::createWindowComponent()
tests/mocks/Unity/Application/ApplicationInfo.h+21−8
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -21,6 +21,7 @@
2121#include <QQmlComponent>
2222
2323class QQuickItem;
24+class MirSurfaceItem;
2425
2526// unity-api
2627#include <unity/shell/application/ApplicationInfoInterface.h>
@@ -36,6 +37,7 @@ class ApplicationInfo : public ApplicationInfoInterface {
3637
3738 Q_PROPERTY(bool fullscreen READ fullscreen WRITE setFullscreen NOTIFY fullscreenChanged)
3839 Q_PROPERTY(Stage stage READ stage WRITE setStage NOTIFY stageChanged)
40+ Q_PROPERTY(MirSurfaceItem* surface READ surface NOTIFY surfaceChanged)
3941
4042 // Only exists in this fake implementation
4143
@@ -45,9 +47,10 @@ class ApplicationInfo : public ApplicationInfoInterface {
4547 // QML component used to represent the application window
4648 Q_PROPERTY(QString windowQml READ windowQml WRITE setWindowQml NOTIFY windowQmlChanged)
4749
48− public:
50+public:
4951 ApplicationInfo(QObject *parent = NULL);
5052 ApplicationInfo(const QString &appId, QObject *parent = NULL);
53+ ~ApplicationInfo();
5154
5255 #define IMPLEMENT_PROPERTY(name, Name, type) \
5356 public: \
@@ -56,11 +59,11 @@ class ApplicationInfo : public ApplicationInfoInterface {
5659 { \
5760 if (m_##name != value) { \
5861 m_##name = value; \
59− Q_EMIT name##Changed(); \
62+ Q_EMIT name##Changed(value); \
6063 } \
6164 } \
6265 Q_SIGNALS: \
63− void name##Changed(); \
66+ void name##Changed(const type&); \
6467 private: \
6568 type m_##name;
6669
@@ -78,21 +81,31 @@ class ApplicationInfo : public ApplicationInfoInterface {
7881
7982 #undef IMPLEMENT_PROPERTY
8083
81− public:
84+public:
85+ void setSurface(MirSurfaceItem* surface);
86+ MirSurfaceItem* surface() const { return m_surface; }
87+
88+Q_SIGNALS:
89+ void surfaceChanged(MirSurfaceItem*);
90+
91+public:
8292 void showWindow(QQuickItem *parent);
8393 void hideWindow();
8494
85− private Q_SLOTS:
95+private Q_SLOTS:
8696 void onWindowComponentStatusChanged(QQmlComponent::Status status);
87− void setRunning();
97+ void onStateChanged(State state);
98+
99+ void createSurface();
88100
89− private:
101+private:
90102 void createWindowItem();
91103 void doCreateWindowItem();
92104 void createWindowComponent();
93105 QQuickItem *m_windowItem;
94106 QQmlComponent *m_windowComponent;
95107 QQuickItem *m_parentItem;
108+ MirSurfaceItem* m_surface;
96109};
97110
98111Q_DECLARE_METATYPE(ApplicationInfo*)
tests/mocks/Unity/Application/ApplicationManager.cpp+60−31
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -15,7 +15,9 @@
1515 */
1616
1717#include "ApplicationManager.h"
18+#include "ApplicationDBusAdaptor.h"
1819#include "ApplicationInfo.h"
20+#include "MirSurfaceItem.h"
1921
2022#include <paths.h>
2123
@@ -26,6 +28,22 @@
2628#include <QQmlComponent>
2729#include <QTimer>
2830#include <QDateTime>
31+#include <QtDBus/QtDBus>
32+
33+ApplicationManager *ApplicationManager::the_application_manager = nullptr;
34+
35+ApplicationManager *ApplicationManager::singleton()
36+{
37+ if (!the_application_manager) {
38+ the_application_manager = new ApplicationManager();
39+ new ApplicationDBusAdaptor(the_application_manager);
40+
41+ QDBusConnection connection = QDBusConnection::sessionBus();
42+ connection.registerService("com.canonical.Unity8");
43+ connection.registerObject("/com/canonical/Unity8/Mocks", the_application_manager);
44+ }
45+ return the_application_manager;
46+}
2947
3048ApplicationManager::ApplicationManager(QObject *parent)
3149 : ApplicationManagerInterface(parent)
@@ -36,6 +54,9 @@ ApplicationManager::ApplicationManager(QObject *parent)
3654 , m_sideStage(0)
3755 , m_rightMargin(0)
3856{
57+ m_roleNames.insert(RoleSurface, "surface");
58+ m_roleNames.insert(RoleFullscreen, "fullscreen");
59+
3960 buildListOfAvailableApplications();
4061}
4162
@@ -69,6 +90,10 @@ QVariant ApplicationManager::data(const QModelIndex& index, int role) const {
6990 return app->focused();
7091 case RoleScreenshot:
7192 return app->screenshot();
93+ case RoleSurface:
94+ return QVariant::fromValue(app->surface());
95+ case RoleFullscreen:
96+ return app->fullscreen();
7297 default:
7398 return QVariant();
7499 }
@@ -89,6 +114,17 @@ ApplicationInfo *ApplicationManager::findApplication(const QString &appId) const
89114 return nullptr;
90115}
91116
117+QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
118+{
119+ for (int i = 0; i < m_runningApplications.size(); ++i) {
120+ if (m_runningApplications.at(i) == application) {
121+ return index(i);
122+ }
123+ }
124+
125+ return QModelIndex();
126+}
127+
92128void ApplicationManager::add(ApplicationInfo *application) {
93129 if (!application) {
94130 return;
@@ -99,7 +135,14 @@ void ApplicationManager::add(ApplicationInfo *application) {
99135 endInsertRows();
100136 Q_EMIT applicationAdded(application->appId());
101137 Q_EMIT countChanged();
138+ if (count() == 1) Q_EMIT emptyChanged(isEmpty()); // was empty but not anymore
102139 Q_EMIT focusRequested(application->appId());
140+
141+ connect(application, &ApplicationInfo::surfaceChanged, this, [application, this]() {
142+ QModelIndex appIndex = findIndex(application);
143+ if (!appIndex.isValid()) return;
144+ Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << ApplicationManager::RoleSurface);
145+ });
103146}
104147
105148void ApplicationManager::remove(ApplicationInfo *application) {
@@ -110,7 +153,9 @@ void ApplicationManager::remove(ApplicationInfo *application) {
110153 endRemoveRows();
111154 Q_EMIT applicationRemoved(application->appId());
112155 Q_EMIT countChanged();
156+ if (isEmpty()) Q_EMIT emptyChanged(isEmpty());
113157 }
158+ disconnect(application, &ApplicationInfo::surfaceChanged, this, 0);
114159}
115160
116161void ApplicationManager::move(int from, int to) {
@@ -127,16 +172,6 @@ void ApplicationManager::move(int from, int to) {
127172 }
128173}
129174
130−int ApplicationManager::keyboardHeight() const
131−{
132− return 0;
133−}
134−
135−bool ApplicationManager::keyboardVisible() const
136−{
137− return false;
138−}
139−
140175int ApplicationManager::sideStageWidth() const
141176{
142177 return 0;
@@ -180,8 +215,7 @@ ApplicationInfo* ApplicationManager::startApplication(const QString &appId,
180215 application->setStage(ApplicationInfo::MainStage);
181216 }
182217 add(application);
183−
184− QMetaObject::invokeMethod(this, "focusApplication", Qt::QueuedConnection, Q_ARG(QString, appId));
218+ application->setState(ApplicationInfo::Running);
185219
186220 return application;
187221}
@@ -195,6 +229,7 @@ bool ApplicationManager::stopApplication(const QString &appId)
195229 if (application->appId() == focusedApplicationId()) {
196230 unfocusCurrentApplication();
197231 }
232+ application->setState(ApplicationInfo::Stopped);
198233 remove(application);
199234 return true;
200235}
@@ -215,7 +250,6 @@ bool ApplicationManager::updateScreenshot(const QString &appId)
215250 return false;
216251 }
217252
218− application->setScreenshot(QString("image://application/%1/%2").arg(appId).arg(QDateTime::currentMSecsSinceEpoch()));
219253 QModelIndex appIndex = index(idx);
220254 Q_EMIT dataChanged(appIndex, appIndex, QVector<int>() << RoleScreenshot);
221255 return true;
@@ -261,6 +295,7 @@ bool ApplicationManager::focusApplication(const QString &appId)
261295 if (app->focused() && app->stage() == ApplicationInfo::MainStage) {
262296 app->setFocused(false);
263297 app->hideWindow();
298+ app->setState(ApplicationInfo::Suspended);
264299 }
265300 }
266301
@@ -268,6 +303,7 @@ bool ApplicationManager::focusApplication(const QString &appId)
268303 application->setFocused(true);
269304 if (!m_mainStage)
270305 createMainStage();
306+ application->setState(ApplicationInfo::Running);
271307 application->showWindow(m_mainStage);
272308 m_mainStage->setZ(-1000);
273309 if (m_sideStage)
@@ -278,6 +314,7 @@ bool ApplicationManager::focusApplication(const QString &appId)
278314 if (app->focused() && app->stage() == ApplicationInfo::SideStage) {
279315 app->setFocused(false);
280316 app->hideWindow();
317+ app->setState(ApplicationInfo::Suspended);
281318 }
282319 }
283320
@@ -285,6 +322,7 @@ bool ApplicationManager::focusApplication(const QString &appId)
285322 application->setFocused(true);
286323 if (!m_sideStage)
287324 createSideStage();
325+ application->setState(ApplicationInfo::Running);
288326 application->showWindow(m_sideStage);
289327 m_sideStage->setZ(-1000);
290328 if (m_mainStage)
@@ -354,6 +392,9 @@ void ApplicationManager::generateQmlStrings(ApplicationInfo *application)
354392 "}").arg(qmlDirectory())
355393 .arg(application->icon().toString());
356394 application->setImageQml(imageQml);
395+
396+ application->setScreenshot(QString("file://%1/Dash/graphics/phone/screenshots/%2@12.png").arg(qmlDirectory())
397+ .arg(application->icon().toString()));
357398}
358399
359400void ApplicationManager::buildListOfAvailableApplications()
@@ -365,7 +406,6 @@ void ApplicationManager::buildListOfAvailableApplications()
365406 application->setName("Dialer");
366407 application->setIcon(QUrl("dialer"));
367408 application->setStage(ApplicationInfo::SideStage);
368− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
369409 generateQmlStrings(application);
370410 m_availableApplications.append(application);
371411
@@ -374,7 +414,6 @@ void ApplicationManager::buildListOfAvailableApplications()
374414 application->setName("Camera");
375415 application->setIcon(QUrl("camera"));
376416 application->setFullscreen(true);
377− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
378417 generateQmlStrings(application);
379418 m_availableApplications.append(application);
380419
@@ -382,7 +421,6 @@ void ApplicationManager::buildListOfAvailableApplications()
382421 application->setAppId("gallery-app");
383422 application->setName("Gallery");
384423 application->setIcon(QUrl("gallery"));
385− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
386424 generateQmlStrings(application);
387425 m_availableApplications.append(application);
388426
@@ -391,7 +429,6 @@ void ApplicationManager::buildListOfAvailableApplications()
391429 application->setName("Facebook");
392430 application->setIcon(QUrl("facebook"));
393431 application->setStage(ApplicationInfo::SideStage);
394− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
395432 generateQmlStrings(application);
396433 m_availableApplications.append(application);
397434
@@ -400,7 +437,6 @@ void ApplicationManager::buildListOfAvailableApplications()
400437 application->setFullscreen(true);
401438 application->setName("Browser");
402439 application->setIcon(QUrl("browser"));
403− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
404440 generateQmlStrings(application);
405441 m_availableApplications.append(application);
406442
@@ -409,7 +445,6 @@ void ApplicationManager::buildListOfAvailableApplications()
409445 application->setName("Twitter");
410446 application->setIcon(QUrl("twitter"));
411447 application->setStage(ApplicationInfo::SideStage);
412− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
413448 generateQmlStrings(application);
414449 m_availableApplications.append(application);
415450
@@ -417,7 +452,6 @@ void ApplicationManager::buildListOfAvailableApplications()
417452 application->setAppId("gmail-webapp");
418453 application->setName("GMail");
419454 application->setIcon(QUrl("gmail"));
420− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
421455 m_availableApplications.append(application);
422456
423457 application = new ApplicationInfo(this);
@@ -425,7 +459,6 @@ void ApplicationManager::buildListOfAvailableApplications()
425459 application->setName("Weather");
426460 application->setIcon(QUrl("weather"));
427461 application->setStage(ApplicationInfo::SideStage);
428− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
429462 generateQmlStrings(application);
430463 m_availableApplications.append(application);
431464
@@ -434,7 +467,6 @@ void ApplicationManager::buildListOfAvailableApplications()
434467 application->setName("Notepad");
435468 application->setIcon(QUrl("notepad"));
436469 application->setStage(ApplicationInfo::SideStage);
437− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
438470 m_availableApplications.append(application);
439471
440472 application = new ApplicationInfo(this);
@@ -442,7 +474,6 @@ void ApplicationManager::buildListOfAvailableApplications()
442474 application->setName("Calendar");
443475 application->setIcon(QUrl("calendar"));
444476 application->setStage(ApplicationInfo::SideStage);
445− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
446477 m_availableApplications.append(application);
447478
448479 application = new ApplicationInfo(this);
@@ -450,21 +481,18 @@ void ApplicationManager::buildListOfAvailableApplications()
450481 application->setName("Media Player");
451482 application->setIcon(QUrl("mediaplayer-app"));
452483 application->setFullscreen(true);
453− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
454484 m_availableApplications.append(application);
455485
456486 application = new ApplicationInfo(this);
457487 application->setAppId("evernote");
458488 application->setName("Evernote");
459489 application->setIcon(QUrl("evernote"));
460− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
461490 m_availableApplications.append(application);
462491
463492 application = new ApplicationInfo(this);
464493 application->setAppId("map");
465494 application->setName("Map");
466495 application->setIcon(QUrl("map"));
467− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
468496 generateQmlStrings(application);
469497 m_availableApplications.append(application);
470498
@@ -472,28 +500,24 @@ void ApplicationManager::buildListOfAvailableApplications()
472500 application->setAppId("pinterest");
473501 application->setName("Pinterest");
474502 application->setIcon(QUrl("pinterest"));
475− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
476503 m_availableApplications.append(application);
477504
478505 application = new ApplicationInfo(this);
479506 application->setAppId("soundcloud");
480507 application->setName("SoundCloud");
481508 application->setIcon(QUrl("soundcloud"));
482− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
483509 m_availableApplications.append(application);
484510
485511 application = new ApplicationInfo(this);
486512 application->setAppId("wikipedia");
487513 application->setName("Wikipedia");
488514 application->setIcon(QUrl("wikipedia"));
489− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
490515 m_availableApplications.append(application);
491516
492517 application = new ApplicationInfo(this);
493518 application->setAppId("youtube");
494519 application->setName("YouTube");
495520 application->setIcon(QUrl("youtube"));
496− application->setScreenshot(QString("image://application/%1/%2").arg(application->appId()).arg(QDateTime::currentMSecsSinceEpoch()));
497521 m_availableApplications.append(application);
498522}
499523
@@ -590,3 +614,8 @@ void ApplicationManager::setRightMargin(int rightMargin)
590614 generateQmlStrings(app);
591615 }
592616}
617+
618+bool ApplicationManager::isEmpty() const
619+{
620+ return m_runningApplications.isEmpty();
621+}
tests/mocks/Unity/Application/ApplicationManager.h+15−9
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -36,8 +36,7 @@ class ApplicationManager : public ApplicationManagerInterface {
3636 Q_ENUMS(FavoriteApplication)
3737 Q_FLAGS(ExecFlags)
3838
39− Q_PROPERTY(int keyboardHeight READ keyboardHeight NOTIFY keyboardHeightChanged)
40− Q_PROPERTY(bool keyboardVisible READ keyboardVisible NOTIFY keyboardVisibleChanged)
39+ Q_PROPERTY(bool empty READ isEmpty NOTIFY emptyChanged)
4140
4241 Q_PROPERTY(int sideStageWidth READ sideStageWidth)
4342 Q_PROPERTY(StageHint stageHint READ stageHint)
@@ -53,6 +52,12 @@ class ApplicationManager : public ApplicationManagerInterface {
5352 ApplicationManager(QObject *parent = NULL);
5453 virtual ~ApplicationManager();
5554
55+ static ApplicationManager *singleton();
56+
57+ enum MoreRoles {
58+ RoleSurface = RoleScreenshot+1,
59+ RoleFullscreen,
60+ };
5661 enum Role {
5762 Dash, Default, Indicators, Notifications, Greeter, Launcher, OnScreenKeyboard,
5863 ShutdownDialog
@@ -74,8 +79,6 @@ class ApplicationManager : public ApplicationManagerInterface {
7479 };
7580 Q_DECLARE_FLAGS(ExecFlags, Flag)
7681
77− int keyboardHeight() const;
78− bool keyboardVisible() const;
7982 int sideStageWidth() const;
8083 StageHint stageHint() const;
8184 FormFactorHint formFactorHint() const;
@@ -108,11 +111,14 @@ class ApplicationManager : public ApplicationManagerInterface {
108111 int rightMargin() const;
109112 void setRightMargin(int rightMargin);
110113
114+ QModelIndex findIndex(ApplicationInfo* application);
115+
116+ bool isEmpty() const;
117+
111118 Q_SIGNALS:
112− void keyboardHeightChanged();
113− void keyboardVisibleChanged();
114119 void focusRequested(FavoriteApplication favoriteApplication);
115120 void focusRequested(const QString &appId);
121+ void emptyChanged(bool empty);
116122
117123 private:
118124 void add(ApplicationInfo *application);
@@ -124,8 +130,6 @@ class ApplicationManager : public ApplicationManagerInterface {
124130 void createMainStage();
125131 void createSideStageComponent();
126132 void createSideStage();
127− int m_keyboardHeight;
128− bool m_keyboardVisible;
129133 bool m_suspended;
130134 QList<ApplicationInfo*> m_runningApplications;
131135 QList<ApplicationInfo*> m_availableApplications;
@@ -135,6 +139,8 @@ class ApplicationManager : public ApplicationManagerInterface {
135139 QQuickItem *m_sideStage;
136140
137141 int m_rightMargin;
142+
143+ static ApplicationManager *the_application_manager;
138144};
139145
140146Q_DECLARE_OPERATORS_FOR_FLAGS(ApplicationManager::ExecFlags)
tests/mocks/Unity/Application/CMakeLists.txt+6−2
@@ -2,10 +2,14 @@ pkg_check_modules(APPLICATION_API REQUIRED unity-shell-application)
22
33set(FakeUnityApplicationQml_SOURCES
44 plugin.cpp
5+ ApplicationDBusAdaptor.cpp
56 ApplicationInfo.cpp
67 ApplicationImage.cpp
78 ApplicationManager.cpp
89 ApplicationScreenshotProvider.cpp
10+ MirSurfaceItem.cpp
11+ SurfaceManager.cpp
12+ VirtualKeyboard.cpp
913 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationInfoInterface.h
1014 ${APPLICATION_API_INCLUDEDIR}/unity/shell/application/ApplicationManagerInterface.h
1115)
@@ -15,8 +19,8 @@ add_library(FakeUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
1519add_library(NonMirUnityApplicationQml MODULE ${FakeUnityApplicationQml_SOURCES})
1620set_target_properties(NonMirUnityApplicationQml PROPERTIES OUTPUT_NAME FakeUnityApplicationQml)
1721
18−qt5_use_modules(FakeUnityApplicationQml Core Quick)
19−qt5_use_modules(NonMirUnityApplicationQml Core Quick)
22+qt5_use_modules(FakeUnityApplicationQml Core Quick DBus)
23+qt5_use_modules(NonMirUnityApplicationQml Core Quick DBus)
2024
2125add_unity8_mock(Unity.Application 0.1 Unity/Application PREFIX mocks TARGETS FakeUnityApplicationQml)
2226add_unity8_mock(Unity.Application 0.1 Unity/Application
tests/mocks/Unity/Application/MirSurfaceItem.cppnew file+172
@@ -0,0 +1,172 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "MirSurfaceItem.h"
18+#include "ApplicationInfo.h"
19+
20+#include <QPainter>
21+#include <QQmlEngine>
22+
23+MirSurfaceItem::MirSurfaceItem(const QString& name,
24+ MirSurfaceItem::Type type,
25+ MirSurfaceItem::State state,
26+ const QUrl& screenshot,
27+ QQuickItem *parent)
28+ : QQuickPaintedItem(parent)
29+ , m_application(nullptr)
30+ , m_name(name)
31+ , m_type(type)
32+ , m_state(state)
33+ , m_img(screenshot.isLocalFile() ? screenshot.toLocalFile() : screenshot.toString())
34+ , m_parentSurface(nullptr)
35+ , m_haveInputMethod(false)
36+{
37+ QQmlEngine::setObjectOwnership(this, QQmlEngine::CppOwnership);
38+
39+ // The virtual keyboard (input method) has a big transparent area so that
40+ // content behind it show through
41+ setFillColor(Qt::transparent);
42+
43+ connect(this, &QQuickItem::focusChanged,
44+ this, &MirSurfaceItem::onFocusChanged);
45+}
46+
47+MirSurfaceItem::~MirSurfaceItem()
48+{
49+ QList<MirSurfaceItem*> children(m_children);
50+ for (MirSurfaceItem* child : children) {
51+ child->setParentSurface(nullptr);
52+ }
53+ if (m_parentSurface)
54+ m_parentSurface->removeChildSurface(this);
55+
56+ if (m_application)
57+ m_application->setSurface(nullptr);
58+}
59+
60+void MirSurfaceItem::paint(QPainter * painter)
61+{
62+ if (!m_img.isNull()) {
63+ painter->drawImage(contentsBoundingRect(), m_img, QRect(QPoint(0,0), m_img.size()));
64+ }
65+}
66+
67+void MirSurfaceItem::release()
68+{
69+ QList<MirSurfaceItem*> children(m_children);
70+ for (MirSurfaceItem* child : children) {
71+ child->release();
72+ }
73+ if (m_parentSurface) {
74+ m_parentSurface->removeChildSurface(this);
75+ }
76+
77+ if (m_application) {
78+ m_application->setSurface(nullptr);
79+ }
80+ if (!parent()) {
81+ deleteLater();
82+ }
83+}
84+
85+void MirSurfaceItem::setApplication(ApplicationInfo* application)
86+{
87+ m_application = application;
88+}
89+
90+void MirSurfaceItem::setParentSurface(MirSurfaceItem* surface)
91+{
92+ if (m_parentSurface == surface || surface == this)
93+ return;
94+
95+ if (m_parentSurface) {
96+ m_parentSurface->removeChildSurface(this);
97+ }
98+
99+ m_parentSurface = surface;
100+
101+ if (m_parentSurface) {
102+ m_parentSurface->addChildSurface(this);
103+ }
104+ Q_EMIT parentSurfaceChanged(surface);
105+}
106+
107+void MirSurfaceItem::removeChildSurface(MirSurfaceItem* surface)
108+{
109+ if (m_children.contains(surface)) {
110+ m_children.removeOne(surface);
111+ Q_EMIT childSurfacesChanged();
112+ }
113+}
114+
115+void MirSurfaceItem::addChildSurface(MirSurfaceItem* surface)
116+{
117+ m_children.append(surface);
118+ Q_EMIT childSurfacesChanged();
119+}
120+
121+QList<MirSurfaceItem*> MirSurfaceItem::childSurfaceList()
122+{
123+ return m_children;
124+}
125+
126+QQmlListProperty<MirSurfaceItem> MirSurfaceItem::childSurfaces()
127+{
128+ return QQmlListProperty<MirSurfaceItem>(this,
129+ 0,
130+ MirSurfaceItem::childSurfaceCount,
131+ MirSurfaceItem::childSurfaceAt);
132+}
133+
134+int MirSurfaceItem::childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop)
135+{
136+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
137+ return p->m_children.count();
138+}
139+
140+MirSurfaceItem* MirSurfaceItem::childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index)
141+{
142+ MirSurfaceItem *p = qobject_cast<MirSurfaceItem*>(prop->object);
143+
144+ if (index < 0 || index >= p->m_children.count())
145+ return nullptr;
146+ return p->m_children[index];
147+}
148+
149+
150+void MirSurfaceItem::touchEvent(QTouchEvent * event)
151+{
152+ if (event->type() == QEvent::TouchBegin && hasFocus()) {
153+ Q_EMIT inputMethodRequested();
154+ m_haveInputMethod = true;
155+ }
156+}
157+
158+void MirSurfaceItem::onFocusChanged()
159+{
160+ if (!hasFocus() && m_haveInputMethod) {
161+ Q_EMIT inputMethodDismissed();
162+ m_haveInputMethod = false;
163+ }
164+}
165+
166+void MirSurfaceItem::setState(MirSurfaceItem::State newState)
167+{
168+ if (newState != m_state) {
169+ m_state = newState;
170+ Q_EMIT stateChanged(newState);
171+ }
172+}
tests/mocks/Unity/Application/MirSurfaceItem.hnew file+121
@@ -0,0 +1,121 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef MIRSURFACEITEM_H
18+#define MIRSURFACEITEM_H
19+
20+#include <QQuickPaintedItem>
21+#include <QImage>
22+
23+class ApplicationInfo;
24+
25+class MirSurfaceItem : public QQuickPaintedItem
26+{
27+ Q_OBJECT
28+ Q_ENUMS(Type)
29+ Q_ENUMS(State)
30+
31+ Q_PROPERTY(Type type READ type NOTIFY typeChanged)
32+ Q_PROPERTY(State state READ state NOTIFY stateChanged)
33+ Q_PROPERTY(QString name READ name NOTIFY nameChanged)
34+ Q_PROPERTY(MirSurfaceItem* parentSurface READ parentSurface NOTIFY parentSurfaceChanged)
35+ Q_PROPERTY(QQmlListProperty<MirSurfaceItem> childSurfaces READ childSurfaces NOTIFY childSurfacesChanged DESIGNABLE false)
36+
37+public:
38+ enum Type {
39+ Normal,
40+ Utility,
41+ Dialog,
42+ Overlay,
43+ Freestyle,
44+ Popover,
45+ InputMethod,
46+ };
47+
48+ enum State {
49+ Unknown,
50+ Restored,
51+ Minimized,
52+ Maximized,
53+ VertMaximized,
54+ /* SemiMaximized, */
55+ Fullscreen,
56+ };
57+
58+ explicit MirSurfaceItem(const QString& name,
59+ Type type,
60+ State state,
61+ const QUrl& screenshot,
62+ QQuickItem *parent = 0);
63+ ~MirSurfaceItem();
64+
65+ //getters
66+ ApplicationInfo* application() const { return m_application; }
67+ Type type() const { return m_type; }
68+ State state() const { return m_state; }
69+ QString name() const { return m_name; }
70+ MirSurfaceItem* parentSurface() const { return m_parentSurface; }
71+ QList<MirSurfaceItem*> childSurfaceList();
72+
73+ void setApplication(ApplicationInfo* item);
74+ void setParentSurface(MirSurfaceItem* item);
75+
76+ Q_INVOKABLE void setState(State newState);
77+ Q_INVOKABLE void release();
78+
79+ void paint(QPainter * painter) override;
80+ void touchEvent(QTouchEvent * event) override;
81+
82+Q_SIGNALS:
83+ void typeChanged(Type);
84+ void stateChanged(State);
85+ void nameChanged(QString);
86+ void parentSurfaceChanged(MirSurfaceItem*);
87+ void childSurfacesChanged();
88+
89+ void removed();
90+
91+ void inputMethodRequested();
92+ void inputMethodDismissed();
93+
94+private Q_SLOTS:
95+ void onFocusChanged();
96+
97+protected:
98+ const QImage &screenshotImage() { return m_img; }
99+
100+private:
101+ void addChildSurface(MirSurfaceItem* surface);
102+ void removeChildSurface(MirSurfaceItem* surface);
103+
104+ QQmlListProperty<MirSurfaceItem> childSurfaces();
105+ static int childSurfaceCount(QQmlListProperty<MirSurfaceItem> *prop);
106+ static MirSurfaceItem* childSurfaceAt(QQmlListProperty<MirSurfaceItem> *prop, int index);
107+
108+ ApplicationInfo* m_application;
109+ const QString m_name;
110+ const Type m_type;
111+ State m_state;
112+ const QImage m_img;
113+
114+ MirSurfaceItem* m_parentSurface;
115+ QList<MirSurfaceItem*> m_children;
116+ bool m_haveInputMethod;
117+};
118+
119+Q_DECLARE_METATYPE(MirSurfaceItem*)
120+
121+#endif // MIRSURFACEITEM_H
tests/mocks/Unity/Application/SurfaceManager.cppnew file+73
@@ -0,0 +1,73 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "SurfaceManager.h"
18+
19+#include "MirSurfaceItem.h"
20+#include "VirtualKeyboard.h"
21+
22+
23+SurfaceManager *SurfaceManager::the_surface_manager = nullptr;
24+
25+SurfaceManager *SurfaceManager::singleton()
26+{
27+ if (!the_surface_manager) {
28+ the_surface_manager = new SurfaceManager();
29+ }
30+ return the_surface_manager;
31+}
32+
33+SurfaceManager::SurfaceManager(QObject *parent) :
34+ QObject(parent)
35+ , m_virtualKeyboard(nullptr)
36+{
37+}
38+
39+void SurfaceManager::registerSurface(MirSurfaceItem *surface)
40+{
41+ connect(surface, &MirSurfaceItem::inputMethodRequested,
42+ this, &SurfaceManager::showInputMethod);
43+ connect(surface, &MirSurfaceItem::inputMethodDismissed,
44+ this, &SurfaceManager::hideInputMethod);
45+ Q_EMIT surfaceCreated(surface);
46+}
47+
48+void SurfaceManager::unregisterSurface(MirSurfaceItem *surface)
49+{
50+ disconnect(surface, 0, this, 0);
51+ Q_EMIT surfaceDestroyed(surface);
52+}
53+
54+void SurfaceManager::showInputMethod()
55+{
56+ inputMethodSurface()->setState(MirSurfaceItem::Restored);
57+}
58+
59+void SurfaceManager::hideInputMethod()
60+{
61+ if (m_virtualKeyboard) {
62+ m_virtualKeyboard->setState(MirSurfaceItem::Minimized);
63+ }
64+}
65+
66+MirSurfaceItem *SurfaceManager::inputMethodSurface()
67+{
68+ if (!m_virtualKeyboard) {
69+ m_virtualKeyboard = new VirtualKeyboard(MirSurfaceItem::Minimized);
70+ Q_EMIT surfaceCreated(m_virtualKeyboard);
71+ }
72+ return m_virtualKeyboard;
73+}
tests/mocks/Unity/Application/SurfaceManager.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef SURFACEMANAGER_H
18+#define SURFACEMANAGER_H
19+
20+#include <QObject>
21+
22+class MirSurfaceItem;
23+class VirtualKeyboard;
24+
25+class SurfaceManager : public QObject
26+{
27+ Q_OBJECT
28+public:
29+ explicit SurfaceManager(QObject *parent = 0);
30+
31+ static SurfaceManager *singleton();
32+
33+ // Internal mock use
34+ void registerSurface(MirSurfaceItem *surface);
35+ void unregisterSurface(MirSurfaceItem *surface);
36+
37+ // To be used in the tests
38+ Q_INVOKABLE MirSurfaceItem *inputMethodSurface();
39+
40+Q_SIGNALS:
41+ void countChanged();
42+ void surfaceCreated(MirSurfaceItem *surface);
43+ void surfaceDestroyed(MirSurfaceItem *surface);
44+
45+private Q_SLOTS:
46+ void showInputMethod();
47+ void hideInputMethod();
48+
49+private:
50+ static SurfaceManager *the_surface_manager;
51+ VirtualKeyboard *m_virtualKeyboard;
52+};
53+
54+#endif // SURFACEMANAGER_H
tests/mocks/Unity/Application/VirtualKeyboard.cppnew file+55
@@ -0,0 +1,55 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#include "VirtualKeyboard.h"
18+
19+#include <paths.h>
20+
21+VirtualKeyboard::VirtualKeyboard(State state, QQuickItem *parent)
22+ : MirSurfaceItem("input-method",
23+ MirSurfaceItem::InputMethod,
24+ state,
25+ QString("file://%1/Dash/graphics/phone/screenshots/vkb_portrait.png").arg(qmlDirectory()),
26+ parent)
27+{
28+}
29+
30+void VirtualKeyboard::touchEvent(QTouchEvent *event)
31+{
32+ if (event->type() == QEvent::TouchBegin && !hasTouchInsideKeyboard(event)) {
33+ event->ignore();
34+ }
35+}
36+
37+bool VirtualKeyboard::hasTouchInsideKeyboard(QTouchEvent *event)
38+{
39+ const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
40+ for (int i = 0; i < touchPoints.count(); ++i) {
41+ QPoint pos = touchPoints.at(i).pos().toPoint();
42+
43+ // Map to image coords
44+ int imageX = (int)( ( ((qreal)pos.x()) / width() ) * ((qreal)screenshotImage().size().width()) );
45+ int imageY = (int)( ( ((qreal)pos.y()) / height() ) * ((qreal)screenshotImage().size().height()) );
46+
47+ QRgb pixelHit = screenshotImage().pixel(imageX, imageY);
48+
49+ // The keyboard depicted in the image is in its opaque part.
50+ if (qAlpha(pixelHit) != 0) {
51+ return true;
52+ }
53+ }
54+ return false;
55+}
qml/Stages/SidestageHandle.qml → tests/mocks/Unity/Application/VirtualKeyboard.hrenamed+19−6
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -14,9 +14,22 @@
1414 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1515 */
1616
17−import QtQuick 2.0
18−import Ubuntu.Components 0.1
17+#ifndef VIRTUALKEYBOARD_H
18+#define VIRTUALKEYBOARD_H
1919
20−BorderImage {
21− source: "graphics/sidestage_handle.sci"
22−}
20+#include "MirSurfaceItem.h"
21+
22+class VirtualKeyboard : public MirSurfaceItem
23+{
24+ Q_OBJECT
25+public:
26+ VirtualKeyboard(State state,
27+ QQuickItem *parent = 0);
28+
29+ void touchEvent(QTouchEvent * event) override;
30+
31+private:
32+ bool hasTouchInsideKeyboard(QTouchEvent *event);
33+};
34+
35+#endif // VIRTUALKEYBOARD_H
tests/mocks/Unity/Application/plugin.cpp+16−9
@@ -1,5 +1,5 @@
11/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013-2014 Canonical, Ltd.
33 *
44 * This program is free software; you can redistribute it and/or modify
55 * it under the terms of the GNU General Public License as published by
@@ -19,29 +19,37 @@
1919#include "ApplicationImage.h"
2020#include "ApplicationManager.h"
2121#include "ApplicationScreenshotProvider.h"
22+#include "MirSurfaceItem.h"
23+#include "SurfaceManager.h"
2224
2325#include <qqml.h>
2426#include <QQmlEngine>
2527
26−ApplicationManager *s_appManager = 0;
27−
2828static QObject* applicationManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
2929 Q_UNUSED(engine);
3030 Q_UNUSED(scriptEngine);
31− if (!s_appManager) {
32− s_appManager = new ApplicationManager();
33− }
34− return s_appManager;
31+ return ApplicationManager::singleton();
32+}
33+
34+static QObject* surfaceManagerSingleton(QQmlEngine* engine, QJSEngine* scriptEngine) {
35+ Q_UNUSED(engine);
36+ Q_UNUSED(scriptEngine);
37+ return SurfaceManager::singleton();
3538}
3639
3740void FakeUnityApplicationQmlPlugin::registerTypes(const char *uri)
3841{
42+ qRegisterMetaType<MirSurfaceItem*>("MirSurfaceItem*");
43+
3944 qmlRegisterUncreatableType<unity::shell::application::ApplicationManagerInterface>(uri, 0, 1, "ApplicationManagerInterface", "Abstract interface. Cannot be created in QML");
4045 qmlRegisterSingletonType<ApplicationManager>(uri, 0, 1, "ApplicationManager", applicationManagerSingleton);
46+ qmlRegisterSingletonType<SurfaceManager>(uri, 0, 1, "SurfaceManager", surfaceManagerSingleton);
4147
4248 qmlRegisterUncreatableType<unity::shell::application::ApplicationInfoInterface>(uri, 0, 1, "ApplicationInfoInterface", "Abstract interface. Cannot be created in QML");
4349 qmlRegisterType<ApplicationInfo>(uri, 0, 1, "ApplicationInfo");
4450
51+ qmlRegisterUncreatableType<MirSurfaceItem>(uri, 0, 1, "MirSurfaceItem", "MirSurfaceItem can't be instantiated from QML");
52+
4553 qmlRegisterType<ApplicationImage>(uri, 0, 1, "ApplicationImage");
4654}
4755
@@ -49,6 +57,5 @@ void FakeUnityApplicationQmlPlugin::initializeEngine(QQmlEngine *engine, const c
4957{
5058 QQmlExtensionPlugin::initializeEngine(engine, uri);
5159
52− ApplicationManager* appManager = static_cast<ApplicationManager*>(applicationManagerSingleton(engine, NULL));
53− engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(appManager));
60+ engine->addImageProvider(QLatin1String("application"), new ApplicationScreenshotProvider(ApplicationManager::singleton()));
5461}
tests/mocks/Unity/fake_categories.cpp+13−1
@@ -145,9 +145,12 @@ Categories::data(const QModelIndex& index, int role) const
145145 } else {
146146 map["category-layout"] = "carousel";
147147 map["card-size"] = "medium";
148− map["collapsed-rows"] = 2;
149148 map["overlay"] = true;
150149 }
150+ if (index.row() == 19) {
151+ map["category-layout"] = "grid";
152+ map["collapsed-rows"] = 0;
153+ }
151154 map["card-size"] = "small";
152155 return map;
153156 }
@@ -166,6 +169,9 @@ Categories::data(const QModelIndex& index, int role) const
166169 return map;
167170 }
168171 case RoleHeaderLink:
172+ if (index.row() == 1 || index.row() == 4) {
173+ return QString("scope://query/1");
174+ }
169175 return QString();
170176 case RoleResults:
171177 return QVariant::fromValue(resultsModel);
@@ -177,3 +183,9 @@ Categories::data(const QModelIndex& index, int role) const
177183 }
178184 }
179185}
186+
187+QVariant
188+Categories::data(int row, int role) const
189+{
190+ return data(index(row, 0), role);
191+}
tests/mocks/Unity/fake_categories.h+2
@@ -37,6 +37,8 @@ public:
3737 Q_INVOKABLE void addSpecialCategory(QString const& categoryId, QString const& name, QString const& icon, QString const& rawTemplate, QObject* countObject) override;
3838 Q_INVOKABLE bool overrideCategoryJson(QString const& categoryId, QString const& json) override;
3939
40+ Q_INVOKABLE QVariant data(int row, int role) const;
41+
4042private Q_SLOTS:
4143 void countChanged();
4244
tests/mocks/Unity/fake_scope.cpp+8−11
@@ -24,7 +24,7 @@ Scope::Scope(QObject* parent) : Scope(QString(), QString(), false, parent)
2424{
2525}
2626
27−Scope::Scope(QString const& id, QString const& name, bool visible, QObject* parent)
27+Scope::Scope(QString const& id, QString const& name, bool visible, QObject* parent, int categories)
2828 : unity::shell::scopes::ScopeInterface(parent)
2929 , m_id(id)
3030 , m_name(name)
@@ -33,7 +33,7 @@ Scope::Scope(QString const& id, QString const& name, bool visible, QObject* pare
3333 , m_isActive(false)
3434 , m_currentDeparment("root")
3535 , m_previewRendererName("preview-generic")
36− , m_categories(new Categories(20, this))
36+ , m_categories(new Categories(categories, this))
3737{
3838}
3939
@@ -182,14 +182,16 @@ bool Scope::hasDepartments() const
182182
183183QVariantMap Scope::customizations() const
184184{
185− QVariantMap m;
185+ QVariantMap m, h;
186186 if (m_id == "clickscope") {
187+ h["foreground-color"] = "yellow";
187188 m["background-color"] = "red";
188189 m["foreground-color"] = "blue";
190+ m["page-header"] = h;
189191 } else if (m_id == "MockScope5") {
190− QVariantMap pageHeader;
191− pageHeader["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
192− m["page-header"] = pageHeader;
192+ h["background"] = "gradient:///lightgrey/grey";
193+ h["logo"] = QUrl("../../../tests/qmltests/Components/tst_PageHeader/logo-ubuntu-orange.svg");
194+ m["page-header"] = h;
193195 }
194196 return m;
195197}
@@ -216,8 +218,3 @@ void Scope::loadDepartment(const QString& id)
216218 m_currentDeparment = id;
217219 Q_EMIT currentDepartmentIdChanged();
218220}
219−
220−void Scope::performQuery(const QString& query)
221−{
222− Q_UNUSED(query);
223−}
tests/mocks/Unity/fake_scope.h+2−2
@@ -30,7 +30,7 @@ class Scope : public unity::shell::scopes::ScopeInterface
3030
3131public:
3232 Scope(QObject* parent = 0);
33− Scope(QString const& id, QString const& name, bool visible, QObject* parent = 0);
33+ Scope(QString const& id, QString const& name, bool visible, QObject* parent = 0, int categories = 20);
3434
3535 /* getters */
3636 QString id() const override;
@@ -64,7 +64,7 @@ public:
6464 bool hasDepartments() const override;
6565 Q_INVOKABLE unity::shell::scopes::DepartmentInterface* getDepartment(const QString& id) override;
6666 Q_INVOKABLE void loadDepartment(const QString& id) override;
67− Q_INVOKABLE void performQuery(const QString& query) override;
67+ Q_SIGNAL void performQuery(const QString& query) override;
6868
6969 QVariantMap customizations() const override;
7070
tests/mocks/Unity/fake_scopes.cpp+1
@@ -46,6 +46,7 @@ void Scopes::updateScopes()
4646 addScope(new Scope("MockScope2", "Music", false, this));
4747 addScope(new Scope("clickscope", "Apps", true, this));
4848 addScope(new Scope("MockScope5", "Videos", true, this));
49+ addScope(new Scope("SingleCategoryScope", "Single", true, this, 1));
4950
5051 if (!m_loaded) {
5152 m_loaded = true;
tests/plugins/Dash/tst_ScopeStyle.qml+27−2
@@ -36,8 +36,8 @@ Rectangle {
3636 property var styles: [
3737 {},
3838 { "foreground-color": "red", "background-color": "black", "page-header": { "logo": "/foo/bar" } },
39− { "foreground-color": "green", "background-color": "white" },
40− { "foreground-color": "blue", "background-color": "darkgrey" },
39+ { "foreground-color": "green", "background-color": "white", "page-header": { "foreground-color": "black" } },
40+ { "foreground-color": "blue", "background-color": "darkgrey", "page-header": { "background": "gradient:///white/blue" } },
4141 ]
4242
4343 function cleanup() {
@@ -147,5 +147,30 @@ Rectangle {
147147 tool.style = testCase.styles[data.index];
148148 compare(tool.headerLogo, data.headerLogo, "Header logo was incorrect.");
149149 }
150+
151+ function test_headerForeground_data() {
152+ return [
153+ { tag: "default", index: 0, headerForeground: "grey" },
154+ { tag: "black", index: 2, headerForeground: "black" },
155+ ];
156+ }
157+
158+ function test_headerForeground(data) {
159+ tool.style = testCase.styles[data.index];
160+ verify(Qt.colorEqual(tool.headerForeground, data.headerForeground),
161+ "Header foreground not equal: %1 != %2".arg(tool.headerForeground).arg(data.headerForeground));
162+ }
163+
164+ function test_headerBackground_data() {
165+ return [
166+ { tag: "default", index: 0, headerBackground: "" },
167+ { tag: "black", index: 3, headerBackground: "gradient:///white/blue" },
168+ ];
169+ }
170+
171+ function test_headerBackground(data) {
172+ tool.style = testCase.styles[data.index];
173+ compare(tool.headerBackground, data.headerBackground, "Header background was incorrect.");
174+ }
150175 }
151176}
tests/qmltests/CMakeLists.txt+1−1
@@ -21,10 +21,10 @@ set(qmltest_DEFAULT_PROPERTIES ENVIRONMENT "LC_ALL=C")
2121
2222add_qml_test(. Shell ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single")
2323add_qml_test(. ShellWithPin ENVIRONMENT "LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/tests/mocks/LightDM/single-pin")
24+add_qml_test(Components Background)
2425add_qml_test(Components Carousel)
2526add_qml_test(Components DraggingArea)
2627add_qml_test(Components EdgeDemoOverlay)
27−add_qml_test(Components FilterGrid)
2828add_qml_test(Components LazyImage)
2929add_qml_test(Components Rating)
3030add_qml_test(Components ResponsiveFlowView)
tests/qmltests/Components/tst_Background.qmlnew file+90
@@ -0,0 +1,90 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.2
18+import QtTest 1.0
19+import Unity.Test 0.1
20+
21+import "../../../qml/Components"
22+
23+Rectangle {
24+ width: units.gu(40)
25+ height: units.gu(71)
26+
27+ Background {
28+ id: background
29+ }
30+
31+ UnityTestCase {
32+ id: testCase
33+ name: "Background"
34+ when: windowShown
35+
36+ SignalSpy {
37+ id: loadedSpy
38+ target: background
39+ signalName: "loaded"
40+ }
41+
42+ function cleanup() {
43+ background.style = "";
44+ loadedSpy.clear();
45+ }
46+
47+ function test_style_data() {
48+ return [
49+ { tag: "empty", style: "" },
50+ { tag: "solid", style: "color:///black" },
51+ { tag: "gradient", style: "gradient:///black/red" },
52+ { tag: "image", style: "/some/path" },
53+ ];
54+ }
55+
56+ function test_style(data) {
57+ background.style = data.style;
58+ expectFail("empty", "Empty style should not create a background.");
59+ loadedSpy.wait();
60+ compare(background.item.objectName, data.tag, "Background should be %1".arg(data.style));
61+ }
62+
63+ function test_solid() {
64+ background.style = "color:///black";
65+ loadedSpy.wait();
66+
67+ verify(Qt.colorEqual(background.item.color, "black"),
68+ "Solid color not equal: %1 != black".arg(background.item.color));
69+ }
70+
71+ function test_gradient() {
72+ background.style = "gradient:///black/red";
73+ loadedSpy.wait();
74+
75+ var stops = background.item.gradient.stops;
76+
77+ verify(Qt.colorEqual(stops[0].color, "black"),
78+ "Top gradient color not equal: %1 != black".arg(stops[0].color));
79+ verify(Qt.colorEqual(stops[1].color, "red"),
80+ "Bottom gradient color not equal: %1 != black".arg(stops[1].color));
81+ }
82+
83+ function test_image() {
84+ background.style = "/some/path";
85+ loadedSpy.wait();
86+
87+ compare(background.item.source, Qt.resolvedUrl("/some/path"), "Image path is incorrect.");
88+ }
89+ }
90+}
tests/qmltests/Components/tst_FilterGrid.qmldeleted−190
@@ -1,190 +0,0 @@
1−/*
2− * Copyright 2013 Canonical Ltd.
3− *
4− * This program is free software; you can redistribute it and/or modify
5− * it under the terms of the GNU General Public License as published by
6− * the Free Software Foundation; version 3.
7− *
8− * This program is distributed in the hope that it will be useful,
9− * but WITHOUT ANY WARRANTY; without even the implied warranty of
10− * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11− * GNU General Public License for more details.
12− *
13− * You should have received a copy of the GNU General Public License
14− * along with this program. If not, see <http://www.gnu.org/licenses/>.
15− */
16−
17−import QtQuick 2.0
18−import QtTest 1.0
19−import "../../../qml/Components"
20−import Ubuntu.Components.ListItems 0.1 as ListItem
21−import Ubuntu.Components 0.1
22−import Unity.Test 0.1 as UT
23−import Utils 0.1
24−
25−/*
26− You should see 6 green squares (from "A" to "F") and a button "View all (12)".
27− Once you press that button other 6 green squares (from "G" to "L") should show up.
28−*/
29−Rectangle {
30− width: gridRect.width + controls.width
31− height: units.gu(50)
32− color: "white"
33−
34− Column {
35− id: controls
36− width: units.gu(30)
37− height: parent.height
38− anchors.top: parent.top
39− anchors.right: parent.right
40− ListItem.ValueSelector {
41− id: collapsedRowCountSelector
42− text: "collapsedRowCount"
43− values: [1,2,3,4]
44− selectedIndex: 1
45− }
46− Row {
47− spacing: units.gu(1)
48− Label { anchors.verticalCenter: parent.verticalCenter
49− text: "Filter" }
50− CheckBox {
51− id: filterCheckBox
52− checked: true
53− onCheckedChanged: filterGrid.setFilter(checked, false /*animate*/)
54− }
55− }
56− }
57−
58− ListModel {
59− id: fakeModel
60− ListElement { name: "A" }
61− ListElement { name: "B" }
62− ListElement { name: "C" }
63− ListElement { name: "D" }
64− ListElement { name: "E" }
65− ListElement { name: "F" }
66− ListElement { name: "G" }
67− ListElement { name: "H" }
68− ListElement { name: "I" }
69− ListElement { name: "J" }
70− ListElement { name: "K" }
71− ListElement { name: "L" }
72− }
73−
74− ListModel {
75− id: fakeModelTwoItems
76− ListElement { name: "A" }
77− ListElement { name: "B" }
78− }
79−
80− ListModel {
81− id: fakeModelFourItems
82− ListElement { name: "A" }
83− ListElement { name: "B" }
84− ListElement { name: "C" }
85− ListElement { name: "D" }
86− }
87−
88− Rectangle {
89− id: gridRect
90− width: units.gu(30)
91− height: parent.height
92− color: "grey"
93− anchors.top: parent.top
94− anchors.left: parent.left
95−
96− FilterGrid {
97− id: filterGrid
98− anchors.fill: parent
99− model: fakeModel
100− maximumNumberOfColumns: 3
101− collapsedRowCount:
102− collapsedRowCountSelector.values[collapsedRowCountSelector.selectedIndex]
103− minimumHorizontalSpacing: units.gu(1)
104− delegateWidth: units.gu(6)
105− delegateHeight: units.gu(6)
106− verticalSpacing: units.gu(1)
107−
108− delegate: Rectangle {
109− // So that it can be identified by countVisibleDelegates()
110− property bool isGridDelegate: true
111−
112− color: "green"
113− width: units.gu(6)
114− height: units.gu(6)
115− Text {
116− anchors.centerIn: parent
117− text: name
118− }
119− }
120− }
121− }
122−
123− UT.UnityTestCase {
124− name: "FilterGrid"
125− when: windowShown
126−
127− function init() {
128− filterGrid.model = fakeModel
129− }
130−
131− function cleanup() {
132− filterCheckBox.checked = true
133− collapsedRowCountSelector.selectedIndex = 1
134− }
135−
136− function test_turningFilterOffShowsAllElements() {
137− tryCompareFunction(countVisibleDelegates, 6)
138−
139− filterCheckBox.checked = false
140−
141− tryCompareFunction(countVisibleDelegates, 12)
142− }
143−
144− function test_collapsedRowCount() {
145− for (var i = 0; i < 4; ++i) {
146− collapsedRowCountSelector.selectedIndex = i
147− // We have 3 elements per row.
148− // row count == index + 1
149− tryCompareFunction(countVisibleDelegates, 3*(i+1))
150− }
151− }
152−
153− function test_modelSizeAffectsCollapsedRowCount_data() {
154− return [
155− { tag: "2 items, collapsedRows 1", model: fakeModelTwoItems, collapsedRowCountIndex: 0,
156− rowsWhenCollapsed: 1, visibleDelegates: 2 },
157− { tag: "2 items, collapsedRows 2", model: fakeModelTwoItems, collapsedRowCountIndex: 1,
158− rowsWhenCollapsed: 1, visibleDelegates: 2 },
159− { tag: "4 items, collapsedRows 1", model: fakeModelFourItems, collapsedRowCountIndex: 0,
160− rowsWhenCollapsed: 1, visibleDelegates: 3 },
161− { tag: "4 items, collapsedRows 2", model: fakeModelFourItems, collapsedRowCountIndex: 1,
162− rowsWhenCollapsed: 2, visibleDelegates: 4 },
163− ]
164− }
165−
166− function test_modelSizeAffectsCollapsedRowCount(data) {
167− filterGrid.model = data.model
168− collapsedRowCountSelector.selectedIndex = data.collapsedRowCountIndex
169−
170− tryCompare(filterGrid, "rowsWhenCollapsed", data.rowsWhenCollapsed)
171− tryCompareFunction(countVisibleDelegates, data.visibleDelegates)
172− }
173−
174− function countVisibleDelegates() {
175− return __countVisibleDelegates(filterGrid.visibleChildren, 0)
176− }
177−
178− function __countVisibleDelegates(objList, total) {
179− for (var i = 0; i < objList.length; ++i) {
180− var child = objList[i];
181− if (child.isGridDelegate !== undefined) {
182− ++total;
183− } else {
184− total = __countVisibleDelegates(child.visibleChildren, total)
185− }
186− }
187− return total
188− }
189− }
190−}
tests/qmltests/Dash/Apps/tst_RunningApplicationsGrid.qml+23−2
@@ -19,10 +19,11 @@ import QtTest 1.0
1919import "../../../../qml/Dash/Apps"
2020import Unity.Test 0.1 as UT
2121import Unity.Application 0.1
22+import Ubuntu.Components 1.1
2223
2324// Using Rectangle to have an opaque surface because AppManager paints app surfaces behind it.
2425Rectangle {
25− width: units.gu(50)
26+ width: units.gu(70)
2627 height: units.gu(40)
2728
2829 function resetRunningApplications() {
@@ -41,10 +42,30 @@ Rectangle {
4142 // The component under test
4243 RunningApplicationsGrid {
4344 id: runningApplicationsGrid
44− anchors.fill: parent
45+ orientationAngle: orientationAngleSelector.selectedIndex * 90
46+ anchors.left: parent.left
47+ anchors.right: controlPanel.left
48+ anchors.top: parent.top
49+ anchors.bottom: parent.bottom
4550 model: ApplicationManager
4651 }
4752
53+ Rectangle {
54+ id: controlPanel
55+ anchors.right: parent.right
56+ anchors.top: parent.top
57+ anchors.bottom: parent.bottom
58+ width: units.gu(20)
59+ color: "black"
60+
61+ OptionSelector {
62+ id: orientationAngleSelector
63+ model: ["0","90","180","270"]
64+ text: "Orientation Angle"
65+ width: parent.width
66+ }
67+ }
68+
4869 UT.UnityTestCase {
4970 name: "RunningApplicationsGrid"
5071 when: windowShown
tests/qmltests/Dash/tst_Dash.qml+1−1
@@ -86,7 +86,7 @@ Item {
8686 tryCompare(dashContentList, "count", 0);
8787 scopes.load();
8888 tryCompare(scopes, "loaded", true);
89− tryCompare(dashContentList, "count", 3);
89+ tryCompare(dashContentList, "count", 4);
9090
9191 verify(dashContentList != undefined);
9292 tryCompare(dashContentList, "currentIndex", data.visualIndex);
tests/qmltests/Dash/tst_DashContent.qml+15−6
@@ -61,6 +61,11 @@ Item {
6161 signalName: "movementStarted"
6262 }
6363
64+ SignalSpy {
65+ id: loadedSpy
66+ signalName: "loaded"
67+ }
68+
6469 UT.UnityTestCase {
6570 name: "DashContent"
6671 when: scopesModel.loaded && windowShown
@@ -78,6 +83,7 @@ Item {
7883
7984 function cleanup() {
8085 movementStartedSpy.clear();
86+ loadedSpy.clear();
8187 dashContent.visible = true;
8288
8389 var dashContentList = findChild(dashContent, "dashContentList");
@@ -116,10 +122,11 @@ Item {
116122
117123 function test_show_header_on_list_movement() {
118124 var dashContentList = findChild(dashContent, "dashContentList");
119− verify(dashContentList != undefined);
120− var categoryListView = findChild(dashContentList, "categoryListView");
121− verify(categoryListView != undefined);
125+ verify(dashContentList !== null);
126+ var scope = findChild(dashContent, "MockScope1 loader");
127+ waitForRendering(scope);
122128
129+ var categoryListView = findChild(scope, "categoryListView");
123130 waitForRendering(categoryListView);
124131
125132 categoryListView.contentY = units.gu(15);
@@ -133,10 +140,12 @@ Item {
133140
134141 function test_set_current_scope_reset() {
135142 var dashContentList = findChild(dashContent, "dashContentList");
136− verify(dashContentList != undefined);
137− var categoryListView = findChild(dashContentList, "categoryListView");
138− verify(categoryListView != undefined);
143+ verify(dashContentList, "Couldn't find dashContentList");
144+ var scope = findChild(dashContent, "MockScope1 loader");
139145
146+ tryCompare(scope, "status", Loader.Ready);
147+
148+ var categoryListView = findChild(dashContentList, "categoryListView");
140149 categoryListView.contentY = units.gu(10);
141150
142151 compare(dashContentList.currentItem.item.objectName, "MockScope1")
tests/qmltests/Dash/tst_GenericScopeView.qml+137−49
@@ -39,6 +39,10 @@ Item {
3939 id: scopes
4040 }
4141
42+ SignalSpy {
43+ id: spy
44+ }
45+
4246 property Item applicationManager: Item {
4347 signal sideStageFocusedApplicationChanged()
4448 signal mainStageFocusedApplicationChanged()
@@ -54,12 +58,20 @@ Item {
5458 when: scopes.loaded && windowShown
5559
5660 property Item previewListView: findChild(genericScopeView, "previewListView")
61+ property Item header: findChild(genericScopeView, "scopePageHeader")
5762
5863 function init() {
5964 genericScopeView.scope = scopes.getScope(1)
6065 shell.width = units.gu(120)
6166 genericScopeView.categoryView.positionAtBeginning();
62− tryCompare(genericScopeView.categoryView, "contentY", 0)
67+ waitForRendering(genericScopeView.categoryView);
68+ }
69+
70+ function cleanup() {
71+ genericScopeView.scope = null;
72+ spy.clear();
73+ spy.target = null;
74+ spy.signalName = "";
6375 }
6476
6577 function test_isActive() {
@@ -104,90 +116,146 @@ Item {
104116 tryCompare(genericScopeView.scope, "searchQuery", "test")
105117 }
106118
107− function test_filter_expand_collapse() {
108− // wait for the item to be there
109− waitForRendering(genericScopeView);
119+ function test_expand_collapse() {
110120 tryCompareFunction(function() { return findChild(genericScopeView, "dashSectionHeader0") != null; }, true);
111121
112− var header = findChild(genericScopeView, "dashSectionHeader0")
113122 var category = findChild(genericScopeView, "dashCategory0")
123+ var seeAll = findChild(category, "seeAll")
114124
115− waitForRendering(header);
125+ waitForRendering(seeAll);
116126 verify(category.expandable);
117− verify(category.filtered);
127+ verify(!category.expanded);
118128
119129 var initialHeight = category.height;
120− var middleHeight;
121− mouseClick(header, header.width / 2, header.height / 2);
122− tryCompareFunction(function() { middleHeight = category.height; return category.height > initialHeight; }, true);
123− tryCompare(category, "filtered", false);
124− tryCompareFunction(function() { return category.height > middleHeight; }, true);
130+ mouseClick(seeAll, seeAll.width / 2, seeAll.height / 2);
131+ verify(category.expanded);
132+ tryCompareFunction(function() { return category.height > initialHeight; }, true);
125133
126− mouseClick(header, header.width / 2, header.height / 2);
127− verify(category.expandable);
128− tryCompare(category, "filtered", true);
134+ mouseClick(seeAll, seeAll.width / 2, seeAll.height / 2);
135+ verify(!category.expanded);
129136 }
130137
131− function test_filter_expand_expand_collapse() {
138+ function test_expand_expand_collapse() {
132139 // wait for the item to be there
133140 tryCompareFunction(function() { return findChild(genericScopeView, "dashSectionHeader2") != null; }, true);
134141
135142 var categoryListView = findChild(genericScopeView, "categoryListView");
136143 categoryListView.contentY = categoryListView.height;
137144
138− var header2 = findChild(genericScopeView, "dashSectionHeader2")
139145 var category2 = findChild(genericScopeView, "dashCategory2")
140− var category2FilterGrid = category2.children[1].children[2];
141− verify(UT.Util.isInstanceOf(category2FilterGrid, "CardFilterGrid"));
146+ var seeAll2 = findChild(category2, "seeAll")
142147
143− waitForRendering(header2);
148+ waitForRendering(seeAll2);
144149 verify(category2.expandable);
145− verify(category2.filtered);
150+ verify(!category2.expanded);
146151
147− mouseClick(header2, header2.width / 2, header2.height / 2);
148− tryCompare(category2, "filtered", false);
149− tryCompare(category2FilterGrid, "filtered", false);
152+ mouseClick(seeAll2, seeAll2.width / 2, seeAll2.height / 2);
153+ tryCompare(category2, "expanded", true);
150154
151155 categoryListView.positionAtBeginning();
152156
153− var header0 = findChild(genericScopeView, "dashSectionHeader0")
154157 var category0 = findChild(genericScopeView, "dashCategory0")
155− mouseClick(header0, header0.width / 2, header0.height / 2);
156− tryCompare(category0, "filtered", false);
157− tryCompare(category2, "filtered", true);
158− tryCompare(category2FilterGrid, "filtered", true);
159− mouseClick(header0, header0.width / 2, header0.height / 2);
160− tryCompare(category0, "filtered", true);
161− tryCompare(category2, "filtered", true);
158+ var seeAll0 = findChild(category0, "seeAll")
159+ mouseClick(seeAll0, seeAll0.width / 2, seeAll0.height / 2);
160+ tryCompare(category0, "expanded", true);
161+ tryCompare(category2, "expanded", false);
162+ mouseClick(seeAll0, seeAll0.width / 2, seeAll0.height / 2);
163+ tryCompare(category0, "expanded", false);
164+ tryCompare(category2, "expanded", false);
165+ }
166+
167+ function test_headerLink() {
168+ tryCompareFunction(function() { return findChild(genericScopeView, "dashSectionHeader1") != null; }, true);
169+ var header = findChild(genericScopeView, "dashSectionHeader1");
170+
171+ spy.target = genericScopeView.scope;
172+ spy.signalName = "performQuery";
173+
174+ mouseClick(header, header.width / 2, header.height / 2);
175+
176+ spy.wait();
177+ compare(spy.signalArguments[0][0], genericScopeView.scope.categories.data(1, Categories.RoleHeaderLink));
178+ }
179+
180+ function test_headerLink_disable_expansion() {
181+ var categoryListView = findChild(genericScopeView, "categoryListView");
182+ waitForRendering(categoryListView);
183+
184+ categoryListView.contentY = categoryListView.height * 2;
185+
186+ // wait for the item to be there
187+ tryCompareFunction(function() { return findChild(genericScopeView, "dashSectionHeader4") != null; }, true);
188+
189+ var categoryView = findChild(genericScopeView, "dashCategory4");
190+ verify(categoryView, "Can't find the category view.");
191+
192+ var seeAll = findChild(categoryView, "seeAll");
193+ verify(seeAll, "Can't find the seeAll element");
194+
195+ compare(seeAll.height, 0, "SeeAll should be 0-height.");
196+
197+ openPreview(4, 0);
198+
199+ compare(testCase.previewListView.count, 12, "There should only be 12 items in preview.");
162200 }
163201
164202 function test_narrow_delegate_ranges_expand() {
165− tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") != undefined; }, true);
203+ tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") !== null; }, true);
166204 var category = findChild(genericScopeView, "dashCategory0")
167− tryCompare(category, "filtered", true);
205+ tryCompare(category, "expanded", false);
168206
169207 shell.width = units.gu(20)
170208 var categoryListView = findChild(genericScopeView, "categoryListView");
171209 categoryListView.contentY = units.gu(20);
172− var header0 = findChild(genericScopeView, "dashSectionHeader0")
173− mouseClick(header0, header0.width / 2, header0.height / 2);
174− tryCompare(category, "filtered", false);
210+ var seeAll = findChild(category, "seeAll")
211+ mouseClick(seeAll, seeAll.width / 2, seeAll.height / 2);
212+ tryCompare(category, "expanded", true);
175213 tryCompareFunction(function() { return category.item.height == genericScopeView.height - category.item.displayMarginBeginning - category.item.displayMarginEnd; }, true);
176− mouseClick(header0, header0.width / 2, header0.height / 2);
177− tryCompare(category, "filtered", true);
214+ mouseClick(seeAll, seeAll.width / 2, seeAll.height / 2);
215+ tryCompare(category, "expanded", false);
216+ }
217+
218+ function test_forced_category_expansion() {
219+ tryCompareFunction(function() {
220+ mouseFlick(genericScopeView, genericScopeView.width/2, genericScopeView.height,
221+ genericScopeView.width/2, genericScopeView.y)
222+ return findChild(genericScopeView, "dashCategory19") !== null;
223+ }, true);
224+ var category = findChild(genericScopeView, "dashCategory19")
225+ compare(category.expandable, false, "Category with collapsed-rows: 0 should not be expandable");
226+
227+ var grid = findChild(category, "19");
228+ verify(grid, "Could not find the category renderer.");
229+
230+ compare(grid.height, grid.expandedHeight, "Category with collapsed-rows: 0 should always be expanded.");
231+ }
232+
233+ function test_single_category_expansion() {
234+ genericScopeView.scope = scopes.getScope(4);
235+
236+ tryCompareFunction(function() { return findChild(genericScopeView, "dashCategory0") != undefined; }, true);
237+ var category = findChild(genericScopeView, "dashCategory0")
238+ compare(category.expandable, false, "Only category should not be expandable.");
239+
240+ var grid = findChild(category, "0");
241+ verify(grid, "Could not find the category renderer.");
242+
243+ compare(grid.height, grid.expandedHeight, "Only category should always be expanded");
178244 }
179245
180− function openPreview() {
246+ function openPreview(category, delegate) {
247+ if (category === undefined) category = 0;
248+ if (delegate === undefined) delegate = 0;
181249 tryCompareFunction(function() {
182− var filterGrid = findChild(genericScopeView, "0");
183− if (filterGrid != null) {
184− var tile = findChild(filterGrid, "delegate0");
250+ var cardGrid = findChild(genericScopeView, category);
251+ if (cardGrid != null) {
252+ var tile = findChild(cardGrid, "delegate"+delegate);
185253 return tile != null;
186254 }
187255 return false;
188256 },
189257 true);
190− var tile = findChild(findChild(genericScopeView, "0"), "delegate0");
258+ var tile = findChild(findChild(genericScopeView, category), "delegate"+delegate);
191259 mouseClick(tile, tile.width / 2, tile.height / 2);
192260 tryCompare(testCase.previewListView, "open", true);
193261 tryCompare(testCase.previewListView, "x", 0);
@@ -257,13 +325,33 @@ Item {
257325 closePreview();
258326 }
259327
260− function test_haeder_logo() {
261− genericScopeView.scope = scopes.getScope(3);
328+ function test_header_style_data() {
329+ return [
330+ { tag: "Default", index: 0, foreground: "grey", background: "", logo: "" },
331+ { tag: "Foreground", index: 2, foreground: "yellow", background: "", logo: "" },
332+ { tag: "Logo+Background", index: 3, foreground: "grey", background: "gradient:///lightgrey/grey",
333+ logo: Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg") },
334+ ];
335+ }
262336
263− var image = findChild(genericScopeView, "titleImage");
264− verify(image, "Could not find the title image");
265− compare(image.source, Qt.resolvedUrl("../Components/tst_PageHeader/logo-ubuntu-orange.svg"), "Title image has the wrong source");
337+ function test_header_style(data) {
338+ genericScopeView.scope = scopes.getScope(data.index);
339+ waitForRendering(genericScopeView);
340+ verify(header, "Could not find the header.");
341+
342+ var innerHeader = findChild(header, "innerPageHeader");
343+ verify(innerHeader, "Could not find the inner header");
344+ verify(Qt.colorEqual(innerHeader.textColor, data.foreground),
345+ "Foreground color not equal: %1 != %2".arg(innerHeader.textColor).arg(data.foreground));
266346
347+ var background = findChild(header, "headerBackground");
348+ verify(background, "Could not find the background");
349+ compare(background.style, data.background);
350+
351+ var image = findChild(genericScopeView, "titleImage");
352+ if (data.logo == "") expectFail(data.tag, "Title image should not exist.");
353+ verify(image, "Could not find the title image.");
354+ compare(image.source, data.logo, "Title image has the wrong source");
267355 }
268356 }
269357 }
tests/qmltests/Greeter/tst_Lockscreen.qml+11−5
@@ -18,8 +18,9 @@ import QtQuick 2.0
1818import QtTest 1.0
1919import ".."
2020import "../../../qml/Components"
21−import Ubuntu.Components 0.1
21+import AccountsService 0.1
2222import LightDM 0.1 as LightDM
23+import Ubuntu.Components 0.1
2324import Unity.Test 0.1 as UT
2425
2526Rectangle {
@@ -53,11 +54,16 @@ Rectangle {
5354 }
5455 }
5556
57+ function setUser(username) {
58+ AccountsService.user = username
59+ LightDM.Greeter.authenticate(username)
60+ }
61+
5662 Connections {
5763 target: LightDM.Greeter
5864
5965 onShowPrompt: {
60− if (text === "PIN") {
66+ if (AccountsService.passwordDisplayHint === AccountsService.Numeric) {
6167 pinPadCheckBox.checked = false
6268 } else {
6369 pinPadCheckBox.checked = true
@@ -139,12 +145,12 @@ Rectangle {
139145 Button {
140146 text: "start auth (1234)"
141147 width: parent.width
142− onClicked: LightDM.Greeter.authenticate("has-pin")
148+ onClicked: setUser("has-pin")
143149 }
144150 Button {
145151 text: "start auth (password)"
146152 width: parent.width
147− onClicked: LightDM.Greeter.authenticate("has-password")
153+ onClicked: setUser("has-password")
148154 }
149155
150156 TextField {
@@ -255,7 +261,7 @@ Rectangle {
255261 enteredLabel.text = ""
256262 minPinLengthTextField.text = data.minPinLength
257263 maxPinLengthTextField.text = data.maxPinLength
258− LightDM.Greeter.authenticate(data.username)
264+ setUser(data.username)
259265 waitForLockscreenReady();
260266
261267 var inputField = findChild(lockscreen, "pinentryField")
tests/qmltests/Launcher/tst_Launcher.qml+11−2
@@ -94,9 +94,16 @@ Item {
9494 name: "Launcher"
9595 when: windowShown && initTestCase.completed
9696
97+ function cleanup() {
98+ mouseClick(root, root.width / 2, root.height / 2);
99+ revealer.waitUntilLauncherDisappears();
100+ }
101+
97102 // Drag from the left edge of the screen rightwards and check that the launcher
98103 // appears (as if being dragged by the finger/pointer)
99104 function test_dragLeftEdgeToRevealLauncherAndTapCenterToDismiss() {
105+ revealer.waitUntilLauncherDisappears();
106+
100107 var panel = findChild(launcher, "launcherPanel")
101108 verify(panel != undefined)
102109
@@ -117,10 +124,9 @@ Item {
117124 corresponding desktop file. E.g. clicking on phone icon should yield
118125 launcherApplicationSelected("[...]dialer-app.desktop") */
119126 function test_clickingOnAppIconCausesSignalEmission() {
127+ revealer.dragLauncherIntoView();
120128 launcher.lastSelectedApplication = ""
121129
122− revealer.dragLauncherIntoView()
123−
124130 var listView = findChild(launcher, "launcherListView");
125131 listView.positionViewAtEnd();
126132
@@ -184,6 +190,7 @@ Item {
184190 }
185191
186192 function test_countEmblems() {
193+ revealer.dragLauncherIntoView();
187194 var launcherListView = findChild(launcher, "launcherListView");
188195 for (var i = 0; i < launcherListView.count; ++i) {
189196 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -192,6 +199,7 @@ Item {
192199 }
193200
194201 function test_progressOverlays() {
202+ revealer.dragLauncherIntoView();
195203 var launcherListView = findChild(launcher, "launcherListView");
196204 for (var i = 0; i < launcherListView.count; ++i) {
197205 var delegate = findChild(launcherListView, "launcherDelegate" + i)
@@ -200,6 +208,7 @@ Item {
200208 }
201209
202210 function test_focusedHighlight() {
211+ revealer.dragLauncherIntoView();
203212 var launcherListView = findChild(launcher, "launcherListView");
204213 for (var i = 0; i < launcherListView.count; ++i) {
205214 var delegate = findChild(launcherListView, "launcherDelegate" + i)
tests/qmltests/Panel/tst_ActiveCallHint.qml+1
@@ -95,6 +95,7 @@ Item {
9595 function test_activeHint(data) {
9696 if (data.dialer) {
9797 var application = ApplicationManager.startApplication("dialer-app");
98+ ApplicationManager.focusApplication("dialer-app");
9899 tryCompare(ApplicationManager, "focusedApplicationId", "dialer-app");
99100 tryCompare(application, "state", ApplicationInfo.Running);
100101
tests/qmltests/Stages/tst_PhoneStage.qml+9−56
@@ -33,7 +33,6 @@ Item {
3333 PhoneStage {
3434 id: phoneStage
3535 anchors { fill: parent; rightMargin: units.gu(30) }
36− shown: true
3736 dragAreaWidth: units.gu(2)
3837 }
3938
@@ -45,7 +44,6 @@ Item {
4544
4645 Rectangle {
4746 anchors { fill: parent; leftMargin: phoneStage.width }
48−// color: "blue"
4947
5048 Column {
5149 anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
@@ -59,7 +57,10 @@ Item {
5957 }
6058 Button {
6159 anchors { left: parent.left; right: parent.right }
62− text: "Add App"
60+ text: "Remove App"
61+ onClicked: {
62+ ApplicationManager.stopApplication(ApplicationManager.get(0).appId)
63+ }
6364 }
6465 }
6566 }
@@ -74,11 +75,8 @@ Item {
7475 for (var i = 0; i < count; i++) {
7576 var app = ApplicationManager.startApplication(ApplicationManager.availableApplications()[ApplicationManager.count])
7677 tryCompare(app, "state", ApplicationInfoInterface.Running)
77− // Fixme: Right now there is a timeout in the PhoneStage that displays a white splash
78− // screen rectangle when an app starts. This is because we don't yet have a way of
79− // knowing when an app has finished launching. That workaround and this wait() should
80− // go away at some point and the app's state only changing to Running when ready for real.
81−// wait(1000)
78+ var spreadView = findChild(phoneStage, "spreadView");
79+ tryCompare(spreadView, "contentX", -spreadView.shift);
8280 waitForRendering(phoneStage)
8381 }
8482 }
@@ -114,8 +112,6 @@ Item {
114112 true /* beginTouch */, true /* endTouch */, units.gu(10), 50);
115113
116114 tryCompare(ApplicationManager, "focusedApplicationId", activeApp.appId)
117−
118− tryCompare(phoneStage, "painting", false);
119115 }
120116
121117 function test_enterSpread_data() {
@@ -139,7 +135,7 @@ Item {
139135 var startX = phoneStage.width;
140136 var startY = phoneStage.height / 2;
141137 var endY = startY;
142− var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset - phoneStage.dragAreaWidth;
138+ var endX = spreadView.width - (spreadView.width * spreadView[data.positionMarker]) - data.offset;
143139
144140 var oldFocusedApp = ApplicationManager.get(0);
145141 var newFocusedApp = ApplicationManager.get(data.newFocusedIndex);
@@ -165,7 +161,6 @@ Item {
165161 mouseClick(app2, units.gu(1), units.gu(1));
166162 }
167163
168− tryCompare(phoneStage, "painting", false);
169164 tryCompare(ApplicationManager, "focusedApplicationId", newFocusedApp.appId);
170165 }
171166
@@ -212,16 +207,6 @@ Item {
212207 tryCompare(spreadView, "phase", 0);
213208 }
214209
215− function test_animateAppStartup() {
216− compare(phoneStage.painting, false);
217− addApps(2);
218− tryCompare(phoneStage, "painting", true);
219− tryCompare(phoneStage, "painting", false);
220− addApps(1);
221− tryCompare(phoneStage, "painting", true);
222− tryCompare(phoneStage, "painting", false);
223− }
224−
225210 function test_select_data() {
226211 return [
227212 { tag: "0", index: 0 },
@@ -240,41 +225,9 @@ Item {
240225
241226 phoneStage.select(selectedApp.appId);
242227
243− tryCompare(phoneStage, "painting", false);
244− compare(ApplicationManager.focusedApplicationId, selectedApp.appId);
245− }
228+ tryCompare(spreadView, "contentX", -spreadView.shift);
246229
247− function test_fullscreenMode() {
248− var fullscreenApp = null;
249− var normalApp = null;
250−
251− for (var i = 0; i < 5; i++) {
252− addApps(1);
253− var newApp = ApplicationManager.get(0);
254− tryCompare(phoneStage, "fullscreen", newApp.fullscreen);
255− if (newApp.fullscreen && fullscreenApp == null) {
256− fullscreenApp = newApp;
257− } else if (!newApp.fullscreen && normalApp == null){
258− normalApp = newApp;
259− }
260− }
261− verify(fullscreenApp != null); // Can't continue the test without having a fullscreen app
262− verify(normalApp != null); // Can't continue the test without having a non-fullscreen app
263−
264− // Select a normal app
265− goToSpread();
266− phoneStage.select(normalApp.appId);
267− tryCompare(phoneStage, "fullscreen", false);
268−
269− // Select a fullscreen app
270− goToSpread();
271− phoneStage.select(fullscreenApp.appId);
272− tryCompare(phoneStage, "fullscreen", true);
273−
274− // Select a normal app
275− goToSpread();
276− phoneStage.select(normalApp.appId);
277− tryCompare(phoneStage, "fullscreen", false);
230+ compare(ApplicationManager.focusedApplicationId, selectedApp.appId);
278231 }
279232
280233 function cleanup() {
tests/qmltests/tst_Shell.qml+108−7
@@ -236,6 +236,7 @@ Item {
236236
237237 // wait until the animation has finished
238238 tryCompare(greeter, "showProgress", 0);
239+ waitForRendering(greeter);
239240 }
240241
241242 /*
@@ -358,6 +359,58 @@ Item {
358359 verify(itemIsOnScreen(runningApplicationsGrid));
359360 }
360361
362+ function test_showInputMethod() {
363+ var item = findChild(shell, "inputMethod");
364+ var surface = SurfaceManager.inputMethodSurface();
365+
366+ surface.setState(MirSurfaceItem.Minimized);
367+ tryCompare(item, "visible", false);
368+
369+ surface.setState(MirSurfaceItem.Restored);
370+ tryCompare(item, "visible", true);
371+
372+ surface.setState(MirSurfaceItem.Minimized);
373+ tryCompare(item, "visible", false);
374+
375+ surface.setState(MirSurfaceItem.Maximized);
376+ tryCompare(item, "visible", true);
377+
378+ surface.setState(MirSurfaceItem.Minimized);
379+ tryCompare(item, "visible", false);
380+ }
381+
382+ function test_surfaceLosesFocusWhilePanelIsOpen() {
383+ var app = ApplicationManager.startApplication("dialer-app");
384+ // wait until the app is fully loaded (ie, real surface replaces splash screen)
385+ tryCompareFunction(function() { return app.surface != null }, true);
386+
387+ tryCompare(app.surface, "focus", true);
388+
389+ // Drag the indicators panel half-open
390+ var touchX = shell.width / 2;
391+ var indicators = findChild(shell, "indicators");
392+ touchFlick(indicators,
393+ touchX /* fromX */, indicators.panelHeight * 0.5 /* fromY */,
394+ touchX /* toX */, shell.height * 0.5 /* toY */,
395+ true /* beginTouch */, false /* endTouch */);
396+ verify(indicators.partiallyOpened);
397+
398+ tryCompare(app.surface, "focus", false);
399+
400+ // And finish getting it open
401+ touchFlick(indicators,
402+ touchX /* fromX */, shell.height * 0.5 /* fromY */,
403+ touchX /* toX */, shell.height * 0.9 /* toY */,
404+ false /* beginTouch */, true /* endTouch */);
405+ tryCompare(indicators, "fullyOpened", true);
406+
407+ tryCompare(app.surface, "focus", false);
408+
409+ dragToCloseIndicatorsPanel();
410+
411+ tryCompare(app.surface, "focus", true);
412+ }
413+
361414 // Wait for the whole UI to settle down
362415 function waitForUIToSettle() {
363416 waitUntilApplicationWindowIsFullyHidden();
@@ -365,6 +418,18 @@ Item {
365418 tryCompare(dashContentList, "moving", false);
366419 }
367420
421+ function dragToCloseIndicatorsPanel() {
422+ var indicators = findChild(shell, "indicators");
423+
424+ var touchStartX = shell.width / 2;
425+ var touchStartY = shell.height - (indicators.panelHeight * 0.5);
426+ touchFlick(shell,
427+ touchStartX, touchStartY,
428+ touchStartX, shell.height * 0.1);
429+
430+ tryCompare(indicators, "fullyClosed", true);
431+ }
432+
368433 function dragLauncherIntoView() {
369434 var launcherPanel = findChild(shell, "launcherPanel");
370435 verify(launcherPanel.x = - launcherPanel.width);
@@ -489,7 +554,7 @@ Item {
489554 {tag: "under greeter", greeter: true, app: false, launcher: false, indicators: false, expectedShown: false},
490555 {tag: "under app", greeter: false, app: true, launcher: false, indicators: false, expectedShown: false},
491556 {tag: "under launcher", greeter: false, app: false, launcher: true, indicators: false, expectedShown: true},
492− {tag: "under indicators", greeter: false, app: false, launcher: false, indicators: true, expectedShown: true},
557+ {tag: "under indicators", greeter: false, app: false, launcher: false, indicators: true, expectedShown: false},
493558 ]
494559 }
495560
@@ -519,16 +584,39 @@ Item {
519584 }
520585
521586 function test_focusRequestedHidesGreeter() {
522− var greeter = findChild(shell, "greeter")
587+ var greeter = findChild(shell, "greeter");
523588
524− greeter.show()
525− tryCompare(greeter, "showProgress", 1)
589+ var app = ApplicationManager.startApplication("dialer-app");
590+ // wait until the app is fully loaded (ie, real surface replaces splash screen)
591+ tryCompareFunction(function() { return app.surface != null }, true);
526592
527− ApplicationManager.focusRequested("notes-app")
528− tryCompare(greeter, "showProgress", 0)
529− waitUntilApplicationWindowIsFullyVisible()
593+ // Minimize the application we just launched
594+ swipeFromLeftEdge(units.gu(27));
595+
596+ // Wait for the whole UI to settle down
597+ waitUntilApplicationWindowIsFullyHidden();
598+
599+ greeter.show();
600+ tryCompare(greeter, "showProgress", 1);
601+
602+ // The main point of this test
603+ ApplicationManager.requestFocusApplication("dialer-app");
604+ tryCompare(greeter, "showProgress", 0);
605+ waitForRendering(greeter);
530606 }
531607
608+ function test_focusRequestedHidesIndicators() {
609+ var indicators = findChild(shell, "indicators");
610+
611+ showIndicators();
612+
613+ ApplicationManager.startApplication("camera-app");
614+ tryCompare(ApplicationManager, "count", 1);
615+
616+ tryCompare(indicators, "fullyClosed", true);
617+ }
618+
619+
532620 function test_showGreeterDBusCall() {
533621 var greeter = findChild(shell, "greeter")
534622 tryCompare(greeter, "showProgress", 0)
@@ -547,5 +635,18 @@ Item {
547635 swipeAwayGreeter()
548636 tryCompare(sessionSpy, "count", 1)
549637 }
638+
639+ function test_fullscreen() {
640+ var panel = findChild(shell, "panel");
641+ compare(panel.fullscreenMode, false);
642+ ApplicationManager.startApplication("camera-app");
643+ tryCompare(panel, "fullscreenMode", true);
644+ ApplicationManager.startApplication("gallery-app");
645+ tryCompare(panel, "fullscreenMode", false);
646+ ApplicationManager.requestFocusApplication("camera-app");
647+ tryCompare(panel, "fullscreenMode", true);
648+ ApplicationManager.requestFocusApplication("gallery-app");
649+ tryCompare(panel, "fullscreenMode", false);
650+ }
550651 }
551652}