on xenial help sign in
merge trunk
c38f4feMichael Zanetti
CMakeLists.txt+1
@@ -113,6 +113,7 @@ set(MOCK_INDICATOR_SERVICE_APP unity-mock-indicator-service)
113include_directories(
113include_directories(
114 ${CMAKE_SOURCE_DIR}/include
114 ${CMAKE_SOURCE_DIR}/include
115 ${CMAKE_BINARY_DIR}/include
115 ${CMAKE_BINARY_DIR}/include
116+ ${APPLICATION_API_INCLUDE_DIRS}
116)
117)
117
118
118# add subdirectories to build
119# add subdirectories to build
debian/changelog+64
@@ -1,9 +1,73 @@
1+unity8 (8.10+15.10.20150612-0ubuntu2) wily; urgency=medium
2+
3+ * No-change rebuild against Qt 5.4.2.
4+
5+ -- Timo Jyrinki <timo-jyrinki@ubuntu.com> Mon, 15 Jun 2015 12:33:07 +0300
6+
7+unity8 (8.10+15.10.20150612-0ubuntu1) wily; urgency=medium
8+
9+ [ Michał Sawicz ]
10+ * Implement full-shell rotation (LP: #1210199)
11+
12+ [ CI Train Bot ]
13+ * New rebuild forced.
14+ * Resync trunk.
15+
16+ [ Daniel d'Andrada ]
17+ * Implemented autopilot-test and fake-sensors for shell-rotation.
18+
19+ [ Mirco Müller ]
20+ * Implemented autopilot-test and fake-sensors for shell-rotation.
21+
22+ -- CI Train Bot <ci-train-bot@canonical.com> Fri, 12 Jun 2015 16:07:47 +0000
23+
1unity8 (8.10-0ubuntu1) UNRELEASED; urgency=medium
24unity8 (8.10-0ubuntu1) UNRELEASED; urgency=medium
2
25
3 * Implement full-shell rotation (LP: #1210199)
26 * Implement full-shell rotation (LP: #1210199)
4
27
5 -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 15 Apr 2015 14:47:17 +0200
28 -- Michał Sawicz <michal.sawicz@canonical.com> Wed, 15 Apr 2015 14:47:17 +0200
6
29
30+unity8 (8.02+15.10.20150603.1-0ubuntu1) wily; urgency=medium
31+
32+ [ CI Train Bot ]
33+ * New rebuild forced.
34+ * Resync trunk.
35+
36+ [ Renato Araujo Oliveira Filho ]
37+ * Set the device led color to green. (LP: #1450894)
38+
39+ -- CI Train Bot <ci-train-bot@canonical.com> Wed, 03 Jun 2015 21:42:35 +0000
40+
41+unity8 (8.02+15.10.20150518.1-0ubuntu1) wily; urgency=medium
42+
43+ [ Albert Astals Cid ]
44+ * Add overrides to override functions
45+ * Implement "rating-edit" preview widget (LP: #1318144)
46+ * Make the DashContent::test_mainNavigation test more stable (LP:
47+ #1450809)
48+ * Use art height as implicitHeight when the header is overlayed and
49+ there's no summary
50+
51+ [ CI Train Bot ]
52+ * New rebuild forced.
53+ * Resync trunk.
54+
55+ [ Daniel d'Andrada ]
56+ * Introducing FloatingFlickable
57+ * Make Ubuntu.Gestures components install TouchRegistry by themselves
58+
59+ [ Michael Terry ]
60+ * Fix a possible crash in our PAM threading code. (LP: #1425362) (LP:
61+ #1425362)
62+ * Fix the lockscreen becoming unresponsive after testing an app on the
63+ device from QtCreator. (LP: #1435364)
64+
65+ [ Nick Dedekind ]
66+ * Fixed desktop stage app focus.
67+ * Fixed issue in laggy indicator autpilot tests (LP: #1446846)
68+
69+ -- CI Train Bot <ci-train-bot@canonical.com> Mon, 18 May 2015 23:04:39 +0000
70+
7unity8 (8.02+15.04.20150511-0ubuntu1) vivid; urgency=medium
71unity8 (8.02+15.04.20150511-0ubuntu1) vivid; urgency=medium
8
72
9 [ Albert Astals Cid ]
73 [ Albert Astals Cid ]
libs/UbuntuGestures/CandidateInactivityTimer.cpp+7−2
@@ -19,12 +19,12 @@
19namespace UbuntuGestures {
19namespace UbuntuGestures {
20
20
21CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate,
21CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *candidate,
22− AbstractTimerFactory &timerFactory, QObject *parent)
22+ AbstractTimer *timer, QObject *parent)
23 : QObject(parent)
23 : QObject(parent)
24+ , m_timer(timer)
24 , m_touchId(touchId)
25 , m_touchId(touchId)
25 , m_candidate(candidate)
26 , m_candidate(candidate)
26{
27{
27− m_timer = timerFactory.createTimer(this);
28 connect(m_timer, &AbstractTimer::timeout,
28 connect(m_timer, &AbstractTimer::timeout,
29 this, &CandidateInactivityTimer::onTimeout);
29 this, &CandidateInactivityTimer::onTimeout);
30 m_timer->setInterval(durationMs);
30 m_timer->setInterval(durationMs);
@@ -32,6 +32,11 @@ CandidateInactivityTimer::CandidateInactivityTimer(int touchId, QQuickItem *cand
32 m_timer->start();
32 m_timer->start();
33}
33}
34
34
35+CandidateInactivityTimer::~CandidateInactivityTimer()
36+{
37+ delete m_timer;
38+}
39+
35void CandidateInactivityTimer::onTimeout()
40void CandidateInactivityTimer::onTimeout()
36{
41{
37 qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId);
42 qWarning("[TouchRegistry] Candidate for touch %d defaulted!", m_touchId);
libs/UbuntuGestures/CandidateInactivityTimer.h+3−1
@@ -29,9 +29,11 @@ class UBUNTUGESTURES_EXPORT CandidateInactivityTimer : public QObject {
29 Q_OBJECT
29 Q_OBJECT
30public:
30public:
31 CandidateInactivityTimer(int touchId, QQuickItem *candidate,
31 CandidateInactivityTimer(int touchId, QQuickItem *candidate,
32− AbstractTimerFactory &timerFactory,
32+ AbstractTimer *timer,
33 QObject *parent = nullptr);
33 QObject *parent = nullptr);
34
34
35+ virtual ~CandidateInactivityTimer();
36+
35 const int durationMs = 1000;
37 const int durationMs = 1000;
36
38
37Q_SIGNALS:
39Q_SIGNALS:
libs/UbuntuGestures/Timer.cpp−10
@@ -115,16 +115,6 @@ FakeTimerFactory::FakeTimerFactory()
115 m_timeSource.reset(new FakeTimeSource);
115 m_timeSource.reset(new FakeTimeSource);
116}
116}
117
117
118−FakeTimerFactory::~FakeTimerFactory()
119−{
120− for (int i = 0; i < timers.count(); ++i) {
121− FakeTimer *timer = timers[i].data();
122− if (timer) {
123− delete timer;
124− }
125− }
126−}
127−
128void FakeTimerFactory::updateTime(qint64 targetTime)
118void FakeTimerFactory::updateTime(qint64 targetTime)
129{
119{
130 qint64 minTimeoutTime = targetTime;
120 qint64 minTimeoutTime = targetTime;
libs/UbuntuGestures/Timer.h+1−1
@@ -101,7 +101,7 @@ class UBUNTUGESTURES_EXPORT FakeTimerFactory : public AbstractTimerFactory
101{
101{
102public:
102public:
103 FakeTimerFactory();
103 FakeTimerFactory();
104− virtual ~FakeTimerFactory();
104+ virtual ~FakeTimerFactory() {}
105
105
106 void updateTime(qint64 msecsSinceReference);
106 void updateTime(qint64 msecsSinceReference);
107 QSharedPointer<TimeSource> timeSource() { return m_timeSource; }
107 QSharedPointer<TimeSource> timeSource() { return m_timeSource; }
libs/UbuntuGestures/TouchRegistry.cpp+16−12
@@ -41,20 +41,10 @@ using namespace UbuntuGestures;
41TouchRegistry *TouchRegistry::m_instance = nullptr;
41TouchRegistry *TouchRegistry::m_instance = nullptr;
42
42
43TouchRegistry::TouchRegistry(QObject *parent)
43TouchRegistry::TouchRegistry(QObject *parent)
44− : TouchRegistry(parent, new TimerFactory)
45−{
46−}
47−
48−TouchRegistry::TouchRegistry(QObject *parent, AbstractTimerFactory *timerFactory)
49 : QObject(parent)
44 : QObject(parent)
50 , m_inDispatchLoop(false)
45 , m_inDispatchLoop(false)
51− , m_timerFactory(timerFactory)
46+ , m_timerFactory(new TimerFactory)
52{
47{
53− if (m_instance == nullptr) {
54− m_instance = this;
55− } else {
56− qFatal("Cannot have more than one instance of TouchRegistry. It must be a singleton.");
57− }
58}
48}
59
49
60TouchRegistry::~TouchRegistry()
50TouchRegistry::~TouchRegistry()
@@ -64,6 +54,20 @@ TouchRegistry::~TouchRegistry()
64 delete m_timerFactory;
54 delete m_timerFactory;
65}
55}
66
56
57+TouchRegistry *TouchRegistry::instance()
58+{
59+ if (m_instance == nullptr) {
60+ m_instance = new TouchRegistry;
61+ }
62+ return m_instance;
63+}
64+
65+void TouchRegistry::setTimerFactory(AbstractTimerFactory *timerFactory)
66+{
67+ delete m_timerFactory;
68+ m_timerFactory = timerFactory;
69+}
70+
67void TouchRegistry::update(const QTouchEvent *event)
71void TouchRegistry::update(const QTouchEvent *event)
68{
72{
69 #if TOUCHREGISTRY_DEBUG
73 #if TOUCHREGISTRY_DEBUG
@@ -261,7 +265,7 @@ void TouchRegistry::addCandidateOwnerForTouch(int id, QQuickItem *candidate)
261 candidateInfo.state = CandidateInfo::Undecided;
265 candidateInfo.state = CandidateInfo::Undecided;
262 candidateInfo.item = candidate;
266 candidateInfo.item = candidate;
263 candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate,
267 candidateInfo.inactivityTimer = new CandidateInactivityTimer(id, candidate,
264− *m_timerFactory,
268+ m_timerFactory->createTimer(),
265 this);
269 this);
266 connect(candidateInfo.inactivityTimer, &CandidateInactivityTimer::candidateDefaulted,
270 connect(candidateInfo.inactivityTimer, &CandidateInactivityTimer::candidateDefaulted,
267 this, &TouchRegistry::rejectCandidateOwnerForTouch);
271 this, &TouchRegistry::rejectCandidateOwnerForTouch);
libs/UbuntuGestures/TouchRegistry.h+8−6
@@ -25,6 +25,7 @@
25
25
26#include "UbuntuGesturesGlobal.h"
26#include "UbuntuGesturesGlobal.h"
27#include "CandidateInactivityTimer.h"
27#include "CandidateInactivityTimer.h"
28+#include "Timer.h"
28#include "Pool.h"
29#include "Pool.h"
29
30
30namespace UbuntuGestures {
31namespace UbuntuGestures {
@@ -93,15 +94,10 @@ class UBUNTUGESTURES_EXPORT TouchRegistry : public QObject
93{
94{
94 Q_OBJECT
95 Q_OBJECT
95public:
96public:
96− TouchRegistry(QObject *parent = nullptr);
97− // Useful for tests, where you should feed a fake timer
98− TouchRegistry(QObject *parent, UbuntuGestures::AbstractTimerFactory *timerFactory);
99−
100 virtual ~TouchRegistry();
97 virtual ~TouchRegistry();
101
98
102 // Returns a pointer to the application's TouchRegistry instance.
99 // Returns a pointer to the application's TouchRegistry instance.
103− // If no instance has been allocated, null is returned.
104− static TouchRegistry *instance() { return m_instance; }
100+ static TouchRegistry *instance();
105
101
106 void update(const QTouchEvent *event);
102 void update(const QTouchEvent *event);
107
103
@@ -128,10 +124,16 @@ public:
128 // but would nonetheless like to be kept up-to-date on its state.
124 // but would nonetheless like to be kept up-to-date on its state.
129 void addTouchWatcher(int touchId, QQuickItem *watcherItem);
125 void addTouchWatcher(int touchId, QQuickItem *watcherItem);
130
126
127+ // Useful for tests, where you should use fake timers
128+ void setTimerFactory(UbuntuGestures::AbstractTimerFactory *timerFactory);
129+
131private Q_SLOTS:
130private Q_SLOTS:
132 void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate);
131 void rejectCandidateOwnerForTouch(int id, QQuickItem *candidate);
133
132
134private:
133private:
134+ // Only instance() can cronstruct one
135+ TouchRegistry(QObject *parent = nullptr);
136+
135 class CandidateInfo {
137 class CandidateInfo {
136 public:
138 public:
137 enum {
139 enum {
plugins/AccountsService/plugin.h+1−1
@@ -28,7 +28,7 @@ class AccountsServicePlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
plugins/Dash/CardCreator.js+2
@@ -644,6 +644,8 @@ function cardString(template, components) {
644 var implicitHeight = 'implicitHeight: ';
644 var implicitHeight = 'implicitHeight: ';
645 if (hasSummary) {
645 if (hasSummary) {
646 implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
646 implicitHeight += 'summary.y + summary.height + units.gu(1);\n';
647+ } else if (headerAsOverlay) {
648+ implicitHeight += 'artShapeHolder.height;\n';
647 } else if (hasHeaderRow) {
649 } else if (hasHeaderRow) {
648 implicitHeight += 'row.y + row.height + units.gu(1);\n';
650 implicitHeight += 'row.y + row.height + units.gu(1);\n';
649 } else if (hasMascot) {
651 } else if (hasMascot) {
plugins/Dash/plugin.h+1−1
@@ -27,7 +27,7 @@ class DashPlugin : public QQmlExtensionPlugin
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28
28
29public:
29public:
30− void registerTypes(const char *uri);
30+ void registerTypes(const char *uri) override;
31};
31};
32
32
33#endif
33#endif
plugins/Greeter/Unity/Launcher/launchermodelas.h+9−9
@@ -37,19 +37,19 @@ public:
37 LauncherModel(QObject *parent = 0);
37 LauncherModel(QObject *parent = 0);
38 ~LauncherModel();
38 ~LauncherModel();
39
39
40− int rowCount(const QModelIndex &parent = QModelIndex()) const;
40+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
41
41
42− QVariant data(const QModelIndex &index, int role) const;
42+ QVariant data(const QModelIndex &index, int role) const override;
43
43
44− Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const;
44+ Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
45− Q_INVOKABLE void move(int oldIndex, int newIndex);
45+ Q_INVOKABLE void move(int oldIndex, int newIndex) override;
46− Q_INVOKABLE void pin(const QString &appId, int index = -1);
46+ Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
47− Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
47+ Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex) override;
48− Q_INVOKABLE void setUser(const QString &username);
48+ Q_INVOKABLE void setUser(const QString &username) override;
49 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
49 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
50
50
51− unity::shell::application::ApplicationManagerInterface* applicationManager() const;
51+ unity::shell::application::ApplicationManagerInterface* applicationManager() const override;
52− void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager);
52+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager) override;
53
53
54 bool onlyPinned() const override;
54 bool onlyPinned() const override;
55 void setOnlyPinned(bool onlyPinned) override;
55 void setOnlyPinned(bool onlyPinned) override;
plugins/Greeter/Unity/Launcher/plugin.h+1−1
@@ -26,7 +26,7 @@ class UnityLauncherPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif
32#endif
plugins/Greeter/Unity/Launcher/quicklistmodel.h+2−2
@@ -45,8 +45,8 @@ public:
45
45
46 QuickListEntry get(int index) const;
46 QuickListEntry get(int index) const;
47
47
48− int rowCount(const QModelIndex &parent = QModelIndex()) const;
48+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
49− QVariant data(const QModelIndex &index, int role) const;
49+ QVariant data(const QModelIndex &index, int role) const override;
50
50
51private:
51private:
52 QList<QuickListEntry> m_list;
52 QList<QuickListEntry> m_list;
plugins/LightDM/UsersModel.cpp+1−1
@@ -32,7 +32,7 @@ class MangleModel : public QSortFilterProxyModel
32public:
32public:
33 explicit MangleModel(QObject* parent=0);
33 explicit MangleModel(QObject* parent=0);
34
34
35− virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
35+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
36};
36};
37
37
38MangleModel::MangleModel(QObject* parent)
38MangleModel::MangleModel(QObject* parent)
plugins/LightDM/liblightdm/GreeterPrivate.cpp+29−5
@@ -56,7 +56,8 @@ public:
56 this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
56 this, SLOT(handleMessage(pam_handle *, QString, QLightDM::Greeter::MessageType)));
57 // This next connect is how we pass ResponseFutures between threads
57 // This next connect is how we pass ResponseFutures between threads
58 connect(this, SIGNAL(showPrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
58 connect(this, SIGNAL(showPrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
59− this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)));
59+ this, SLOT(handlePrompt(pam_handle *, QString, QLightDM::Greeter::PromptType, QLightDM::GreeterImpl::ResponseFuture)),
60+ Qt::BlockingQueuedConnection);
60 }
61 }
61
62
62 ~GreeterImpl()
63 ~GreeterImpl()
@@ -68,6 +69,13 @@ public:
68 {
69 {
69 // Clear out any existing PAM interactions first
70 // Clear out any existing PAM interactions first
70 cancelPam();
71 cancelPam();
72+ if (pamHandle != nullptr) {
73+ // While we were cancelling pam above, we processed Qt events.
74+ // Which may have allowed someone to call start() on us again.
75+ // In which case, we'll bail on our current start() call.
76+ // This isn't racy because it's all in the same thread.
77+ return;
78+ }
71
79
72 AppData *appData = new AppData();
80 AppData *appData = new AppData();
73 appData->impl = this;
81 appData->impl = this;
@@ -79,7 +87,7 @@ public:
79
87
80 if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
88 if (pam_start("lightdm", username.toUtf8(), &conversation, &pamHandle) == PAM_SUCCESS) {
81 appData->handle = pamHandle;
89 appData->handle = pamHandle;
82− futureWatcher.setFuture(QtConcurrent::run(authenticateWithPam, pamHandle));
90+ futureWatcher.setFuture(QtConcurrent::mapped(QList<pam_handle*>() << pamHandle, authenticateWithPam));
83 } else {
91 } else {
84 delete appData;
92 delete appData;
85 greeterPrivate->authenticated = false;
93 greeterPrivate->authenticated = false;
@@ -88,7 +96,7 @@ public:
88 }
96 }
89 }
97 }
90
98
91− static int authenticateWithPam(pam_handle* pamHandle)
99+ static int authenticateWithPam(pam_handle* const& pamHandle)
92 {
100 {
93 int pamStatus = pam_authenticate(pamHandle, 0);
101 int pamStatus = pam_authenticate(pamHandle, 0);
94 if (pamStatus == PAM_SUCCESS) {
102 if (pamStatus == PAM_SUCCESS) {
@@ -242,11 +250,22 @@ private Q_SLOTS:
242private:
250private:
243 void cancelPam()
251 void cancelPam()
244 {
252 {
245− // Unfortunately we can't simply cancel our QFuture because QtConcurrent::run doesn't support cancel
246 if (pamHandle != nullptr) {
253 if (pamHandle != nullptr) {
254+ QFuture<int> pamFuture = futureWatcher.future();
247 pam_handle *handle = pamHandle;
255 pam_handle *handle = pamHandle;
248 pamHandle = nullptr; // to disable normal finishPam() handling
256 pamHandle = nullptr; // to disable normal finishPam() handling
257+ pamFuture.cancel();
258+
259+ // Note the empty loop, we just want to clear the futures queue.
260+ // Any further prompts from the pam thread will be immediately
261+ // responded to/dismissed in handlePrompt().
249− while (respond(QString())); // clear our local queue of QFutures
262+ while (respond(QString()));
263+
264+ // Now let signal/slot handling happen so the thread can finish
265+ while (!pamFuture.isFinished()) {
266+ QCoreApplication::processEvents();
267+ }
268+
250 pam_end(handle, PAM_CONV_ERR);
269 pam_end(handle, PAM_CONV_ERR);
251 }
270 }
252 }
271 }
@@ -266,6 +285,11 @@ GreeterPrivate::GreeterPrivate(Greeter* parent)
266{
285{
267}
286}
268
287
288+GreeterPrivate::~GreeterPrivate()
289+{
290+ delete m_impl;
291+}
292+
269void GreeterPrivate::handleAuthenticate()
293void GreeterPrivate::handleAuthenticate()
270{
294{
271 m_impl->start(authenticationUser);
295 m_impl->start(authenticationUser);
plugins/LightDM/liblightdm/GreeterPrivate.h+1−1
@@ -30,7 +30,7 @@ class GreeterPrivate
30{
30{
31public:
31public:
32 explicit GreeterPrivate(Greeter* parent=0);
32 explicit GreeterPrivate(Greeter* parent=0);
33− virtual ~GreeterPrivate() = default;
33+ virtual ~GreeterPrivate();
34
34
35 // These variables may not be used by all subclasses, that's no problem
35 // These variables may not be used by all subclasses, that's no problem
36 bool authenticated;
36 bool authenticated;
plugins/LightDM/liblightdm/UsersModel.h+2−2
@@ -53,8 +53,8 @@ public:
53 BackgroundPathRole
53 BackgroundPathRole
54 };
54 };
55
55
56− int rowCount(const QModelIndex &parent) const;
56+ int rowCount(const QModelIndex &parent) const override;
57− QVariant data(const QModelIndex &index, int role) const;
57+ QVariant data(const QModelIndex &index, int role) const override;
58
58
59private:
59private:
60 UsersModelPrivate * const d_ptr;
60 UsersModelPrivate * const d_ptr;
plugins/LightDM/plugin.h+1−1
@@ -29,7 +29,7 @@ class LightDMPlugin : public QQmlExtensionPlugin
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
30
30
31public:
31public:
32− void registerTypes(const char *uri);
32+ void registerTypes(const char *uri) override;
33};
33};
34
34
35#endif
35#endif
plugins/Lights/plugin.h+1−1
@@ -28,7 +28,7 @@ class LightsPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
plugins/Powerd/plugin.h+1−1
@@ -29,7 +29,7 @@ class PowerdPlugin : public QQmlExtensionPlugin
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
30
30
31public:
31public:
32− void registerTypes(const char *uri);
32+ void registerTypes(const char *uri) override;
33};
33};
34
34
35#endif
35#endif
plugins/ScreenGrabber/plugin.h+1−1
@@ -27,7 +27,7 @@ class ScreenGrabberPlugin : public QQmlExtensionPlugin
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28
28
29public:
29public:
30− void registerTypes(const char *uri);
30+ void registerTypes(const char *uri) override;
31};
31};
32
32
33#endif // SCREENGRABBER_PLUGIN_H
33#endif // SCREENGRABBER_PLUGIN_H
plugins/SessionBroadcast/plugin.h+1−1
@@ -27,7 +27,7 @@ class SessionBroadcastPlugin : public QQmlExtensionPlugin
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28
28
29public:
29public:
30− void registerTypes(const char *uri);
30+ void registerTypes(const char *uri) override;
31};
31};
32
32
33#endif
33#endif
plugins/Ubuntu/DownloadDaemonListener/plugin.h+2−2
@@ -31,7 +31,7 @@ class BackendPlugin : public QQmlExtensionPlugin
31 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
31 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
32
32
33public:
33public:
34− void registerTypes(const char *uri);
34+ void registerTypes(const char *uri) override;
35− void initializeEngine(QQmlEngine *engine, const char *uri);
35+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
36};
36};
37#endif // BACKEND_PLUGIN_H
37#endif // BACKEND_PLUGIN_H
plugins/Ubuntu/Gestures/CMakeLists.txt+1
@@ -7,6 +7,7 @@ set(UbuntuGesturesQml_SOURCES
7 Damper.cpp
7 Damper.cpp
8 Direction.cpp
8 Direction.cpp
9 DirectionalDragArea.cpp
9 DirectionalDragArea.cpp
10+ FloatingFlickable.cpp
10 PressedOutsideNotifier.cpp
11 PressedOutsideNotifier.cpp
11 TouchDispatcher.cpp
12 TouchDispatcher.cpp
12 TouchGate.cpp
13 TouchGate.cpp
plugins/Ubuntu/Gestures/Direction.cpp+6−3
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -25,12 +25,15 @@ bool Direction::isHorizontal(Direction::Type type)
25
25
26bool Direction::isVertical(Direction::Type type)
26bool Direction::isVertical(Direction::Type type)
27{
27{
28− return type == Direction::Upwards || type == Direction::Downwards;
28+ return type == Direction::Upwards
29+ || type == Direction::Downwards
30+ || type == Direction::Vertical;
29}
31}
30
32
31bool Direction::isPositive(Direction::Type type)
33bool Direction::isPositive(Direction::Type type)
32{
34{
33 return type == Rightwards
35 return type == Rightwards
34 || type == Downwards
36 || type == Downwards
35− || type == Horizontal;
37+ || type == Horizontal
38+ || type == Vertical;
36}
39}
plugins/Ubuntu/Gestures/Direction.h+3−2
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -34,7 +34,8 @@ public:
34 Leftwards, // Along the negative direction of the X axis
34 Leftwards, // Along the negative direction of the X axis
35 Downwards, // Along the positive direction of the Y axis
35 Downwards, // Along the positive direction of the Y axis
36 Upwards, // Along the negative direction of the Y axis
36 Upwards, // Along the negative direction of the Y axis
37− Horizontal // Along the X axis, in any direction
37+ Horizontal, // Along the X axis, in any direction
38+ Vertical // Along the Y axis, in any direction
38 };
39 };
39
40
40 Q_INVOKABLE static bool isHorizontal(Direction::Type type);
41 Q_INVOKABLE static bool isHorizontal(Direction::Type type);
plugins/Ubuntu/Gestures/DirectionalDragArea.cpp+5−2
@@ -506,7 +506,7 @@ const QTouchEvent::TouchPoint *DirectionalDragAreaPrivate::fetchTargetTouchPoint
506
506
507bool DirectionalDragAreaPrivate::movingInRightDirection() const
507bool DirectionalDragAreaPrivate::movingInRightDirection() const
508{
508{
509− if (direction == Direction::Horizontal) {
509+ if (direction == Direction::Horizontal || direction == Direction::Vertical) {
510 return true;
510 return true;
511 } else {
511 } else {
512 QPointF movementVector(dampedScenePos.x() - previousDampedScenePos.x(),
512 QPointF movementVector(dampedScenePos.x() - previousDampedScenePos.x(),
@@ -532,7 +532,7 @@ bool DirectionalDragAreaPrivate::movedFarEnoughAlongGestureAxis() const
532 ddaDebug(" movedFarEnoughAlongGestureAxis: scalarProjection=" << scalarProjection
532 ddaDebug(" movedFarEnoughAlongGestureAxis: scalarProjection=" << scalarProjection
533 << ", distanceThreshold=" << distanceThreshold);
533 << ", distanceThreshold=" << distanceThreshold);
534
534
535− if (direction == Direction::Horizontal) {
535+ if (direction == Direction::Horizontal || direction == Direction::Vertical) {
536 return qAbs(scalarProjection) > distanceThreshold;
536 return qAbs(scalarProjection) > distanceThreshold;
537 } else {
537 } else {
538 return scalarProjection > distanceThreshold;
538 return scalarProjection > distanceThreshold;
@@ -712,6 +712,8 @@ void DirectionalDragArea::itemChange(ItemChange change, const ItemChangeData &va
712{
712{
713 if (change == QQuickItem::ItemSceneChange) {
713 if (change == QQuickItem::ItemSceneChange) {
714 if (value.window != nullptr) {
714 if (value.window != nullptr) {
715+ value.window->installEventFilter(TouchRegistry::instance());
716+
715 // TODO: Handle window->screen() changes (ie window changing screens)
717 // TODO: Handle window->screen() changes (ie window changing screens)
716 qreal pixelsPerMm = value.window->screen()->physicalDotsPerInch() / 25.4;
718 qreal pixelsPerMm = value.window->screen()->physicalDotsPerInch() / 25.4;
717 d->setPixelsPerMm(pixelsPerMm);
719 d->setPixelsPerMm(pixelsPerMm);
@@ -843,6 +845,7 @@ void DirectionalDragAreaPrivate::updateSceneDirectionVector()
843 localDirection.ry() = -1.;
845 localDirection.ry() = -1.;
844 break;
846 break;
845 case Direction::Downwards:
847 case Direction::Downwards:
848+ case Direction::Vertical:
846 localDirection.rx() = 0.;
849 localDirection.rx() = 0.;
847 localDirection.ry() = 1;
850 localDirection.ry() = 1;
848 break;
851 break;
plugins/Ubuntu/Gestures/DirectionalDragArea.h+2−2
@@ -125,8 +125,8 @@ Q_SIGNALS:
125 void immediateRecognitionChanged(bool value);
125 void immediateRecognitionChanged(bool value);
126
126
127protected:
127protected:
128− virtual void touchEvent(QTouchEvent *event);
128+ void touchEvent(QTouchEvent *event) override;
129− virtual void itemChange(ItemChange change, const ItemChangeData &value);
129+ void itemChange(ItemChange change, const ItemChangeData &value) override;
130
130
131public: // so tests can access it
131public: // so tests can access it
132 DirectionalDragAreaPrivate *d;
132 DirectionalDragAreaPrivate *d;
plugins/Ubuntu/Gestures/FloatingFlickable.cppnew file+150
@@ -0,0 +1,150 @@
1+/*
2+ * Copyright (C) 2015 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 "FloatingFlickable.h"
18+
19+#include <private/qquickflickable_p.h>
20+#include "DirectionalDragArea.h"
21+
22+#include <QDebug>
23+
24+FloatingFlickable::FloatingFlickable(QQuickItem *parent)
25+ : QQuickItem(parent)
26+ , m_mousePressed(false)
27+{
28+ m_dragArea = new DirectionalDragArea(this);
29+ m_dragArea->setWidth(width());
30+ m_dragArea->setHeight(height());
31+ m_dragArea->setDirection(Direction::Horizontal);
32+ connect(m_dragArea, &DirectionalDragArea::touchXChanged,
33+ this, &FloatingFlickable::onDragAreaTouchPosChanged);
34+ connect(m_dragArea, &DirectionalDragArea::touchYChanged,
35+ this, &FloatingFlickable::onDragAreaTouchPosChanged);
36+ connect(m_dragArea, &DirectionalDragArea::draggingChanged,
37+ this, &FloatingFlickable::onDragAreaDraggingChanged);
38+ connect(m_dragArea, &DirectionalDragArea::directionChanged, this, &FloatingFlickable::directionChanged);
39+
40+ m_flickable = new QQuickFlickable(this);
41+ m_flickable->setEnabled(false);
42+ m_flickable->setWidth(width());
43+ m_flickable->setHeight(height());
44+ connect(m_flickable, &QQuickFlickable::contentWidthChanged, this, &FloatingFlickable::contentWidthChanged);
45+ connect(m_flickable, &QQuickFlickable::contentHeightChanged, this, &FloatingFlickable::contentHeightChanged);
46+ connect(m_flickable, &QQuickFlickable::contentXChanged, this, &FloatingFlickable::contentXChanged);
47+ connect(m_flickable, &QQuickFlickable::contentYChanged, this, &FloatingFlickable::contentYChanged);
48+
49+ connect(this, &QQuickItem::widthChanged, this, &FloatingFlickable::updateChildrenWidth);
50+ connect(this, &QQuickItem::heightChanged, this, &FloatingFlickable::updateChildrenHeight);
51+}
52+
53+qreal FloatingFlickable::contentWidth() const
54+{
55+ return m_flickable->contentWidth();
56+}
57+
58+void FloatingFlickable::setContentWidth(qreal contentWidth)
59+{
60+ m_flickable->setContentWidth(contentWidth);
61+}
62+
63+qreal FloatingFlickable::contentHeight() const
64+{
65+ return m_flickable->contentHeight();
66+}
67+
68+void FloatingFlickable::setContentHeight(qreal contentHeight)
69+{
70+ m_flickable->setContentHeight(contentHeight);
71+}
72+
73+qreal FloatingFlickable::contentX() const
74+{
75+ return m_flickable->contentX();
76+}
77+
78+void FloatingFlickable::setContentX(qreal contentX)
79+{
80+ m_flickable->setContentX(contentX);
81+}
82+
83+qreal FloatingFlickable::contentY() const
84+{
85+ return m_flickable->contentY();
86+}
87+
88+void FloatingFlickable::setContentY(qreal contentY)
89+{
90+ m_flickable->setContentY(contentY);
91+}
92+
93+Direction::Type FloatingFlickable::direction() const
94+{
95+ return m_dragArea->direction();
96+}
97+
98+void FloatingFlickable::setDirection(Direction::Type direction)
99+{
100+ m_dragArea->setDirection(direction);
101+ if (Direction::isHorizontal(direction)) {
102+ m_flickable->setFlickableDirection(QQuickFlickable::HorizontalFlick);
103+ } else {
104+ m_flickable->setFlickableDirection(QQuickFlickable::VerticalFlick);
105+ }
106+}
107+
108+void FloatingFlickable::updateChildrenWidth()
109+{
110+ m_dragArea->setWidth(width());
111+ m_flickable->setWidth(width());
112+}
113+
114+void FloatingFlickable::updateChildrenHeight()
115+{
116+ m_dragArea->setHeight(height());
117+ m_flickable->setHeight(height());
118+}
119+
120+void FloatingFlickable::onDragAreaTouchPosChanged(qreal)
121+{
122+ if (m_mousePressed) {
123+ QMouseEvent mouseEvent(QEvent::MouseMove,
124+ QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
125+ Qt::NoButton, Qt::LeftButton, Qt::NoModifier);
126+
127+ QCoreApplication::sendEvent(m_flickable, &mouseEvent);
128+
129+ }
130+}
131+
132+void FloatingFlickable::onDragAreaDraggingChanged(bool dragging)
133+{
134+ if (dragging && !m_mousePressed) {
135+ QMouseEvent mouseEvent(QEvent::MouseButtonPress,
136+ QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
137+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
138+
139+ QCoreApplication::sendEvent(m_flickable, &mouseEvent);
140+ m_mousePressed = true;
141+
142+ } else if (!dragging && m_mousePressed) {
143+ QMouseEvent mouseEvent(QEvent::MouseButtonRelease,
144+ QPointF(m_dragArea->touchX(),m_dragArea->touchY()),
145+ Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
146+
147+ QCoreApplication::sendEvent(m_flickable, &mouseEvent);
148+ m_mousePressed = false;
149+ }
150+}
plugins/Ubuntu/Gestures/FloatingFlickable.hnew file+86
@@ -0,0 +1,86 @@
1+/*
2+ * Copyright (C) 2015 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 FLOATING_FLICKABLE_H
18+#define FLOATING_FLICKABLE_H
19+
20+#include <QQuickItem>
21+#include "UbuntuGesturesQmlGlobal.h"
22+#include "Direction.h"
23+
24+class DirectionalDragArea;
25+class QQuickFlickable;
26+
27+/*
28+ A Flickable that can be put in front of the item to be flicked and
29+ still have the item-to-be-flicked receive input events that are not flicks.
30+
31+ Ie, it's a Flickable that, input-wise, is transparent to non-flick gestures.
32+
33+ With a regular Flickable you would have to make the item-to-be-flicked a child
34+ of Flicakble to achieve the same result. FloatingFlickable has no such requirement
35+ or limitation.
36+ */
37+class UBUNTUGESTURESQML_EXPORT FloatingFlickable : public QQuickItem {
38+ Q_OBJECT
39+
40+ Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth NOTIFY contentWidthChanged)
41+ Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight NOTIFY contentHeightChanged)
42+ Q_PROPERTY(qreal contentX READ contentX WRITE setContentX NOTIFY contentXChanged)
43+ Q_PROPERTY(qreal contentY READ contentY WRITE setContentY NOTIFY contentYChanged)
44+
45+ Q_PROPERTY(Direction::Type direction READ direction WRITE setDirection NOTIFY directionChanged)
46+
47+Q_SIGNALS:
48+ void contentWidthChanged();
49+ void contentHeightChanged();
50+ void contentXChanged();
51+ void contentYChanged();
52+ void directionChanged();
53+
54+public:
55+ FloatingFlickable(QQuickItem *parent = nullptr);
56+
57+ qreal contentWidth() const;
58+ void setContentWidth(qreal contentWidth);
59+
60+ qreal contentHeight() const;
61+ void setContentHeight(qreal contentHeight);
62+
63+ qreal contentX() const;
64+ void setContentX(qreal contentX);
65+
66+ qreal contentY() const;
67+ void setContentY(qreal contentY);
68+
69+ Direction::Type direction() const;
70+ void setDirection(Direction::Type);
71+
72+private Q_SLOTS:
73+ void updateChildrenWidth();
74+ void updateChildrenHeight();
75+ void onDragAreaTouchPosChanged(qreal);
76+ void onDragAreaDraggingChanged(bool value);
77+
78+private:
79+ DirectionalDragArea *m_dragArea;
80+ QQuickFlickable *m_flickable;
81+ bool m_mousePressed;
82+
83+ friend class tst_FloatingFlickable;
84+};
85+
86+#endif // FLOATING_FLICKABLE_H
plugins/Ubuntu/Gestures/TouchGate.cpp+10
@@ -18,6 +18,7 @@
18
18
19#include <QCoreApplication>
19#include <QCoreApplication>
20#include <QDebug>
20#include <QDebug>
21+#include <QQuickWindow>
21
22
22#include <TouchOwnershipEvent.h>
23#include <TouchOwnershipEvent.h>
23#include <TouchRegistry.h>
24#include <TouchRegistry.h>
@@ -102,6 +103,15 @@ void TouchGate::touchEvent(QTouchEvent *event)
102 }
103 }
103}
104}
104
105
106+void TouchGate::itemChange(ItemChange change, const ItemChangeData &value)
107+{
108+ if (change == QQuickItem::ItemSceneChange) {
109+ if (value.window != nullptr) {
110+ value.window->installEventFilter(TouchRegistry::instance());
111+ }
112+ }
113+}
114+
105void TouchGate::touchOwnershipEvent(TouchOwnershipEvent *event)
115void TouchGate::touchOwnershipEvent(TouchOwnershipEvent *event)
106{
116{
107 // TODO: Optimization: batch those actions as TouchOwnershipEvents
117 // TODO: Optimization: batch those actions as TouchOwnershipEvents
plugins/Ubuntu/Gestures/TouchGate.h+1
@@ -57,6 +57,7 @@ Q_SIGNALS:
57
57
58protected:
58protected:
59 void touchEvent(QTouchEvent *event) override;
59 void touchEvent(QTouchEvent *event) override;
60+ void itemChange(ItemChange change, const ItemChangeData &value) override;
60
61
61private Q_SLOTS:
62private Q_SLOTS:
62 void onEnabledChanged();
63 void onEnabledChanged();
plugins/Ubuntu/Gestures/plugin.cpp+3−1
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2013 Canonical, Ltd.
2+ * Copyright (C) 2013,2015 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -18,6 +18,7 @@
18#include "AxisVelocityCalculator.h"
18#include "AxisVelocityCalculator.h"
19#include "Direction.h"
19#include "Direction.h"
20#include "DirectionalDragArea.h"
20#include "DirectionalDragArea.h"
21+#include "FloatingFlickable.h"
21#include "PressedOutsideNotifier.h"
22#include "PressedOutsideNotifier.h"
22#include "TouchGate.h"
23#include "TouchGate.h"
23
24
@@ -34,6 +35,7 @@ void UbuntuGesturesQmlPlugin::registerTypes(const char *uri)
34 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
35 qmlRegisterSingletonType<Direction>(uri, 0, 1, "Direction", directionSingleton);
35 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
36 qmlRegisterType<DirectionalDragArea>(uri, 0, 1, "DirectionalDragArea");
36 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
37 qmlRegisterType<AxisVelocityCalculator>(uri, 0, 1, "AxisVelocityCalculator");
38+ qmlRegisterType<FloatingFlickable>(uri, 0, 1, "FloatingFlickable");
37 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
39 qmlRegisterType<PressedOutsideNotifier>(uri, 0, 1, "PressedOutsideNotifier");
38 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
40 qmlRegisterType<TouchGate>(uri, 0, 1, "TouchGate");
39}
41}
plugins/Ubuntu/Gestures/plugin.h+1−1
@@ -24,7 +24,7 @@ class UbuntuGesturesQmlPlugin : public QQmlExtensionPlugin
24 Q_OBJECT
24 Q_OBJECT
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26public:
26public:
27− void registerTypes(const char *uri);
27+ void registerTypes(const char *uri) override;
28};
28};
29
29
30
30
plugins/Ubuntu/Payments/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // PAYMENTS_PLUGIN_H
31#endif // PAYMENTS_PLUGIN_H
plugins/Ubuntu/SystemImage/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // SYSTEMIMAGE_PLUGIN_H
31#endif // SYSTEMIMAGE_PLUGIN_H
plugins/Unity/Connectivity/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // CONNECTIVITY_PLUGIN_H
31#endif // CONNECTIVITY_PLUGIN_H
plugins/Unity/DashCommunicator/plugin.h+1−1
@@ -28,7 +28,7 @@ class DashCommunicatorPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
plugins/Unity/Indicators/indicatorsmodel.h+5−5
@@ -50,11 +50,11 @@ public:
50 void setProfile(const QString& profile);
50 void setProfile(const QString& profile);
51
51
52 /* QAbstractItemModel */
52 /* QAbstractItemModel */
53− QHash<int, QByteArray> roleNames() const;
53+ QHash<int, QByteArray> roleNames() const override;
54− int columnCount(const QModelIndex &parent = QModelIndex()) const;
54+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
55− QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
55+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
56− QModelIndex parent (const QModelIndex &index) const;
56+ QModelIndex parent (const QModelIndex &index) const override;
57− int rowCount(const QModelIndex &parent = QModelIndex()) const;
57+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
58
58
59
59
60Q_SIGNALS:
60Q_SIGNALS:
plugins/Unity/Indicators/menucontentactivator.cpp+4−4
@@ -28,10 +28,10 @@ public:
28 connect(&m_timer, &QTimer::timeout,
28 connect(&m_timer, &QTimer::timeout,
29 this, &UnityIndicators::AbstractTimer::timeout);
29 this, &UnityIndicators::AbstractTimer::timeout);
30 }
30 }
31− virtual int interval() const { return m_timer.interval(); }
31+ int interval() const override { return m_timer.interval(); }
32− virtual void setInterval(int msecs) { m_timer.setInterval(msecs); }
32+ void setInterval(int msecs) override { m_timer.setInterval(msecs); }
33− virtual void start() { m_timer.start(); UnityIndicators::AbstractTimer::start(); }
33+ void start() override { m_timer.start(); UnityIndicators::AbstractTimer::start(); }
34− virtual void stop() { m_timer.stop(); UnityIndicators::AbstractTimer::stop(); }
34+ void stop() override { m_timer.stop(); UnityIndicators::AbstractTimer::stop(); }
35private:
35private:
36 QTimer m_timer;
36 QTimer m_timer;
37};
37};
plugins/Unity/Indicators/plugin.h+1−1
@@ -27,7 +27,7 @@ class IndicatorsPlugin : public QQmlExtensionPlugin
27 Q_OBJECT
27 Q_OBJECT
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29public:
29public:
30− void registerTypes(const char *uri);
30+ void registerTypes(const char *uri) override;
31};
31};
32
32
33#endif // INDICATORS2_PLUGIN_H
33#endif // INDICATORS2_PLUGIN_H
plugins/Unity/Launcher/launchermodel.h+10−10
@@ -41,19 +41,19 @@ public:
41 LauncherModel(QObject *parent = 0);
41 LauncherModel(QObject *parent = 0);
42 ~LauncherModel();
42 ~LauncherModel();
43
43
44− int rowCount(const QModelIndex &parent = QModelIndex()) const;
44+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
45
45
46− QVariant data(const QModelIndex &index, int role) const;
46+ QVariant data(const QModelIndex &index, int role) const override;
47
47
48− Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const;
48+ Q_INVOKABLE unity::shell::launcher::LauncherItemInterface* get(int index) const override;
49− Q_INVOKABLE void move(int oldIndex, int newIndex);
49+ Q_INVOKABLE void move(int oldIndex, int newIndex) override;
50− Q_INVOKABLE void pin(const QString &appId, int index = -1);
50+ Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
51− Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
51+ Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex) override;
52− Q_INVOKABLE void setUser(const QString &username);
52+ Q_INVOKABLE void setUser(const QString &username) override;
53 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
53 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
54
54
55− unity::shell::application::ApplicationManagerInterface* applicationManager() const;
55+ unity::shell::application::ApplicationManagerInterface* applicationManager() const override;
56− void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager);
56+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface *appManager) override;
57
57
58 bool onlyPinned() const override;
58 bool onlyPinned() const override;
59 void setOnlyPinned(bool onlyPinned) override;
59 void setOnlyPinned(bool onlyPinned) override;
@@ -61,7 +61,7 @@ public:
61 int findApplication(const QString &appId);
61 int findApplication(const QString &appId);
62
62
63public Q_SLOTS:
63public Q_SLOTS:
64− void requestRemove(const QString &appId);
64+ void requestRemove(const QString &appId) override;
65 Q_INVOKABLE void refresh();
65 Q_INVOKABLE void refresh();
66
66
67private:
67private:
plugins/Unity/Launcher/plugin.h+1−1
@@ -28,7 +28,7 @@ class UnityLauncherPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
plugins/Unity/Launcher/quicklistmodel.h+2−2
@@ -48,8 +48,8 @@ public:
48
48
49 QuickListEntry get(int index) const;
49 QuickListEntry get(int index) const;
50
50
51− int rowCount(const QModelIndex &parent = QModelIndex()) const;
51+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
52− QVariant data(const QModelIndex &index, int role) const;
52+ QVariant data(const QModelIndex &index, int role) const override;
53
53
54private:
54private:
55 QList<QuickListEntry> m_list;
55 QList<QuickListEntry> m_list;
plugins/Unity/Session/plugin.h+1−1
@@ -28,7 +28,7 @@ class SessionPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
plugins/Utils/HomeKeyWatcher.h+1−1
@@ -49,7 +49,7 @@ public:
49
49
50 virtual ~HomeKeyWatcher();
50 virtual ~HomeKeyWatcher();
51
51
52− bool eventFilter(QObject *watched, QEvent *event);
52+ bool eventFilter(QObject *watched, QEvent *event) override;
53
53
54 void update(QEvent *event);
54 void update(QEvent *event);
55
55
plugins/Utils/plugin.h+2−2
@@ -28,8 +28,8 @@ class UtilsPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32− void initializeEngine(QQmlEngine *engine, const char *uri);
32+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
33};
33};
34
34
35#endif
35#endif
plugins/Utils/qlimitproxymodelqml.h+2−2
@@ -32,8 +32,8 @@ public:
32
32
33 /* getters */
33 /* getters */
34 int limit() const;
34 int limit() const;
35− int rowCount(const QModelIndex &parent = QModelIndex()) const;
35+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
36− QHash<int, QByteArray> roleNames() const;
36+ QHash<int, QByteArray> roleNames() const override;
37
37
38 /* setters */
38 /* setters */
39 void setModel(QAbstractItemModel *model);
39 void setModel(QAbstractItemModel *model);
plugins/Utils/qvariantlistmodel.h+6−6
@@ -54,14 +54,14 @@ public:
54
54
55 ~QVariantListModel();
55 ~QVariantListModel();
56
56
57− int rowCount(const QModelIndex &parent = QModelIndex()) const;
57+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
58− QModelIndex sibling(int row, int column, const QModelIndex &idx) const;
58+ QModelIndex sibling(int row, int column, const QModelIndex &idx) const override;
59
59
60− QVariant data(const QModelIndex &index, int role) const;
60+ QVariant data(const QModelIndex &index, int role) const override;
61− bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole);
61+ bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
62
62
63− bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());
63+ bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
64− bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
64+ bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
65
65
66 QVariantList variantList() const;
66 QVariantList variantList() const;
67 void setVariantList(const QVariantList &list);
67 void setVariantList(const QVariantList &list);
plugins/Utils/timeformatter.h+1−1
@@ -62,7 +62,7 @@ public:
62 GDateTimeFormatter(QObject *parent = 0);
62 GDateTimeFormatter(QObject *parent = 0);
63
63
64protected:
64protected:
65− virtual QString formatTime() const;
65+ QString formatTime() const override;
66};
66};
67
67
68#endif
68#endif
plugins/Utils/unitysortfilterproxymodelqml.h+2−2
@@ -36,12 +36,12 @@ public:
36 Q_INVOKABLE int count();
36 Q_INVOKABLE int count();
37 Q_INVOKABLE int findFirst(int role, const QVariant& value) const;
37 Q_INVOKABLE int findFirst(int role, const QVariant& value) const;
38 Q_INVOKABLE int mapRowToSource(int row);
38 Q_INVOKABLE int mapRowToSource(int row);
39− virtual bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
39+ bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
40
40
41 /* getters */
41 /* getters */
42 int totalCount() const;
42 int totalCount() const;
43 bool invertMatch() const;
43 bool invertMatch() const;
44− QHash<int, QByteArray> roleNames() const;
44+ QHash<int, QByteArray> roleNames() const override;
45
45
46 /* setters */
46 /* setters */
47 void setModel(QAbstractItemModel *model);
47 void setModel(QAbstractItemModel *model);
plugins/Utils/windowkeysfilter.h+1−1
@@ -39,7 +39,7 @@ class WindowKeysFilter : public QQuickItem
39public:
39public:
40 WindowKeysFilter(QQuickItem *parent = 0);
40 WindowKeysFilter(QQuickItem *parent = 0);
41
41
42− bool eventFilter(QObject *watched, QEvent *event);
42+ bool eventFilter(QObject *watched, QEvent *event) override;
43
43
44private Q_SLOTS:
44private Q_SLOTS:
45 void setupFilterOnWindow(QQuickWindow *window);
45 void setupFilterOnWindow(QQuickWindow *window);
plugins/Wizard/plugin.h+1−1
@@ -26,7 +26,7 @@ class WizardPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif
32#endif
po/am.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-03-19 23:16+0000\n"
11+"PO-Revision-Date: 2015-05-24 14:07+0000\n"
12"Last-Translator: samson <Unknown>\n"
12"Last-Translator: samson <Unknown>\n"
13"Language-Team: Amharic <am@li.org>\n"
13"Language-Team: Amharic <am@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
17"Plural-Forms: nplurals=2; plural=n > 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:47+0000\n"
18+"X-Launchpad-Export-Date: 2015-05-25 06:04+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17514)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -371,7 +371,7 @@ msgstr "እዚህ መታ ይድርጉ ለመቀጠል"
371
371
372#: qml/Tutorial/TutorialContent.qml:81
372#: qml/Tutorial/TutorialContent.qml:81
373msgid "Click here to finish."
373msgid "Click here to finish."
374−msgstr ""
374+msgstr "ለመጨረስ እዚህ ይጫኑ"
375
375
376#: qml/Tutorial/TutorialLeftFinish.qml:24
376#: qml/Tutorial/TutorialLeftFinish.qml:24
377msgid "These are the shortcuts to favorite apps"
377msgid "These are the shortcuts to favorite apps"
po/ast.po+86−86
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-03-02 18:12+0000\n"
11+"PO-Revision-Date: 2015-06-11 23:39+0000\n"
12−"Last-Translator: ivarela <ivarela@ubuntu.com>\n"
12+"Last-Translator: enolp <enolp@softastur.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
13"Language-Team: Asturian <ast@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
18+"X-Launchpad-Export-Date: 2015-06-16 11:20+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17557)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -25,11 +25,11 @@ msgstr "Contraseña: "
25#: plugins/Unity/Launcher/launcheritem.cpp:45
25#: plugins/Unity/Launcher/launcheritem.cpp:45
26#: plugins/Unity/Launcher/launcheritem.cpp:100
26#: plugins/Unity/Launcher/launcheritem.cpp:100
27msgid "Pin shortcut"
27msgid "Pin shortcut"
28−msgstr "Anclar"
28+msgstr "Anclar atayu"
29
29
30#: plugins/Unity/Launcher/launcheritem.cpp:100
30#: plugins/Unity/Launcher/launcheritem.cpp:100
31msgid "Unpin shortcut"
31msgid "Unpin shortcut"
32−msgstr "Desanclar"
32+msgstr "Desanclar atayu"
33
33
34#: qml/Components/DelayedLockscreen.qml:49
34#: qml/Components/DelayedLockscreen.qml:49
35msgid "Device Locked"
35msgid "Device Locked"
@@ -37,7 +37,7 @@ msgstr "Preséu bloquiáu"
37
37
38#: qml/Components/DelayedLockscreen.qml:64
38#: qml/Components/DelayedLockscreen.qml:64
39msgid "You have been locked out due to too many failed passphrase attempts."
39msgid "You have been locked out due to too many failed passphrase attempts."
40−msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de frase de pasu."
40+msgstr "Quedasti bloquiáu polos escesivos intentos fallíos de fras de pasu."
41
41
42#: qml/Components/DelayedLockscreen.qml:65
42#: qml/Components/DelayedLockscreen.qml:65
43msgid "You have been locked out due to too many failed passcode attempts."
43msgid "You have been locked out due to too many failed passcode attempts."
@@ -48,27 +48,27 @@ msgstr ""
48#, qt-format
48#, qt-format
49msgid "Please wait %1 minute and then try again…"
49msgid "Please wait %1 minute and then try again…"
50msgid_plural "Please wait %1 minutes and then try again…"
50msgid_plural "Please wait %1 minutes and then try again…"
51−msgstr[0] "Espera %1 minutu y vuelvi a intentalo…"
51+msgstr[0] "Por favor, espera %1 minutu y vuelvi a intentalo…"
52−msgstr[1] "Espera %1 minutos y vuelvi a intentalo…"
52+msgstr[1] "Por favor, espera %1 minutos y vuelvi a intentalo…"
53
53
54#: qml/Components/Dialogs.qml:69
54#: qml/Components/Dialogs.qml:69
55msgctxt "Title: Lock/Log out dialog"
55msgctxt "Title: Lock/Log out dialog"
56msgid "Log out"
56msgid "Log out"
57−msgstr ""
57+msgstr "Zarrar sesión"
58
58
59#: qml/Components/Dialogs.qml:70
59#: qml/Components/Dialogs.qml:70
60msgid "Are you sure you want to log out?"
60msgid "Are you sure you want to log out?"
61−msgstr "De xuru que quies zarrar la sesión?"
61+msgstr "¿De xuru que quies zarrar la sesión?"
62
62
63#: qml/Components/Dialogs.qml:72
63#: qml/Components/Dialogs.qml:72
64msgctxt "Button: Lock the system"
64msgctxt "Button: Lock the system"
65msgid "Lock"
65msgid "Lock"
66−msgstr ""
66+msgstr "Bloquiar"
67
67
68#: qml/Components/Dialogs.qml:79
68#: qml/Components/Dialogs.qml:79
69msgctxt "Button: Log out from the system"
69msgctxt "Button: Log out from the system"
70msgid "Log Out"
70msgid "Log Out"
71−msgstr ""
71+msgstr "Zarrar sesión"
72
72
73#: qml/Components/Dialogs.qml:86 qml/Components/Dialogs.qml:117
73#: qml/Components/Dialogs.qml:86 qml/Components/Dialogs.qml:117
74#: qml/Components/Dialogs.qml:173
74#: qml/Components/Dialogs.qml:173
@@ -78,30 +78,30 @@ msgstr "Encaboxar"
78#: qml/Components/Dialogs.qml:98
78#: qml/Components/Dialogs.qml:98
79msgctxt "Title: Reboot/Shut down dialog"
79msgctxt "Title: Reboot/Shut down dialog"
80msgid "Shut down"
80msgid "Shut down"
81−msgstr ""
81+msgstr "Apagáu"
82
82
83#: qml/Components/Dialogs.qml:99
83#: qml/Components/Dialogs.qml:99
84msgid "Are you sure you want to shut down?"
84msgid "Are you sure you want to shut down?"
85−msgstr "De xuru que quies apagar?"
85+msgstr "¿De xuru que quies apagar?"
86
86
87#: qml/Components/Dialogs.qml:101
87#: qml/Components/Dialogs.qml:101
88msgctxt "Button: Reboot the system"
88msgctxt "Button: Reboot the system"
89msgid "Reboot"
89msgid "Reboot"
90−msgstr ""
90+msgstr "Reaniciar"
91
91
92#: qml/Components/Dialogs.qml:109
92#: qml/Components/Dialogs.qml:109
93msgctxt "Button: Shut down the system"
93msgctxt "Button: Shut down the system"
94msgid "Shut down"
94msgid "Shut down"
95−msgstr ""
95+msgstr "Apagar"
96
96
97#: qml/Components/Dialogs.qml:129
97#: qml/Components/Dialogs.qml:129
98msgctxt "Title: Reboot dialog"
98msgctxt "Title: Reboot dialog"
99msgid "Reboot"
99msgid "Reboot"
100−msgstr ""
100+msgstr "Reaniciu"
101
101
102#: qml/Components/Dialogs.qml:130
102#: qml/Components/Dialogs.qml:130
103msgid "Are you sure you want to reboot?"
103msgid "Are you sure you want to reboot?"
104−msgstr "De xuru que quies reaniciar?"
104+msgstr "¿De xuru que quies reaniciar?"
105
105
106#: qml/Components/Dialogs.qml:132
106#: qml/Components/Dialogs.qml:132
107msgid "No"
107msgid "No"
@@ -121,18 +121,18 @@ msgid ""
121"Are you sure you would like\n"
121"Are you sure you would like\n"
122"to power off?"
122"to power off?"
123msgstr ""
123msgstr ""
124−"De xuru que quies\n"
124+"¿De xuru que te prestaría\n"
125"apagar?"
125"apagar?"
126
126
127#: qml/Components/Dialogs.qml:155
127#: qml/Components/Dialogs.qml:155
128msgctxt "Button: Power off the system"
128msgctxt "Button: Power off the system"
129msgid "Power off"
129msgid "Power off"
130−msgstr ""
130+msgstr "Apagar"
131
131
132#: qml/Components/Dialogs.qml:164
132#: qml/Components/Dialogs.qml:164
133msgctxt "Button: Restart the system"
133msgctxt "Button: Restart the system"
134msgid "Restart"
134msgid "Restart"
135−msgstr ""
135+msgstr "Reaniciar"
136
136
137#: qml/Components/Lockscreen.qml:245
137#: qml/Components/Lockscreen.qml:245
138msgid "Return to Call"
138msgid "Return to Call"
@@ -157,22 +157,22 @@ msgstr "Ver too"
157#: qml/Dash/GenericScopeView.qml:594
157#: qml/Dash/GenericScopeView.qml:594
158msgctxt "Label: Hint for dash search line edit"
158msgctxt "Label: Hint for dash search line edit"
159msgid "Search"
159msgid "Search"
160−msgstr ""
160+msgstr "Guetar"
161
161
162#: qml/Dash/PageHeader.qml:269
162#: qml/Dash/PageHeader.qml:269
163msgctxt "Button: Open the Ubuntu Store"
163msgctxt "Button: Open the Ubuntu Store"
164msgid "Store"
164msgid "Store"
165−msgstr ""
165+msgstr "Tienda"
166
166
167#: qml/Dash/PageHeader.qml:276
167#: qml/Dash/PageHeader.qml:276
168msgctxt "Button: Start a search in the current dash scope"
168msgctxt "Button: Start a search in the current dash scope"
169msgid "Search"
169msgid "Search"
170−msgstr ""
170+msgstr "Guetar"
171
171
172#: qml/Dash/PageHeader.qml:286
172#: qml/Dash/PageHeader.qml:286
173msgctxt "Button: Show the current dash scope settings"
173msgctxt "Button: Show the current dash scope settings"
174msgid "Settings"
174msgid "Settings"
175−msgstr ""
175+msgstr "Axustes"
176
176
177#: qml/Dash/PageHeader.qml:293
177#: qml/Dash/PageHeader.qml:293
178msgid "Remove from Favorites"
178msgid "Remove from Favorites"
@@ -204,19 +204,19 @@ msgstr "Unviar"
204
204
205#: qml/Dash/PullToRefreshScopeStyle.qml:55
205#: qml/Dash/PullToRefreshScopeStyle.qml:55
206msgid "Pull to refresh…"
206msgid "Pull to refresh…"
207−msgstr "Tirar p'anovar..."
207+msgstr "Tira p'anovar..."
208
208
209#: qml/Dash/PullToRefreshScopeStyle.qml:60
209#: qml/Dash/PullToRefreshScopeStyle.qml:60
210msgid "Release to refresh…"
210msgid "Release to refresh…"
211−msgstr "Soltar p'anovar..."
211+msgstr "Sueltar p'anovar..."
212
212
213#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
213#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
214msgid "Enable location data"
214msgid "Enable location data"
215−msgstr "Activar datos de llocalización"
215+msgstr "Habilitar datos d'allugamientu"
216
216
217#: qml/Dash/ScopesList.qml:66
217#: qml/Dash/ScopesList.qml:66
218msgid "Manage"
218msgid "Manage"
219−msgstr "Alministrar"
219+msgstr "Xestionar"
220
220
221#: qml/Dash/ScopesList.qml:112
221#: qml/Dash/ScopesList.qml:112
222msgid "Home"
222msgid "Home"
@@ -232,52 +232,52 @@ msgstr "Desbloquiar"
232
232
233#: qml/Greeter/LoginList.qml:236
233#: qml/Greeter/LoginList.qml:236
234msgid "Retry"
234msgid "Retry"
235−msgstr ""
235+msgstr "Reintentar"
236
236
237#: qml/Greeter/LoginList.qml:237
237#: qml/Greeter/LoginList.qml:237
238msgid "Tap to unlock"
238msgid "Tap to unlock"
239−msgstr ""
239+msgstr "Calca pa desbloquiar"
240
240
241#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
241#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
242msgid "Sorry, incorrect passphrase."
242msgid "Sorry, incorrect passphrase."
243−msgstr "Fras de pasu incorreuta"
243+msgstr "Perdón, fras de pasu incorreuta"
244
244
245#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
245#: qml/Greeter/NarrowView.qml:54 qml/Wizard/Pages/passwd-confirm.qml:54
246msgid "Sorry, incorrect passcode."
246msgid "Sorry, incorrect passcode."
247−msgstr "Códigu de pasu incorreutu"
247+msgstr "Perdón, códigu de pasu incorreutu."
248
248
249#: qml/Greeter/NarrowView.qml:55
249#: qml/Greeter/NarrowView.qml:55
250msgid "This will be your last attempt."
250msgid "This will be your last attempt."
251−msgstr "Esti ye'l caberu intentu."
251+msgstr "Esti sedra'l to caberu intentu"
252
252
253#: qml/Greeter/NarrowView.qml:57
253#: qml/Greeter/NarrowView.qml:57
254msgid ""
254msgid ""
255"If passphrase is entered incorrectly, your phone will conduct a factory "
255"If passphrase is entered incorrectly, your phone will conduct a factory "
256"reset and all personal data will be deleted."
256"reset and all personal data will be deleted."
257msgstr ""
257msgstr ""
258−"Si s'inxerta la fras incorreutamente, el teléfonu va volver a la "
258+"Si s'inxerta la fras de pasu incorreutamente, el to teléfonu va reafitase y "
259−"configuración de fábrica y van perdese tolos datos personales."
259+"van desaniciase tolos datos personales."
260
260
261#: qml/Greeter/NarrowView.qml:58
261#: qml/Greeter/NarrowView.qml:58
262msgid ""
262msgid ""
263"If passcode is entered incorrectly, your phone will conduct a factory reset "
263"If passcode is entered incorrectly, your phone will conduct a factory reset "
264"and all personal data will be deleted."
264"and all personal data will be deleted."
265msgstr ""
265msgstr ""
266−"Si s'inxerta'l códigu incorreutamente, el teléfonu va volver a la "
266+"Si s'inxerta'l códigu de pasu incorreutamente, el to teléfonu va reafitase y "
267−"configuración de fábrica y van perdese tolos datos personales."
267+"van desaniciase tolos datos personales."
268
268
269#: qml/Greeter/NarrowView.qml:115
269#: qml/Greeter/NarrowView.qml:115
270#, qt-format
270#, qt-format
271msgid "Enter %1"
271msgid "Enter %1"
272−msgstr "Escribi %1"
272+msgstr "Introduz %1"
273
273
274#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
274#: qml/Greeter/NarrowView.qml:116 qml/Wizard/Pages/passwd-set.qml:60
275msgid "Enter passphrase"
275msgid "Enter passphrase"
276−msgstr "Escribi la frase contraseña"
276+msgstr "Introduz la fras de pasu"
277
277
278#: qml/Greeter/NarrowView.qml:117
278#: qml/Greeter/NarrowView.qml:117
279msgid "Enter passcode"
279msgid "Enter passcode"
280−msgstr "Escribi'l códigu de pasu"
280+msgstr "Introduz el códigu de pasu"
281
281
282#: qml/Greeter/NarrowView.qml:118
282#: qml/Greeter/NarrowView.qml:118
283#, qt-format
283#, qt-format
@@ -290,7 +290,7 @@ msgstr "Sentímoslo, contraseña incorreuta"
290
290
291#: qml/Greeter/NarrowView.qml:120
291#: qml/Greeter/NarrowView.qml:120
292msgid "Please re-enter"
292msgid "Please re-enter"
293−msgstr "Vuelvi a escribila"
293+msgstr "Por favor, reintroduzla"
294
294
295#: qml/Greeter/NarrowView.qml:121
295#: qml/Greeter/NarrowView.qml:121
296msgid "Sorry, incorrect passcode"
296msgid "Sorry, incorrect passcode"
@@ -302,7 +302,7 @@ msgstr "Amosar contraseña"
302
302
303#: qml/Panel/ActiveCallHint.qml:79
303#: qml/Panel/ActiveCallHint.qml:79
304msgid "Tap to return to call..."
304msgid "Tap to return to call..."
305−msgstr "Tocar pa tornar a la llamada..."
305+msgstr "Toca pa tornar a la llamada..."
306
306
307#: qml/Panel/ActiveCallHint.qml:92
307#: qml/Panel/ActiveCallHint.qml:92
308msgid "Conference"
308msgid "Conference"
@@ -310,11 +310,11 @@ msgstr "Conferencia"
310
310
311#: qml/Panel/Indicators/MenuItemFactory.qml:639
311#: qml/Panel/Indicators/MenuItemFactory.qml:639
312msgid "Nothing is playing"
312msgid "Nothing is playing"
313−msgstr "Nun hai nada en reproducción"
313+msgstr "Nun ta reproduciéndose nada"
314
314
315#: qml/Panel/Indicators/MenuItemFactory.qml:787
315#: qml/Panel/Indicators/MenuItemFactory.qml:787
316msgid "In queue…"
316msgid "In queue…"
317−msgstr "N'espera…"
317+msgstr "Na cola..."
318
318
319#: qml/Panel/Indicators/MenuItemFactory.qml:791
319#: qml/Panel/Indicators/MenuItemFactory.qml:791
320msgid "Downloading"
320msgid "Downloading"
@@ -339,7 +339,7 @@ msgstr "Falló, toca pa reintentar"
339#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
339#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
340msgctxt "Label: Hint in message indicator line edit"
340msgctxt "Label: Hint in message indicator line edit"
341msgid "Reply"
341msgid "Reply"
342−msgstr ""
342+msgstr "Responder"
343
343
344#: qml/Panel/Indicators/ModemInfoItem.qml:105
344#: qml/Panel/Indicators/ModemInfoItem.qml:105
345msgid "Unlock SIM"
345msgid "Unlock SIM"
@@ -351,7 +351,7 @@ msgstr "Roaming"
351
351
352#: qml/Tutorial/TutorialBottomFinish.qml:24
352#: qml/Tutorial/TutorialBottomFinish.qml:24
353msgid "This action does different things for different apps"
353msgid "This action does different things for different apps"
354−msgstr "Esta aición tiene efeutos distintos en cada aplicación"
354+msgstr "Esta aición fai coses distintes p'aplicaciones estremaes"
355
355
356#: qml/Tutorial/TutorialBottomFinish.qml:25
356#: qml/Tutorial/TutorialBottomFinish.qml:25
357msgid "Tap here to finish."
357msgid "Tap here to finish."
@@ -363,7 +363,7 @@ msgstr "Abrir menús especiales"
363
363
364#: qml/Tutorial/TutorialBottom.qml:29
364#: qml/Tutorial/TutorialBottom.qml:29
365msgid "Swipe up from the bottom edge."
365msgid "Swipe up from the bottom edge."
366−msgstr ""
366+msgstr "Esliza dende'l berbesu d'embaxo."
367
367
368#: qml/Tutorial/TutorialContent.qml:81 qml/Tutorial/TutorialLeftFinish.qml:25
368#: qml/Tutorial/TutorialContent.qml:81 qml/Tutorial/TutorialLeftFinish.qml:25
369#: qml/Tutorial/TutorialRight.qml:144
369#: qml/Tutorial/TutorialRight.qml:144
@@ -372,11 +372,11 @@ msgstr "Toca equí pa siguir."
372
372
373#: qml/Tutorial/TutorialContent.qml:81
373#: qml/Tutorial/TutorialContent.qml:81
374msgid "Click here to finish."
374msgid "Click here to finish."
375−msgstr ""
375+msgstr "Primi equí pa finar."
376
376
377#: qml/Tutorial/TutorialLeftFinish.qml:24
377#: qml/Tutorial/TutorialLeftFinish.qml:24
378msgid "These are the shortcuts to favorite apps"
378msgid "These are the shortcuts to favorite apps"
379−msgstr ""
379+msgstr "Estos son los atayos a les aplicaciones favorites"
380
380
381#: qml/Tutorial/TutorialLeft.qml:26
381#: qml/Tutorial/TutorialLeft.qml:26
382msgid "Open the launcher"
382msgid "Open the launcher"
@@ -384,44 +384,44 @@ msgstr "Abrir el llanzador"
384
384
385#: qml/Tutorial/TutorialLeft.qml:27
385#: qml/Tutorial/TutorialLeft.qml:27
386msgid "Short swipe from the left edge."
386msgid "Short swipe from the left edge."
387−msgstr ""
387+msgstr "Esliza un poco dende'l berbesu esquierdu."
388
388
389#: qml/Tutorial/TutorialPage.qml:178
389#: qml/Tutorial/TutorialPage.qml:178
390msgid "You almost got it!"
390msgid "You almost got it!"
391−msgstr ""
391+msgstr "¡Yá cuasi finamos!"
392
392
393#: qml/Tutorial/TutorialPage.qml:195
393#: qml/Tutorial/TutorialPage.qml:195
394msgid "Try again."
394msgid "Try again."
395−msgstr ""
395+msgstr "Intentar de nueves"
396
396
397#: qml/Tutorial/TutorialRight.qml:31
397#: qml/Tutorial/TutorialRight.qml:31
398msgid "To view open apps"
398msgid "To view open apps"
399−msgstr ""
399+msgstr "Pa ver aplicaciones abiertes"
400
400
401#: qml/Tutorial/TutorialRight.qml:32
401#: qml/Tutorial/TutorialRight.qml:32
402msgid "Long swipe from the right edge."
402msgid "Long swipe from the right edge."
403−msgstr ""
403+msgstr "Eslizamientu llargu dende'l berbesu drechu."
404
404
405#: qml/Tutorial/TutorialRight.qml:122
405#: qml/Tutorial/TutorialRight.qml:122
406msgid "View all your running tasks."
406msgid "View all your running tasks."
407−msgstr ""
407+msgstr "Mira toles tos aplicaciones n'execución."
408
408
409#: qml/Wizard/Page.qml:89
409#: qml/Wizard/Page.qml:89
410msgctxt "Button: Go back one page in the Wizard"
410msgctxt "Button: Go back one page in the Wizard"
411msgid "Back"
411msgid "Back"
412−msgstr ""
412+msgstr "Atrás"
413
413
414#: qml/Wizard/Pages/10-welcome.qml:27
414#: qml/Wizard/Pages/10-welcome.qml:27
415msgid "Hi!"
415msgid "Hi!"
416−msgstr "Hola!"
416+msgstr "¡Hola!"
417
417
418#: qml/Wizard/Pages/10-welcome.qml:44
418#: qml/Wizard/Pages/10-welcome.qml:44
419msgid "Welcome to your Ubuntu phone."
419msgid "Welcome to your Ubuntu phone."
420−msgstr "Dámoste l'acoyida a Ubuntu Phone"
420+msgstr "Bienllegáu/ada al to teléfonu d'Ubuntu"
421
421
422#: qml/Wizard/Pages/10-welcome.qml:52
422#: qml/Wizard/Pages/10-welcome.qml:52
423msgid "Let’s get started."
423msgid "Let’s get started."
424−msgstr "Entamamos."
424+msgstr "Entamemos."
425
425
426#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
426#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
427#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
427#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
@@ -432,7 +432,7 @@ msgstr "Siguir"
432
432
433#: qml/Wizard/Pages/20-sim.qml:25
433#: qml/Wizard/Pages/20-sim.qml:25
434msgid "Add a SIM card and restart your device"
434msgid "Add a SIM card and restart your device"
435−msgstr "Amiesta una tarxeta SIM y reanicia'l preséu"
435+msgstr "Amiesta una tarxeta SIM y reanicia'l to preséu"
436
436
437#: qml/Wizard/Pages/20-sim.qml:59
437#: qml/Wizard/Pages/20-sim.qml:59
438msgid "Without it, you won’t be able to make calls or use text messaging."
438msgid "Without it, you won’t be able to make calls or use text messaging."
@@ -440,49 +440,49 @@ msgstr "Ensin ella, nun vas poder facer llamaes nin unviar mensaxes."
440
440
441#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
441#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
442msgid "Skip"
442msgid "Skip"
443−msgstr "Omitir"
443+msgstr "Saltar"
444
444
445#: qml/Wizard/Pages/30-passwd-type.qml:39
445#: qml/Wizard/Pages/30-passwd-type.qml:39
446msgid "Lock security"
446msgid "Lock security"
447−msgstr "Seguridá de bloquéu"
447+msgstr "Seguranza del bloquéu"
448
448
449#: qml/Wizard/Pages/30-passwd-type.qml:74
449#: qml/Wizard/Pages/30-passwd-type.qml:74
450msgid "Please select how you’d like to unlock your phone."
450msgid "Please select how you’d like to unlock your phone."
451−msgstr "Seleiciona cómo te prestaría desbloquiar el teléfonu."
451+msgstr "Por favor, esbilla como te prestaría desbloquiar el teléfonu."
452
452
453#: qml/Wizard/Pages/30-passwd-type.qml:97
453#: qml/Wizard/Pages/30-passwd-type.qml:97
454msgctxt "Label: Type of security method"
454msgctxt "Label: Type of security method"
455msgid "Swipe"
455msgid "Swipe"
456−msgstr ""
456+msgstr "Eslizar"
457
457
458#: qml/Wizard/Pages/30-passwd-type.qml:98
458#: qml/Wizard/Pages/30-passwd-type.qml:98
459msgctxt "Label: Description of security method"
459msgctxt "Label: Description of security method"
460msgid "No security"
460msgid "No security"
461−msgstr ""
461+msgstr "Ensin seguranza"
462
462
463#: qml/Wizard/Pages/30-passwd-type.qml:100
463#: qml/Wizard/Pages/30-passwd-type.qml:100
464msgctxt "Label: Type of security method"
464msgctxt "Label: Type of security method"
465msgid "Passcode"
465msgid "Passcode"
466−msgstr ""
466+msgstr "Códigu de pasu"
467
467
468#: qml/Wizard/Pages/30-passwd-type.qml:101
468#: qml/Wizard/Pages/30-passwd-type.qml:101
469msgctxt "Label: Description of security method"
469msgctxt "Label: Description of security method"
470msgid "4 digits only"
470msgid "4 digits only"
471−msgstr ""
471+msgstr "Namái 4 díxitos"
472
472
473#: qml/Wizard/Pages/30-passwd-type.qml:103
473#: qml/Wizard/Pages/30-passwd-type.qml:103
474msgctxt "Label: Type of security method"
474msgctxt "Label: Type of security method"
475msgid "Passphrase"
475msgid "Passphrase"
476−msgstr ""
476+msgstr "Fras de pasu"
477
477
478#: qml/Wizard/Pages/30-passwd-type.qml:104
478#: qml/Wizard/Pages/30-passwd-type.qml:104
479msgctxt "Label: Description of security method"
479msgctxt "Label: Description of security method"
480msgid "Numbers and letters"
480msgid "Numbers and letters"
481−msgstr ""
481+msgstr "Númberos y lletres"
482
482
483#: qml/Wizard/Pages/40-wifi.qml:29
483#: qml/Wizard/Pages/40-wifi.qml:29
484msgid "Connect to Wi‑Fi"
484msgid "Connect to Wi‑Fi"
485−msgstr "Coneutar a WiFi"
485+msgstr "Coneutase al WiFi"
486
486
487#: qml/Wizard/Pages/40-wifi.qml:168
487#: qml/Wizard/Pages/40-wifi.qml:168
488msgid "Available networks…"
488msgid "Available networks…"
@@ -494,11 +494,11 @@ msgstr "Nun hai redes disponibles"
494
494
495#: qml/Wizard/Pages/50-location.qml:27
495#: qml/Wizard/Pages/50-location.qml:27
496msgid "Location"
496msgid "Location"
497−msgstr "Llocalización"
497+msgstr "Allugamientu"
498
498
499#: qml/Wizard/Pages/50-location.qml:62
499#: qml/Wizard/Pages/50-location.qml:62
500msgid "Let the phone detect your location:"
500msgid "Let the phone detect your location:"
501−msgstr "Permitir al teléfonu deteutar la llocalización:"
501+msgstr "Dexar al teléfonu deteutar l'allugamientu:"
502
502
503#: qml/Wizard/Pages/50-location.qml:69
503#: qml/Wizard/Pages/50-location.qml:69
504msgid "Using GPS only (less accurate)"
504msgid "Using GPS only (less accurate)"
@@ -507,7 +507,7 @@ msgstr "Namái usando GPS (menos precisión)"
507#: qml/Wizard/Pages/50-location.qml:86
507#: qml/Wizard/Pages/50-location.qml:86
508msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
508msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
509msgstr ""
509msgstr ""
510−"Usando GPS, Wifi anónimes ya información de redes móviles (recomiéndase)"
510+"Usando GPS, Wi-fi anónimes ya información de redes móviles (aconseyao)"
511
511
512#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
512#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
513#: qml/Wizard/Pages/50-location.qml:103
513#: qml/Wizard/Pages/50-location.qml:103
@@ -515,8 +515,8 @@ msgid ""
515"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
515"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
516"conditions</a>."
516"conditions</a>."
517msgstr ""
517msgstr ""
518−"Seleicionando esta opción, aceutes los <a href='#'>términos y "
518+"Esbillando esta opción aceutes los <a href='#'>términos y condiciones</a> de "
519−"condiciones</a> de Nokia HERE."
519+"Nokia HERE."
520
520
521#: qml/Wizard/Pages/50-location.qml:112
521#: qml/Wizard/Pages/50-location.qml:112
522msgid "Not at all"
522msgid "Not at all"
@@ -528,7 +528,7 @@ msgstr "Pues cambialo dempués n'<b>Axustes del sistema</b>."
528
528
529#: qml/Wizard/Pages/60-reporting.qml:24
529#: qml/Wizard/Pages/60-reporting.qml:24
530msgid "Improving your experience"
530msgid "Improving your experience"
531−msgstr "Ameyorar la esperiencia"
531+msgstr "Ameyorando la to esperiencia"
532
532
533#: qml/Wizard/Pages/60-reporting.qml:36
533#: qml/Wizard/Pages/60-reporting.qml:36
534msgid ""
534msgid ""
@@ -543,7 +543,7 @@ msgid ""
543"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
543"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
544"Privacy</b>"
544"Privacy</b>"
545msgstr ""
545msgstr ""
546−"Esto pue desactivase nos <b>Axustes del sistema</b> en <b>Seguranza y "
546+"Esto pue deshabilitase nos <b>Axustes del sistema</b> en <b>Seguranza y "
547"privacidá</b>"
547"privacidá</b>"
548
548
549#: qml/Wizard/Pages/80-finished.qml:24
549#: qml/Wizard/Pages/80-finished.qml:24
@@ -552,11 +552,11 @@ msgstr "Too fecho"
552
552
553#: qml/Wizard/Pages/80-finished.qml:39
553#: qml/Wizard/Pages/80-finished.qml:39
554msgid "Nice work!"
554msgid "Nice work!"
555−msgstr "Bon trabayu!"
555+msgstr "¡Bon trabayu!"
556
556
557#: qml/Wizard/Pages/80-finished.qml:46
557#: qml/Wizard/Pages/80-finished.qml:46
558msgid "Your phone is now ready to use."
558msgid "Your phone is now ready to use."
559−msgstr "El teléfonu yá ta preparáu pa usar."
559+msgstr "El teléfonu yá ta tresnáu pa usase."
560
560
561#: qml/Wizard/Pages/80-finished.qml:53
561#: qml/Wizard/Pages/80-finished.qml:53
562msgid "Finish"
562msgid "Finish"
@@ -568,24 +568,24 @@ msgstr "Términos y condiciones"
568
568
569#: qml/Wizard/Pages/passwd-confirm.qml:49
569#: qml/Wizard/Pages/passwd-confirm.qml:49
570msgid "Confirm passphrase"
570msgid "Confirm passphrase"
571−msgstr "Confirmar fras secreta"
571+msgstr "Confirmar frase de pasu"
572
572
573#: qml/Wizard/Pages/passwd-confirm.qml:50
573#: qml/Wizard/Pages/passwd-confirm.qml:50
574msgid "Confirm passcode"
574msgid "Confirm passcode"
575−msgstr "Confirmar el códigu de pasu"
575+msgstr "Confirmar códigu de pasu"
576
576
577#: qml/Wizard/Pages/passwd-confirm.qml:53
577#: qml/Wizard/Pages/passwd-confirm.qml:53
578#: qml/Wizard/Pages/passwd-confirm.qml:54
578#: qml/Wizard/Pages/passwd-confirm.qml:54
579msgid "Please try again."
579msgid "Please try again."
580−msgstr "Vuelvi a intentalo."
580+msgstr "Por favor, vuelvi a intentalo."
581
581
582#: qml/Wizard/Pages/passwd-set.qml:61
582#: qml/Wizard/Pages/passwd-set.qml:61
583msgid "Choose your passcode"
583msgid "Choose your passcode"
584−msgstr "Escueyi'l códigu de pasu"
584+msgstr "Escueyi'l to códigu de pasu"
585
585
586#: qml/Wizard/Pages/passwd-set.qml:68
586#: qml/Wizard/Pages/passwd-set.qml:68
587msgid "Passphrase must be 4 characters long"
587msgid "Passphrase must be 4 characters long"
588−msgstr "La fras de contraseña tien de ser de 4 caráuteres"
588+msgstr "La fras de pasu tien de ser 4 caráuteres de llargor"
589
589
590#: qml/Wizard/StackButton.qml:39
590#: qml/Wizard/StackButton.qml:39
591#, qt-format
591#, qt-format
po/eo.po+6−6
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2013-06-26 22:35+0000\n"
11+"PO-Revision-Date: 2015-06-06 23:37+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: Eliovir <Unknown>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
13"Language-Team: Esperanto <eo@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
18+"X-Launchpad-Export-Date: 2015-06-08 05:26+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17540)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -197,7 +197,7 @@ msgstr ""
197
197
198#: qml/Dash/Previews/PreviewRatingInput.qml:166
198#: qml/Dash/Previews/PreviewRatingInput.qml:166
199msgid "Send"
199msgid "Send"
200−msgstr ""
200+msgstr "Sendi"
201
201
202#: qml/Dash/PullToRefreshScopeStyle.qml:55
202#: qml/Dash/PullToRefreshScopeStyle.qml:55
203msgid "Pull to refresh…"
203msgid "Pull to refresh…"
@@ -291,7 +291,7 @@ msgstr ""
291
291
292#: qml/Notifications/NotificationMenuItemFactory.qml:128
292#: qml/Notifications/NotificationMenuItemFactory.qml:128
293msgid "Show password"
293msgid "Show password"
294−msgstr ""
294+msgstr "Montri pasvorton"
295
295
296#: qml/Panel/ActiveCallHint.qml:79
296#: qml/Panel/ActiveCallHint.qml:79
297msgid "Tap to return to call..."
297msgid "Tap to return to call..."
po/fi.po+4−4
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-03-25 07:55+0000\n"
11+"PO-Revision-Date: 2015-05-19 09:14+0000\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
12"Last-Translator: Jiri Grönroos <Unknown>\n"
13"Language-Team: Finnish <fi@li.org>\n"
13"Language-Team: Finnish <fi@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
18+"X-Launchpad-Export-Date: 2015-05-22 05:09+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17514)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -373,7 +373,7 @@ msgstr "Napauta tästä jatkaaksesi."
373
373
374#: qml/Tutorial/TutorialContent.qml:81
374#: qml/Tutorial/TutorialContent.qml:81
375msgid "Click here to finish."
375msgid "Click here to finish."
376−msgstr ""
376+msgstr "Viimeistele napsauttamalla tästä."
377
377
378#: qml/Tutorial/TutorialLeftFinish.qml:24
378#: qml/Tutorial/TutorialLeftFinish.qml:24
379msgid "These are the shortcuts to favorite apps"
379msgid "These are the shortcuts to favorite apps"
po/ia.po+94−83
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-04-27 10:07+0000\n"
11+"PO-Revision-Date: 2015-06-08 18:58+0000\n"
12−"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
12+"Last-Translator: karm <melo@carmu.com>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
13"Language-Team: Interlingua <ia@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-28 05:33+0000\n"
18+"X-Launchpad-Export-Date: 2015-06-09 05:42+0000\n"
19−"X-Generator: Launchpad (build 17453)\n"
19+"X-Generator: Launchpad (build 17549)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -29,7 +29,7 @@ msgstr "Via-breve a pin"
29
29
30#: plugins/Unity/Launcher/launcheritem.cpp:100
30#: plugins/Unity/Launcher/launcheritem.cpp:100
31msgid "Unpin shortcut"
31msgid "Unpin shortcut"
32−msgstr "Via-breve levar pin"
32+msgstr "Via-breve a levar pin"
33
33
34#: qml/Components/DelayedLockscreen.qml:49
34#: qml/Components/DelayedLockscreen.qml:49
35msgid "Device Locked"
35msgid "Device Locked"
@@ -49,13 +49,13 @@ msgstr ""
49#, qt-format
49#, qt-format
50msgid "Please wait %1 minute and then try again…"
50msgid "Please wait %1 minute and then try again…"
51msgid_plural "Please wait %1 minutes and then try again…"
51msgid_plural "Please wait %1 minutes and then try again…"
52−msgstr[0] "Per favor attende %1 minuta e postea tentar de nove"
52+msgstr[0] "Per favor attende %1 minuta e postea tenta de nove"
53msgstr[1] "Per favor attende %1 minutas e postea tentar de nove"
53msgstr[1] "Per favor attende %1 minutas e postea tentar de nove"
54
54
55#: qml/Components/Dialogs.qml:69
55#: qml/Components/Dialogs.qml:69
56msgctxt "Title: Lock/Log out dialog"
56msgctxt "Title: Lock/Log out dialog"
57msgid "Log out"
57msgid "Log out"
58−msgstr ""
58+msgstr "Clauder de session"
59
59
60#: qml/Components/Dialogs.qml:70
60#: qml/Components/Dialogs.qml:70
61msgid "Are you sure you want to log out?"
61msgid "Are you sure you want to log out?"
@@ -64,12 +64,12 @@ msgstr "Desira tu vermente Clauder le Session"
64#: qml/Components/Dialogs.qml:72
64#: qml/Components/Dialogs.qml:72
65msgctxt "Button: Lock the system"
65msgctxt "Button: Lock the system"
66msgid "Lock"
66msgid "Lock"
67−msgstr ""
67+msgstr "Blocar"
68
68
69#: qml/Components/Dialogs.qml:79
69#: qml/Components/Dialogs.qml:79
70msgctxt "Button: Log out from the system"
70msgctxt "Button: Log out from the system"
71msgid "Log Out"
71msgid "Log Out"
72−msgstr ""
72+msgstr "Claude session"
73
73
74#: qml/Components/Dialogs.qml:86 qml/Components/Dialogs.qml:117
74#: qml/Components/Dialogs.qml:86 qml/Components/Dialogs.qml:117
75#: qml/Components/Dialogs.qml:173
75#: qml/Components/Dialogs.qml:173
@@ -79,7 +79,7 @@ msgstr "Cancellar"
79#: qml/Components/Dialogs.qml:98
79#: qml/Components/Dialogs.qml:98
80msgctxt "Title: Reboot/Shut down dialog"
80msgctxt "Title: Reboot/Shut down dialog"
81msgid "Shut down"
81msgid "Shut down"
82−msgstr ""
82+msgstr "Stoppar"
83
83
84#: qml/Components/Dialogs.qml:99
84#: qml/Components/Dialogs.qml:99
85msgid "Are you sure you want to shut down?"
85msgid "Are you sure you want to shut down?"
@@ -88,21 +88,21 @@ msgstr "Desira tu vermente Stoppar"
88#: qml/Components/Dialogs.qml:101
88#: qml/Components/Dialogs.qml:101
89msgctxt "Button: Reboot the system"
89msgctxt "Button: Reboot the system"
90msgid "Reboot"
90msgid "Reboot"
91−msgstr ""
91+msgstr "Reinitiar"
92
92
93#: qml/Components/Dialogs.qml:109
93#: qml/Components/Dialogs.qml:109
94msgctxt "Button: Shut down the system"
94msgctxt "Button: Shut down the system"
95msgid "Shut down"
95msgid "Shut down"
96−msgstr ""
96+msgstr "Stoppar"
97
97
98#: qml/Components/Dialogs.qml:129
98#: qml/Components/Dialogs.qml:129
99msgctxt "Title: Reboot dialog"
99msgctxt "Title: Reboot dialog"
100msgid "Reboot"
100msgid "Reboot"
101−msgstr ""
101+msgstr "Reinitiar"
102
102
103#: qml/Components/Dialogs.qml:130
103#: qml/Components/Dialogs.qml:130
104msgid "Are you sure you want to reboot?"
104msgid "Are you sure you want to reboot?"
105−msgstr "Desira tu vermente Reinitiar"
105+msgstr "Desira tu vermente reinitiar"
106
106
107#: qml/Components/Dialogs.qml:132
107#: qml/Components/Dialogs.qml:132
108msgid "No"
108msgid "No"
@@ -115,7 +115,7 @@ msgstr "Si"
115#: qml/Components/Dialogs.qml:152
115#: qml/Components/Dialogs.qml:152
116msgctxt "Title: Power off/Restart dialog"
116msgctxt "Title: Power off/Restart dialog"
117msgid "Power"
117msgid "Power"
118−msgstr ""
118+msgstr "Energia"
119
119
120#: qml/Components/Dialogs.qml:153
120#: qml/Components/Dialogs.qml:153
121msgid ""
121msgid ""
@@ -123,17 +123,17 @@ msgid ""
123"to power off?"
123"to power off?"
124msgstr ""
124msgstr ""
125"Desira tu vermente \n"
125"Desira tu vermente \n"
126−"Stoppar le energia?"
126+"stoppar le energia?"
127
127
128#: qml/Components/Dialogs.qml:155
128#: qml/Components/Dialogs.qml:155
129msgctxt "Button: Power off the system"
129msgctxt "Button: Power off the system"
130msgid "Power off"
130msgid "Power off"
131−msgstr ""
131+msgstr "Stoppar le energia"
132
132
133#: qml/Components/Dialogs.qml:164
133#: qml/Components/Dialogs.qml:164
134msgctxt "Button: Restart the system"
134msgctxt "Button: Restart the system"
135msgid "Restart"
135msgid "Restart"
136−msgstr ""
136+msgstr "Reinitiar"
137
137
138#: qml/Components/Lockscreen.qml:245
138#: qml/Components/Lockscreen.qml:245
139msgid "Return to Call"
139msgid "Return to Call"
@@ -158,22 +158,22 @@ msgstr "Vider toto"
158#: qml/Dash/GenericScopeView.qml:594
158#: qml/Dash/GenericScopeView.qml:594
159msgctxt "Label: Hint for dash search line edit"
159msgctxt "Label: Hint for dash search line edit"
160msgid "Search"
160msgid "Search"
161−msgstr ""
161+msgstr "Cerca"
162
162
163#: qml/Dash/PageHeader.qml:269
163#: qml/Dash/PageHeader.qml:269
164msgctxt "Button: Open the Ubuntu Store"
164msgctxt "Button: Open the Ubuntu Store"
165msgid "Store"
165msgid "Store"
166−msgstr ""
166+msgstr "Salva"
167
167
168#: qml/Dash/PageHeader.qml:276
168#: qml/Dash/PageHeader.qml:276
169msgctxt "Button: Start a search in the current dash scope"
169msgctxt "Button: Start a search in the current dash scope"
170msgid "Search"
170msgid "Search"
171−msgstr ""
171+msgstr "Cerca"
172
172
173#: qml/Dash/PageHeader.qml:286
173#: qml/Dash/PageHeader.qml:286
174msgctxt "Button: Show the current dash scope settings"
174msgctxt "Button: Show the current dash scope settings"
175msgid "Settings"
175msgid "Settings"
176−msgstr ""
176+msgstr "Configurationes"
177
177
178#: qml/Dash/PageHeader.qml:293
178#: qml/Dash/PageHeader.qml:293
179msgid "Remove from Favorites"
179msgid "Remove from Favorites"
@@ -213,7 +213,7 @@ msgstr "Relaxar pro renovar…"
213
213
214#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
214#: qml/Dash/ScopeSettings/ScopeSettingBoolean.qml:43
215msgid "Enable location data"
215msgid "Enable location data"
216−msgstr ""
216+msgstr "Habilita le datos del location"
217
217
218#: qml/Dash/ScopesList.qml:66
218#: qml/Dash/ScopesList.qml:66
219msgid "Manage"
219msgid "Manage"
@@ -233,11 +233,11 @@ msgstr "Liberar"
233
233
234#: qml/Greeter/LoginList.qml:236
234#: qml/Greeter/LoginList.qml:236
235msgid "Retry"
235msgid "Retry"
236−msgstr ""
236+msgstr "Re-provar"
237
237
238#: qml/Greeter/LoginList.qml:237
238#: qml/Greeter/LoginList.qml:237
239msgid "Tap to unlock"
239msgid "Tap to unlock"
240−msgstr ""
240+msgstr "Pulsa pro liberar"
241
241
242#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
242#: qml/Greeter/NarrowView.qml:53 qml/Wizard/Pages/passwd-confirm.qml:53
243msgid "Sorry, incorrect passphrase."
243msgid "Sorry, incorrect passphrase."
@@ -299,7 +299,7 @@ msgstr "Displacente, codice-contrasigno incorrecte"
299
299
300#: qml/Notifications/NotificationMenuItemFactory.qml:128
300#: qml/Notifications/NotificationMenuItemFactory.qml:128
301msgid "Show password"
301msgid "Show password"
302−msgstr "Monstra le contrasigno"
302+msgstr "Monstrar le contrasigno"
303
303
304#: qml/Panel/ActiveCallHint.qml:79
304#: qml/Panel/ActiveCallHint.qml:79
305msgid "Tap to return to call..."
305msgid "Tap to return to call..."
@@ -340,7 +340,7 @@ msgstr "Fallite, colpar pro re-provar"
340#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
340#: qml/Panel/Indicators/MessageMenuItemFactory.qml:149
341msgctxt "Label: Hint in message indicator line edit"
341msgctxt "Label: Hint in message indicator line edit"
342msgid "Reply"
342msgid "Reply"
343−msgstr ""
343+msgstr "Responde"
344
344
345#: qml/Panel/Indicators/ModemInfoItem.qml:105
345#: qml/Panel/Indicators/ModemInfoItem.qml:105
346msgid "Unlock SIM"
346msgid "Unlock SIM"
@@ -352,162 +352,165 @@ msgstr "Roaming"
352
352
353#: qml/Tutorial/TutorialBottomFinish.qml:24
353#: qml/Tutorial/TutorialBottomFinish.qml:24
354msgid "This action does different things for different apps"
354msgid "This action does different things for different apps"
355−msgstr ""
355+msgstr "Iste action ha effectos differente pro applicationes differente"
356
356
357#: qml/Tutorial/TutorialBottomFinish.qml:25
357#: qml/Tutorial/TutorialBottomFinish.qml:25
358msgid "Tap here to finish."
358msgid "Tap here to finish."
359−msgstr ""
359+msgstr "Pulsa ci pro finir"
360
360
361#: qml/Tutorial/TutorialBottom.qml:28
361#: qml/Tutorial/TutorialBottom.qml:28
362msgid "Open special menus"
362msgid "Open special menus"
363−msgstr ""
363+msgstr "Aperi le menus special"
364
364
365#: qml/Tutorial/TutorialBottom.qml:29
365#: qml/Tutorial/TutorialBottom.qml:29
366msgid "Swipe up from the bottom edge."
366msgid "Swipe up from the bottom edge."
367−msgstr ""
367+msgstr "Stria in alto ex le bordo basse."
368
368
369#: qml/Tutorial/TutorialContent.qml:81 qml/Tutorial/TutorialLeftFinish.qml:25
369#: qml/Tutorial/TutorialContent.qml:81 qml/Tutorial/TutorialLeftFinish.qml:25
370#: qml/Tutorial/TutorialRight.qml:144
370#: qml/Tutorial/TutorialRight.qml:144
371msgid "Tap here to continue."
371msgid "Tap here to continue."
372−msgstr ""
372+msgstr "Pulsa ci pro continuar"
373
373
374#: qml/Tutorial/TutorialContent.qml:81
374#: qml/Tutorial/TutorialContent.qml:81
375msgid "Click here to finish."
375msgid "Click here to finish."
376−msgstr ""
376+msgstr "Clicca ci pro finir"
377
377
378#: qml/Tutorial/TutorialLeftFinish.qml:24
378#: qml/Tutorial/TutorialLeftFinish.qml:24
379msgid "These are the shortcuts to favorite apps"
379msgid "These are the shortcuts to favorite apps"
380−msgstr ""
380+msgstr "Iste es le vias breve al applicationes favorite"
381
381
382#: qml/Tutorial/TutorialLeft.qml:26
382#: qml/Tutorial/TutorialLeft.qml:26
383msgid "Open the launcher"
383msgid "Open the launcher"
384−msgstr ""
384+msgstr "Aperi le lanceator"
385
385
386#: qml/Tutorial/TutorialLeft.qml:27
386#: qml/Tutorial/TutorialLeft.qml:27
387msgid "Short swipe from the left edge."
387msgid "Short swipe from the left edge."
388−msgstr ""
388+msgstr "Stria curte ex le bordo sinistre."
389
389
390#: qml/Tutorial/TutorialPage.qml:178
390#: qml/Tutorial/TutorialPage.qml:178
391msgid "You almost got it!"
391msgid "You almost got it!"
392−msgstr ""
392+msgstr "Tu ha quasi obtenite lo!"
393
393
394#: qml/Tutorial/TutorialPage.qml:195
394#: qml/Tutorial/TutorialPage.qml:195
395msgid "Try again."
395msgid "Try again."
396−msgstr ""
396+msgstr "Prova de novo"
397
397
398#: qml/Tutorial/TutorialRight.qml:31
398#: qml/Tutorial/TutorialRight.qml:31
399msgid "To view open apps"
399msgid "To view open apps"
400−msgstr ""
400+msgstr "Aperi le applicationes pro vider"
401
401
402#: qml/Tutorial/TutorialRight.qml:32
402#: qml/Tutorial/TutorialRight.qml:32
403msgid "Long swipe from the right edge."
403msgid "Long swipe from the right edge."
404−msgstr ""
404+msgstr "Stria longemente ex le bordo dextre."
405
405
406#: qml/Tutorial/TutorialRight.qml:122
406#: qml/Tutorial/TutorialRight.qml:122
407msgid "View all your running tasks."
407msgid "View all your running tasks."
408−msgstr ""
408+msgstr "Vide tote tu tasks fluente"
409
409
410#: qml/Wizard/Page.qml:89
410#: qml/Wizard/Page.qml:89
411msgctxt "Button: Go back one page in the Wizard"
411msgctxt "Button: Go back one page in the Wizard"
412msgid "Back"
412msgid "Back"
413−msgstr ""
413+msgstr "Retro"
414
414
415#: qml/Wizard/Pages/10-welcome.qml:27
415#: qml/Wizard/Pages/10-welcome.qml:27
416msgid "Hi!"
416msgid "Hi!"
417−msgstr ""
417+msgstr "Salute!"
418
418
419#: qml/Wizard/Pages/10-welcome.qml:44
419#: qml/Wizard/Pages/10-welcome.qml:44
420msgid "Welcome to your Ubuntu phone."
420msgid "Welcome to your Ubuntu phone."
421−msgstr ""
421+msgstr "Benvenite a tu telephono Ubuntu."
422
422
423#: qml/Wizard/Pages/10-welcome.qml:52
423#: qml/Wizard/Pages/10-welcome.qml:52
424msgid "Let’s get started."
424msgid "Let’s get started."
425−msgstr ""
425+msgstr "Que nos initia."
426
426
427#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
427#: qml/Wizard/Pages/10-welcome.qml:88 qml/Wizard/Pages/30-passwd-type.qml:128
428#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
428#: qml/Wizard/Pages/40-wifi.qml:215 qml/Wizard/Pages/50-location.qml:131
429#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
429#: qml/Wizard/Pages/60-reporting.qml:50 qml/Wizard/Pages/passwd-confirm.qml:82
430#: qml/Wizard/Pages/passwd-set.qml:90
430#: qml/Wizard/Pages/passwd-set.qml:90
431msgid "Continue"
431msgid "Continue"
432−msgstr ""
432+msgstr "Continua"
433
433
434#: qml/Wizard/Pages/20-sim.qml:25
434#: qml/Wizard/Pages/20-sim.qml:25
435msgid "Add a SIM card and restart your device"
435msgid "Add a SIM card and restart your device"
436−msgstr ""
436+msgstr "Adde un carta SIM e reinitia tu dispositivo"
437
437
438#: qml/Wizard/Pages/20-sim.qml:59
438#: qml/Wizard/Pages/20-sim.qml:59
439msgid "Without it, you won’t be able to make calls or use text messaging."
439msgid "Without it, you won’t be able to make calls or use text messaging."
440msgstr ""
440msgstr ""
441+"Sin illo, tu non es habile a facer appellos o usar le messages de texto."
441
442
442#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
443#: qml/Wizard/Pages/20-sim.qml:73 qml/Wizard/Pages/40-wifi.qml:215
443msgid "Skip"
444msgid "Skip"
444−msgstr ""
445+msgstr "Salta"
445
446
446#: qml/Wizard/Pages/30-passwd-type.qml:39
447#: qml/Wizard/Pages/30-passwd-type.qml:39
447msgid "Lock security"
448msgid "Lock security"
448−msgstr ""
449+msgstr "Bloco de securitate"
449
450
450#: qml/Wizard/Pages/30-passwd-type.qml:74
451#: qml/Wizard/Pages/30-passwd-type.qml:74
451msgid "Please select how you’d like to unlock your phone."
452msgid "Please select how you’d like to unlock your phone."
452−msgstr ""
453+msgstr "Per favor selige in qual maniera disblocar tu telephono."
453
454
454#: qml/Wizard/Pages/30-passwd-type.qml:97
455#: qml/Wizard/Pages/30-passwd-type.qml:97
455msgctxt "Label: Type of security method"
456msgctxt "Label: Type of security method"
456msgid "Swipe"
457msgid "Swipe"
457−msgstr ""
458+msgstr "Striar"
458
459
459#: qml/Wizard/Pages/30-passwd-type.qml:98
460#: qml/Wizard/Pages/30-passwd-type.qml:98
460msgctxt "Label: Description of security method"
461msgctxt "Label: Description of security method"
461msgid "No security"
462msgid "No security"
462−msgstr ""
463+msgstr "Nulle securitate"
463
464
464#: qml/Wizard/Pages/30-passwd-type.qml:100
465#: qml/Wizard/Pages/30-passwd-type.qml:100
465msgctxt "Label: Type of security method"
466msgctxt "Label: Type of security method"
466msgid "Passcode"
467msgid "Passcode"
467−msgstr ""
468+msgstr "Codice-contrasigno"
468
469
469#: qml/Wizard/Pages/30-passwd-type.qml:101
470#: qml/Wizard/Pages/30-passwd-type.qml:101
470msgctxt "Label: Description of security method"
471msgctxt "Label: Description of security method"
471msgid "4 digits only"
472msgid "4 digits only"
472−msgstr ""
473+msgstr "4 cifras sol"
473
474
474#: qml/Wizard/Pages/30-passwd-type.qml:103
475#: qml/Wizard/Pages/30-passwd-type.qml:103
475msgctxt "Label: Type of security method"
476msgctxt "Label: Type of security method"
476msgid "Passphrase"
477msgid "Passphrase"
477−msgstr ""
478+msgstr "Phrase-contrasigno"
478
479
479#: qml/Wizard/Pages/30-passwd-type.qml:104
480#: qml/Wizard/Pages/30-passwd-type.qml:104
480msgctxt "Label: Description of security method"
481msgctxt "Label: Description of security method"
481msgid "Numbers and letters"
482msgid "Numbers and letters"
482−msgstr ""
483+msgstr "Numeros e litteras"
483
484
484#: qml/Wizard/Pages/40-wifi.qml:29
485#: qml/Wizard/Pages/40-wifi.qml:29
485msgid "Connect to Wi‑Fi"
486msgid "Connect to Wi‑Fi"
486−msgstr ""
487+msgstr "Connecter al Wi‑Fi"
487
488
488#: qml/Wizard/Pages/40-wifi.qml:168
489#: qml/Wizard/Pages/40-wifi.qml:168
489msgid "Available networks…"
490msgid "Available networks…"
490−msgstr ""
491+msgstr "Retes disponibile..."
491
492
492#: qml/Wizard/Pages/40-wifi.qml:169
493#: qml/Wizard/Pages/40-wifi.qml:169
493msgid "No available networks."
494msgid "No available networks."
494−msgstr ""
495+msgstr "Nulle rete disponibile."
495
496
496#: qml/Wizard/Pages/50-location.qml:27
497#: qml/Wizard/Pages/50-location.qml:27
497msgid "Location"
498msgid "Location"
498−msgstr ""
499+msgstr "Location"
499
500
500#: qml/Wizard/Pages/50-location.qml:62
501#: qml/Wizard/Pages/50-location.qml:62
501msgid "Let the phone detect your location:"
502msgid "Let the phone detect your location:"
502−msgstr ""
503+msgstr "Lassar le telephono disvelar tu position:"
503
504
504#: qml/Wizard/Pages/50-location.qml:69
505#: qml/Wizard/Pages/50-location.qml:69
505msgid "Using GPS only (less accurate)"
506msgid "Using GPS only (less accurate)"
506−msgstr ""
507+msgstr "Usar sol le GPS (minus accurate)"
507
508
508#: qml/Wizard/Pages/50-location.qml:86
509#: qml/Wizard/Pages/50-location.qml:86
509msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
510msgid "Using GPS, anonymized Wi-Fi and cellular network info (recommended)"
510msgstr ""
511msgstr ""
512+"Usar le GPS, le Wi-Fi in modo anonyme e le informationes del rete cellular "
513+"(recommendate)"
511
514
512#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
515#. TRANSLATORS: HERE is a trademark for Nokia's location service, you probably shouldn't translate it
513#: qml/Wizard/Pages/50-location.qml:103
516#: qml/Wizard/Pages/50-location.qml:103
@@ -515,81 +518,89 @@ msgid ""
515"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
518"By selecting this option you agree to the Nokia HERE <a href='#'>terms and "
516"conditions</a>."
519"conditions</a>."
517msgstr ""
520msgstr ""
521+"Per le selection de iste option tu esser de accordo con le Nokia HERE <a "
522+"href='#'>terminos e conditiones</a>."
518
523
519#: qml/Wizard/Pages/50-location.qml:112
524#: qml/Wizard/Pages/50-location.qml:112
520msgid "Not at all"
525msgid "Not at all"
521−msgstr ""
526+msgstr "No, del toto"
522
527
523#: qml/Wizard/Pages/50-location.qml:124
528#: qml/Wizard/Pages/50-location.qml:124
524msgid "You can change your mind later in <b>System Settings</b>."
529msgid "You can change your mind later in <b>System Settings</b>."
525msgstr ""
530msgstr ""
531+"Tu pote cambiar tu desiderata plus tarde in <b>Configurationes del "
532+"systema</b>."
526
533
527#: qml/Wizard/Pages/60-reporting.qml:24
534#: qml/Wizard/Pages/60-reporting.qml:24
528msgid "Improving your experience"
535msgid "Improving your experience"
529−msgstr ""
536+msgstr "Affinamento de tu experientia"
530
537
531#: qml/Wizard/Pages/60-reporting.qml:36
538#: qml/Wizard/Pages/60-reporting.qml:36
532msgid ""
539msgid ""
533"Your phone is set up to automatically report errors to Canonical and its "
540"Your phone is set up to automatically report errors to Canonical and its "
534"partners, the makers of the operating system."
541"partners, the makers of the operating system."
535msgstr ""
542msgstr ""
543+"Tu telephono es configurate a reportar automaticamente le errores a "
544+"Canonical e su socios, le fabricantes del systema operative."
536
545
537#: qml/Wizard/Pages/60-reporting.qml:43
546#: qml/Wizard/Pages/60-reporting.qml:43
538msgid ""
547msgid ""
539"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
548"This can be disabled in <b>System Settings</b> under <b>Security &amp; "
540"Privacy</b>"
549"Privacy</b>"
541msgstr ""
550msgstr ""
551+"Isto pote esser impedite in <b>Preparationes del systema</b> sub "
552+"<b>Securitate &amp; Confidentialitate</b>"
542
553
543#: qml/Wizard/Pages/80-finished.qml:24
554#: qml/Wizard/Pages/80-finished.qml:24
544msgid "All done"
555msgid "All done"
545−msgstr ""
556+msgstr "Toto preste"
546
557
547#: qml/Wizard/Pages/80-finished.qml:39
558#: qml/Wizard/Pages/80-finished.qml:39
548msgid "Nice work!"
559msgid "Nice work!"
549−msgstr ""
560+msgstr "Belle obra!"
550
561
551#: qml/Wizard/Pages/80-finished.qml:46
562#: qml/Wizard/Pages/80-finished.qml:46
552msgid "Your phone is now ready to use."
563msgid "Your phone is now ready to use."
553−msgstr ""
564+msgstr "Tu telephono es ora preste al uso."
554
565
555#: qml/Wizard/Pages/80-finished.qml:53
566#: qml/Wizard/Pages/80-finished.qml:53
556msgid "Finish"
567msgid "Finish"
557−msgstr ""
568+msgstr "Fin"
558
569
559#: qml/Wizard/Pages/here-terms.qml:27
570#: qml/Wizard/Pages/here-terms.qml:27
560msgid "Terms & Conditions"
571msgid "Terms & Conditions"
561−msgstr ""
572+msgstr "Terminos & Conditiones"
562
573
563#: qml/Wizard/Pages/passwd-confirm.qml:49
574#: qml/Wizard/Pages/passwd-confirm.qml:49
564msgid "Confirm passphrase"
575msgid "Confirm passphrase"
565−msgstr ""
576+msgstr "Confirma le phrase-contrasigno"
566
577
567#: qml/Wizard/Pages/passwd-confirm.qml:50
578#: qml/Wizard/Pages/passwd-confirm.qml:50
568msgid "Confirm passcode"
579msgid "Confirm passcode"
569−msgstr ""
580+msgstr "Confirma le codice-contrasigno"
570
581
571#: qml/Wizard/Pages/passwd-confirm.qml:53
582#: qml/Wizard/Pages/passwd-confirm.qml:53
572#: qml/Wizard/Pages/passwd-confirm.qml:54
583#: qml/Wizard/Pages/passwd-confirm.qml:54
573msgid "Please try again."
584msgid "Please try again."
574−msgstr ""
585+msgstr "Reproba per favor."
575
586
576#: qml/Wizard/Pages/passwd-set.qml:61
587#: qml/Wizard/Pages/passwd-set.qml:61
577msgid "Choose your passcode"
588msgid "Choose your passcode"
578−msgstr ""
589+msgstr "Selige tu codice-contrasigno"
579
590
580#: qml/Wizard/Pages/passwd-set.qml:68
591#: qml/Wizard/Pages/passwd-set.qml:68
581msgid "Passphrase must be 4 characters long"
592msgid "Passphrase must be 4 characters long"
582−msgstr ""
593+msgstr "Le phrase-contrasigno debe esser longe 4 characteres"
583
594
584#: qml/Wizard/StackButton.qml:39
595#: qml/Wizard/StackButton.qml:39
585#, qt-format
596#, qt-format
586msgid "〈 %1"
597msgid "〈 %1"
587−msgstr ""
598+msgstr "〈 %1"
588
599
589#: qml/Wizard/StackButton.qml:42
600#: qml/Wizard/StackButton.qml:42
590#, qt-format
601#, qt-format
591msgid "%1 〉"
602msgid "%1 〉"
592−msgstr ""
603+msgstr "%1 〉"
593
604
594#~ msgid "Log out"
605#~ msgid "Log out"
595#~ msgstr "Clauder le Session"
606#~ msgstr "Clauder le Session"
@@ -641,13 +652,6 @@ msgstr ""
641#~ msgid "Well done"
652#~ msgid "Well done"
642#~ msgstr "Ben!"
653#~ msgstr "Ben!"
643
654
644−#~ msgid ""
645−#~ "You have now mastered the edge gestures and can start using the "
646−#~ "phone<br><br>Tap on the screen to start"
647−#~ msgstr ""
648−#~ "Tu ha ora maestrate le gestos del bordo e pote initiar usar le "
649−#~ "telephono<br><br>colpar sur le schermo pro initiar"
650−
651#~ msgid "Search"
655#~ msgid "Search"
652#~ msgstr "Cercar"
656#~ msgstr "Cercar"
653
657
@@ -671,3 +675,10 @@ msgstr ""
671
675
672#~ msgid "Speaking..."
676#~ msgid "Speaking..."
673#~ msgstr "Parlante..."
677#~ msgstr "Parlante..."
678+
679+#~ msgid ""
680+#~ "You have now mastered the edge gestures and can start using the "
681+#~ "phone<br><br>Tap on the screen to start"
682+#~ msgstr ""
683+#~ "Tu es ora maestrate le gestos del bordo e pote initiar usar le "
684+#~ "telephono<br><br>colpar sur le schermo pro initiar"
po/nb.po+8−8
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-03-20 14:03+0000\n"
11+"PO-Revision-Date: 2015-06-03 02:43+0000\n"
12−"Last-Translator: Åka Sikrom <Unknown>\n"
12+"Last-Translator: Eirik Garatun <eikknud@gmail.com>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
13"Language-Team: Norwegian Bokmal <nb@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
18+"X-Launchpad-Export-Date: 2015-06-05 05:58+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17540)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -163,17 +163,17 @@ msgstr "Søk"
163#: qml/Dash/PageHeader.qml:269
163#: qml/Dash/PageHeader.qml:269
164msgctxt "Button: Open the Ubuntu Store"
164msgctxt "Button: Open the Ubuntu Store"
165msgid "Store"
165msgid "Store"
166−msgstr ""
166+msgstr "Butikk"
167
167
168#: qml/Dash/PageHeader.qml:276
168#: qml/Dash/PageHeader.qml:276
169msgctxt "Button: Start a search in the current dash scope"
169msgctxt "Button: Start a search in the current dash scope"
170msgid "Search"
170msgid "Search"
171−msgstr ""
171+msgstr "Søk"
172
172
173#: qml/Dash/PageHeader.qml:286
173#: qml/Dash/PageHeader.qml:286
174msgctxt "Button: Show the current dash scope settings"
174msgctxt "Button: Show the current dash scope settings"
175msgid "Settings"
175msgid "Settings"
176−msgstr ""
176+msgstr "Innstillinger"
177
177
178#: qml/Dash/PageHeader.qml:293
178#: qml/Dash/PageHeader.qml:293
179msgid "Remove from Favorites"
179msgid "Remove from Favorites"
@@ -373,7 +373,7 @@ msgstr "Trykk her for å fortsette."
373
373
374#: qml/Tutorial/TutorialContent.qml:81
374#: qml/Tutorial/TutorialContent.qml:81
375msgid "Click here to finish."
375msgid "Click here to finish."
376−msgstr ""
376+msgstr "Trykk her for å fullføre."
377
377
378#: qml/Tutorial/TutorialLeftFinish.qml:24
378#: qml/Tutorial/TutorialLeftFinish.qml:24
379msgid "These are the shortcuts to favorite apps"
379msgid "These are the shortcuts to favorite apps"
po/pt.po+7−7
@@ -8,15 +8,15 @@ msgstr ""
8"Project-Id-Version: unity8\n"
8"Project-Id-Version: unity8\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-04-18 02:15+0000\n"
11+"PO-Revision-Date: 2015-05-19 03:42+0000\n"
12"Last-Translator: António Miranda <Unknown>\n"
12"Last-Translator: António Miranda <Unknown>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
13"Language-Team: Portuguese <pt@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
17"Plural-Forms: nplurals=2; plural=n != 1;\n"
18−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
18+"X-Launchpad-Export-Date: 2015-05-22 05:09+0000\n"
19−"X-Generator: Launchpad (build 17430)\n"
19+"X-Generator: Launchpad (build 17514)\n"
20
20
21#: plugins/LightDM/Greeter.cpp:112
21#: plugins/LightDM/Greeter.cpp:112
22msgid "Password: "
22msgid "Password: "
@@ -262,7 +262,7 @@ msgid ""
262"If passcode is entered incorrectly, your phone will conduct a factory reset "
262"If passcode is entered incorrectly, your phone will conduct a factory reset "
263"and all personal data will be deleted."
263"and all personal data will be deleted."
264msgstr ""
264msgstr ""
265−"Se o código seja introduzido incorretamente, todos os dados pessoais do seu "
265+"Se o código não for introduzido corretamente, todos os dados pessoais do seu "
266"telemóvel serão apagados."
266"telemóvel serão apagados."
267
267
268#: qml/Greeter/NarrowView.qml:115
268#: qml/Greeter/NarrowView.qml:115
@@ -276,7 +276,7 @@ msgstr "Indique a palavra-passe"
276
276
277#: qml/Greeter/NarrowView.qml:117
277#: qml/Greeter/NarrowView.qml:117
278msgid "Enter passcode"
278msgid "Enter passcode"
279−msgstr "Introduza código"
279+msgstr "Introduza o código"
280
280
281#: qml/Greeter/NarrowView.qml:118
281#: qml/Greeter/NarrowView.qml:118
282#, qt-format
282#, qt-format
@@ -293,7 +293,7 @@ msgstr "Por favor, volte a introduzir"
293
293
294#: qml/Greeter/NarrowView.qml:121
294#: qml/Greeter/NarrowView.qml:121
295msgid "Sorry, incorrect passcode"
295msgid "Sorry, incorrect passcode"
296−msgstr "Código incorreta"
296+msgstr "Código incorreto"
297
297
298#: qml/Notifications/NotificationMenuItemFactory.qml:128
298#: qml/Notifications/NotificationMenuItemFactory.qml:128
299msgid "Show password"
299msgid "Show password"
@@ -371,7 +371,7 @@ msgstr "Toque aqui para continuar."
371
371
372#: qml/Tutorial/TutorialContent.qml:81
372#: qml/Tutorial/TutorialContent.qml:81
373msgid "Click here to finish."
373msgid "Click here to finish."
374−msgstr ""
374+msgstr "Clique aqui para finalizar."
375
375
376#: qml/Tutorial/TutorialLeftFinish.qml:24
376#: qml/Tutorial/TutorialLeftFinish.qml:24
377msgid "These are the shortcuts to favorite apps"
377msgid "These are the shortcuts to favorite apps"
po/sl.po+8−8
@@ -8,16 +8,16 @@ msgstr ""
8"Project-Id-Version: unity\n"
8"Project-Id-Version: unity\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
9"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
10"POT-Creation-Date: 2015-04-14 16:13+0200\n"
11−"PO-Revision-Date: 2015-03-23 07:24+0000\n"
11+"PO-Revision-Date: 2015-06-05 06:39+0000\n"
12−"Last-Translator: Damir Jerovšek <Unknown>\n"
12+"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
13"Language-Team: Slovenian <sl@li.org>\n"
14"MIME-Version: 1.0\n"
14"MIME-Version: 1.0\n"
15"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Type: text/plain; charset=UTF-8\n"
16"Content-Transfer-Encoding: 8bit\n"
16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
17"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || "
18"n%100==4 ? 3 : 0);\n"
18"n%100==4 ? 3 : 0);\n"
19−"X-Launchpad-Export-Date: 2015-04-23 06:48+0000\n"
19+"X-Launchpad-Export-Date: 2015-06-06 05:31+0000\n"
20−"X-Generator: Launchpad (build 17430)\n"
20+"X-Generator: Launchpad (build 17540)\n"
21
21
22#: plugins/LightDM/Greeter.cpp:112
22#: plugins/LightDM/Greeter.cpp:112
23msgid "Password: "
23msgid "Password: "
@@ -164,17 +164,17 @@ msgstr "Iskanje"
164#: qml/Dash/PageHeader.qml:269
164#: qml/Dash/PageHeader.qml:269
165msgctxt "Button: Open the Ubuntu Store"
165msgctxt "Button: Open the Ubuntu Store"
166msgid "Store"
166msgid "Store"
167−msgstr ""
167+msgstr "Trgovina"
168
168
169#: qml/Dash/PageHeader.qml:276
169#: qml/Dash/PageHeader.qml:276
170msgctxt "Button: Start a search in the current dash scope"
170msgctxt "Button: Start a search in the current dash scope"
171msgid "Search"
171msgid "Search"
172−msgstr ""
172+msgstr "Iskanje"
173
173
174#: qml/Dash/PageHeader.qml:286
174#: qml/Dash/PageHeader.qml:286
175msgctxt "Button: Show the current dash scope settings"
175msgctxt "Button: Show the current dash scope settings"
176msgid "Settings"
176msgid "Settings"
177−msgstr ""
177+msgstr "Nastavitve"
178
178
179#: qml/Dash/PageHeader.qml:293
179#: qml/Dash/PageHeader.qml:293
180msgid "Remove from Favorites"
180msgid "Remove from Favorites"
@@ -374,7 +374,7 @@ msgstr "Tapnite tukaj za nadaljevanje."
374
374
375#: qml/Tutorial/TutorialContent.qml:81
375#: qml/Tutorial/TutorialContent.qml:81
376msgid "Click here to finish."
376msgid "Click here to finish."
377−msgstr ""
377+msgstr "Kliknite tu za zaključek."
378
378
379#: qml/Tutorial/TutorialLeftFinish.qml:24
379#: qml/Tutorial/TutorialLeftFinish.qml:24
380msgid "These are the shortcuts to favorite apps"
380msgid "These are the shortcuts to favorite apps"
qml/Dash/Previews/PreviewRatingDisplay.qml+9−44
@@ -49,53 +49,18 @@ PreviewWidget {
49 objectName: "reviewsRepeater"
49 objectName: "reviewsRepeater"
50 model: root.widgetData["reviews"]
50 model: root.widgetData["reviews"]
51
51
52− delegate: Column {
52+ delegate: PreviewRatingSingleDisplay {
53− id: reviewItem
54 objectName: "reviewItem" + index
53 objectName: "reviewItem" + index
55− anchors { left: parent.left; right: parent.right;}
56− spacing: units.gu(1)
57
54
58− Rating {
55+ anchors { left: parent.left; right: parent.right; }
59− id: rating
60− objectName: "rating"
61− size: 5
62− value: modelData["rating"] || -1
63− visible: value >= 0
64− interactive: false
65
56
57+ rating: modelData["rating"] || -1
58+ author: modelData["author"] || ""
59+ review: modelData["review"] || ""
66− property var urlIconEmpty: widgetData["rating-icon-empty"]
60+ urlIconEmpty: widgetData["rating-icon-empty"]
67− property var urlIconFull: widgetData["rating-icon-full"]
61+ urlIconFull: widgetData["rating-icon-full"]
68− property var urlIconHalf: widgetData["rating-icon-half"]
62+ urlIconHalf: widgetData["rating-icon-half"]
69− }
70−
71− Label {
72− id: authorLabel
73− objectName: "authorLabel"
74− anchors { left: parent.left; right: parent.right }
75− color: scopeStyle ? scopeStyle.foreground : Theme.palette.normal.baseText
76− opacity: .8
77− text: modelData["author"] || ""
78− visible: text !== ""
79− wrapMode: Text.Wrap
80− }
81−
82− Label {
83− id: reviewLabel
84− objectName: "reviewLabel"
85− anchors { left: parent.left; right: parent.right }
86− color: scopeStyle ? scopeStyle.foreground : Theme.palette.normal.baseText
63+ labelColor: scopeStyle ? scopeStyle.foreground : Theme.palette.normal.baseText
87− opacity: .8
88− text: modelData["review"] || ""
89− visible: text !== ""
90− wrapMode: Text.Wrap
91− }
92−
93− Item {
94− id: spacing
95− anchors { left: parent.left; right: parent.right }
96− height: units.gu(2)
97− visible: rating.visible || authorLabel.visible || reviewLabel.visible
98− }
99 }
64 }
100 }
65 }
101 }
66 }
qml/Dash/Previews/PreviewRatingEdit.qmlnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright (C) 2015 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.4
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+/*! \brief Preview widget for editable rating.
22+
23+ Shows a single display rating that can be switched by the user to edit mode
24+ and then behaves as a rating display widget
25+
26+ The display part uses widgetData["author"], widgetData["review"] and widgetData["rating"].
27+
28+ The edit part uses the same fields as the "rating-input" widget
29+*/
30+
31+PreviewWidget {
32+ id: root
33+ implicitHeight: display.visible ? display.implicitHeight : input.implicitHeight
34+
35+ Button {
36+ id: editIcon
37+ objectName: "editButton"
38+
39+ iconName: "edit"
40+ width: height
41+ anchors.right: parent.right
42+ visible: display.visible
43+ onClicked: display.visible = false
44+ }
45+
46+ PreviewRatingSingleDisplay {
47+ id: display
48+ objectName: "display"
49+
50+ anchors.left: parent.left
51+ anchors.right: editIcon.left
52+
53+ rating: widgetData["rating"] || -1
54+ author: widgetData["author"] || ""
55+ review: widgetData["review"] || ""
56+ urlIconEmpty: widgetData["rating-icon-empty"]
57+ urlIconFull: widgetData["rating-icon-full"]
58+ urlIconHalf: widgetData["rating-icon-half"]
59+ labelColor: scopeStyle ? scopeStyle.foreground : Theme.palette.normal.baseText
60+ }
61+
62+ PreviewRatingInput {
63+ id: input
64+ objectName: "input"
65+
66+ visible: !display.visible
67+ width: parent.width
68+
69+ widgetId: root.widgetId
70+ widgetData: root.widgetData
71+ isCurrentPreview: root.isCurrentPreview
72+ scopeStyle: root.scopeStyle
73+
74+ ratingValue: widgetData["rating"]
75+ reviewText: widgetData["review"]
76+
77+ onTriggered: root.triggered(widgetId, actionId, data);
78+ }
79+
80+}
qml/Dash/Previews/PreviewRatingInput.qml+3
@@ -48,6 +48,9 @@ PreviewWidget {
48 }
48 }
49 }
49 }
50
50
51+ property alias ratingValue: rating.value
52+ property alias reviewText: reviewTextArea.text
53+
51 function submit() {
54 function submit() {
52 // checks rating-input requirements
55 // checks rating-input requirements
53 if (((widgetData["required"] === "both" ||
56 if (((widgetData["required"] === "both" ||
qml/Dash/Previews/PreviewRatingSingleDisplay.qmlnew file+70
@@ -0,0 +1,70 @@
1+/*
2+ * Copyright (C) 2015 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.4
18+import Ubuntu.Components 0.1
19+import "../../Components"
20+
21+Column {
22+ id: reviewItem
23+ spacing: units.gu(1)
24+
25+ property alias rating: ratingItem.value
26+ property alias author: authorLabel.text
27+ property alias review: reviewLabel.text
28+ property alias urlIconEmpty: ratingItem.urlIconEmpty
29+ property alias urlIconFull: ratingItem.urlIconFull
30+ property alias urlIconHalf: ratingItem.urlIconHalf
31+ property alias labelColor: authorLabel.color
32+
33+ Rating {
34+ id: ratingItem
35+ objectName: "rating"
36+ size: 5
37+ visible: value >= 0
38+ interactive: false
39+
40+ property var urlIconEmpty
41+ property var urlIconFull
42+ property var urlIconHalf
43+ }
44+
45+ Label {
46+ id: authorLabel
47+ objectName: "authorLabel"
48+ anchors { left: parent.left; right: parent.right }
49+ opacity: .8
50+ visible: text !== ""
51+ wrapMode: Text.Wrap
52+ }
53+
54+ Label {
55+ id: reviewLabel
56+ objectName: "reviewLabel"
57+ anchors { left: parent.left; right: parent.right }
58+ color: authorLabel.color
59+ opacity: .8
60+ visible: text !== ""
61+ wrapMode: Text.Wrap
62+ }
63+
64+ Item {
65+ id: spacing
66+ anchors { left: parent.left; right: parent.right }
67+ height: units.gu(2)
68+ visible: rating.visible || authorLabel.visible || reviewLabel.visible
69+ }
70+}
qml/Dash/Previews/PreviewWidgetFactory.qml+1
@@ -57,6 +57,7 @@ Loader {
57 case "progress": return "PreviewProgress.qml";
57 case "progress": return "PreviewProgress.qml";
58 case "payments": return "PreviewPayments.qml";
58 case "payments": return "PreviewPayments.qml";
59 case "rating-input": return "PreviewRatingInput.qml";
59 case "rating-input": return "PreviewRatingInput.qml";
60+ case "rating-edit": return "PreviewRatingEdit.qml";
60 case "reviews": return "PreviewRatingDisplay.qml";
61 case "reviews": return "PreviewRatingDisplay.qml";
61 case "table": return "PreviewTable.qml";
62 case "table": return "PreviewTable.qml";
62 case "text": return "PreviewTextSummary.qml";
63 case "text": return "PreviewTextSummary.qml";
qml/Greeter/Greeter.qml+4−2
@@ -143,8 +143,10 @@ Showable {
143 enabled = false;
143 enabled = false;
144 if (LightDM.Greeter.startSessionSync()) {
144 if (LightDM.Greeter.startSessionSync()) {
145 sessionStarted();
145 sessionStarted();
146+ if (loader.item) {
146− loader.item.notifyAuthenticationSucceeded();
147+ loader.item.notifyAuthenticationSucceeded();
148+ }
147− } else {
149+ } else if (loader.item) {
148 loader.item.notifyAuthenticationFailed();
150 loader.item.notifyAuthenticationFailed();
149 }
151 }
150 enabled = true;
152 enabled = true;
qml/Panel/Indicators/IndicatorsLight.qml+8
@@ -26,6 +26,8 @@ import Unity.Indicators 0.1 as Indicators
26QtObject {
26QtObject {
27 id: root
27 id: root
28
28
29+ property color color: "darkgreen"
30+
29 property var _actionGroup: QMenuModel.QDBusActionGroup {
31 property var _actionGroup: QMenuModel.QDBusActionGroup {
30 busType: 1
32 busType: 1
31 busName: "com.canonical.indicator.messages"
33 busName: "com.canonical.indicator.messages"
@@ -50,4 +52,10 @@ QtObject {
50 return (Powerd.status === Powerd.Off && _rootState.hasMessages) ? Lights.On : Lights.Off
52 return (Powerd.status === Powerd.Off && _rootState.hasMessages) ? Lights.On : Lights.Off
51 }
53 }
52 }
54 }
55+
56+ property var _colorBinding: Binding {
57+ target: Lights
58+ property: "color"
59+ value: root.color
60+ }
53}
61}
qml/Shell.qml−1
@@ -140,7 +140,6 @@ Item {
140
140
141 GSettings {
141 GSettings {
142 id: backgroundSettings
142 id: backgroundSettings
143− objectName: "backgroundSettings"
144 schema.id: "org.gnome.desktop.background"
143 schema.id: "org.gnome.desktop.background"
145 }
144 }
146
145
qml/Stages/DecoratedWindow.qml+1
@@ -42,6 +42,7 @@ FocusScope {
42
42
43 WindowDecoration {
43 WindowDecoration {
44 id: decoration
44 id: decoration
45+ objectName: application ? "appWindowDecoration_" + application.appId : "appWindowDecoration_null"
45 anchors { left: parent.left; top: parent.top; right: parent.right }
46 anchors { left: parent.left; top: parent.top; right: parent.right }
46 height: units.gu(3)
47 height: units.gu(3)
47 title: model.name
48 title: model.name
qml/Stages/DesktopStage.qml+20−14
@@ -20,9 +20,8 @@ import QtQuick 2.3
20import Ubuntu.Components 1.1
20import Ubuntu.Components 1.1
21import Unity.Application 0.1
21import Unity.Application 0.1
22import "../Components/PanelState"
22import "../Components/PanelState"
23−import Utils 0.1
24
23
25−FocusScope {
24+Rectangle {
26 id: root
25 id: root
27
26
28 anchors.fill: parent
27 anchors.fill: parent
@@ -52,8 +51,6 @@ FocusScope {
52
51
53 property alias background: wallpaper.source
52 property alias background: wallpaper.source
54
53
55− property var windowStateStorage: WindowStateStorage
56−
57 CrossFadeImage {
54 CrossFadeImage {
58 id: wallpaper
55 id: wallpaper
59 anchors.fill: parent
56 anchors.fill: parent
@@ -81,7 +78,16 @@ FocusScope {
81 id: priv
78 id: priv
82
79
83 readonly property string focusedAppId: ApplicationManager.focusedApplicationId
80 readonly property string focusedAppId: ApplicationManager.focusedApplicationId
84− readonly property var focusedAppDelegate: focusedAppId ? appRepeater.itemAt(indexOf(focusedAppId)) : null
81+ readonly property var focusedAppDelegate: {
82+ var index = indexOf(focusedAppId);
83+ return index >= 0 && index < appRepeater.count ? appRepeater.itemAt(index) : null
84+ }
85+
86+ onFocusedAppDelegateChanged: {
87+ if (focusedAppDelegate) {
88+ focusedAppDelegate.focus = true;
89+ }
90+ }
85
91
86 function indexOf(appId) {
92 function indexOf(appId) {
87 for (var i = 0; i < ApplicationManager.count; i++) {
93 for (var i = 0; i < ApplicationManager.count; i++) {
@@ -112,13 +118,19 @@ FocusScope {
112 id: appRepeater
118 id: appRepeater
113 model: ApplicationManager
119 model: ApplicationManager
114
120
115− delegate: Item {
121+ delegate: FocusScope {
116 id: appDelegate
122 id: appDelegate
117 z: ApplicationManager.count - index
123 z: ApplicationManager.count - index
118 y: units.gu(3)
124 y: units.gu(3)
119 width: units.gu(60)
125 width: units.gu(60)
120 height: units.gu(50)
126 height: units.gu(50)
121
127
128+ onFocusChanged: {
129+ if (focus) {
130+ ApplicationManager.requestFocusApplication(model.appId);
131+ }
132+ }
133+
122 readonly property int minWidth: units.gu(10)
134 readonly property int minWidth: units.gu(10)
123 readonly property int minHeight: units.gu(10)
135 readonly property int minHeight: units.gu(10)
124
136
@@ -142,14 +154,13 @@ FocusScope {
142 ]
154 ]
143
155
144 WindowMoveResizeArea {
156 WindowMoveResizeArea {
145− windowStateStorage: root.windowStateStorage
146 target: appDelegate
157 target: appDelegate
147 minWidth: appDelegate.minWidth
158 minWidth: appDelegate.minWidth
148 minHeight: appDelegate.minHeight
159 minHeight: appDelegate.minHeight
149 resizeHandleWidth: units.gu(0.5)
160 resizeHandleWidth: units.gu(0.5)
150 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
161 windowId: model.appId // FIXME: Change this to point to windowId once we have such a thing
151
162
152− onPressed: decoratedWindow.focus = true;
163+ onPressed: appDelegate.focus = true;
153 }
164 }
154
165
155 DecoratedWindow {
166 DecoratedWindow {
@@ -158,12 +169,7 @@ FocusScope {
158 anchors.fill: parent
169 anchors.fill: parent
159 application: ApplicationManager.get(index)
170 application: ApplicationManager.get(index)
160 active: ApplicationManager.focusedApplicationId === model.appId
171 active: ApplicationManager.focusedApplicationId === model.appId
161−
162− onFocusChanged: {
163− if (focus) {
172+ focus: true
164− ApplicationManager.requestFocusApplication(model.appId);
165− }
166− }
167
173
168 onClose: ApplicationManager.stopApplication(model.appId)
174 onClose: ApplicationManager.stopApplication(model.appId)
169 onMaximize: appDelegate.state = (appDelegate.state == "maximized" ? "normal" : "maximized")
175 onMaximize: appDelegate.state = (appDelegate.state == "maximized" ? "normal" : "maximized")
qml/Stages/PhoneStage.qml+5−4
@@ -176,15 +176,16 @@ Rectangle {
176 id: priv
176 id: priv
177
177
178 property string focusedAppId: root.applicationManager.focusedApplicationId
178 property string focusedAppId: root.applicationManager.focusedApplicationId
179− property var focusedApplication: root.applicationManager.findApplication(focusedAppId)
180− property var focusedAppDelegate: null
181 property bool focusedAppOrientationChangesEnabled: false
179 property bool focusedAppOrientationChangesEnabled: false
180+ readonly property int firstSpreadIndex: root.focusFirstApp ? 1 : 0
181+ readonly property var focusedAppDelegate: {
182+ var index = indexOf(focusedAppId);
183+ return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
184+ }
182
185
183 property real oldInverseProgress: 0
186 property real oldInverseProgress: 0
184 property bool animateX: false
187 property bool animateX: false
185
188
186− onFocusedAppIdChanged: focusedAppDelegate = spreadRepeater.itemAt(0);
187−
188 onFocusedAppDelegateChanged: {
189 onFocusedAppDelegateChanged: {
189 if (focusedAppDelegate) {
190 if (focusedAppDelegate) {
190 focusedAppDelegate.focus = true;
191 focusedAppDelegate.focus = true;
qml/Stages/TabletStage.qml+10−12
@@ -119,6 +119,11 @@ Rectangle {
119 id: priv
119 id: priv
120
120
121 property string focusedAppId: ApplicationManager.focusedApplicationId
121 property string focusedAppId: ApplicationManager.focusedApplicationId
122+ readonly property var focusedAppDelegate: {
123+ var index = indexOf(focusedAppId);
124+ return index >= 0 && index < spreadRepeater.count ? spreadRepeater.itemAt(index) : null
125+ }
126+
122 property string oldFocusedAppId: ""
127 property string oldFocusedAppId: ""
123 property bool mainAppOrientationChangesEnabled: false
128 property bool mainAppOrientationChangesEnabled: false
124
129
@@ -150,19 +155,11 @@ Rectangle {
150
155
151 appId0 = ApplicationManager.count >= 1 ? ApplicationManager.get(0).appId : "";
156 appId0 = ApplicationManager.count >= 1 ? ApplicationManager.get(0).appId : "";
152 appId1 = ApplicationManager.count > 1 ? ApplicationManager.get(1).appId : "";
157 appId1 = ApplicationManager.count > 1 ? ApplicationManager.get(1).appId : "";
153−
154− // Update the QML focus accordingly
155− updateSpreadDelegateFocus();
156 }
158 }
157
159
158− function updateSpreadDelegateFocus() {
160+ onFocusedAppDelegateChanged: {
159− if (priv.focusedAppId) {
161+ if (focusedAppDelegate) {
160− var focusedAppIndex = priv.indexOf(priv.focusedAppId);
162+ focusedAppDelegate.focus = true;
161− if (focusedAppIndex !== -1) {
162− spreadRepeater.itemAt(focusedAppIndex).focus = true;
163− } else {
164− console.warn("TabletStage: Failed to find the SpreadDelegate for appID=" + priv.focusedAppId);
165− }
166 }
163 }
167 }
164 }
168
165
@@ -597,7 +594,8 @@ Rectangle {
597
594
598 delegate: TransformedTabletSpreadDelegate {
595 delegate: TransformedTabletSpreadDelegate {
599 id: spreadTile
596 id: spreadTile
600− objectName: "spreadDelegate_" + model.appId
597+ objectName: model.appId ? "tabletSpreadDelegate_" + model.appId
598+ : "tabletSpreadDelegate_null";
601 width: {
599 width: {
602 if (wantsMainStage) {
600 if (wantsMainStage) {
603 return spreadView.width;
601 return spreadView.width;
src/Dash/main.cpp−6
@@ -31,9 +31,6 @@
31#include "../ApplicationArguments.h"
31#include "../ApplicationArguments.h"
32#include "../CachingNetworkManagerFactory.h"
32#include "../CachingNetworkManagerFactory.h"
33
33
34−// Ubuntu Gestures
35−#include <TouchRegistry.h>
36−
37int main(int argc, const char *argv[])
34int main(int argc, const char *argv[])
38{
35{
39 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
36 QGuiApplication *application = new QGuiApplication(argc, (char**)argv);
@@ -97,9 +94,6 @@ int main(int argc, const char *argv[])
97 view->setTitle("Scopes");
94 view->setTitle("Scopes");
98 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
95 view->rootContext()->setContextProperty("applicationArguments", &qmlArgs);
99
96
100− TouchRegistry touchRegistry;
101− view->installEventFilter(&touchRegistry);
102−
103 // You will need this if you want to interact with touch-only components using a mouse
97 // You will need this if you want to interact with touch-only components using a mouse
104 // Needed only when manually testing on a desktop.
98 // Needed only when manually testing on a desktop.
105 MouseTouchAdaptor *mouseTouchAdaptor = 0;
99 MouseTouchAdaptor *mouseTouchAdaptor = 0;
src/main.cpp−5
@@ -35,9 +35,6 @@
35#include "CachingNetworkManagerFactory.h"
35#include "CachingNetworkManagerFactory.h"
36#include "UnityCommandLineParser.h"
36#include "UnityCommandLineParser.h"
37
37
38−// Ubuntu Gestures
39−#include <TouchRegistry.h>
40−
41int main(int argc, const char *argv[])
38int main(int argc, const char *argv[])
42{
39{
43 bool isMirServer = false;
40 bool isMirServer = false;
@@ -99,8 +96,6 @@ int main(int argc, const char *argv[])
99 if (parser.hasFrameless()) {
96 if (parser.hasFrameless()) {
100 view->setFlags(Qt::FramelessWindowHint);
97 view->setFlags(Qt::FramelessWindowHint);
101 }
98 }
102− TouchRegistry touchRegistry;
103− view->installEventFilter(&touchRegistry);
104
99
105 // You will need this if you want to interact with touch-only components using a mouse
100 // You will need this if you want to interact with touch-only components using a mouse
106 // Needed only when manually testing on a desktop.
101 // Needed only when manually testing on a desktop.
tests/autopilot/unity8/application_lifecycle/tests/test_application_lifecycle.py+13−3
@@ -21,6 +21,7 @@
21
21
22import logging
22import logging
23import os
23import os
24+import threading
24
25
25from autopilot.platform import model
26from autopilot.platform import model
26
27
@@ -90,10 +91,19 @@ class ApplicationLifecycleTests(tests.ApplicationLifeCycleTestCase):
90 """Greeter should hide when an app is opened"""
91 """Greeter should hide when an app is opened"""
91 process_helpers.lock_unity()
92 process_helpers.lock_unity()
92
93
93− application_name = self.launch_fake_app()
94+ # FIXME - this is because the device greeter uses a password.
95+ # Need to be able to selectively enable mocks so that we can use the fake greeter.
96+ def unlock_thread_worker(greeter):
97+ greeter.wait_swiped_away()
98+ process_helpers.unlock_unity()
99+ greeter.created.wait_for(False)
100+
94 greeter = self.main_window.get_greeter()
101 greeter = self.main_window.get_greeter()
95− greeter.wait_swiped_away()
102+ unlock_thread = threading.Thread(target=unlock_thread_worker, args=(greeter,))
96− process_helpers.unlock_unity()
103+ unlock_thread.start()
104+ application_name = self.launch_fake_app()
105+ unlock_thread.join(10)
106+
97 self.assert_current_focused_application(application_name)
107 self.assert_current_focused_application(application_name)
98
108
99 def test_greeter_hides_on_app_focus(self):
109 def test_greeter_hides_on_app_focus(self):
tests/autopilot/unity8/fixture_setup.py+131−3
@@ -17,19 +17,147 @@
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
17# along with this program. If not, see <http://www.gnu.org/licenses/>.
18#
18#
19
19
20−import fixtures
21−import logging
22import os
20import os
23import subprocess
21import subprocess
22+import threading
23+import fixtures
24+import logging
24
25
25import ubuntuuitoolkit
26import ubuntuuitoolkit
26from autopilot import introspection
27from autopilot import introspection
28+from autopilot.matchers import Eventually
29+from testtools.matchers import Equals
30+from ubuntuuitoolkit import fixture_setup
27
31
28from unity8 import (
32from unity8 import (
29 get_binary_path,
33 get_binary_path,
34+ sensors,
30 process_helpers
35 process_helpers
31)
36)
32
37
38+from unity8.shell import emulators
39+
40+from unity8.shell.emulators import (
41+ main_window as main_window_emulator
42+)
43+
44+from unity8 import (
45+ get_mocks_library_path,
46+ get_default_extra_mock_libraries,
47+ get_data_dirs
48+)
49+
50+logger = logging.getLogger(__name__)
51+
52+
53+class LaunchUnityWithFakeSensors(fixtures.Fixture):
54+
55+ """Fixture to launch Unity8 with an injectable sensors backend.
56+
57+ :ivar unity_proxy: The Autopilot proxy object for the Unity shell.
58+
59+ """
60+
61+ unity_proxy = None
62+ main_win = None
63+
64+ def setUp(self):
65+ """Restart Unity8 with testability and create sensors."""
66+ super().setUp()
67+ self.useFixture(
68+ fixture_setup.InitctlEnvironmentVariable(
69+ UBUNTU_PLATFORM_API_TEST_OVERRIDE='sensors'))
70+
71+ self.addCleanup(process_helpers.stop_job, 'unity8')
72+ restart_thread = threading.Thread(
73+ target=self._restart_unity_with_testability)
74+ restart_thread.start()
75+
76+ self._create_sensors()
77+
78+ restart_thread.join()
79+ self.fake_sensors = sensors.FakePlatformSensors()
80+
81+ def _get_lightdm_mock_path(self):
82+ lib_path = get_mocks_library_path()
83+ lightdm_mock_path = os.path.abspath(
84+ os.path.join(lib_path, "LightDM", "liblightdm")
85+ )
86+
87+ if not os.path.exists(lightdm_mock_path):
88+ raise RuntimeError(
89+ "LightDM mock does not exist at path {}.".
90+ format(lightdm_mock_path)
91+ )
92+ return lightdm_mock_path
93+
94+ def _get_qml_import_path_with_mock(self):
95+ """Return the QML2_IMPORT_PATH value with the mock path prepended."""
96+ qml_import_path = [get_mocks_library_path()]
97+ if os.getenv('QML2_IMPORT_PATH') is not None:
98+ qml_import_path.append(os.getenv('QML2_IMPORT_PATH'))
99+
100+ qml_import_path = ':'.join(qml_import_path)
101+ return qml_import_path
102+
103+ def _restart_unity_with_testability(self):
104+ _environment = {}
105+
106+ data_dirs = get_data_dirs(True)
107+ if data_dirs is not None:
108+ _environment['XDG_DATA_DIRS'] = data_dirs
109+
110+ _environment['QML2_IMPORT_PATH'] = (
111+ self._get_qml_import_path_with_mock()
112+ )
113+
114+ new_ld_library_path = [
115+ get_default_extra_mock_libraries(),
116+ self._get_lightdm_mock_path()
117+ ]
118+ if os.getenv('LD_LIBRARY_PATH') is not None:
119+ new_ld_library_path.append(os.getenv('LD_LIBRARY_PATH'))
120+ new_ld_library_path = ':'.join(new_ld_library_path)
121+ _environment['LD_LIBRARY_PATH'] = new_ld_library_path
122+
123+ # FIXME: we shouldn't be doing this
124+ # $MIR_SOCKET, fallback to $XDG_RUNTIME_DIR/mir_socket and
125+ # /tmp/mir_socket as last resort
126+ try:
127+ os.unlink(
128+ os.getenv('MIR_SOCKET',
129+ os.path.join(os.getenv('XDG_RUNTIME_DIR', "/tmp"),
130+ "mir_socket")))
131+ except OSError:
132+ pass
133+ try:
134+ os.unlink("/tmp/mir_socket")
135+ except OSError:
136+ pass
137+
138+ binary_arg = "BINARY=%s" % get_binary_path()
139+ env_args = ["%s=%s" % (k, v) for k, v in _environment.items()]
140+ args = [binary_arg] + env_args
141+ self.unity_proxy = process_helpers.restart_unity_with_testability(
142+ *args)
143+ self.main_win = self.unity_proxy.select_single(
144+ main_window_emulator.QQuickView)
145+
146+ def _create_sensors(self):
147+ # Wait for unity to start running.
148+ Eventually(Equals(True)).match(
149+ lambda: process_helpers.is_job_running('unity8'))
150+
151+ # Wait for the sensors fifo file to be created.
152+ fifo_path = '/tmp/sensor-fifo-{0}'.format(
153+ process_helpers.get_unity_pid())
154+ Eventually(Equals(True)).match(
155+ lambda: os.path.exists(fifo_path))
156+
157+ with open(fifo_path, 'w') as fifo:
158+ fifo.write('create accel 0 1000 0.1\n')
159+ fifo.write('create light 0 10 1\n')
160+ fifo.write('create proximity\n')
33
161
34logger = logging.getLogger(__name__)
162logger = logging.getLogger(__name__)
35
163
@@ -188,7 +316,7 @@ class LaunchMockIndicatorService(fixtures.Fixture):
188 self.ensure_not_running = ensure_not_running
316 self.ensure_not_running = ensure_not_running
189
317
190 def setUp(self):
318 def setUp(self):
191− super(LaunchMockIndicatorService, self).setUp()
319+ super().setUp()
192 if self.ensure_not_running:
320 if self.ensure_not_running:
193 self.ensure_service_not_running()
321 self.ensure_service_not_running()
194 self.addCleanup(self.stop_service)
322 self.addCleanup(self.stop_service)
tests/autopilot/unity8/indicators/tests/test_action_latency.py+4−2
@@ -70,10 +70,11 @@ class TestServerValueUpdate(TestIndicatorBaseTestCase):
70 switch_menu = self.indicator_page.get_switch_menu()
70 switch_menu = self.indicator_page.get_switch_menu()
71
71
72 switch.change_state()
72 switch.change_state()
73+ final_value = switch.checked
73
74
74 self.assertThat(
75 self.assertThat(
75 switch_menu.serverChecked,
76 switch_menu.serverChecked,
76− Eventually(Equals(switch.checked), timeout=20)
77+ Eventually(Equals(final_value), timeout=20)
77 )
78 )
78
79
79 def test_slider_reaches_server_value(self):
80 def test_slider_reaches_server_value(self):
@@ -82,6 +83,7 @@ class TestServerValueUpdate(TestIndicatorBaseTestCase):
82
83
83 old_value = slider.value
84 old_value = slider.value
84 slider.slide_left()
85 slider.slide_left()
86+ final_value = slider.value
85
87
86 self.assertThat(
88 self.assertThat(
87 slider_menu.serverValue,
89 slider_menu.serverValue,
@@ -90,7 +92,7 @@ class TestServerValueUpdate(TestIndicatorBaseTestCase):
90
92
91 self.assertThat(
93 self.assertThat(
92 slider_menu.serverValue,
94 slider_menu.serverValue,
93− Eventually(Equals(slider.value), timeout=20)
95+ Eventually(Equals(final_value), timeout=20)
94 )
96 )
95
97
96
98
tests/autopilot/unity8/indicators/tests/test_display_indicator.py+1−1
@@ -18,7 +18,7 @@
18
18
19from unity8 import (
19from unity8 import (
20 fixture_setup,
20 fixture_setup,
21− indicators,
21+ indicators
22)
22)
23from unity8.indicators import tests
23from unity8.indicators import tests
24
24
tests/autopilot/unity8/process_helpers.py+3−3
@@ -58,7 +58,7 @@ def unlock_unity(unity_proxy_obj=None):
58 """
58 """
59 if unity_proxy_obj is None:
59 if unity_proxy_obj is None:
60 try:
60 try:
61− pid = _get_unity_pid()
61+ pid = get_unity_pid()
62 unity = _get_unity_proxy_object(pid)
62 unity = _get_unity_proxy_object(pid)
63 main_window = unity.select_single(main_window_emulator.QQuickView)
63 main_window = unity.select_single(main_window_emulator.QQuickView)
64 except ProcessSearchError as e:
64 except ProcessSearchError as e:
@@ -108,7 +108,7 @@ def lock_unity(unity_proxy_obj=None):
108 """
108 """
109 if unity_proxy_obj is None:
109 if unity_proxy_obj is None:
110 try:
110 try:
111− pid = _get_unity_pid()
111+ pid = get_unity_pid()
112 unity = _get_unity_proxy_object(pid)
112 unity = _get_unity_proxy_object(pid)
113 main_window = unity.select_single(main_window_emulator.QQuickView)
113 main_window = unity.select_single(main_window_emulator.QQuickView)
114 except ProcessSearchError as e:
114 except ProcessSearchError as e:
@@ -262,7 +262,7 @@ def _get_unity_status():
262 raise CannotAccessUnity(str(error))
262 raise CannotAccessUnity(str(error))
263
263
264
264
265−def _get_unity_pid():
265+def get_unity_pid():
266 try:
266 try:
267 return get_job_pid('unity8')
267 return get_job_pid('unity8')
268 except JobError as error:
268 except JobError as error:
tests/autopilot/unity8/sensors.pynew file+93
@@ -0,0 +1,93 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2015 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Control module for event injection to the fake/test platform sensors."""
21+
22+from unity8 import process_helpers
23+
24+
25+class FakePlatformSensors:
26+
27+ def __init__(self, pid=None):
28+ self.pid = pid or process_helpers.get_unity_pid()
29+
30+ def set_orientation(self, action):
31+ if action == 'top_up':
32+ with open("/tmp/sensor-fifo-{0}".format(self.pid), "w") as fifo:
33+ fifo.write("70 accel -10.050858 -0.598550 0.756568\n")
34+ fifo.write("70 accel -9.797073 -0.555455 1.019930\n")
35+ fifo.write("70 accel -10.141838 -0.770933 0.632069\n")
36+ fifo.write("70 accel -12.057199 -1.259350 1.690306\n")
37+ fifo.write("70 accel -19.282900 -3.926491 3.098097\n")
38+ fifo.write("70 accel -14.480132 -14.269443 1.216254\n")
39+ fifo.write("70 accel 16.419436 4.242526 -7.714118\n")
40+ fifo.write("70 accel 5.583278 8.279149 -1.848324\n")
41+ fifo.write("70 accel 1.422156 8.547300 0.416591\n")
42+ fifo.write("70 accel 4.357447 9.988609 -0.110133\n")
43+ fifo.write("70 accel 0.699107 9.840169 0.756568\n")
44+ fifo.write("70 accel 1.364695 9.844957 -0.287304\n")
45+ fifo.flush()
46+ elif action == 'top_down':
47+ with open("/tmp/sensor-fifo-{0}".format(self.pid), "w") as fifo:
48+ fifo.write("70 accel -10.050858 -0.598550 0.756568\n")
49+ fifo.write("70 accel 9.538500 -0.603339 1.292869\n")
50+ fifo.write("70 accel 9.485827 -0.636858 1.422156\n")
51+ fifo.write("70 accel 9.677363 -0.402226 1.374272\n")
52+ fifo.write("70 accel 9.303867 -0.507571 1.283292\n")
53+ fifo.write("70 accel 8.604761 -1.015141 1.436521\n")
54+ fifo.write("70 accel 7.580042 -2.001553 0.521936\n")
55+ fifo.write("70 accel 7.503428 -4.247314 0.502782\n")
56+ fifo.write("70 accel 7.067683 -7.240066 0.842759\n")
57+ fifo.write("70 accel 6.488286 -9.873688 -0.541090\n")
58+ fifo.write("70 accel 6.229713 -9.241618 -1.048660\n")
59+ fifo.write("70 accel 4.046201 -9.198523 -0.057461\n")
60+ fifo.write("70 accel 2.398990 -9.629479 0.957681\n")
61+ fifo.write("70 accel 1.632846 -9.361329 -0.311246\n")
62+ fifo.write("70 accel -0.181959 -9.696517 -0.301669\n")
63+ fifo.flush()
64+ elif action == 'left_up':
65+ with open("/tmp/sensor-fifo-{0}".format(self.pid), "w") as fifo:
66+ fifo.write("70 accel -10.050858 -0.598550 0.756568\n")
67+ fifo.write("70 accel 0.196325 9.878476 0.948104\n")
68+ fifo.write("70 accel 0.258574 9.955091 1.091756\n")
69+ fifo.write("70 accel 0.287304 10.041282 1.134852\n")
70+ fifo.write("70 accel 1.537078 10.553641 1.561020\n")
71+ fifo.write("70 accel 8.130709 10.093954 2.561796\n")
72+ fifo.write("70 accel -0.229843 5.348647 1.723825\n")
73+ fifo.write("70 accel -9.916783 0.488417 -3.418920\n")
74+ fifo.write("70 accel -13.417107 -0.416591 -2.360683\n")
75+ fifo.write("70 accel -13.872005 -2.049437 -0.574608\n")
76+ fifo.flush()
77+ elif action == 'right_up':
78+ with open("/tmp/sensor-fifo-{0}".format(self.pid), "w") as fifo:
79+ fifo.write("70 accel -10.050858 -0.598550 0.756568\n")
80+ fifo.write("70 accel -4.550858 -0.598550 0.856568\n")
81+ fifo.write("70 accel -0.799663 9.988609 1.197101\n")
82+ fifo.write("70 accel -0.861913 9.864111 1.066701\n")
83+ fifo.write("70 accel -0.861913 9.864111 0.866701\n")
84+ fifo.write("70 accel -1.776498 9.830592 1.273715\n")
85+ fifo.write("70 accel -2.376498 9.830592 1.273715\n")
86+ fifo.write("70 accel -13.158532 2.217031 1.091756\n")
87+ fifo.write("70 accel 5.056554 1.067814 0.799663\n")
88+ fifo.write("70 accel 5.056554 1.767814 0.799663\n")
89+ fifo.write("70 accel 14.882358 2.896984 1.221043\n")
90+ fifo.write("70 accel 9.466674 -0.363919 -1.029507\n")
91+ fifo.write("70 accel 11.253524 -0.186748 -0.311246\n")
92+ fifo.write("70 accel 12.253524 -0.186748 -0.311246\n")
93+ fifo.flush()
tests/autopilot/unity8/shell/emulators/main_window.py+12
@@ -169,6 +169,18 @@ class QQuickView(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
169 objectName='pinPadButton{}'.format(button_id)
169 objectName='pinPadButton{}'.format(button_id)
170 )
170 )
171
171
172+ def get_shell_orientation_angle(self):
173+ return self._get_shell().orientationAngle
174+
175+ def get_shell_orientation(self):
176+ return self._get_shell().orientation
177+
178+ def get_shell_primary_orientation(self):
179+ return self._get_shell().primaryOrientation
180+
181+ def get_shell_native_orientation(self):
182+ return self._get_shell().nativeOrientation
183+
172 @autopilot_logging.log_action(logger.info)
184 @autopilot_logging.log_action(logger.info)
173 def wait_for_notification(self):
185 def wait_for_notification(self):
174 """Wait for a notification dialog to appear.
186 """Wait for a notification dialog to appear.
tests/autopilot/unity8/shell/tests/test_rotation.pynew file+113
@@ -0,0 +1,113 @@
1+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
2+#
3+# Unity Autopilot Test Suite
4+# Copyright (C) 2015 Canonical
5+#
6+# This program is free software: you can redistribute it and/or modify
7+# it under the terms of the GNU General Public License as published by
8+# the Free Software Foundation, either version 3 of the License, or
9+# (at your option) any later version.
10+#
11+# This program is distributed in the hope that it will be useful,
12+# but WITHOUT ANY WARRANTY; without even the implied warranty of
13+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14+# GNU General Public License for more details.
15+#
16+# You should have received a copy of the GNU General Public License
17+# along with this program. If not, see <http://www.gnu.org/licenses/>.
18+#
19+
20+"""Tests for shell-rotation"""
21+
22+from autopilot.platform import model
23+from unity8 import (
24+ fixture_setup,
25+ process_helpers
26+)
27+from unity8.shell import tests
28+import logging
29+from testtools.matchers import Equals
30+from autopilot.matchers import Eventually
31+
32+logger = logging.getLogger(__name__)
33+
34+
35+class RotationBase(tests.UnityTestCase):
36+ """Base class for all shell-rotation tests that provides helper methods."""
37+
38+ def setUp(self):
39+ if model() == 'Desktop':
40+ self.skipTest('Test cannot be run on the desktop.')
41+ super().setUp()
42+ self._qml_mock_enabled = False
43+ self._data_dirs_mock_enabled = False
44+
45+ def _assert_change_of_orientation_and_angle(self):
46+ self.assertThat(self.shell_proxy.orientation,
47+ Eventually(Equals(self.orientation)))
48+ self.assertThat(self.shell_proxy.orientationAngle,
49+ Eventually(Equals(self.angle)))
50+
51+
52+class TestFakeSensor(RotationBase):
53+ scenarios = [('top up', {'action': 'top_up', 'orientation': 1}),
54+ ('right up', {'action': 'right_up', 'orientation': 8}),
55+ ('top down', {'action': 'top_down', 'orientation': 4}),
56+ ('left up', {'action': 'left_up', 'orientation': 2})]
57+
58+ def test_fake_sensor(self):
59+ unity_with_sensors = fixture_setup.LaunchUnityWithFakeSensors()
60+ self.useFixture(unity_with_sensors)
61+ process_helpers.unlock_unity(unity_with_sensors.unity_proxy)
62+ fake_sensors = unity_with_sensors.fake_sensors
63+ o_proxy = unity_with_sensors.main_win.select_single('OrientedShell')
64+
65+ fake_sensors.set_orientation(self.action)
66+ self.assertThat(o_proxy.physicalOrientation,
67+ Eventually(Equals(self.orientation), timeout=15))
68+
69+
70+class TestRotationWithApp(RotationBase):
71+ scenarios = [
72+ ('top up, angle 0',
73+ {'action': 'top_up', 'orientation': 1, 'angle': 0}),
74+ ('right up, angle 90',
75+ {'action': 'right_up', 'orientation': 8, 'angle': 90}),
76+ ('top down, angle 180',
77+ {'action': 'top_down', 'orientation': 4, 'angle': 180}),
78+ ('left up, angle 270',
79+ {'action': 'left_up', 'orientation': 2, 'angle': 270})]
80+
81+ def test_rotation_with_webbrowser_app(self):
82+ """Do an orientation-change and verify that an app and the shell
83+ adapted correctly"""
84+
85+ unity_with_sensors = fixture_setup.LaunchUnityWithFakeSensors()
86+ self.useFixture(unity_with_sensors)
87+ process_helpers.unlock_unity(unity_with_sensors.unity_proxy)
88+ fake_sensors = unity_with_sensors.fake_sensors
89+ o_proxy = unity_with_sensors.main_win.select_single('OrientedShell')
90+ self.shell_proxy = unity_with_sensors.main_win.select_single('Shell')
91+
92+ # launch an application
93+ self.launch_upstart_application('webbrowser-app')
94+ unity_with_sensors.main_win.show_dash_from_launcher()
95+ unity_with_sensors.main_win.launch_application('webbrowser-app')
96+
97+ # skip test early, if device doesn't support a certain orientation
98+ if not (self.shell_proxy.orientation & o_proxy.supportedOrientations):
99+ self.skipTest('unsupported orientation ' + self.action)
100+
101+ self.assertThat(
102+ unity_with_sensors.main_win.get_current_focused_app_id(),
103+ Eventually(Equals('webbrowser-app')))
104+
105+ # get default orientation and angle
106+ self.orientation = self.shell_proxy.orientation
107+ self.angle = self.shell_proxy.orientationAngle
108+
109+ # check if fake sensors affect orientation and angle
110+ fake_sensors.set_orientation(self.action)
111+ self.assertThat(o_proxy.physicalOrientation,
112+ Eventually(Equals(self.orientation), timeout=15))
113+ self._assert_change_of_orientation_and_angle()
tests/libs/UbuntuGestures/tst_TouchRegistry.cpp+75−76
@@ -53,8 +53,8 @@ private Q_SLOTS:
53 void initTestCase() {} // will be called before the first test function is executed
53 void initTestCase() {} // will be called before the first test function is executed
54 void cleanupTestCase() {} // will be called after the last test function was executed.
54 void cleanupTestCase() {} // will be called after the last test function was executed.
55
55
56− void init() {} // called right before each and every test function is executed
56+ void init(); // called right before each and every test function is executed
57− void cleanup() {} // called right after each and every test function is executed
57+ void cleanup(); // called right after each and every test function is executed
58
58
59 void requestWithNoCandidates();
59 void requestWithNoCandidates();
60 void lateCandidateRequestGetsNothing();
60 void lateCandidateRequestGetsNothing();
@@ -67,11 +67,23 @@ private Q_SLOTS:
67 void rejectingTouchfterItsEnd();
67 void rejectingTouchfterItsEnd();
68 void removeOldUndecidedCandidates();
68 void removeOldUndecidedCandidates();
69 void interimOwnerWontGetUnownedTouchEvents();
69 void interimOwnerWontGetUnownedTouchEvents();
70+
71+private:
72+ TouchRegistry *touchRegistry;
70};
73};
71
74
75+void tst_TouchRegistry::init()
76+{
77+ touchRegistry = TouchRegistry::instance();
78+}
79+
80+void tst_TouchRegistry::cleanup()
81+{
82+ delete touchRegistry;
83+}
84+
72void tst_TouchRegistry::requestWithNoCandidates()
85void tst_TouchRegistry::requestWithNoCandidates()
73{
86{
74− TouchRegistry touchRegistry;
75 DummyCandidate candidate;
87 DummyCandidate candidate;
76
88
77 {
89 {
@@ -83,17 +95,16 @@ void tst_TouchRegistry::requestWithNoCandidates()
83 Qt::NoModifier,
95 Qt::NoModifier,
84 Qt::TouchPointPressed,
96 Qt::TouchPointPressed,
85 touchPoints);
97 touchPoints);
86− touchRegistry.update(&touchEvent);
98+ touchRegistry->update(&touchEvent);
87 }
99 }
88
100
89− touchRegistry.requestTouchOwnership(0, &candidate);
101+ touchRegistry->requestTouchOwnership(0, &candidate);
90
102
91 QVERIFY(candidate.ownedTouches.contains(0));
103 QVERIFY(candidate.ownedTouches.contains(0));
92}
104}
93
105
94void tst_TouchRegistry::lateCandidateRequestGetsNothing()
106void tst_TouchRegistry::lateCandidateRequestGetsNothing()
95{
107{
96− TouchRegistry touchRegistry;
97 DummyCandidate earlyCandidate;
108 DummyCandidate earlyCandidate;
98 earlyCandidate.setObjectName("early");
109 earlyCandidate.setObjectName("early");
99 DummyCandidate lateCandidate;
110 DummyCandidate lateCandidate;
@@ -108,21 +119,21 @@ void tst_TouchRegistry::lateCandidateRequestGetsNothing()
108 Qt::NoModifier,
119 Qt::NoModifier,
109 Qt::TouchPointPressed,
120 Qt::TouchPointPressed,
110 touchPoints);
121 touchPoints);
111− touchRegistry.update(&touchEvent);
122+ touchRegistry->update(&touchEvent);
112 }
123 }
113
124
114− touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
125+ touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate);
115− touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
126+ touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate);
116
127
117 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
128 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
118 QVERIFY(lateCandidate.ownedTouches.isEmpty());
129 QVERIFY(lateCandidate.ownedTouches.isEmpty());
119
130
120− touchRegistry.requestTouchOwnership(0, &lateCandidate);
131+ touchRegistry->requestTouchOwnership(0, &lateCandidate);
121
132
122 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
133 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
123 QVERIFY(lateCandidate.ownedTouches.isEmpty());
134 QVERIFY(lateCandidate.ownedTouches.isEmpty());
124
135
125− touchRegistry.requestTouchOwnership(0, &earlyCandidate);
136+ touchRegistry->requestTouchOwnership(0, &earlyCandidate);
126
137
127 QVERIFY(earlyCandidate.ownedTouches.contains(0));
138 QVERIFY(earlyCandidate.ownedTouches.contains(0));
128 QVERIFY(lateCandidate.ownedTouches.isEmpty());
139 QVERIFY(lateCandidate.ownedTouches.isEmpty());
@@ -130,7 +141,6 @@ void tst_TouchRegistry::lateCandidateRequestGetsNothing()
130
141
131void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
142void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
132{
143{
133− TouchRegistry touchRegistry;
134 DummyCandidate earlyCandidate;
144 DummyCandidate earlyCandidate;
135 DummyCandidate lateCandidate;
145 DummyCandidate lateCandidate;
136
146
@@ -143,21 +153,21 @@ void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
143 Qt::NoModifier,
153 Qt::NoModifier,
144 Qt::TouchPointPressed,
154 Qt::TouchPointPressed,
145 touchPoints);
155 touchPoints);
146− touchRegistry.update(&touchEvent);
156+ touchRegistry->update(&touchEvent);
147 }
157 }
148
158
149− touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
159+ touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate);
150− touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
160+ touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate);
151
161
152 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
162 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
153 QVERIFY(lateCandidate.ownedTouches.isEmpty());
163 QVERIFY(lateCandidate.ownedTouches.isEmpty());
154
164
155− touchRegistry.requestTouchOwnership(0, &lateCandidate);
165+ touchRegistry->requestTouchOwnership(0, &lateCandidate);
156
166
157 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
167 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
158 QVERIFY(lateCandidate.ownedTouches.isEmpty());
168 QVERIFY(lateCandidate.ownedTouches.isEmpty());
159
169
160− touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
170+ touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate);
161
171
162 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
172 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
163 QVERIFY(lateCandidate.ownedTouches.contains(0));
173 QVERIFY(lateCandidate.ownedTouches.contains(0));
@@ -165,7 +175,6 @@ void tst_TouchRegistry::lateCandidateGestOwnershipOnceEarlyCandidateQuits()
165
175
166void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
176void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
167{
177{
168− TouchRegistry touchRegistry;
169 QQuickItem rootItem;
178 QQuickItem rootItem;
170
179
171 DummyCandidate candidate0;
180 DummyCandidate candidate0;
@@ -190,10 +199,10 @@ void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
190 Qt::NoModifier,
199 Qt::NoModifier,
191 Qt::TouchPointPressed,
200 Qt::TouchPointPressed,
192 touchPoints);
201 touchPoints);
193− touchRegistry.update(&touchEvent);
202+ touchRegistry->update(&touchEvent);
194 }
203 }
195
204
196− touchRegistry.addCandidateOwnerForTouch(0, &candidate0);
205+ touchRegistry->addCandidateOwnerForTouch(0, &candidate0);
197
206
198 {
207 {
199 QList<QTouchEvent::TouchPoint> touchPoints;
208 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -208,7 +217,7 @@ void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
208 Qt::NoModifier,
217 Qt::NoModifier,
209 Qt::TouchPointPressed | Qt::TouchPointMoved,
218 Qt::TouchPointPressed | Qt::TouchPointMoved,
210 touchPoints);
219 touchPoints);
211− touchRegistry.update(&touchEvent);
220+ touchRegistry->update(&touchEvent);
212 }
221 }
213
222
214 // candidate0 should have received an update on the touch he's interested on.
223 // candidate0 should have received an update on the touch he's interested on.
@@ -220,7 +229,7 @@ void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
220 QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - candidate0.x());
229 QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().x(), 11 - candidate0.x());
221 QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - candidate0.y());
230 QCOMPARE(candidate0.unownedTouchEvents[0].touchPoints[0].rect().y(), 11 - candidate0.y());
222
231
223− touchRegistry.addCandidateOwnerForTouch(1, &candidate1);
232+ touchRegistry->addCandidateOwnerForTouch(1, &candidate1);
224
233
225 {
234 {
226 QList<QTouchEvent::TouchPoint> touchPoints;
235 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -235,7 +244,7 @@ void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
235 Qt::NoModifier,
244 Qt::NoModifier,
236 Qt::TouchPointPressed | Qt::TouchPointMoved,
245 Qt::TouchPointPressed | Qt::TouchPointMoved,
237 touchPoints);
246 touchPoints);
238− touchRegistry.update(&touchEvent);
247+ touchRegistry->update(&touchEvent);
239 }
248 }
240
249
241 // candidate0 gets updates only for touch 0 and
250 // candidate0 gets updates only for touch 0 and
@@ -252,7 +261,6 @@ void tst_TouchRegistry::dispatchesTouchEventsToCandidates()
252
261
253void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
262void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
254{
263{
255− TouchRegistry touchRegistry;
256 QQuickItem rootItem;
264 QQuickItem rootItem;
257
265
258 DummyCandidate watcher;
266 DummyCandidate watcher;
@@ -271,10 +279,10 @@ void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
271 Qt::NoModifier,
279 Qt::NoModifier,
272 Qt::TouchPointPressed,
280 Qt::TouchPointPressed,
273 touchPoints);
281 touchPoints);
274− touchRegistry.update(&touchEvent);
282+ touchRegistry->update(&touchEvent);
275 }
283 }
276
284
277− touchRegistry.addTouchWatcher(0, &watcher);
285+ touchRegistry->addTouchWatcher(0, &watcher);
278
286
279 {
287 {
280 QList<QTouchEvent::TouchPoint> touchPoints;
288 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -289,7 +297,7 @@ void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
289 Qt::NoModifier,
297 Qt::NoModifier,
290 Qt::TouchPointPressed | Qt::TouchPointMoved,
298 Qt::TouchPointPressed | Qt::TouchPointMoved,
291 touchPoints);
299 touchPoints);
292− touchRegistry.update(&touchEvent);
300+ touchRegistry->update(&touchEvent);
293 }
301 }
294
302
295 // watcher should have received an update on the touch he's interested on.
303 // watcher should have received an update on the touch he's interested on.
@@ -314,7 +322,7 @@ void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
314 Qt::NoModifier,
322 Qt::NoModifier,
315 Qt::TouchPointPressed | Qt::TouchPointMoved,
323 Qt::TouchPointPressed | Qt::TouchPointMoved,
316 touchPoints);
324 touchPoints);
317− touchRegistry.update(&touchEvent);
325+ touchRegistry->update(&touchEvent);
318 }
326 }
319
327
320 // watcher gets updates only for touch 0
328 // watcher gets updates only for touch 0
@@ -326,7 +334,6 @@ void tst_TouchRegistry::dispatchesTouchEventsToWatchers()
326
334
327void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
335void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
328{
336{
329− TouchRegistry touchRegistry;
330 DummyCandidate item;
337 DummyCandidate item;
331
338
332 {
339 {
@@ -338,10 +345,10 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
338 Qt::NoModifier,
345 Qt::NoModifier,
339 Qt::TouchPointPressed,
346 Qt::TouchPointPressed,
340 touchPoints);
347 touchPoints);
341− touchRegistry.update(&touchEvent);
348+ touchRegistry->update(&touchEvent);
342 }
349 }
343
350
344− touchRegistry.addCandidateOwnerForTouch(0, &item);
351+ touchRegistry->addCandidateOwnerForTouch(0, &item);
345
352
346 {
353 {
347 QList<QTouchEvent::TouchPoint> touchPoints;
354 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -354,7 +361,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
354 Qt::NoModifier,
361 Qt::NoModifier,
355 Qt::TouchPointPressed | Qt::TouchPointMoved,
362 Qt::TouchPointPressed | Qt::TouchPointMoved,
356 touchPoints);
363 touchPoints);
357− touchRegistry.update(&touchEvent);
364+ touchRegistry->update(&touchEvent);
358 }
365 }
359
366
360 QCOMPARE(item.unownedTouchEvents.count(), 1);
367 QCOMPARE(item.unownedTouchEvents.count(), 1);
@@ -362,7 +369,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
362 QCOMPARE(item.unownedTouchEvents[0].touchPoints[0].id(), 0);
369 QCOMPARE(item.unownedTouchEvents[0].touchPoints[0].id(), 0);
363 item.unownedTouchEvents.clear();
370 item.unownedTouchEvents.clear();
364
371
365− touchRegistry.addTouchWatcher(1, &item);
372+ touchRegistry->addTouchWatcher(1, &item);
366
373
367 {
374 {
368 QList<QTouchEvent::TouchPoint> touchPoints;
375 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -375,7 +382,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
375 Qt::NoModifier,
382 Qt::NoModifier,
376 Qt::TouchPointMoved,
383 Qt::TouchPointMoved,
377 touchPoints);
384 touchPoints);
378− touchRegistry.update(&touchEvent);
385+ touchRegistry->update(&touchEvent);
379 }
386 }
380
387
381 QCOMPARE(item.unownedTouchEvents.count(), 1);
388 QCOMPARE(item.unownedTouchEvents.count(), 1);
@@ -395,7 +402,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
395 Qt::NoModifier,
402 Qt::NoModifier,
396 Qt::TouchPointReleased | Qt::TouchPointMoved,
403 Qt::TouchPointReleased | Qt::TouchPointMoved,
397 touchPoints);
404 touchPoints);
398− touchRegistry.update(&touchEvent);
405+ touchRegistry->update(&touchEvent);
399 }
406 }
400
407
401 QCOMPARE(item.unownedTouchEvents.count(), 1);
408 QCOMPARE(item.unownedTouchEvents.count(), 1);
@@ -404,7 +411,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
404 QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
411 QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
405 item.unownedTouchEvents.clear();
412 item.unownedTouchEvents.clear();
406
413
407− touchRegistry.removeCandidateOwnerForTouch(0, &item);
414+ touchRegistry->removeCandidateOwnerForTouch(0, &item);
408
415
409 {
416 {
410 QList<QTouchEvent::TouchPoint> touchPoints;
417 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -415,7 +422,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
415 Qt::NoModifier,
422 Qt::NoModifier,
416 Qt::TouchPointReleased,
423 Qt::TouchPointReleased,
417 touchPoints);
424 touchPoints);
418− touchRegistry.update(&touchEvent);
425+ touchRegistry->update(&touchEvent);
419 }
426 }
420
427
421 QCOMPARE(item.unownedTouchEvents.count(), 1);
428 QCOMPARE(item.unownedTouchEvents.count(), 1);
@@ -423,7 +430,7 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
423 QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
430 QVERIFY(item.unownedTouchEvents[0].containsTouchWithId(1));
424 item.unownedTouchEvents.clear();
431 item.unownedTouchEvents.clear();
425
432
426− QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
433+ QVERIFY(touchRegistry->m_touchInfoPool.isEmpty());
427}
434}
428
435
429/*
436/*
@@ -432,7 +439,6 @@ void tst_TouchRegistry::keepDispatchingToWatchersAfterLastCandidateGivesUp()
432 */
439 */
433void tst_TouchRegistry::candidatesAndWatchers_1()
440void tst_TouchRegistry::candidatesAndWatchers_1()
434{
441{
435− TouchRegistry touchRegistry;
436 DummyCandidate item;
442 DummyCandidate item;
437
443
438 {
444 {
@@ -444,10 +450,10 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
444 Qt::NoModifier,
450 Qt::NoModifier,
445 Qt::TouchPointPressed,
451 Qt::TouchPointPressed,
446 touchPoints);
452 touchPoints);
447− touchRegistry.update(&touchEvent);
453+ touchRegistry->update(&touchEvent);
448 }
454 }
449
455
450− touchRegistry.addCandidateOwnerForTouch(0, &item);
456+ touchRegistry->addCandidateOwnerForTouch(0, &item);
451
457
452 {
458 {
453 QList<QTouchEvent::TouchPoint> touchPoints;
459 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -460,14 +466,14 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
460 Qt::NoModifier,
466 Qt::NoModifier,
461 Qt::TouchPointPressed | Qt::TouchPointMoved,
467 Qt::TouchPointPressed | Qt::TouchPointMoved,
462 touchPoints);
468 touchPoints);
463− touchRegistry.update(&touchEvent);
469+ touchRegistry->update(&touchEvent);
464 }
470 }
465
471
466− touchRegistry.addTouchWatcher(1, &item);
472+ touchRegistry->addTouchWatcher(1, &item);
467
473
468− touchRegistry.removeCandidateOwnerForTouch(0, &item);
474+ touchRegistry->removeCandidateOwnerForTouch(0, &item);
469
475
470− touchRegistry.addTouchWatcher(0, &item);
476+ touchRegistry->addTouchWatcher(0, &item);
471
477
472 {
478 {
473 QList<QTouchEvent::TouchPoint> touchPoints;
479 QList<QTouchEvent::TouchPoint> touchPoints;
@@ -480,7 +486,7 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
480 Qt::NoModifier,
486 Qt::NoModifier,
481 Qt::TouchPointReleased | Qt::TouchPointMoved,
487 Qt::TouchPointReleased | Qt::TouchPointMoved,
482 touchPoints);
488 touchPoints);
483− touchRegistry.update(&touchEvent);
489+ touchRegistry->update(&touchEvent);
484 }
490 }
485
491
486 {
492 {
@@ -492,10 +498,10 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
492 Qt::NoModifier,
498 Qt::NoModifier,
493 Qt::TouchPointReleased,
499 Qt::TouchPointReleased,
494 touchPoints);
500 touchPoints);
495− touchRegistry.update(&touchEvent);
501+ touchRegistry->update(&touchEvent);
496 }
502 }
497
503
498− QVERIFY(touchRegistry.m_touchInfoPool.isEmpty());
504+ QVERIFY(touchRegistry->m_touchInfoPool.isEmpty());
499
505
500 item.unownedTouchEvents.clear();
506 item.unownedTouchEvents.clear();
501
507
@@ -508,7 +514,7 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
508 Qt::NoModifier,
514 Qt::NoModifier,
509 Qt::TouchPointPressed,
515 Qt::TouchPointPressed,
510 touchPoints);
516 touchPoints);
511− touchRegistry.update(&touchEvent);
517+ touchRegistry->update(&touchEvent);
512 }
518 }
513
519
514 // Haven't made any subscription for that new touch 0.
520 // Haven't made any subscription for that new touch 0.
@@ -521,8 +527,6 @@ void tst_TouchRegistry::candidatesAndWatchers_1()
521 */
527 */
522void tst_TouchRegistry::candidatesAndWatchers_2()
528void tst_TouchRegistry::candidatesAndWatchers_2()
523{
529{
524− TouchRegistry touchRegistry;
525−
526 DummyCandidate directionalDragArea;
530 DummyCandidate directionalDragArea;
527 directionalDragArea.setObjectName("DirectionalDragArea");
531 directionalDragArea.setObjectName("DirectionalDragArea");
528
532
@@ -539,14 +543,14 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
539 Qt::NoModifier,
543 Qt::NoModifier,
540 Qt::TouchPointPressed,
544 Qt::TouchPointPressed,
541 touchPoints);
545 touchPoints);
542− touchRegistry.update(&touchEvent);
546+ touchRegistry->update(&touchEvent);
543 }
547 }
544
548
545 // [TouchRegistry] addCandidateOwnerForTouch id 0 candidate DirectionalDragArea
549 // [TouchRegistry] addCandidateOwnerForTouch id 0 candidate DirectionalDragArea
546− touchRegistry.addCandidateOwnerForTouch(0, &directionalDragArea);
550+ touchRegistry->addCandidateOwnerForTouch(0, &directionalDragArea);
547
551
548 // [TouchRegistry] requestTouchOwnership id 0 candidate TouchGate
552 // [TouchRegistry] requestTouchOwnership id 0 candidate TouchGate
549− touchRegistry.requestTouchOwnership(0, &touchGate);
553+ touchRegistry->requestTouchOwnership(0, &touchGate);
550
554
551 //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(147,1023)) (id:1, state:pressed, scenePos:(327,792))
555 //[TouchRegistry] got TouchUpdate (id:0, state:moved, scenePos:(147,1023)) (id:1, state:pressed, scenePos:(327,792))
552 {
556 {
@@ -560,24 +564,24 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
560 Qt::NoModifier,
564 Qt::NoModifier,
561 Qt::TouchPointPressed | Qt::TouchPointMoved,
565 Qt::TouchPointPressed | Qt::TouchPointMoved,
562 touchPoints);
566 touchPoints);
563− touchRegistry.update(&touchEvent);
567+ touchRegistry->update(&touchEvent);
564 }
568 }
565
569
566 // [TouchRegistry] addTouchWatcher id 1 watcher DirectionalDragArea
570 // [TouchRegistry] addTouchWatcher id 1 watcher DirectionalDragArea
567− touchRegistry.addTouchWatcher(1, &directionalDragArea);
571+ touchRegistry->addTouchWatcher(1, &directionalDragArea);
568
572
569 // [TouchRegistry] removeCandidateOwnerForTouch id 0 candidate DirectionalDragArea
573 // [TouchRegistry] removeCandidateOwnerForTouch id 0 candidate DirectionalDragArea
570− touchRegistry.removeCandidateOwnerForTouch(0, &directionalDragArea);
574+ touchRegistry->removeCandidateOwnerForTouch(0, &directionalDragArea);
571
575
572 //[TouchRegistry] sending TouchWonershipEvent(id = 0 gained) to candidate TouchGate
576 //[TouchRegistry] sending TouchWonershipEvent(id = 0 gained) to candidate TouchGate
573 QCOMPARE(touchGate.ownedTouches.count(), 1);
577 QCOMPARE(touchGate.ownedTouches.count(), 1);
574 QVERIFY(touchGate.ownedTouches.contains(0));
578 QVERIFY(touchGate.ownedTouches.contains(0));
575
579
576 // [TouchRegistry] addTouchWatcher id 0 watcher DirectionalDragArea
580 // [TouchRegistry] addTouchWatcher id 0 watcher DirectionalDragArea
577− touchRegistry.addTouchWatcher(0, &directionalDragArea);
581+ touchRegistry->addTouchWatcher(0, &directionalDragArea);
578
582
579 // [TouchRegistry] requestTouchOwnership id 1 candidate TouchGate
583 // [TouchRegistry] requestTouchOwnership id 1 candidate TouchGate
580− touchRegistry.requestTouchOwnership(1, &touchGate);
584+ touchRegistry->requestTouchOwnership(1, &touchGate);
581
585
582 //[TouchRegistry] sending TouchWonershipEvent(id = 1 gained) to candidate TouchGate
586 //[TouchRegistry] sending TouchWonershipEvent(id = 1 gained) to candidate TouchGate
583 QCOMPARE(touchGate.ownedTouches.count(), 2);
587 QCOMPARE(touchGate.ownedTouches.count(), 2);
@@ -598,7 +602,7 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
598 Qt::NoModifier,
602 Qt::NoModifier,
599 Qt::TouchPointMoved,
603 Qt::TouchPointMoved,
600 touchPoints);
604 touchPoints);
601− touchRegistry.update(&touchEvent);
605+ touchRegistry->update(&touchEvent);
602 }
606 }
603
607
604 //vvvvv DDA Watchers are being ignored from now on vvvvvvv
608 //vvvvv DDA Watchers are being ignored from now on vvvvvvv
@@ -624,7 +628,7 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
624 Qt::NoModifier,
628 Qt::NoModifier,
625 Qt::TouchPointMoved | Qt::TouchPointReleased,
629 Qt::TouchPointMoved | Qt::TouchPointReleased,
626 touchPoints);
630 touchPoints);
627− touchRegistry.update(&touchEvent);
631+ touchRegistry->update(&touchEvent);
628 }
632 }
629
633
630 QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
634 QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
@@ -646,7 +650,7 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
646 Qt::NoModifier,
650 Qt::NoModifier,
647 Qt::TouchPointReleased,
651 Qt::TouchPointReleased,
648 touchPoints);
652 touchPoints);
649− touchRegistry.update(&touchEvent);
653+ touchRegistry->update(&touchEvent);
650 }
654 }
651
655
652 QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
656 QCOMPARE(directionalDragArea.unownedTouchEvents.count(), 1);
@@ -658,7 +662,6 @@ void tst_TouchRegistry::candidatesAndWatchers_2()
658
662
659void tst_TouchRegistry::rejectingTouchfterItsEnd()
663void tst_TouchRegistry::rejectingTouchfterItsEnd()
660{
664{
661− TouchRegistry touchRegistry;
662 DummyCandidate earlyCandidate;
665 DummyCandidate earlyCandidate;
663 DummyCandidate lateCandidate;
666 DummyCandidate lateCandidate;
664
667
@@ -671,16 +674,16 @@ void tst_TouchRegistry::rejectingTouchfterItsEnd()
671 Qt::NoModifier,
674 Qt::NoModifier,
672 Qt::TouchPointPressed,
675 Qt::TouchPointPressed,
673 touchPoints);
676 touchPoints);
674− touchRegistry.update(&touchEvent);
677+ touchRegistry->update(&touchEvent);
675 }
678 }
676
679
677− touchRegistry.addCandidateOwnerForTouch(0, &earlyCandidate);
680+ touchRegistry->addCandidateOwnerForTouch(0, &earlyCandidate);
678− touchRegistry.addCandidateOwnerForTouch(0, &lateCandidate);
681+ touchRegistry->addCandidateOwnerForTouch(0, &lateCandidate);
679
682
680 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
683 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
681 QVERIFY(lateCandidate.ownedTouches.isEmpty());
684 QVERIFY(lateCandidate.ownedTouches.isEmpty());
682
685
683− touchRegistry.requestTouchOwnership(0, &lateCandidate);
686+ touchRegistry->requestTouchOwnership(0, &lateCandidate);
684
687
685 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
688 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
686 QVERIFY(lateCandidate.ownedTouches.isEmpty());
689 QVERIFY(lateCandidate.ownedTouches.isEmpty());
@@ -694,25 +697,25 @@ void tst_TouchRegistry::rejectingTouchfterItsEnd()
694 Qt::NoModifier,
697 Qt::NoModifier,
695 Qt::TouchPointPressed,
698 Qt::TouchPointPressed,
696 touchPoints);
699 touchPoints);
697− touchRegistry.update(&touchEvent);
700+ touchRegistry->update(&touchEvent);
698 }
701 }
699
702
700 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
703 QVERIFY(earlyCandidate.ownedTouches.isEmpty());
701 QVERIFY(lateCandidate.ownedTouches.isEmpty());
704 QVERIFY(lateCandidate.ownedTouches.isEmpty());
702
705
703− touchRegistry.removeCandidateOwnerForTouch(0, &earlyCandidate);
706+ touchRegistry->removeCandidateOwnerForTouch(0, &earlyCandidate);
704
707
705 QCOMPARE(lateCandidate.ownedTouches.count(), 1);
708 QCOMPARE(lateCandidate.ownedTouches.count(), 1);
706 QCOMPARE(lateCandidate.ownedTouches.contains(0), 1);
709 QCOMPARE(lateCandidate.ownedTouches.contains(0), 1);
707
710
708 // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
711 // Check that there's no trace left of touch 0 as we no longer need to keep tabs on it.
709− QVERIFY(!touchRegistry.findTouchInfo(0));
712+ QVERIFY(!touchRegistry->findTouchInfo(0));
710}
713}
711
714
712void tst_TouchRegistry::removeOldUndecidedCandidates()
715void tst_TouchRegistry::removeOldUndecidedCandidates()
713{
716{
714 FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
717 FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
715− TouchRegistry *touchRegistry = new TouchRegistry(nullptr, fakeTimerFactory);
718+ touchRegistry->setTimerFactory(fakeTimerFactory);
716
719
717 DummyCandidate undecidedCandidate;
720 DummyCandidate undecidedCandidate;
718 undecidedCandidate.setObjectName("undecided");
721 undecidedCandidate.setObjectName("undecided");
@@ -749,8 +752,6 @@ void tst_TouchRegistry::removeOldUndecidedCandidates()
749 QVERIFY(undecidedCandidate.lostTouches.contains(0));
752 QVERIFY(undecidedCandidate.lostTouches.contains(0));
750 QVERIFY(candidateThatWantsTouch.ownedTouches.contains(0));
753 QVERIFY(candidateThatWantsTouch.ownedTouches.contains(0));
751 QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
754 QVERIFY(candidateThatWantsTouch.lostTouches.isEmpty());
752−
753− delete touchRegistry;
754}
755}
755
756
756/*
757/*
@@ -762,7 +763,7 @@ void tst_TouchRegistry::removeOldUndecidedCandidates()
762void tst_TouchRegistry::interimOwnerWontGetUnownedTouchEvents()
763void tst_TouchRegistry::interimOwnerWontGetUnownedTouchEvents()
763{
764{
764 FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
765 FakeTimerFactory *fakeTimerFactory = new FakeTimerFactory;
765− TouchRegistry *touchRegistry = new TouchRegistry(nullptr, fakeTimerFactory);
766+ touchRegistry->setTimerFactory(fakeTimerFactory);
766
767
767 DummyCandidate undecidedCandidate;
768 DummyCandidate undecidedCandidate;
768 undecidedCandidate.setObjectName("undecided");
769 undecidedCandidate.setObjectName("undecided");
@@ -814,8 +815,6 @@ void tst_TouchRegistry::interimOwnerWontGetUnownedTouchEvents()
814
815
815 QCOMPARE(undecidedCandidate.unownedTouchEvents.count(), 2);
816 QCOMPARE(undecidedCandidate.unownedTouchEvents.count(), 2);
816 QCOMPARE(interimOwner.unownedTouchEvents.count(), 0);
817 QCOMPARE(interimOwner.unownedTouchEvents.count(), 0);
817−
818− delete touchRegistry;
819}
818}
820
819
821////////////// TouchMemento //////////
820////////////// TouchMemento //////////
tests/mocks/AccountsService/plugin.h+1−1
@@ -29,7 +29,7 @@ class AccountsServicePlugin : public QQmlExtensionPlugin
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
30
30
31public:
31public:
32− void registerTypes(const char *uri);
32+ void registerTypes(const char *uri) override;
33};
33};
34
34
35#endif
35#endif
tests/mocks/CMakeLists.txt+1
@@ -41,6 +41,7 @@ add_subdirectory(Ubuntu)
41add_subdirectory(Unity)
41add_subdirectory(Unity)
42add_subdirectory(QtMultimedia)
42add_subdirectory(QtMultimedia)
43add_subdirectory(Wizard)
43add_subdirectory(Wizard)
44+add_subdirectory(Utils)
44
45
45install(
46install(
46 DIRECTORY data
47 DIRECTORY data
tests/mocks/GSettings.1.0/fake_gsettings.h+2−2
@@ -78,10 +78,10 @@ public:
78 ~GSettingsControllerQml();
78 ~GSettingsControllerQml();
79
79
80 QString pictureUri() const;
80 QString pictureUri() const;
81− void setPictureUri(const QString &str);
81+ Q_INVOKABLE void setPictureUri(const QString &str);
82
82
83 QString usageMode() const;
83 QString usageMode() const;
84− void setUsageMode(const QString &usageMode);
84+ Q_INVOKABLE void setUsageMode(const QString &usageMode);
85
85
86Q_SIGNALS:
86Q_SIGNALS:
87 void pictureUriChanged(const QString&);
87 void pictureUriChanged(const QString&);
tests/mocks/GSettings.1.0/plugin.cpp+6
@@ -19,8 +19,14 @@
19
19
20#include <QtQml/qqml.h>
20#include <QtQml/qqml.h>
21
21
22+static QObject* controllerProvider(QQmlEngine* /* engine */, QJSEngine* /* scriptEngine */)
23+{
24+ return GSettingsControllerQml::instance();
25+}
26+
22void FakeGSettingsQmlPlugin::registerTypes(const char *uri)
27void FakeGSettingsQmlPlugin::registerTypes(const char *uri)
23{
28{
29+ qmlRegisterSingletonType<GSettingsControllerQml>(uri, 1, 0, "GSettingsController", controllerProvider);
24 qmlRegisterType<GSettingsQml>(uri, 1, 0, "GSettings");
30 qmlRegisterType<GSettingsQml>(uri, 1, 0, "GSettings");
25 qmlRegisterUncreatableType<GSettingsSchemaQml>(uri, 1, 0, "GSettingsSchema",
31 qmlRegisterUncreatableType<GSettingsSchemaQml>(uri, 1, 0, "GSettingsSchema",
26 "GSettingsSchema can only be used inside of a GSettings component");
32 "GSettingsSchema can only be used inside of a GSettings component");
tests/mocks/GSettings.1.0/plugin.h+1−1
@@ -25,7 +25,7 @@ class FakeGSettingsQmlPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // PLUGIN_H
31#endif // PLUGIN_H
tests/mocks/LightDM/liblightdm/UsersModel.h+2−2
@@ -53,8 +53,8 @@ public:
53 BackgroundPathRole
53 BackgroundPathRole
54 };
54 };
55
55
56− int rowCount(const QModelIndex &parent) const;
56+ int rowCount(const QModelIndex &parent) const override;
57− QVariant data(const QModelIndex &index, int role) const;
57+ QVariant data(const QModelIndex &index, int role) const override;
58
58
59 QString mockMode() const;
59 QString mockMode() const;
60 void setMockMode(QString mockMode);
60 void setMockMode(QString mockMode);
tests/mocks/LightDM/plugin.h+1−1
@@ -26,7 +26,7 @@ class LightDMPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif
32#endif
tests/mocks/Lights/plugin.h+1−1
@@ -26,7 +26,7 @@ class PowerdPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif
32#endif
tests/mocks/MeeGo/QOfono/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // MOCK_QOFONO_PLUGIN_H
31#endif // MOCK_QOFONO_PLUGIN_H
tests/mocks/Powerd/plugin.h+1−1
@@ -28,7 +28,7 @@ class PowerdPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
tests/mocks/QMenuModel/plugin.h+1−1
@@ -28,7 +28,7 @@ class QMenuModelPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
tests/mocks/QMenuModel/unitymenumodel.h+6−6
@@ -61,12 +61,12 @@ public:
61
61
62 QString nameOwner() const;
62 QString nameOwner() const;
63
63
64− int rowCount(const QModelIndex &parent = QModelIndex()) const;
64+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
65− int columnCount(const QModelIndex &parent = QModelIndex()) const;
65+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
66− QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
66+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
67− QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const;
67+ QModelIndex index(int row, int column = 0, const QModelIndex &parent = QModelIndex()) const override;
68− QModelIndex parent(const QModelIndex &index) const;
68+ QModelIndex parent(const QModelIndex &index) const override;
69− QHash<int, QByteArray> roleNames() const;
69+ QHash<int, QByteArray> roleNames() const override;
70
70
71 Q_INVOKABLE QObject * submenu(int position, QQmlComponent* actionStateParser = nullptr);
71 Q_INVOKABLE QObject * submenu(int position, QQmlComponent* actionStateParser = nullptr);
72 Q_INVOKABLE bool loadExtendedAttributes(int position, const QVariantMap &schema);
72 Q_INVOKABLE bool loadExtendedAttributes(int position, const QVariantMap &schema);
tests/mocks/QtMultimedia/plugin.h+1−1
@@ -28,7 +28,7 @@ class MockQtMultimediaPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
tests/mocks/Ubuntu/Connectivity/plugin.h+2−2
@@ -28,8 +28,8 @@ class QmlConnectivityNetworkingPlugin : public QQmlExtensionPlugin {
28 Q_INTERFACES(QQmlExtensionInterface)
28 Q_INTERFACES(QQmlExtensionInterface)
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32− void initializeEngine(QQmlEngine *engine, const char *uri);
32+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
33};
33};
34
34
35#endif // QML_CONNECTIVITY_PLUGIN_H
35#endif // QML_CONNECTIVITY_PLUGIN_H
tests/mocks/Ubuntu/DownloadDaemonListener/plugin.h+1−1
@@ -24,7 +24,7 @@ class FakeUbuntuDownloadDaemonListenerQmlPlugin : public QQmlExtensionPlugin
24 Q_OBJECT
24 Q_OBJECT
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26public:
26public:
27− void registerTypes(const char *uri);
27+ void registerTypes(const char *uri) override;
28};
28};
29
29
30#endif
30#endif
tests/mocks/Ubuntu/Payments/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // PAYMENTS_PLUGIN_H
31#endif // PAYMENTS_PLUGIN_H
tests/mocks/Ubuntu/SystemImage/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // MOCK_SYSTEMIMAGE_PLUGIN_H
31#endif // MOCK_SYSTEMIMAGE_PLUGIN_H
tests/mocks/Ubuntu/SystemSettings/SecurityPrivacy/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // MOCK_SECURITYPRIVACY_PLUGIN_H
31#endif // MOCK_SECURITYPRIVACY_PLUGIN_H
tests/mocks/Ubuntu/Telephony/MockCallEntry.h+1−1
@@ -53,7 +53,7 @@ Q_SIGNALS:
53 void elapsedTimerRunningChanged();
53 void elapsedTimerRunningChanged();
54
54
55protected:
55protected:
56− void timerEvent(QTimerEvent * event);
56+ void timerEvent(QTimerEvent * event) override;
57
57
58private:
58private:
59 QString m_phoneNumber;
59 QString m_phoneNumber;
tests/mocks/Ubuntu/Telephony/plugin.h+2−2
@@ -27,8 +27,8 @@ class FakeUbuntuTelephonyQmlPlugin : public QQmlExtensionPlugin
27 Q_OBJECT
27 Q_OBJECT
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29public:
29public:
30− void initializeEngine(QQmlEngine *engine, const char *uri);
30+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32
32
33private:
33private:
34 QQmlContext *mRootContext;
34 QQmlContext *mRootContext;
tests/mocks/Unity/Application/ApplicationManager.cpp+1−1
@@ -143,7 +143,7 @@ QModelIndex ApplicationManager::findIndex(ApplicationInfo* application)
143}
143}
144
144
145void ApplicationManager::add(ApplicationInfo *application) {
145void ApplicationManager::add(ApplicationInfo *application) {
146− if (!application) {
146+ if (!application || m_runningApplications.contains(application)) {
147 return;
147 return;
148 }
148 }
149
149
tests/mocks/Unity/Application/CMakeLists.txt−4
@@ -1,7 +1,3 @@
1−include_directories(
2− ${APPLICATION_API_INCLUDE_DIRS}
3−)
4−
5set(FakeUnityApplicationQml_SOURCES
1set(FakeUnityApplicationQml_SOURCES
6 plugin.cpp
2 plugin.cpp
7 ApplicationInfo.cpp
3 ApplicationInfo.cpp
tests/mocks/Unity/Application/ObjectListModel.h+1−1
@@ -76,7 +76,7 @@ public:
76 return QVariant();
76 return QVariant();
77 }
77 }
78
78
79− QHash<int, QByteArray> roleNames() const
79+ QHash<int, QByteArray> roleNames() const override
80 {
80 {
81 QHash<int, QByteArray> roleNames;
81 QHash<int, QByteArray> roleNames;
82 roleNames.insert(RoleModelData, "modelData");
82 roleNames.insert(RoleModelData, "modelData");
tests/mocks/Unity/Application/plugin.h+2−2
@@ -24,8 +24,8 @@ class FakeUnityApplicationQmlPlugin : public QQmlExtensionPlugin
24 Q_OBJECT
24 Q_OBJECT
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26public:
26public:
27− void registerTypes(const char *uri);
27+ void registerTypes(const char *uri) override;
28− void initializeEngine(QQmlEngine *engine, const char *uri);
28+ void initializeEngine(QQmlEngine *engine, const char *uri) override;
29};
29};
30
30
31#endif
31#endif
tests/mocks/Unity/Connectivity/plugin.h+1−1
@@ -25,7 +25,7 @@ class BackendPlugin : public QQmlExtensionPlugin
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
25 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26
26
27public:
27public:
28− void registerTypes(const char *uri);
28+ void registerTypes(const char *uri) override;
29};
29};
30
30
31#endif // MOCK_CONNECTIVITY_PLUGIN_H
31#endif // MOCK_CONNECTIVITY_PLUGIN_H
tests/mocks/Unity/DashCommunicator/plugin.h+1−1
@@ -28,7 +28,7 @@ class DashCommunicatorPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
tests/mocks/Unity/Indicators/fakeindicatorsmodel.h+5−5
@@ -50,11 +50,11 @@ public:
50 QVariant modelData() const { return m_modelData; }
50 QVariant modelData() const { return m_modelData; }
51
51
52 /* QAbstractItemModel */
52 /* QAbstractItemModel */
53− QHash<int, QByteArray> roleNames() const;
53+ QHash<int, QByteArray> roleNames() const override;
54− int columnCount(const QModelIndex &parent = QModelIndex()) const;
54+ int columnCount(const QModelIndex &parent = QModelIndex()) const override;
55− QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
55+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
56− QModelIndex parent (const QModelIndex &index) const;
56+ QModelIndex parent (const QModelIndex &index) const override;
57− int rowCount(const QModelIndex &parent = QModelIndex()) const;
57+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
58
58
59Q_SIGNALS:
59Q_SIGNALS:
60 void countChanged();
60 void countChanged();
tests/mocks/Unity/Indicators/fakeplugin.h+1−1
@@ -26,7 +26,7 @@ class IndicatorsFakePlugin : public QQmlExtensionPlugin
26 Q_OBJECT
26 Q_OBJECT
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif // INDICATORS_FAKE_PLUGIN_H
32#endif // INDICATORS_FAKE_PLUGIN_H
tests/mocks/Unity/Launcher/MockLauncherItem.h+2−2
@@ -43,9 +43,9 @@ public:
43 int progress() const override;
43 int progress() const override;
44 int count() const override;
44 int count() const override;
45 bool countVisible() const override;
45 bool countVisible() const override;
46− bool focused() const;
46+ bool focused() const override;
47
47
48− unity::shell::launcher::QuickListModelInterface *quickList() const;
48+ unity::shell::launcher::QuickListModelInterface *quickList() const override;
49
49
50private:
50private:
51 void setPinned(bool pinned);
51 void setPinned(bool pinned);
tests/mocks/Unity/Launcher/MockLauncherModel.h+10−10
@@ -34,20 +34,20 @@ public:
34 MockLauncherModel(QObject* parent = 0);
34 MockLauncherModel(QObject* parent = 0);
35 ~MockLauncherModel();
35 ~MockLauncherModel();
36
36
37− int rowCount(const QModelIndex& parent) const;
37+ int rowCount(const QModelIndex& parent) const override;
38
38
39− QVariant data(const QModelIndex& index, int role) const;
39+ QVariant data(const QModelIndex& index, int role) const override;
40
40
41− Q_INVOKABLE unity::shell::launcher::LauncherItemInterface *get(int index) const;
41+ Q_INVOKABLE unity::shell::launcher::LauncherItemInterface *get(int index) const override;
42− Q_INVOKABLE void move(int oldIndex, int newIndex);
42+ Q_INVOKABLE void move(int oldIndex, int newIndex) override;
43− Q_INVOKABLE void pin(const QString &appId, int index = -1);
43+ Q_INVOKABLE void pin(const QString &appId, int index = -1) override;
44− Q_INVOKABLE void requestRemove(const QString &appId);
44+ Q_INVOKABLE void requestRemove(const QString &appId) override;
45− Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex);
45+ Q_INVOKABLE void quickListActionInvoked(const QString &appId, int actionIndex) override;
46− Q_INVOKABLE void setUser(const QString &username);
46+ Q_INVOKABLE void setUser(const QString &username) override;
47 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
47 Q_INVOKABLE QString getUrlForAppId(const QString &appId) const;
48
48
49− unity::shell::application::ApplicationManagerInterface *applicationManager() const;
49+ unity::shell::application::ApplicationManagerInterface *applicationManager() const override;
50− void setApplicationManager(unity::shell::application::ApplicationManagerInterface *applicationManager);
50+ void setApplicationManager(unity::shell::application::ApplicationManagerInterface *applicationManager) override;
51
51
52 bool onlyPinned() const override;
52 bool onlyPinned() const override;
53 void setOnlyPinned(bool onlyPinned) override;
53 void setOnlyPinned(bool onlyPinned) override;
tests/mocks/Unity/Launcher/MockQuickListModel.h+2−2
@@ -30,9 +30,9 @@ class MockQuickListModel: public QuickListModelInterface
30public:
30public:
31 MockQuickListModel(QObject *parent = 0);
31 MockQuickListModel(QObject *parent = 0);
32
32
33− QVariant data(const QModelIndex &index, int role) const;
33+ QVariant data(const QModelIndex &index, int role) const override;
34
34
35− int rowCount(const QModelIndex &parent = QModelIndex()) const;
35+ int rowCount(const QModelIndex &parent = QModelIndex()) const override;
36};
36};
37
37
38#endif // MOCKQUICKLISTMODEL_H
38#endif // MOCKQUICKLISTMODEL_H
tests/mocks/Unity/Launcher/plugin.h+1−1
@@ -29,7 +29,7 @@ class TestLauncherPlugin : public QQmlExtensionPlugin
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
30
30
31public:
31public:
32− void registerTypes(const char* uri);
32+ void registerTypes(const char* uri) override;
33};
33};
34
34
35#endif // TESTLAUNCHER_PLUGIN_H
35#endif // TESTLAUNCHER_PLUGIN_H
tests/mocks/Unity/Notifications/MockActionModel.h+3−3
@@ -32,9 +32,9 @@ public:
32 ActionModel(QObject *parent=nullptr);
32 ActionModel(QObject *parent=nullptr);
33 virtual ~ActionModel();
33 virtual ~ActionModel();
34
34
35− virtual int rowCount(const QModelIndex &index) const;
35+ int rowCount(const QModelIndex &index) const override;
36− virtual QVariant data(const QModelIndex &index, int role) const;
36+ QVariant data(const QModelIndex &index, int role) const override;
37− virtual QHash<int, QByteArray> roleNames() const;
37+ QHash<int, QByteArray> roleNames() const override;
38
38
39 Q_ENUMS(ActionsRoles)
39 Q_ENUMS(ActionsRoles)
40 enum ActionsRoles {
40 enum ActionsRoles {
tests/mocks/Unity/Notifications/MockNotificationModel.h+3−3
@@ -35,9 +35,9 @@ public:
35 MockNotificationModel(QObject *parent=nullptr);
35 MockNotificationModel(QObject *parent=nullptr);
36 virtual ~MockNotificationModel();
36 virtual ~MockNotificationModel();
37
37
38− virtual int rowCount(const QModelIndex &parent) const;
38+ int rowCount(const QModelIndex &parent) const override;
39− virtual QVariant data(const QModelIndex &index, int role) const;
39+ QVariant data(const QModelIndex &index, int role) const override;
40− virtual QHash<int, QByteArray> roleNames() const;
40+ QHash<int, QByteArray> roleNames() const override;
41
41
42 Q_INVOKABLE void append(MockNotification* n);
42 Q_INVOKABLE void append(MockNotification* n);
43 MockNotification* getNotification(int id) const;
43 MockNotification* getNotification(int id) const;
tests/mocks/Unity/Notifications/plugin.h+1−1
@@ -28,7 +28,7 @@ class TestNotificationPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char* uri);
31+ void registerTypes(const char* uri) override;
32};
32};
33
33
34#endif // TESTNOTIFICATION_PLUGIN_H
34#endif // TESTNOTIFICATION_PLUGIN_H
tests/mocks/Unity/fake_scopes.h+2−2
@@ -50,8 +50,8 @@ public:
50 Q_INVOKABLE void clearFavorites();
50 Q_INVOKABLE void clearFavorites();
51 Q_INVOKABLE void load();
51 Q_INVOKABLE void load();
52
52
53− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
53+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
54− QModelIndex parent ( const QModelIndex & index ) const;
54+ QModelIndex parent ( const QModelIndex & index ) const override;
55
55
56 bool loaded() const override;
56 bool loaded() const override;
57 int count() const override;
57 int count() const override;
tests/mocks/Unity/fake_unity_plugin.h+1−1
@@ -28,7 +28,7 @@ class FakeUnityPlugin : public QQmlExtensionPlugin
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
28 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
29
29
30public:
30public:
31− void registerTypes(const char *uri);
31+ void registerTypes(const char *uri) override;
32};
32};
33
33
34#endif
34#endif
tests/mocks/Utils/CMakeLists.txtnew file+40
@@ -0,0 +1,40 @@
1+pkg_search_module(GIO REQUIRED gio-2.0)
2+
3+include_directories(
4+ ${CMAKE_CURRENT_SOURCE_DIR}
5+ ${CMAKE_CURRENT_BINARY_DIR}
6+ ${Qt5Gui_PRIVATE_INCLUDE_DIRS}
7+ ${GIO_INCLUDE_DIRS}
8+ ${CMAKE_SOURCE_DIR}/plugins/Utils
9+)
10+
11+set(QMLPLUGIN_SRC
12+ ${CMAKE_SOURCE_DIR}/plugins/Utils/inputwatcher.cpp
13+ ${CMAKE_SOURCE_DIR}/plugins/Utils/qlimitproxymodelqml.cpp
14+ ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
15+ ${CMAKE_SOURCE_DIR}/plugins/Utils/relativetimeformatter.cpp
16+ ${CMAKE_SOURCE_DIR}/plugins/Utils/timeformatter.cpp
17+ ${CMAKE_SOURCE_DIR}/plugins/Utils/unitymenumodelpaths.cpp
18+ ${CMAKE_SOURCE_DIR}/plugins/Utils/windowkeysfilter.cpp
19+ ${CMAKE_SOURCE_DIR}/plugins/Utils/windowscreenshotprovider.cpp
20+ ${CMAKE_SOURCE_DIR}/plugins/Utils/easingcurve.cpp
21+ constants.cpp
22+ plugin.cpp
23+ windowstatestorage.cpp
24+ )
25+
26+add_library(FakeUtils-qml SHARED
27+ ${QMLPLUGIN_SRC}
28+ )
29+
30+target_link_libraries(FakeUtils-qml ${GIO_LDFLAGS})
31+
32+# Because this is an internal support library, we want
33+# to expose all symbols in it. Consider changing this
34+# either to a static library or just using the
35+# files directly in targets.
36+set_target_properties(FakeUtils-qml PROPERTIES COMPILE_FLAGS -fvisibility=default)
37+
38+qt5_use_modules(FakeUtils-qml Qml Quick DBus Network Gui)
39+
40+add_unity8_mock(Utils 0.1 Utils TARGETS FakeUtils-qml)
tests/mocks/Utils/HomeKeyWatcher.qmlnew file+21
@@ -0,0 +1,21 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+
19+QtObject {
20+ signal activated()
21+}
tests/mocks/Utils/Style.jsnew file+37
@@ -0,0 +1,37 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
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+.pragma library
18+
19+/*! \brief Calculate average luminance of the passed colors
20+
21+ \note If not fully opaque, luminance is dependant on blending.
22+ */
23+function luminance() {
24+ var sum = 0;
25+ // TODO this was originally
26+ // for (var k in arguments) {
27+ // but for some unkown reason was causing crashes in testDash/testDashContent
28+ // investigate when we have some time
29+ for (var k = 0; k < arguments.length; ++k) {
30+ // only way to convert string to color
31+ var c = Qt.lighter(arguments[k], 1.0);
32+
33+ sum += 0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b;
34+ }
35+
36+ return sum / arguments.length;
37+}
tests/mocks/Utils/Utils.qmltypesnew file+175
@@ -0,0 +1,175 @@
1+import QtQuick.tooling 1.1
2+
3+// This file describes the plugin-supplied types contained in the library.
4+// It is used for QML tooling purposes only.
5+//
6+// This file was auto-generated by:
7+// 'qmlplugindump -notrelocatable Utils 0.1 plugins'
8+
9+Module {
10+ Component {
11+ name: "EasingCurve"
12+ prototype: "QObject"
13+ exports: ["Utils/EasingCurve 0.1"]
14+ exportMetaObjectRevisions: [0]
15+ Property { name: "type"; type: "QEasingCurve::Type" }
16+ Property { name: "period"; type: "double" }
17+ Property { name: "progress"; type: "double" }
18+ Property { name: "value"; type: "double"; isReadonly: true }
19+ }
20+ Component {
21+ name: "QAbstractProxyModel"
22+ prototype: "QAbstractItemModel"
23+ Property { name: "sourceModel"; type: "QAbstractItemModel"; isPointer: true }
24+ }
25+ Component { name: "QIdentityProxyModel"; prototype: "QAbstractProxyModel" }
26+ Component {
27+ name: "QLimitProxyModelQML"
28+ prototype: "QIdentityProxyModel"
29+ exports: ["Utils/LimitProxyModel 0.1"]
30+ exportMetaObjectRevisions: [0]
31+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
32+ Property { name: "limit"; type: "int" }
33+ Property { name: "count"; type: "int"; isReadonly: true }
34+ Signal { name: "totalCountChanged" }
35+ }
36+ Component {
37+ name: "QSortFilterProxyModel"
38+ prototype: "QAbstractProxyModel"
39+ Property { name: "filterRegExp"; type: "QRegExp" }
40+ Property { name: "filterKeyColumn"; type: "int" }
41+ Property { name: "dynamicSortFilter"; type: "bool" }
42+ Property { name: "filterCaseSensitivity"; type: "Qt::CaseSensitivity" }
43+ Property { name: "sortCaseSensitivity"; type: "Qt::CaseSensitivity" }
44+ Property { name: "isSortLocaleAware"; type: "bool" }
45+ Property { name: "sortRole"; type: "int" }
46+ Property { name: "filterRole"; type: "int" }
47+ Method {
48+ name: "setFilterRegExp"
49+ Parameter { name: "pattern"; type: "string" }
50+ }
51+ Method {
52+ name: "setFilterWildcard"
53+ Parameter { name: "pattern"; type: "string" }
54+ }
55+ Method {
56+ name: "setFilterFixedString"
57+ Parameter { name: "pattern"; type: "string" }
58+ }
59+ Method { name: "clear" }
60+ Method { name: "invalidate" }
61+ }
62+ Component {
63+ name: "RelativeTimeFormatter"
64+ prototype: "TimeFormatter"
65+ exports: ["Utils/RelativeTimeFormatter 0.1"]
66+ exportMetaObjectRevisions: [0]
67+ }
68+ Component {
69+ name: "TimeFormatter"
70+ prototype: "QObject"
71+ exports: ["Utils/GDateTimeFormatter 0.1", "Utils/TimeFormatter 0.1"]
72+ exportMetaObjectRevisions: [0, 0]
73+ Property { name: "format"; type: "string" }
74+ Property { name: "timeString"; type: "string"; isReadonly: true }
75+ Property { name: "time"; type: "qlonglong" }
76+ Signal {
77+ name: "formatChanged"
78+ Parameter { name: "format"; type: "string" }
79+ }
80+ Signal {
81+ name: "timeStringChanged"
82+ Parameter { name: "timeString"; type: "string" }
83+ }
84+ Signal {
85+ name: "timeChanged"
86+ Parameter { name: "time"; type: "qlonglong" }
87+ }
88+ }
89+ Component {
90+ name: "UnityMenuModelPaths"
91+ prototype: "QObject"
92+ exports: ["Utils/UnityMenuModelPaths 0.1"]
93+ exportMetaObjectRevisions: [0]
94+ Property { name: "source"; type: "QVariant" }
95+ Property { name: "busName"; type: "QByteArray"; isReadonly: true }
96+ Property { name: "actions"; type: "QVariantMap"; isReadonly: true }
97+ Property { name: "menuObjectPath"; type: "QByteArray"; isReadonly: true }
98+ Property { name: "busNameHint"; type: "QByteArray" }
99+ Property { name: "actionsHint"; type: "QByteArray" }
100+ Property { name: "menuObjectPathHint"; type: "QByteArray" }
101+ }
102+ Component {
103+ name: "UnitySortFilterProxyModelQML"
104+ prototype: "QSortFilterProxyModel"
105+ exports: ["Utils/UnitySortFilterProxyModel 0.1"]
106+ exportMetaObjectRevisions: [0]
107+ Property { name: "model"; type: "QAbstractItemModel"; isPointer: true }
108+ Property { name: "totalCount"; type: "int"; isReadonly: true }
109+ Property { name: "count"; type: "int"; isReadonly: true }
110+ Property { name: "invertMatch"; type: "bool" }
111+ Signal {
112+ name: "invertMatchChanged"
113+ Parameter { type: "bool" }
114+ }
115+ Method {
116+ name: "get"
117+ type: "QVariantMap"
118+ Parameter { name: "row"; type: "int" }
119+ }
120+ Method {
121+ name: "data"
122+ type: "QVariant"
123+ Parameter { name: "row"; type: "int" }
124+ Parameter { name: "role"; type: "int" }
125+ }
126+ Method { name: "count"; type: "int" }
127+ Method {
128+ name: "findFirst"
129+ type: "int"
130+ Parameter { name: "role"; type: "int" }
131+ Parameter { name: "value"; type: "QVariant" }
132+ }
133+ Method {
134+ name: "mapRowToSource"
135+ type: "int"
136+ Parameter { name: "row"; type: "int" }
137+ }
138+ Method {
139+ name: "mapFromSource"
140+ type: "int"
141+ Parameter { name: "row"; type: "int" }
142+ }
143+ Method {
144+ name: "mapToSource"
145+ type: "int"
146+ Parameter { name: "row"; type: "int" }
147+ }
148+ }
149+ Component {
150+ name: "WindowKeysFilter"
151+ defaultProperty: "data"
152+ prototype: "QQuickItem"
153+ exports: ["Utils/WindowKeysFilter 0.1"]
154+ exportMetaObjectRevisions: [0]
155+ }
156+ Component {
157+ name: "WindowStateStorage"
158+ prototype: "QObject"
159+ exports: ["Utils/WindowStateStorage 0.1"]
160+ isCreatable: false
161+ isSingleton: true
162+ exportMetaObjectRevisions: [0]
163+ Method {
164+ name: "saveGeometry"
165+ Parameter { name: "windowId"; type: "string" }
166+ Parameter { name: "rect"; type: "QRect" }
167+ }
168+ Method {
169+ name: "getGeometry"
170+ type: "QRect"
171+ Parameter { name: "windowId"; type: "string" }
172+ Parameter { name: "defaultValue"; type: "QRect" }
173+ }
174+ }
175+}
tests/mocks/Utils/constants.cppnew file+23
@@ -0,0 +1,23 @@
1+/*
2+ * Copyright 2015 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+#include "constants.h"
18+
19+Constants::Constants(QObject *parent)
20+ : QObject(parent)
21+{
22+ m_indicatorValueTimeout = 5000;
23+}
tests/mocks/Utils/constants.hnew file+43
@@ -0,0 +1,43 @@
1+/*
2+ * Copyright 2015 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+#ifndef CONSTANTS_H
18+#define CONSTANTS_H
19+
20+#include <QObject>
21+
22+/**
23+ * @brief The Constants class
24+ *
25+ * This singleton class exposes contants to Qml
26+ *
27+ */
28+
29+class Constants: public QObject
30+{
31+ Q_OBJECT
32+ Q_PROPERTY(int indicatorValueTimeout READ indicatorValueTimeout CONSTANT)
33+
34+public:
35+ Constants(QObject *parent = 0);
36+
37+ int indicatorValueTimeout() const { return m_indicatorValueTimeout; }
38+
39+private:
40+ int m_indicatorValueTimeout;
41+};
42+
43+#endif
tests/mocks/Utils/plugin.cppnew file+76
@@ -0,0 +1,76 @@
1+/*
2+ * Copyright (C) 2015 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+// Qt
18+#include <QtQml/qqml.h>
19+#include <QDBusConnection>
20+#include <QQmlContext>
21+#include <QtQuick/QQuickWindow>
22+#include <QDebug>
23+
24+// local
25+#include "plugin.h"
26+#include "windowstatestorage.h"
27+#include "constants.h"
28+
29+// plugin
30+#include <inputwatcher.h>
31+#include <qlimitproxymodelqml.h>
32+#include <unitysortfilterproxymodelqml.h>
33+#include <relativetimeformatter.h>
34+#include <timeformatter.h>
35+#include <unitymenumodelpaths.h>
36+#include <windowkeysfilter.h>
37+#include <windowscreenshotprovider.h>
38+#include <easingcurve.h>
39+
40+static QObject *createWindowStateStorage(QQmlEngine *engine, QJSEngine *scriptEngine)
41+{
42+ Q_UNUSED(engine)
43+ Q_UNUSED(scriptEngine)
44+ return new WindowStateStorage();
45+}
46+
47+static QObject *createConstants(QQmlEngine *engine, QJSEngine *scriptEngine)
48+{
49+ Q_UNUSED(engine)
50+ Q_UNUSED(scriptEngine)
51+ return new Constants();
52+}
53+
54+void FakeUtilsPlugin::registerTypes(const char *uri)
55+{
56+ Q_ASSERT(uri == QLatin1String("Utils"));;
57+ qmlRegisterType<QAbstractItemModel>();
58+ qmlRegisterType<QLimitProxyModelQML>(uri, 0, 1, "LimitProxyModel");
59+ qmlRegisterType<UnitySortFilterProxyModelQML>(uri, 0, 1, "UnitySortFilterProxyModel");
60+ qmlRegisterType<UnityMenuModelPaths>(uri, 0, 1, "UnityMenuModelPaths");
61+ qmlRegisterType<TimeFormatter>(uri, 0, 1, "TimeFormatter");
62+ qmlRegisterType<WindowKeysFilter>(uri, 0, 1, "WindowKeysFilter");
63+ qmlRegisterType<GDateTimeFormatter>(uri, 0, 1, "GDateTimeFormatter");
64+ qmlRegisterType<EasingCurve>(uri, 0, 1, "EasingCurve");
65+ qmlRegisterType<RelativeTimeFormatter>(uri, 0, 1, "RelativeTimeFormatter");
66+ qmlRegisterSingletonType<WindowStateStorage>(uri, 0, 1, "WindowStateStorage", createWindowStateStorage);
67+ qmlRegisterType<InputWatcher>(uri, 0, 1, "InputWatcher");
68+ qmlRegisterSingletonType<Constants>(uri, 0, 1, "Constants", createConstants);
69+}
70+
71+void FakeUtilsPlugin::initializeEngine(QQmlEngine *engine, const char *uri)
72+{
73+ QQmlExtensionPlugin::initializeEngine(engine, uri);
74+
75+ engine->addImageProvider(QLatin1String("window"), new WindowScreenshotProvider);
76+}
tests/mocks/Utils/plugin.hnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2015 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+#ifndef FAKE_UTILS_PLUGIN_H
18+#define FAKE_UTILS_PLUGIN_H
19+
20+#include <QtQml/QQmlEngine>
21+#include <QtQml/QQmlExtensionPlugin>
22+
23+class FakeUtilsPlugin : public QQmlExtensionPlugin
24+{
25+ Q_OBJECT
26+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27+
28+public:
29+ void registerTypes(const char *uri);
30+ void initializeEngine(QQmlEngine *engine, const char *uri);
31+};
32+
33+#endif
tests/mocks/Utils/qmldirnew file+5
@@ -0,0 +1,5 @@
1+module Utils
2+plugin FakeUtils-qml
3+typeinfo Utils.qmltypes
4+Style 0.1 Style.js
5+HomeKeyWatcher 0.1 HomeKeyWatcher.qml
tests/mocks/Utils/windowstatestorage.cppnew file+48
@@ -0,0 +1,48 @@
1+/*
2+ * Copyright 2015 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+#include "windowstatestorage.h"
18+
19+#include <QRect>
20+
21+WindowStateStorage::WindowStateStorage(QObject *parent):
22+ QObject(parent)
23+{
24+}
25+
26+void WindowStateStorage::setGeometry(const QVariantMap& geometry)
27+{
28+ if (geometry != m_geometry) {
29+ m_geometry = geometry;
30+ Q_EMIT geometryChanged(m_geometry);
31+ }
32+}
33+
34+QVariantMap WindowStateStorage::geometry() const
35+{
36+ return m_geometry;
37+}
38+
39+void WindowStateStorage::saveGeometry(const QString &windowId, const QRect &rect)
40+{
41+ m_geometry[windowId] = rect;
42+}
43+
44+QRect WindowStateStorage::getGeometry(const QString &windowId, const QRect &defaultValue)
45+{
46+ if (!m_geometry.contains(windowId)) return defaultValue;
47+ return m_geometry.value(windowId).toRect();
48+}
tests/mocks/Utils/windowstatestorage.hnew file+38
@@ -0,0 +1,38 @@
1+/*
2+ * Copyright 2015 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+#include <QObject>
18+#include <QVariantMap>
19+
20+class WindowStateStorage: public QObject
21+{
22+ Q_OBJECT
23+ Q_PROPERTY(QVariantMap geometry READ geometry WRITE setGeometry NOTIFY geometryChanged)
24+public:
25+ WindowStateStorage(QObject *parent = 0);
26+
27+ Q_INVOKABLE void saveGeometry(const QString &windowId, const QRect &rect);
28+ Q_INVOKABLE QRect getGeometry(const QString &windowId, const QRect &defaultValue);
29+
30+Q_SIGNALS:
31+ void geometryChanged(const QVariantMap& geometry);
32+
33+private:
34+ void setGeometry(const QVariantMap& geometry);
35+ QVariantMap geometry() const;
36+
37+ QVariantMap m_geometry;
38+};
tests/mocks/Wizard/mockplugin.h+1−1
@@ -26,7 +26,7 @@ class MockWizardPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif
32#endif
tests/mocks/indicator-service/mock-indicator-service.c+76−12
@@ -27,8 +27,15 @@ typedef struct
27 guint actions_export_id;
27 guint actions_export_id;
28 guint menu_export_id;
28 guint menu_export_id;
29 int action_delay;
29 int action_delay;
30+ int change_interval;
30} IndicatorTestService;
31} IndicatorTestService;
31
32
33+typedef struct
34+{
35+ GSimpleAction *action;
36+ GVariant* value;
37+} Action;
38+
32static void
39static void
33bus_acquired (GDBusConnection *connection,
40bus_acquired (GDBusConnection *connection,
34 const gchar *name,
41 const gchar *name,
@@ -96,10 +103,10 @@ actual_switch (gpointer user_data)
96 gboolean state = g_variant_get_boolean (v);
103 gboolean state = g_variant_get_boolean (v);
97 GVariant *new_state = g_variant_new_boolean (state == TRUE ? FALSE : TRUE);
104 GVariant *new_state = g_variant_new_boolean (state == TRUE ? FALSE : TRUE);
98
105
99− g_simple_action_set_state(G_SIMPLE_ACTION(action), new_state);
106+ g_simple_action_set_state(action, new_state);
100
107
101 g_variant_unref (v);
108 g_variant_unref (v);
102− g_message ("switching");
109+ g_message ("switching %d", state);
103 return FALSE;
110 return FALSE;
104}
111}
105
112
@@ -120,13 +127,12 @@ activate_switch (GSimpleAction *action,
120static gboolean
127static gboolean
121actual_slide (gpointer user_data)
128actual_slide (gpointer user_data)
122{
129{
123− GSimpleAction *action = user_data;
130+ Action *slide_action = user_data;
124−
125− GVariant* new_state = g_object_get_qdata (G_OBJECT (action), slider_value_quark ());
126
131
127− g_simple_action_set_state(G_SIMPLE_ACTION(action), new_state);
132+ g_simple_action_set_state(G_SIMPLE_ACTION(slide_action->action), slide_action->value);
133+ g_message ("sliding %f", g_variant_get_double(slide_action->value));
134+ free(slide_action);
128
135
129− g_message ("switching");
130 return FALSE;
136 return FALSE;
131}
137}
132
138
@@ -136,10 +142,40 @@ void change_slider (GSimpleAction *action,
136{
142{
137 IndicatorTestService *indicator = user_data;
143 IndicatorTestService *indicator = user_data;
138
144
139− g_object_set_qdata (G_OBJECT (action), slider_value_quark (), g_variant_ref(value));
145+ Action* slide_action = malloc(sizeof(Action));
146+ slide_action->action = action;
147+ slide_action->value = g_variant_ref(value);
140
148
141− g_timeout_add(indicator->action_delay, actual_slide, action);
149+ g_timeout_add(indicator->action_delay, actual_slide, slide_action);
142− g_message ("slide delay %.03f", g_variant_get_double(value));
150+ g_message ("slide delay %f", g_variant_get_double(value));
151+}
152+
153+static gboolean
154+change_interval (gpointer user_data)
155+{
156+ g_message ("change interval");
157+
158+ IndicatorTestService *indicator = user_data;
159+
160+ GAction* action_switch = g_action_map_lookup_action(G_ACTION_MAP(indicator->actions), "action.switch");
161+ actual_switch(G_SIMPLE_ACTION(action_switch));
162+
163+ GAction* action_checkbox = g_action_map_lookup_action(G_ACTION_MAP(indicator->actions), "action.checkbox");
164+ actual_switch(G_SIMPLE_ACTION(action_checkbox));
165+
166+ GAction* action_accessPoint = g_action_map_lookup_action(G_ACTION_MAP(indicator->actions), "action.accessPoint");
167+ actual_switch(G_SIMPLE_ACTION(action_accessPoint));
168+
169+ GAction* action_slider = g_action_map_lookup_action(G_ACTION_MAP(indicator->actions), "action.slider");
170+ static double old_value = 0.25;
171+ double new_value = old_value == 0.25 ? 0.75 : 0.25;
172+ old_value = new_value;
173+ Action* slide_action = malloc(sizeof(Action));
174+ slide_action->action = G_SIMPLE_ACTION(action_slider);
175+ slide_action->value = g_variant_new_double(new_value);
176+ actual_slide(slide_action);
177+
178+ return TRUE;
143}
179}
144
180
145int
181int
@@ -147,6 +183,7 @@ main (int argc, char **argv)
147{
183{
148 IndicatorTestService indicator = { 0 };
184 IndicatorTestService indicator = { 0 };
149 indicator.action_delay = -1;
185 indicator.action_delay = -1;
186+ indicator.change_interval = -1;
150 GMenuItem *item;
187 GMenuItem *item;
151 GMenu *submenu;
188 GMenu *submenu;
152 GActionEntry entries[] = {
189 GActionEntry entries[] = {
@@ -191,6 +228,27 @@ main (int argc, char **argv)
191 }
228 }
192 break;
229 break;
193 }
230 }
231+
232+ case 'c':
233+ {
234+ arg += 2;
235+ if (!arg[0] && i < argc-1) {
236+ i++;
237+ int interval = -1;
238+
239+ if (sscanf(argv[i], "%d", &interval) == 1) {
240+ indicator.change_interval = interval;
241+ } else {
242+ printf("Invalid change interval value: %s\n", argv[i]);
243+ help = 1;
244+ }
245+ } else {
246+ printf("Invalid change interval value: %s\n", argv[i]);
247+ help = 1;
248+ }
249+ break;
250+ }
251+
194 case 'h':
252 case 'h':
195 help = 1;
253 help = 1;
196 break;
254 break;
@@ -201,8 +259,9 @@ main (int argc, char **argv)
201
259
202 if (help) {
260 if (help) {
203 printf("Usage: %s [<options>]\n"
261 printf("Usage: %s [<options>]\n"
204− " -t DELAY Action activation delay\n"
262+ " -t DELAY Action activation delay\n"
263+ " -c CHANGE_INTERVAL Interval to change action values\n"
205− " -h Show this help text\n"
264+ " -h Show this help text\n"
206 , argv[0]);
265 , argv[0]);
207 return 0;
266 return 0;
208 }
267 }
@@ -249,6 +308,11 @@ main (int argc, char **argv)
249 NULL);
308 NULL);
250
309
251 loop = g_main_loop_new (NULL, FALSE);
310 loop = g_main_loop_new (NULL, FALSE);
311+
312+ if (indicator.change_interval != -1) {
313+ g_timeout_add(indicator.change_interval, change_interval, &indicator);
314+ }
315+
252 g_main_loop_run (loop);
316 g_main_loop_run (loop);
253
317
254 g_object_unref (submenu);
318 g_object_unref (submenu);
tests/plugins/Dash/cardcreator/5.res+1−1
@@ -163,5 +163,5 @@ UbuntuShape {
163 radius: "medium";
163 radius: "medium";
164 borderSource: "radius_pressed.sci"
164 borderSource: "radius_pressed.sci"
165}
165}
166−implicitHeight: subtitleLabel.y + subtitleLabel.height + units.gu(1);
166+implicitHeight: artShapeHolder.height;
167}
167}
tests/plugins/Dash/horizontaljournaltest.cpp+3−3
@@ -32,19 +32,19 @@
32
32
33class WidthModel : public QAbstractListModel {
33class WidthModel : public QAbstractListModel {
34public:
34public:
35− QHash<int, QByteArray> roleNames() const
35+ QHash<int, QByteArray> roleNames() const override
36 {
36 {
37 QHash<int, QByteArray> roles;
37 QHash<int, QByteArray> roles;
38 roles.insert(Qt::DisplayRole, "modelWidth");
38 roles.insert(Qt::DisplayRole, "modelWidth");
39 return roles;
39 return roles;
40 }
40 }
41
41
42− int rowCount(const QModelIndex & /*parent*/) const
42+ int rowCount(const QModelIndex & /*parent*/) const override
43 {
43 {
44 return m_list.count();
44 return m_list.count();
45 }
45 }
46
46
47− QVariant data(const QModelIndex &index, int /*role*/) const
47+ QVariant data(const QModelIndex &index, int /*role*/) const override
48 {
48 {
49 return m_list[index.row()];
49 return m_list[index.row()];
50 }
50 }
tests/plugins/Dash/horizontaljournaltry.cpp+1−1
@@ -29,7 +29,7 @@
29class QWidthModela : public QStringListModel {
29class QWidthModela : public QStringListModel {
30 Q_OBJECT
30 Q_OBJECT
31public:
31public:
32− QHash<int, QByteArray> roleNames() const
32+ QHash<int, QByteArray> roleNames() const override
33 {
33 {
34 QHash<int, QByteArray> roles;
34 QHash<int, QByteArray> roles;
35 roles.insert(Qt::DisplayRole, "modelWidth");
35 roles.insert(Qt::DisplayRole, "modelWidth");
tests/plugins/Dash/listviewwithpageheadersectionexternalmodeltest.cpp+3−3
@@ -37,7 +37,7 @@ public:
37 list << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "H";
37 list << "A" << "B" << "C" << "D" << "E" << "F" << "G" << "H";
38 }
38 }
39
39
40− int rowCount(const QModelIndex &parent) const
40+ int rowCount(const QModelIndex &parent) const override
41 {
41 {
42 if (parent.isValid())
42 if (parent.isValid())
43 return 0;
43 return 0;
@@ -45,14 +45,14 @@ public:
45 return list.count();
45 return list.count();
46 }
46 }
47
47
48− QVariant data(const QModelIndex &index, int role) const
48+ QVariant data(const QModelIndex &index, int role) const override
49 {
49 {
50 if (role == Qt::SizeHintRole) return 50;
50 if (role == Qt::SizeHintRole) return 50;
51 else if (role == Qt::DisplayRole) return list[index.row()];
51 else if (role == Qt::DisplayRole) return list[index.row()];
52 return QVariant();
52 return QVariant();
53 }
53 }
54
54
55− QHash<int, QByteArray> roleNames() const
55+ QHash<int, QByteArray> roleNames() const override
56 {
56 {
57 QHash<int, QByteArray> hash;
57 QHash<int, QByteArray> hash;
58 hash.insert(Qt::DisplayRole, "type");
58 hash.insert(Qt::DisplayRole, "type");
tests/plugins/Dash/organicgridtest.cpp+2−2
@@ -34,12 +34,12 @@ class DummyModel : public QAbstractListModel {
34public:
34public:
35 DummyModel() : m_count(0) {}
35 DummyModel() : m_count(0) {}
36
36
37− int rowCount(const QModelIndex & /*parent*/) const
37+ int rowCount(const QModelIndex & /*parent*/) const override
38 {
38 {
39 return m_count;
39 return m_count;
40 }
40 }
41
41
42− QVariant data(const QModelIndex & /*index*/, int /*role*/) const
42+ QVariant data(const QModelIndex & /*index*/, int /*role*/) const override
43 {
43 {
44 return QVariant();
44 return QVariant();
45 }
45 }
tests/plugins/Dash/organicgridtry.cpp+2−2
@@ -31,12 +31,12 @@ class DummyModel : public QAbstractListModel {
31public:
31public:
32 DummyModel() : m_count(0) {}
32 DummyModel() : m_count(0) {}
33
33
34− int rowCount(const QModelIndex & /*parent*/) const
34+ int rowCount(const QModelIndex & /*parent*/) const override
35 {
35 {
36 return m_count;
36 return m_count;
37 }
37 }
38
38
39− QVariant data(const QModelIndex & /*index*/, int /*role*/) const
39+ QVariant data(const QModelIndex & /*index*/, int /*role*/) const override
40 {
40 {
41 return QVariant();
41 return QVariant();
42 }
42 }
tests/plugins/Dash/verticaljournaltest.cpp+3−3
@@ -32,19 +32,19 @@
32
32
33class HeightModel : public QAbstractListModel {
33class HeightModel : public QAbstractListModel {
34public:
34public:
35− QHash<int, QByteArray> roleNames() const
35+ QHash<int, QByteArray> roleNames() const override
36 {
36 {
37 QHash<int, QByteArray> roles;
37 QHash<int, QByteArray> roles;
38 roles.insert(Qt::DisplayRole, "modelHeight");
38 roles.insert(Qt::DisplayRole, "modelHeight");
39 return roles;
39 return roles;
40 }
40 }
41
41
42− int rowCount(const QModelIndex & /*parent*/) const
42+ int rowCount(const QModelIndex & /*parent*/) const override
43 {
43 {
44 return m_list.count();
44 return m_list.count();
45 }
45 }
46
46
47− QVariant data(const QModelIndex &index, int /*role*/) const
47+ QVariant data(const QModelIndex &index, int /*role*/) const override
48 {
48 {
49 return m_list[index.row()];
49 return m_list[index.row()];
50 }
50 }
tests/plugins/Dash/verticaljournaltry.cpp+1−1
@@ -29,7 +29,7 @@
29class QHeightModel : public QStringListModel {
29class QHeightModel : public QStringListModel {
30 Q_OBJECT
30 Q_OBJECT
31public:
31public:
32− QHash<int, QByteArray> roleNames() const
32+ QHash<int, QByteArray> roleNames() const override
33 {
33 {
34 QHash<int, QByteArray> roles;
34 QHash<int, QByteArray> roles;
35 roles.insert(Qt::DisplayRole, "modelHeight");
35 roles.insert(Qt::DisplayRole, "modelHeight");
tests/plugins/LightDM/CMakeLists.txt+35−16
@@ -1,8 +1,38 @@
1+add_definitions(
2+ -DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
3+ )
4+include_directories(
5+ ${CMAKE_CURRENT_BINARY_DIR}
6+ )
7+
1add_executable(GreeterDBusTestExec
8add_executable(GreeterDBusTestExec
2 dbus.cpp
9 dbus.cpp
3 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
10 ${CMAKE_SOURCE_DIR}/plugins/LightDM/Greeter.cpp
4 )
11 )
5qt5_use_modules(GreeterDBusTestExec Core DBus Quick Test)
12qt5_use_modules(GreeterDBusTestExec Core DBus Quick Test)
13+target_link_libraries(GreeterDBusTestExec
14+ -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
15+ -llightdm-qt5-2
16+ )
17+target_include_directories(GreeterDBusTestExec PUBLIC
18+ ${CMAKE_SOURCE_DIR}/plugins/LightDM
19+ ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
20+ )
21+add_binary_qml_test(GreeterDBus "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm" MockLightDM "QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks")
22+
23+add_executable(GreeterPamTestExec
24+ pam.cpp
25+ ${CMAKE_SOURCE_DIR}/plugins/LightDM/liblightdm/GreeterPrivate.cpp
26+ )
27+qt5_use_modules(GreeterPamTestExec Concurrent Core Test)
28+target_link_libraries(GreeterPamTestExec
29+ integratedLightDM
30+ )
31+target_include_directories(GreeterPamTestExec PUBLIC
32+ ${CMAKE_SOURCE_DIR}/plugins/LightDM/liblightdm
33+ )
34+add_qmltest_target(testGreeterPam "${CMAKE_CURRENT_BINARY_DIR}/GreeterPamTestExec" TRUE FALSE)
35+add_dependencies(testGreeterPam GreeterPamTestExec)
6
36
7add_executable(GreeterUsersModelTestExec
37add_executable(GreeterUsersModelTestExec
8 usersmodel.cpp
38 usersmodel.cpp
@@ -10,24 +40,13 @@ add_executable(GreeterUsersModelTestExec
10 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
40 ${CMAKE_SOURCE_DIR}/plugins/Utils/unitysortfilterproxymodelqml.cpp
11 )
41 )
12qt5_use_modules(GreeterUsersModelTestExec Core Test)
42qt5_use_modules(GreeterUsersModelTestExec Core Test)
13−
43+target_link_libraries(GreeterUsersModelTestExec
14−include_directories(
44+ -L${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm
15− ${CMAKE_CURRENT_BINARY_DIR}
45+ -llightdm-qt5-2
46+ )
47+target_include_directories(GreeterUsersModelTestExec PUBLIC
16 ${CMAKE_SOURCE_DIR}/plugins/LightDM
48 ${CMAKE_SOURCE_DIR}/plugins/LightDM
17 ${CMAKE_SOURCE_DIR}/plugins/Utils
49 ${CMAKE_SOURCE_DIR}/plugins/Utils
18 ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
50 ${CMAKE_SOURCE_DIR}/tests/mocks/LightDM
19 )
51 )
20−
21−target_link_libraries(GreeterDBusTestExec
22− MockLightDM
23− )
24−
25−target_link_libraries(GreeterUsersModelTestExec
26− MockLightDM
27− )
28−
29−add_definitions(-DCURRENT_SOURCE_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
30−
31−add_binary_qml_test(GreeterDBus "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm" MockLightDM "QML2_IMPORT_PATH=${CMAKE_BINARY_DIR}/tests/mocks")
32−
33add_binary_qml_test(GreeterUsersModel "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm" MockLightDM "LIBLIGHTDM_MOCK_MODE=full")
52add_binary_qml_test(GreeterUsersModel "${CMAKE_BINARY_DIR}/tests/mocks/LightDM/liblightdm" MockLightDM "LIBLIGHTDM_MOCK_MODE=full")
tests/plugins/LightDM/pam.cppnew file+52
@@ -0,0 +1,52 @@
1+/*
2+ * Copyright (C) 2015 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 "GreeterPrivate.h"
18+
19+#include <QtTest>
20+
21+class GreeterPamTest : public QObject
22+{
23+ Q_OBJECT
24+
25+private Q_SLOTS:
26+
27+ void init()
28+ {
29+ m_greeterpriv = new QLightDM::GreeterPrivate();
30+ }
31+
32+ void cleanup()
33+ {
34+ delete m_greeterpriv;
35+ QTRY_COMPARE(QThreadPool::globalInstance()->activeThreadCount(), 0);
36+ }
37+
38+ void testRapidFireAuthentication()
39+ {
40+ m_greeterpriv->authenticationUser = qgetenv("USER");
41+ for (int i = 0; i < 100; i++) {
42+ m_greeterpriv->handleAuthenticate();
43+ }
44+ }
45+
46+private:
47+ QLightDM::GreeterPrivate *m_greeterpriv;
48+};
49+
50+QTEST_GUILESS_MAIN(GreeterPamTest)
51+
52+#include "pam.moc"
tests/plugins/Ubuntu/Gestures/CMakeLists.txt+2−1
@@ -22,7 +22,7 @@ add_definitions(-DUBUNTU_GESTURES_PLUGIN_DIR="${CMAKE_BINARY_DIR}/plugins")
22add_definitions(-DTESTS_UTILS_MODULES_DIR="${CMAKE_BINARY_DIR}/tests/utils/modules")
22add_definitions(-DTESTS_UTILS_MODULES_DIR="${CMAKE_BINARY_DIR}/tests/utils/modules")
23
23
24macro(add_gesture_ui_test CLASSNAME)
24macro(add_gesture_ui_test CLASSNAME)
25− add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp)
25+ add_executable(${CLASSNAME}TestExec tst_${CLASSNAME}.cpp GestureTest.cpp TestItem.cpp)
26 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
26 qt5_use_modules(${CLASSNAME}TestExec Test Core Qml Gui Quick)
27 target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml UbuntuGestures)
27 target_link_libraries(${CLASSNAME}TestExec UbuntuGesturesQml UbuntuGestures)
28
28
@@ -46,6 +46,7 @@ macro(add_gesture_test CLASSNAME)
46endmacro(add_gesture_test)
46endmacro(add_gesture_test)
47
47
48add_gesture_ui_test(DirectionalDragArea)
48add_gesture_ui_test(DirectionalDragArea)
49+add_gesture_ui_test(FloatingFlickable)
49add_gesture_ui_test(PressedOutsideNotifier)
50add_gesture_ui_test(PressedOutsideNotifier)
50add_gesture_ui_test(TouchDispatcher)
51add_gesture_ui_test(TouchDispatcher)
51add_gesture_ui_test(TouchGate)
52add_gesture_ui_test(TouchGate)
tests/plugins/Ubuntu/Gestures/GestureTest.cpp+2−1
@@ -53,7 +53,8 @@ void GestureTest::init()
53
53
54 m_fakeTimerFactory = new FakeTimerFactory;
54 m_fakeTimerFactory = new FakeTimerFactory;
55
55
56− m_touchRegistry = new TouchRegistry(nullptr, m_fakeTimerFactory);
56+ m_touchRegistry = TouchRegistry::instance();
57+ m_touchRegistry->setTimerFactory(m_fakeTimerFactory);
57 m_view->installEventFilter(m_touchRegistry);
58 m_view->installEventFilter(m_touchRegistry);
58
59
59 qApp->processEvents();
60 qApp->processEvents();
tests/plugins/Ubuntu/Gestures/TestItem.cppnew file+30
@@ -0,0 +1,30 @@
1+/*
2+ * Copyright (C) 2015 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 "TestItem.h"
18+
19+#include <QTouchEvent>
20+
21+void TestItem::touchEvent(QTouchEvent *event)
22+{
23+ QTouchEvent *clonedEvent = new QTouchEvent(event->type(),
24+ event->device(),
25+ event->modifiers(),
26+ event->touchPointStates(),
27+ event->touchPoints());
28+
29+ touchEventsReceived.append(QSharedPointer<QTouchEvent>(clonedEvent));
30+}
tests/plugins/Ubuntu/Gestures/TestItem.hnew file+33
@@ -0,0 +1,33 @@
1+/*
2+ * Copyright (C) 2015 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 UBUNTUGESTURES_TEST_ITEM_H
18+#define UBUNTUGESTURES_TEST_ITEM_H
19+
20+#include <QQuickItem>
21+
22+class TestItem : public QQuickItem
23+{
24+ Q_OBJECT
25+
26+public:
27+ QList<QSharedPointer<QTouchEvent>> touchEventsReceived;
28+
29+protected:
30+ void touchEvent(QTouchEvent *event) override;
31+};
32+
33+#endif // UBUNTUGESTURES_TEST_ITEM_H
tests/plugins/Ubuntu/Gestures/tst_AxisVelocityCalculator.cpp+1−1
@@ -24,7 +24,7 @@ class FakeTimeSource : public UbuntuGestures::TimeSource {
24public:
24public:
25 FakeTimeSource() : m_value(0) {}
25 FakeTimeSource() : m_value(0) {}
26
26
27− virtual qint64 msecsSinceReference() {
27+ qint64 msecsSinceReference() override {
28 return m_value;
28 return m_value;
29 }
29 }
30
30
tests/plugins/Ubuntu/Gestures/tst_DirectionalDragArea.cpp+21−21
@@ -84,7 +84,7 @@ class tst_DirectionalDragArea: public GestureTest
84public:
84public:
85 tst_DirectionalDragArea();
85 tst_DirectionalDragArea();
86private Q_SLOTS:
86private Q_SLOTS:
87− void init(); // called right before each and every test function is executed
87+ void init() override; // called right before each and every test function is executed
88
88
89 void dragWithShortDirectionChange();
89 void dragWithShortDirectionChange();
90 void recognitionTimerUsage();
90 void recognitionTimerUsage();
@@ -202,7 +202,7 @@ void tst_DirectionalDragArea::dragWithShortDirectionChange()
202 DirectionalDragArea *edgeDragArea =
202 DirectionalDragArea *edgeDragArea =
203 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
203 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
204 QVERIFY(edgeDragArea != 0);
204 QVERIFY(edgeDragArea != 0);
205− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
205+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
206 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
206 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
207
207
208 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
208 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
@@ -297,7 +297,7 @@ void tst_DirectionalDragArea::sceneXAndX()
297 DirectionalDragArea *edgeDragArea =
297 DirectionalDragArea *edgeDragArea =
298 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
298 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
299 QVERIFY(edgeDragArea != 0);
299 QVERIFY(edgeDragArea != 0);
300− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
300+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
301 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
301 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
302 edgeDragArea->setImmediateRecognition(true);
302 edgeDragArea->setImmediateRecognition(true);
303
303
@@ -326,7 +326,7 @@ void tst_DirectionalDragArea::sceneYAndY()
326 DirectionalDragArea *edgeDragArea =
326 DirectionalDragArea *edgeDragArea =
327 m_view->rootObject()->findChild<DirectionalDragArea*>("vnDragArea");
327 m_view->rootObject()->findChild<DirectionalDragArea*>("vnDragArea");
328 QVERIFY(edgeDragArea != 0);
328 QVERIFY(edgeDragArea != 0);
329− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
329+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
330 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
330 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
331 edgeDragArea->setImmediateRecognition(true);
331 edgeDragArea->setImmediateRecognition(true);
332
332
@@ -357,7 +357,7 @@ void tst_DirectionalDragArea::twoFingerTap()
357 DirectionalDragArea *edgeDragArea =
357 DirectionalDragArea *edgeDragArea =
358 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
358 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
359 QVERIFY(edgeDragArea != 0);
359 QVERIFY(edgeDragArea != 0);
360− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
360+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
361 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
361 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
362
362
363 // Make touches evenly spaced along the edgeDragArea
363 // Make touches evenly spaced along the edgeDragArea
@@ -439,7 +439,7 @@ void tst_DirectionalDragArea::movingDDA()
439 DirectionalDragArea *edgeDragArea =
439 DirectionalDragArea *edgeDragArea =
440 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
440 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
441 Q_ASSERT(edgeDragArea != 0);
441 Q_ASSERT(edgeDragArea != 0);
442− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
442+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
443 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
443 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
444
444
445 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
445 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
@@ -479,7 +479,7 @@ void tst_DirectionalDragArea::ignoreOldFinger()
479 DirectionalDragArea *edgeDragArea =
479 DirectionalDragArea *edgeDragArea =
480 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
480 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
481 Q_ASSERT(edgeDragArea != 0);
481 Q_ASSERT(edgeDragArea != 0);
482− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
482+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
483 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
483 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
484
484
485 // Make touches evenly spaced along the edgeDragArea
485 // Make touches evenly spaced along the edgeDragArea
@@ -542,7 +542,7 @@ void tst_DirectionalDragArea::rotated()
542 DirectionalDragArea *edgeDragArea =
542 DirectionalDragArea *edgeDragArea =
543 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
543 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
544 Q_ASSERT(edgeDragArea != 0);
544 Q_ASSERT(edgeDragArea != 0);
545− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
545+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
546 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
546 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
547
547
548 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
548 QPointF initialTouchPos = calculateInitialTouchPos(edgeDragArea);
@@ -582,7 +582,7 @@ void tst_DirectionalDragArea::sceneDistance()
582 DirectionalDragArea *edgeDragArea =
582 DirectionalDragArea *edgeDragArea =
583 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
583 rightwardsLauncher->findChild<DirectionalDragArea*>("hpDragArea");
584 Q_ASSERT(edgeDragArea != 0);
584 Q_ASSERT(edgeDragArea != 0);
585− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
585+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
586 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
586 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
587
587
588 // to disable the position smoothing so that we can more easily check sceneDistance values
588 // to disable the position smoothing so that we can more easily check sceneDistance values
@@ -640,7 +640,7 @@ void tst_DirectionalDragArea::disabledWhileDragging()
640 DirectionalDragArea *edgeDragArea =
640 DirectionalDragArea *edgeDragArea =
641 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
641 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
642 Q_ASSERT(edgeDragArea != 0);
642 Q_ASSERT(edgeDragArea != 0);
643− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
643+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
644 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
644 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
645
645
646 QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
646 QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
@@ -678,7 +678,7 @@ void tst_DirectionalDragArea::oneFingerDownFollowedByLateSecondFingerDown()
678 DirectionalDragArea *edgeDragArea =
678 DirectionalDragArea *edgeDragArea =
679 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
679 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
680 Q_ASSERT(edgeDragArea != 0);
680 Q_ASSERT(edgeDragArea != 0);
681− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
681+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
682 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
682 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
683
683
684 // Disable some constraints we're not interested in
684 // Disable some constraints we're not interested in
@@ -753,7 +753,7 @@ void tst_DirectionalDragArea::givesUpWhenLosesTouch()
753 DirectionalDragArea *edgeDragArea =
753 DirectionalDragArea *edgeDragArea =
754 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
754 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
755 Q_ASSERT(edgeDragArea != 0);
755 Q_ASSERT(edgeDragArea != 0);
756− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
756+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
757 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
757 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
758
758
759 // Disable some constraints we're not interested in
759 // Disable some constraints we're not interested in
@@ -798,7 +798,7 @@ void tst_DirectionalDragArea::threeFingerDrag()
798 DirectionalDragArea *edgeDragArea =
798 DirectionalDragArea *edgeDragArea =
799 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
799 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
800 Q_ASSERT(edgeDragArea != 0);
800 Q_ASSERT(edgeDragArea != 0);
801− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
801+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
802 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
802 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
803
803
804 // Disable some constraints we're not interested in
804 // Disable some constraints we're not interested in
@@ -867,7 +867,7 @@ void tst_DirectionalDragArea::immediateRecognitionWhenConstraintsDisabled()
867 DirectionalDragArea *edgeDragArea =
867 DirectionalDragArea *edgeDragArea =
868 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
868 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
869 Q_ASSERT(edgeDragArea != 0);
869 Q_ASSERT(edgeDragArea != 0);
870− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
870+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
871 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
871 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
872
872
873 // Disable the minimum amount of constraints to ensure immediate recognition
873 // Disable the minimum amount of constraints to ensure immediate recognition
@@ -900,7 +900,7 @@ void tst_DirectionalDragArea::withdrawTouchOwnershipCandidacyIfDisabledDuringRec
900 DirectionalDragArea *edgeDragArea =
900 DirectionalDragArea *edgeDragArea =
901 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
901 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
902 Q_ASSERT(edgeDragArea != 0);
902 Q_ASSERT(edgeDragArea != 0);
903− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
903+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
904 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
904 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
905
905
906 QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
906 QPointF touchPoint = calculateInitialTouchPos(edgeDragArea);
@@ -964,7 +964,7 @@ void tst_DirectionalDragArea::gettingTouchOwnershipMakesMouseAreaBehindGetCancel
964 DirectionalDragArea *edgeDragArea =
964 DirectionalDragArea *edgeDragArea =
965 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
965 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
966 QVERIFY(edgeDragArea != nullptr);
966 QVERIFY(edgeDragArea != nullptr);
967− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
967+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
968 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
968 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
969
969
970 QQuickMouseArea *mouseArea =
970 QQuickMouseArea *mouseArea =
@@ -1014,7 +1014,7 @@ void tst_DirectionalDragArea::interleavedTouches()
1014 DirectionalDragArea *edgeDragArea =
1014 DirectionalDragArea *edgeDragArea =
1015 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1015 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1016 QVERIFY(edgeDragArea != 0);
1016 QVERIFY(edgeDragArea != 0);
1017− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
1017+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1018 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1018 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1019
1019
1020 QPointF touch0 = edgeDragArea->mapToScene(
1020 QPointF touch0 = edgeDragArea->mapToScene(
@@ -1109,7 +1109,7 @@ void tst_DirectionalDragArea::makoRightEdgeDrag()
1109 DirectionalDragArea *edgeDragArea =
1109 DirectionalDragArea *edgeDragArea =
1110 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
1110 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
1111 QVERIFY(edgeDragArea != nullptr);
1111 QVERIFY(edgeDragArea != nullptr);
1112− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
1112+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1113 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1113 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1114
1114
1115 StatusSpy *statusSpy = new StatusSpy(edgeDragArea);
1115 StatusSpy *statusSpy = new StatusSpy(edgeDragArea);
@@ -1154,7 +1154,7 @@ void tst_DirectionalDragArea::makoRightEdgeDrag_verticalDownwards()
1154 DirectionalDragArea *edgeDragArea =
1154 DirectionalDragArea *edgeDragArea =
1155 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
1155 m_view->rootObject()->findChild<DirectionalDragArea*>("hnDragArea");
1156 QVERIFY(edgeDragArea != nullptr);
1156 QVERIFY(edgeDragArea != nullptr);
1157− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
1157+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1158 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1158 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1159
1159
1160 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1160 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
@@ -1198,7 +1198,7 @@ void tst_DirectionalDragArea::makoLeftEdgeDrag_slowStart()
1198 DirectionalDragArea *edgeDragArea =
1198 DirectionalDragArea *edgeDragArea =
1199 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1199 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1200 QVERIFY(edgeDragArea != nullptr);
1200 QVERIFY(edgeDragArea != nullptr);
1201− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
1201+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1202 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1202 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1203
1203
1204 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1204 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
@@ -1262,7 +1262,7 @@ void tst_DirectionalDragArea::makoLeftEdgeDrag_movesSlightlyBackwardsOnStart()
1262 DirectionalDragArea *edgeDragArea =
1262 DirectionalDragArea *edgeDragArea =
1263 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1263 m_view->rootObject()->findChild<DirectionalDragArea*>("hpDragArea");
1264 QVERIFY(edgeDragArea != nullptr);
1264 QVERIFY(edgeDragArea != nullptr);
1265− edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer());
1265+ edgeDragArea->d->setRecognitionTimer(m_fakeTimerFactory->createTimer(edgeDragArea));
1266 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1266 edgeDragArea->d->setTimeSource(m_fakeTimerFactory->timeSource());
1267
1267
1268 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
1268 edgeDragArea->d->setPixelsPerMm(320.0 /*mako ppi*/ * 0.03937 /* inches per mm*/);
tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.cppnew file+122
@@ -0,0 +1,122 @@
1+/*
2+ * Copyright (C) 2015 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 <QtTest>
18+#include <QQuickView>
19+
20+// Ubuntu.Gestures plugin
21+#include <DirectionalDragArea.h>
22+#include <FloatingFlickable.h>
23+
24+#include "GestureTest.h"
25+#include "TestItem.h"
26+
27+using namespace UbuntuGestures;
28+
29+class tst_FloatingFlickable: public GestureTest
30+{
31+ Q_OBJECT
32+public:
33+ tst_FloatingFlickable();
34+private Q_SLOTS:
35+ void tapGoesThrough();
36+ void flickChangesContentX();
37+ void flickChangesContentY();
38+};
39+
40+tst_FloatingFlickable::tst_FloatingFlickable()
41+ : GestureTest(QStringLiteral("tst_FloatingFlickable.qml"))
42+{
43+}
44+
45+void tst_FloatingFlickable::tapGoesThrough()
46+{
47+ FloatingFlickable *floatingFlickable =
48+ m_view->rootObject()->findChild<FloatingFlickable*>("floatingFlickable");
49+ QVERIFY(floatingFlickable != nullptr);
50+
51+ TestItem *testItem = new TestItem;
52+ testItem->setWidth(floatingFlickable->width());
53+ testItem->setHeight(floatingFlickable->height());
54+ testItem->setParentItem(m_view->rootObject());
55+ testItem->setZ(1.0);
56+
57+ floatingFlickable->setZ(2.0);
58+
59+ QTest::touchEvent(m_view, m_device)
60+ .press(0, QPoint(floatingFlickable->width()/2, floatingFlickable->height()/2));
61+
62+ QCOMPARE(testItem->touchEventsReceived.count(), 1);
63+}
64+
65+void tst_FloatingFlickable::flickChangesContentX()
66+{
67+ FloatingFlickable *floatingFlickable =
68+ m_view->rootObject()->findChild<FloatingFlickable*>("floatingFlickable");
69+ QVERIFY(floatingFlickable != nullptr);
70+
71+ floatingFlickable->m_dragArea->removeTimeConstraints();
72+
73+ qreal startContentX = floatingFlickable->contentX();
74+
75+ QPoint startPos(floatingFlickable->width() - 5, 10);
76+ int stepCount = 20;
77+ int step = (startPos.x() - 5) / stepCount;
78+
79+ QTest::touchEvent(m_view, m_device).press(0, startPos);
80+ for (int i = 0; i < stepCount; ++i) {
81+ QTest::qWait(10);
82+ QPoint touchPos = startPos - QPoint(step*i, 0);
83+ QTest::touchEvent(m_view, m_device).move(0, touchPos);
84+ }
85+
86+ QTest::qWait(10);
87+ QTest::touchEvent(m_view, m_device).release(0, QPoint(5, 10));
88+
89+ QVERIFY(floatingFlickable->contentX() > (startContentX + floatingFlickable->width()/2));
90+}
91+
92+void tst_FloatingFlickable::flickChangesContentY()
93+{
94+ FloatingFlickable *floatingFlickable =
95+ m_view->rootObject()->findChild<FloatingFlickable*>("floatingFlickable");
96+ QVERIFY(floatingFlickable != nullptr);
97+
98+ floatingFlickable->setDirection(Direction::Vertical);
99+ floatingFlickable->m_dragArea->removeTimeConstraints();
100+
101+ qreal startContentY = floatingFlickable->contentY();
102+
103+ QPoint startPos(10, floatingFlickable->height() - 5);
104+ int stepCount = 20;
105+ int step = (startPos.y() - 5) / stepCount;
106+
107+ QTest::touchEvent(m_view, m_device).press(0, startPos);
108+ for (int i = 0; i < stepCount; ++i) {
109+ QTest::qWait(10);
110+ QPoint touchPos = startPos - QPoint(0, step*i);
111+ QTest::touchEvent(m_view, m_device).move(0, touchPos);
112+ }
113+
114+ QTest::qWait(10);
115+ QTest::touchEvent(m_view, m_device).release(0, QPoint(10, 5));
116+
117+ QVERIFY(floatingFlickable->contentY() > (startContentY + floatingFlickable->height()/2));
118+}
119+
120+QTEST_MAIN(tst_FloatingFlickable)
121+
122+#include "tst_FloatingFlickable.moc"
tests/plugins/Ubuntu/Gestures/tst_FloatingFlickable.qmlnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright (C) 2015 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.Test 0.1
21+
22+Rectangle {
23+ id: root
24+ width: units.gu(60)
25+ height: units.gu(60)
26+ color: "white"
27+
28+ Binding {
29+ target: MouseTouchAdaptor
30+ property: "enabled"
31+ value: true
32+ }
33+
34+ Grid {
35+ id: colorGrid
36+ readonly property bool horizontal: floatingFlickable.direction === Direction.Horizontal
37+ x: horizontal ? -floatingFlickable.contentX : 0
38+ y: horizontal ? 0 : -floatingFlickable.contentY
39+ rows: horizontal ? 1 : 100
40+ columns: horizontal ? 100 : 1
41+ Repeater {
42+ model: 100
43+ Rectangle {
44+ width: colorGrid.horizontal ? units.gu(12) : root.width
45+ height: colorGrid.horizontal ? root.height : units.gu(12)
46+ color: mouseArea.pressed ? "red"
47+ : Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
48+ MouseArea {
49+ id: mouseArea
50+ anchors.fill: parent
51+ }
52+ }
53+ }
54+ }
55+
56+ FloatingFlickable {
57+ id: floatingFlickable
58+ objectName: "floatingFlickable"
59+ anchors.fill: parent
60+ contentWidth: colorGrid.width
61+ contentHeight: colorGrid.height
62+ }
63+
64+ Button {
65+ anchors.bottom: parent.bottom
66+ anchors.right: parent.right
67+ anchors.margins: units.gu(1)
68+
69+ text: floatingFlickable.direction === Direction.Horizontal ? "Horizontal" : "Vertical"
70+ activeFocusOnPress: false
71+
72+ onClicked: {
73+ if (floatingFlickable.direction === Direction.Horizontal) {
74+ floatingFlickable.direction = Direction.Vertical;
75+ } else {
76+ floatingFlickable.direction = Direction.Horizontal;
77+ }
78+ }
79+ }
80+}
tests/plugins/Ubuntu/Gestures/tst_PressedOutsideNotifier.cpp+1−1
@@ -28,7 +28,7 @@ class tst_PressedOutsideNotifier: public GestureTest
28public:
28public:
29 tst_PressedOutsideNotifier();
29 tst_PressedOutsideNotifier();
30private Q_SLOTS:
30private Q_SLOTS:
31− void init(); // called right before each and every test function is executed
31+ void init() override; // called right before each and every test function is executed
32
32
33 void touchOutsideAreaTriggersSignal();
33 void touchOutsideAreaTriggersSignal();
34 void touchInsideAreaHasNoEffect();
34 void touchInsideAreaHasNoEffect();
tests/plugins/Ubuntu/Gestures/tst_TouchGate.cpp+2−25
@@ -29,16 +29,7 @@
29#include <TouchGate.h>
29#include <TouchGate.h>
30#include <TouchRegistry.h>
30#include <TouchRegistry.h>
31
31
32−class TestItem : public QQuickItem
32+#include "TestItem.h"
33−{
34− Q_OBJECT
35−
36−public:
37− QList<QSharedPointer<QTouchEvent>> touchEventsReceived;
38−
39−protected:
40− void touchEvent(QTouchEvent *event) override;
41−};
42
33
43class CandidateItem : public QQuickItem
34class CandidateItem : public QQuickItem
44{
35{
@@ -104,10 +95,9 @@ void tst_TouchGate::cleanupTestCase()
104
95
105void tst_TouchGate::init()
96void tst_TouchGate::init()
106{
97{
107− touchRegistry = new TouchRegistry;
98+ touchRegistry = TouchRegistry::instance();
108
99
109 view = createView();
100 view = createView();
110− view->installEventFilter(touchRegistry);
111 view->setSource(QUrl::fromLocalFile("touchGateExample.qml"));
101 view->setSource(QUrl::fromLocalFile("touchGateExample.qml"));
112 view->show();
102 view->show();
113 QVERIFY(QTest::qWaitForWindowExposed(view));
103 QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -381,19 +371,6 @@ void tst_TouchGate::disabledWhileHoldingTouch()
381 }
371 }
382}
372}
383
373
384−///////////// TestItem /////////////////////////////////////////////////////////////
385−
386−void TestItem::touchEvent(QTouchEvent *event)
387−{
388− QTouchEvent *clonedEvent = new QTouchEvent(event->type(),
389− event->device(),
390− event->modifiers(),
391− event->touchPointStates(),
392− event->touchPoints());
393−
394− touchEventsReceived.append(QSharedPointer<QTouchEvent>(clonedEvent));
395−}
396−
397///////////// CandidateItem /////////////////////////////////////////////////////////////
374///////////// CandidateItem /////////////////////////////////////////////////////////////
398
375
399void CandidateItem::touchEvent(QTouchEvent *event)
376void CandidateItem::touchEvent(QTouchEvent *event)
tests/plugins/Unity/Indicators/menucontentactivatortest.cpp+2−2
@@ -30,8 +30,8 @@ public:
30 : UnityIndicators::AbstractTimer(parent)
30 : UnityIndicators::AbstractTimer(parent)
31 {}
31 {}
32
32
33− virtual int interval() const { return m_duration; }
33+ int interval() const override { return m_duration; }
34− virtual void setInterval(int msecs) { m_duration = msecs; }
34+ void setInterval(int msecs) override { m_duration = msecs; }
35
35
36 void emitTimeout() {
36 void emitTimeout() {
37 if (isRunning()) {
37 if (isRunning()) {
tests/plugins/Unity/Launcher/CMakeLists.txt−1
@@ -2,7 +2,6 @@ pkg_check_modules(GSETTINGS_QT REQUIRED gsettings-qt)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=6)
2pkg_check_modules(LAUNCHER_API REQUIRED unity-shell-launcher=6)
3
3
4include_directories(
4include_directories(
5− ${APPLICATION_API_INCLUDE_DIRS}
6 ${CMAKE_CURRENT_SOURCE_DIR}
5 ${CMAKE_CURRENT_SOURCE_DIR}
7 ${CMAKE_CURRENT_BINARY_DIR}
6 ${CMAKE_CURRENT_BINARY_DIR}
8 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher
7 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher
tests/plugins/Unity/Launcher/launchermodeltest.cpp+21−21
@@ -39,13 +39,13 @@ class MockApp: public unity::shell::application::ApplicationInfoInterface
39 Q_OBJECT
39 Q_OBJECT
40public:
40public:
41 MockApp(const QString &appId, QObject *parent = 0): ApplicationInfoInterface(appId, parent), m_appId(appId), m_focused(false) { }
41 MockApp(const QString &appId, QObject *parent = 0): ApplicationInfoInterface(appId, parent), m_appId(appId), m_focused(false) { }
42− QString appId() const { return m_appId; }
42+ QString appId() const override { return m_appId; }
43− QString name() const { return "mock"; }
43+ QString name() const override { return "mock"; }
44− QString comment() const { return "this is a mock"; }
44+ QString comment() const override { return "this is a mock"; }
45− QUrl icon() const { return QUrl(); }
45+ QUrl icon() const override { return QUrl(); }
46− ApplicationInfoInterface::Stage stage() const { return ApplicationInfoInterface::MainStage; }
46+ ApplicationInfoInterface::Stage stage() const override { return ApplicationInfoInterface::MainStage; }
47− ApplicationInfoInterface::State state() const { return ApplicationInfoInterface::Running; }
47+ ApplicationInfoInterface::State state() const override { return ApplicationInfoInterface::Running; }
48− bool focused() const { return m_focused; }
48+ bool focused() const override { return m_focused; }
49 QString splashTitle() const override { return QString(); }
49 QString splashTitle() const override { return QString(); }
50 QUrl splashImage() const override { return QUrl(); }
50 QUrl splashImage() const override { return QUrl(); }
51 bool splashShowHeader() const override { return true; }
51 bool splashShowHeader() const override { return true; }
@@ -68,16 +68,16 @@ class MockAppManager: public unity::shell::application::ApplicationManagerInterf
68 Q_OBJECT
68 Q_OBJECT
69public:
69public:
70 MockAppManager(QObject *parent = 0): ApplicationManagerInterface(parent) {}
70 MockAppManager(QObject *parent = 0): ApplicationManagerInterface(parent) {}
71− int rowCount(const QModelIndex &) const { return m_list.count(); }
71+ int rowCount(const QModelIndex &) const override { return m_list.count(); }
72− QVariant data(const QModelIndex &, int ) const { return QVariant(); }
72+ QVariant data(const QModelIndex &, int ) const override { return QVariant(); }
73− QString focusedApplicationId() const {
73+ QString focusedApplicationId() const override {
74 Q_FOREACH(MockApp *app, m_list) {
74 Q_FOREACH(MockApp *app, m_list) {
75 if (app->focused()) return app->appId();
75 if (app->focused()) return app->appId();
76 }
76 }
77 return QString();
77 return QString();
78 }
78 }
79− unity::shell::application::ApplicationInfoInterface *get(int index) const { return m_list.at(index); }
79+ unity::shell::application::ApplicationInfoInterface *get(int index) const override { return m_list.at(index); }
80− unity::shell::application::ApplicationInfoInterface *findApplication(const QString &appId) const {
80+ unity::shell::application::ApplicationInfoInterface *findApplication(const QString &appId) const override {
81 Q_FOREACH(MockApp* app, m_list) {
81 Q_FOREACH(MockApp* app, m_list) {
82 if (app->appId() == appId) {
82 if (app->appId() == appId) {
83 return app;
83 return app;
@@ -85,8 +85,8 @@ public:
85 }
85 }
86 return nullptr;
86 return nullptr;
87 }
87 }
88− unity::shell::application::ApplicationInfoInterface *startApplication(const QString &, const QStringList &) { return nullptr; }
88+ unity::shell::application::ApplicationInfoInterface *startApplication(const QString &, const QStringList &) override { return nullptr; }
89− bool stopApplication(const QString &appId) {
89+ bool stopApplication(const QString &appId) override {
90 Q_FOREACH(MockApp* app, m_list) {
90 Q_FOREACH(MockApp* app, m_list) {
91 if (app->appId() == appId) {
91 if (app->appId() == appId) {
92 removeApplication(m_list.indexOf(app));
92 removeApplication(m_list.indexOf(app));
@@ -95,7 +95,7 @@ public:
95 }
95 }
96 return false;
96 return false;
97 }
97 }
98− bool focusApplication(const QString &appId) {
98+ bool focusApplication(const QString &appId) override {
99 Q_FOREACH(MockApp* app, m_list) {
99 Q_FOREACH(MockApp* app, m_list) {
100 app->setFocused(app->appId() == appId);
100 app->setFocused(app->appId() == appId);
101 }
101 }
@@ -103,7 +103,7 @@ public:
103 return true;
103 return true;
104 }
104 }
105
105
106− void unfocusCurrentApplication() { }
106+ void unfocusCurrentApplication() override { }
107
107
108 void addApplication(MockApp *app) {
108 void addApplication(MockApp *app) {
109 beginInsertRows(QModelIndex(), count(), count());
109 beginInsertRows(QModelIndex(), count(), count());
@@ -115,11 +115,11 @@ public:
115 m_list.takeAt(index)->deleteLater();
115 m_list.takeAt(index)->deleteLater();
116 endRemoveRows();
116 endRemoveRows();
117 }
117 }
118− bool requestFocusApplication(const QString &appId) { Q_UNUSED(appId); return true; }
118+ bool requestFocusApplication(const QString &appId) override { Q_UNUSED(appId); return true; }
119− bool suspended() const { return false; }
119+ bool suspended() const override { return false; }
120− void setSuspended(bool) {}
120+ void setSuspended(bool) override {}
121− bool forceDashActive() const { return false; }
121+ bool forceDashActive() const override { return false; }
122− void setForceDashActive(bool) {}
122+ void setForceDashActive(bool) override {}
123
123
124private:
124private:
125 QList<MockApp*> m_list;
125 QList<MockApp*> m_list;
tests/plugins/Utils/qlimitproxymodeltest.cpp+5−5
@@ -36,12 +36,12 @@ public:
36 {
36 {
37 }
37 }
38
38
39− int rowCount(const QModelIndex& /* parent */ = QModelIndex()) const
39+ int rowCount(const QModelIndex& /* parent */ = QModelIndex()) const override
40 {
40 {
41 return m_list.size();
41 return m_list.size();
42 }
42 }
43
43
44− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
44+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override
45 {
45 {
46 if (!index.isValid() || index.row() < 0 || index.row() >= m_list.size() || role != Qt::DisplayRole) {
46 if (!index.isValid() || index.row() < 0 || index.row() >= m_list.size() || role != Qt::DisplayRole) {
47 return QVariant();
47 return QVariant();
@@ -49,7 +49,7 @@ public:
49 return QVariant(m_list[index.row()]);
49 return QVariant(m_list[index.row()]);
50 }
50 }
51
51
52− QHash<int, QByteArray> roleNames() const
52+ QHash<int, QByteArray> roleNames() const override
53 {
53 {
54 return m_roles;
54 return m_roles;
55 }
55 }
@@ -65,7 +65,7 @@ public:
65 endRemoveRows();
65 endRemoveRows();
66 }
66 }
67
67
68− bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) {
68+ bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) override {
69 beginInsertRows(parent, row, row+count-1);
69 beginInsertRows(parent, row, row+count-1);
70 for (int i=0; i<count; i++) {
70 for (int i=0; i<count; i++) {
71 m_list.insert(i+row, QString::number(i));
71 m_list.insert(i+row, QString::number(i));
@@ -81,7 +81,7 @@ public:
81 return true;
81 return true;
82 }
82 }
83
83
84− bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) {
84+ bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override {
85 beginRemoveRows(parent, row, row+count-1);
85 beginRemoveRows(parent, row, row+count-1);
86 for (int i=0; i<count; i++) {
86 for (int i=0; i<count; i++) {
87 m_list.removeAt(row);
87 m_list.removeAt(row);
tests/plugins/Utils/unitysortfilterproxymodeltest.cpp+5−5
@@ -39,12 +39,12 @@ public:
39 {
39 {
40 }
40 }
41
41
42− int rowCount(const QModelIndex& /* parent */ = QModelIndex()) const
42+ int rowCount(const QModelIndex& /* parent */ = QModelIndex()) const override
43 {
43 {
44 return m_list.size();
44 return m_list.size();
45 }
45 }
46
46
47− QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const
47+ QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override
48 {
48 {
49 if (!index.isValid() || index.row() < 0 || index.row() >= m_list.size() || role != Qt::DisplayRole) {
49 if (!index.isValid() || index.row() < 0 || index.row() >= m_list.size() || role != Qt::DisplayRole) {
50 return QVariant();
50 return QVariant();
@@ -52,7 +52,7 @@ public:
52 return QVariant(m_list[index.row()]);
52 return QVariant(m_list[index.row()]);
53 }
53 }
54
54
55− QHash<int, QByteArray> roleNames() const
55+ QHash<int, QByteArray> roleNames() const override
56 {
56 {
57 return m_roles;
57 return m_roles;
58 }
58 }
@@ -61,7 +61,7 @@ public:
61 m_roles = roles;
61 m_roles = roles;
62 }
62 }
63
63
64− bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) {
64+ bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex()) override {
65 beginInsertRows(parent, row, row+count-1);
65 beginInsertRows(parent, row, row+count-1);
66 for (int i=0; i<count; i++) {
66 for (int i=0; i<count; i++) {
67 m_list.insert(i+row, QString("test%1").arg(i));
67 m_list.insert(i+row, QString("test%1").arg(i));
@@ -77,7 +77,7 @@ public:
77 return true;
77 return true;
78 }
78 }
79
79
80− bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) {
80+ bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex()) override {
81 beginRemoveRows(parent, row, row+count-1);
81 beginRemoveRows(parent, row, row+count-1);
82 for (int i=0; i<count; i++) {
82 for (int i=0; i<count; i++) {
83 m_list.removeAt(row);
83 m_list.removeAt(row);
tests/qmltests/CMakeLists.txt+1
@@ -50,6 +50,7 @@ add_qml_test(Dash/Previews PreviewImageGallery)
50add_qml_test(Dash/Previews PreviewPayments)
50add_qml_test(Dash/Previews PreviewPayments)
51add_qml_test(Dash/Previews PreviewProgress)
51add_qml_test(Dash/Previews PreviewProgress)
52add_qml_test(Dash/Previews PreviewRatingDisplay)
52add_qml_test(Dash/Previews PreviewRatingDisplay)
53+add_qml_test(Dash/Previews PreviewRatingEdit)
53add_qml_test(Dash/Previews PreviewRatingInput)
54add_qml_test(Dash/Previews PreviewRatingInput)
54add_qml_test(Dash/Previews PreviewTable)
55add_qml_test(Dash/Previews PreviewTable)
55add_qml_test(Dash/Previews PreviewTextSummary)
56add_qml_test(Dash/Previews PreviewTextSummary)
tests/qmltests/Components/tst_DragHandle.cpp−8
@@ -26,7 +26,6 @@
26#include <DirectionalDragArea.h>
26#include <DirectionalDragArea.h>
27#include <DirectionalDragArea_p.h>
27#include <DirectionalDragArea_p.h>
28#include <Timer.h>
28#include <Timer.h>
29−#include <TouchRegistry.h>
30
29
31using namespace UbuntuGestures;
30using namespace UbuntuGestures;
32
31
@@ -61,7 +60,6 @@ private:
61
60
62 QQuickView *createView();
61 QQuickView *createView();
63 QQuickView *m_view;
62 QQuickView *m_view;
64− TouchRegistry *m_touchRegistry;
65 QTouchDevice *m_device;
63 QTouchDevice *m_device;
66 FakeTimer *m_fakeTimer;
64 FakeTimer *m_fakeTimer;
67 QSharedPointer<FakeTimeSource> m_fakeTimeSource;
65 QSharedPointer<FakeTimeSource> m_fakeTimeSource;
@@ -85,10 +83,7 @@ void tst_DragHandle::cleanupTestCase()
85
83
86void tst_DragHandle::init()
84void tst_DragHandle::init()
87{
85{
88− m_touchRegistry = new TouchRegistry;
89−
90 m_view = createView();
86 m_view = createView();
91− m_view->installEventFilter(m_touchRegistry);
92 m_view->setSource(QUrl::fromLocalFile(TEST_DIR"/tst_DragHandle.qml"));
87 m_view->setSource(QUrl::fromLocalFile(TEST_DIR"/tst_DragHandle.qml"));
93 m_view->show();
88 m_view->show();
94 QVERIFY(QTest::qWaitForWindowExposed(m_view));
89 QVERIFY(QTest::qWaitForWindowExposed(m_view));
@@ -108,9 +103,6 @@ void tst_DragHandle::cleanup()
108 delete m_view;
103 delete m_view;
109 m_view = 0;
104 m_view = 0;
110
105
111− delete m_touchRegistry;
112− m_touchRegistry = 0;
113−
114 delete m_fakeTimer;
106 delete m_fakeTimer;
115 m_fakeTimer = 0;
107 m_fakeTimer = 0;
116
108
tests/qmltests/Dash/Previews/tst_PreviewRatingEdit.qmlnew file+80
@@ -0,0 +1,80 @@
1+/*
2+ * Copyright 2014 Canonical Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import QtTest 1.0
19+import Ubuntu.Components 0.1
20+import "../../../../qml/Dash/Previews"
21+import Unity.Test 0.1 as UT
22+
23+Rectangle {
24+ id: root
25+ width: units.gu(40)
26+ height: units.gu(80)
27+ color: Theme.palette.selected.background
28+
29+ property var widgetData0: { "visible": "both", "required": "both", author: "Some dude", rating: 4.5, review: "Very cool app" }
30+
31+ PreviewRatingEdit {
32+ id: previewRatingEdit
33+ anchors.left: parent.left
34+ anchors.right: parent.right
35+ widgetData: widgetData0
36+ widgetId: "previewRatingInput"
37+ }
38+
39+ SignalSpy {
40+ id: spy
41+ signalName: "triggered"
42+ }
43+
44+ UT.UnityTestCase {
45+ name: "PreviewRatingEditTest"
46+ when: windowShown
47+
48+ function test_switch_and_trigger(data) {
49+ spy.target = previewRatingEdit;
50+
51+ var authorLabel = findChild(previewRatingEdit, "authorLabel");
52+ var reviewTextArea = findChild(previewRatingEdit, "reviewTextArea");
53+ var inputRating = findChild(findChild(previewRatingEdit, "input"), "rating");
54+ verify(authorLabel.visible)
55+ verify(!reviewTextArea.visible)
56+
57+ var editButton = findChild(previewRatingEdit, "editButton");
58+ mouseClick(editButton);
59+ verify(!authorLabel.visible)
60+ verify(reviewTextArea.visible)
61+
62+ compare(reviewTextArea.text, "Very cool app");
63+ compare(inputRating.value, 4.5);
64+
65+ reviewTextArea.text = "Ho Ho";
66+ inputRating.value = 3;
67+
68+ var submitButton = findChild(previewRatingEdit, "submitButton")
69+ mouseClick(submitButton);
70+
71+ compare(spy.count, 1);
72+ var args = spy.signalArguments[0];
73+ compare(args[0], previewRatingEdit.widgetId);
74+ compare(args[1], "rated");
75+ compare(args[2]["rating"], 3);
76+ compare(args[2]["review"], "Ho Ho");
77+ verify(args[2]["author"] !== undefined); // Just verifying it exists now
78+ }
79+ }
80+}
tests/qmltests/Dash/tst_DashContent.qml+7−2
@@ -142,7 +142,7 @@ Item {
142
142
143 var startX = dashContentList.width/2;
143 var startX = dashContentList.width/2;
144 var startY = dashContentList.height/2;
144 var startY = dashContentList.height/2;
145− touchFlick(dashContentList, startX - units.gu(2), startY, startX, startY);
145+ touchFlick(dashContentList, startX - units.gu(4), startY, startX, startY);
146 tryCompare(categoryListView, "contentY", units.gu(15) - categoryListView.pageHeader.height);
146 tryCompare(categoryListView, "contentY", units.gu(15) - categoryListView.pageHeader.height);
147 }
147 }
148
148
@@ -153,7 +153,7 @@ Item {
153
153
154 tryCompare(scope, "status", Loader.Ready);
154 tryCompare(scope, "status", Loader.Ready);
155
155
156− var categoryListView = findChild(dashContentList, "categoryListView");
156+ var categoryListView = findChild(scope, "categoryListView");
157 categoryListView.contentY = units.gu(10);
157 categoryListView.contentY = units.gu(10);
158
158
159 compare(dashContentList.currentItem.item.objectName, "MockScope1")
159 compare(dashContentList.currentItem.item.objectName, "MockScope1")
@@ -353,6 +353,8 @@ Item {
353 compare(backButton.visible, true);
353 compare(backButton.visible, true);
354
354
355 tryCompare(navigationList1.navigation, "loaded", true);
355 tryCompare(navigationList1.navigation, "loaded", true);
356+ tryCompare(navigationList1, "implicitHeight", navigationList1.itemHeight * 10);
357+ tryCompare(navigationList1, "height", navigationList1.implicitHeight);
356 navigation = findChild(dashNavigationButton, "navigation1child2");
358 navigation = findChild(dashNavigationButton, "navigation1child2");
357 mouseClick(navigation);
359 mouseClick(navigation);
358 compare(dashNavigationButton.showList, false);
360 compare(dashNavigationButton.showList, false);
@@ -386,6 +388,9 @@ Item {
386 mouseClick(dashNavigationButton);
388 mouseClick(dashNavigationButton);
387 compare(dashNavigationButton.showList, true);
389 compare(dashNavigationButton.showList, true);
388 tryCompare(navigationListView.currentItem.navigation, "loaded", true);
390 tryCompare(navigationListView.currentItem.navigation, "loaded", true);
391+ var navigationList0 = findChild(dashNavigationButton, "navigation0");
392+ tryCompare(navigationList0, "implicitHeight", navigationList0.itemHeight * 8);
393+ tryCompare(navigationList0, "height", navigationList0.implicitHeight);
389 navigation = findChild(dashNavigationButton, "navigation0child2");
394 navigation = findChild(dashNavigationButton, "navigation0child2");
390 mouseClick(navigation);
395 mouseClick(navigation);
391 compare(dashNavigationButton.showList, true);
396 compare(dashNavigationButton.showList, true);
tests/qmltests/Stages/ApplicationCheckBox.qml+49−20
@@ -22,27 +22,67 @@ import Unity.Application 0.1
22RowLayout {
22RowLayout {
23 id: root
23 id: root
24 property string appId
24 property string appId
25− property alias checked: checkbox.checked
25+ property bool checked: false
26
26
27 enabled: appId !== "unity8-dash"
27 enabled: appId !== "unity8-dash"
28
28
29+ onCheckedChanged: {
30+ if (d.bindGuard) { return; }
31+ d.bindGuard = true;
32+
33+ if (checked) {
34+ ApplicationManager.startApplication(root.appId);
35+ } else {
36+ ApplicationManager.stopApplication(root.appId);
37+ }
38+ d.bindGuard = false;
39+ }
40+
41+ QtObject {
42+ id: d
43+ property bool bindGuard: false
44+ property var application: null
45+ Component.onCompleted: {
46+ application = ApplicationManager.findApplication(root.appId);
47+ }
48+ }
49+
50+ Connections {
51+ target: ApplicationManager
52+ onCountChanged: {
53+ d.application = ApplicationManager.findApplication(root.appId);
54+ }
55+ }
56+
29 Layout.fillWidth: true
57 Layout.fillWidth: true
30 CheckBox {
58 CheckBox {
31 id: checkbox
59 id: checkbox
32 checked: false
60 checked: false
33 activeFocusOnPress: false
61 activeFocusOnPress: false
34− property bool noop: false
62+
35− onCheckedChanged: {
63+ onTriggered: {
36− if (noop) {
37− return;
64+ if (d.bindGuard) { return; }
38− }
65+ d.bindGuard = true;
66+
39 if (checked) {
67 if (checked) {
40− var application = ApplicationManager.startApplication(root.appId);
68+ ApplicationManager.startApplication(root.appId);
41− appConnections.target = application;
42 } else {
69 } else {
43− appConnections.target = null;
44 ApplicationManager.stopApplication(root.appId);
70 ApplicationManager.stopApplication(root.appId);
45 }
71 }
72+ d.bindGuard = false;
73+ }
74+ onCheckedChanged: {
75+ if (d.bindGuard) { return; }
76+ d.bindGuard = true;
77+
78+ root.checked = checked;
79+
80+ d.bindGuard = false;
81+ }
82+ Binding {
83+ target: checkbox
84+ property: "checked"
85+ value: d.application != null
46 }
86 }
47 }
87 }
48 Label {
88 Label {
@@ -50,15 +90,4 @@ RowLayout {
50 color: "white"
90 color: "white"
51 anchors.verticalCenter: parent.verticalCenter
91 anchors.verticalCenter: parent.verticalCenter
52 }
92 }
53−
54− Connections {
55− id: appConnections
56− onStateChanged: {
57− if (target.state == ApplicationInfoInterface.Stopped) {
58− checkbox.noop = true;
59− checkbox.checked = false;
60− checkbox.noop = false;
61− }
62− }
63− }
64}
93}
tests/qmltests/Stages/tst_DesktopStage.qml+77−67
@@ -20,6 +20,7 @@ import Ubuntu.Components 1.1
20import Ubuntu.Components.ListItems 1.0 as ListItem
20import Ubuntu.Components.ListItems 1.0 as ListItem
21import Unity.Application 0.1
21import Unity.Application 0.1
22import Unity.Test 0.1
22import Unity.Test 0.1
23+import Utils 0.1
23
24
24import "../../../qml/Stages"
25import "../../../qml/Stages"
25
26
@@ -29,31 +30,18 @@ Rectangle {
29 width: desktopStageLoader.width + controls.width
30 width: desktopStageLoader.width + controls.width
30 height: desktopStageLoader.height
31 height: desktopStageLoader.height
31
32
32− QtObject {
33+ Binding {
33− id: fakeWindowStateStorage
34+ target: MouseTouchAdaptor
34−
35− property var storedGeom: [
35+ property: "enabled"
36− ["unity8-dash", Qt.rect(units.gu(2), units.gu(2), units.gu(50), units.gu(50))],
36+ value: false
37− ["webbrowser-app", Qt.rect(units.gu(60), units.gu(2), units.gu(50), units.gu(50))]
37+ }
38− ]
39
38
40− function saveGeometry(windowId, geometry) {
39+ Component.onCompleted: {
41− for (var i = 0; i < storedGeom.length; ++i) {
40+ // ensures apps which are tested decorations are in view.
42− if (storedGeom[i][0] === windowId) {
41+ WindowStateStorage.geometry = {
43− storedGeom[i][1] = geometry;
42+ 'unity8-dash': Qt.rect(0, units.gu(3), units.gu(50), units.gu(40)),
44− return;
43+ 'dialer-app': Qt.rect(units.gu(51), units.gu(3), units.gu(50), units.gu(40)),
45− }
44+ 'camera-app': Qt.rect(0, units.gu(44), units.gu(50), units.gu(40)),
46− }
47− // if new
48− storedGeom[storedGeom.length] = [windowId, geometry];
49− }
50− function getGeometry(windowId, defaultGeometry) {
51− for (var i = 0; i < storedGeom.length; ++i) {
52− if (storedGeom[i][0] === windowId) {
53− return storedGeom[i][1];
54− }
55− }
56− return defaultGeometry;
57 }
45 }
58 }
46 }
59
47
@@ -70,7 +58,6 @@ Rectangle {
70 sourceComponent: Component {
58 sourceComponent: Component {
71 DesktopStage {
59 DesktopStage {
72 anchors.fill: parent
60 anchors.fill: parent
73− windowStateStorage: fakeWindowStateStorage
74 Component.onDestruction: {
61 Component.onDestruction: {
75 desktopStageLoader.itemDestroyed = true;
62 desktopStageLoader.itemDestroyed = true;
76 }
63 }
@@ -108,9 +95,6 @@ Rectangle {
108
95
109 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
96 property Item desktopStage: desktopStageLoader.status === Loader.Ready ? desktopStageLoader.item : null
110
97
111− function init() {
112− }
113−
114 function cleanup() {
98 function cleanup() {
115 desktopStageLoader.itemDestroyed = false;
99 desktopStageLoader.itemDestroyed = false;
116 desktopStageLoader.active = false;
100 desktopStageLoader.active = false;
@@ -145,57 +129,83 @@ Rectangle {
145 tryCompare(appWindowStates, "state", "surface");
129 tryCompare(appWindowStates, "state", "surface");
146 }
130 }
147
131
148− function rectsIntersect(aLocal, bLocal) {
132+ function startApplication(appId) {
149−
133+ var app = ApplicationManager.findApplication(appId);
150− var a = aLocal.mapToItem(null, 0, 0, aLocal.width, aLocal.height);
134+ if (!app) {
151− var b = bLocal.mapToItem(null, 0, 0, bLocal.width, bLocal.height);
135+ app = ApplicationManager.startApplication(appId);
152−
136+ }
137+ verify(app);
138+ waitUntilAppSurfaceShowsUp(appId);
139+ verify(app.session.surface);
153− return !((a.y+a.height) < b.y
140+ return app;
154− || a.y > (b.y+b.height)
155− || (a.x+a.width) < b.x
156− || a.x > (b.x+b.width));
157 }
141 }
158
142
159− function test_tappingOnWindowChangesFocusedApp() {
143+ function test_appFocusSwitch_data() {
160− ApplicationManager.startApplication("webbrowser-app");
144+ return [
161− waitUntilAppSurfaceShowsUp("webbrowser-app");
145+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
146+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
147+ ]
148+ }
162
149
163− var webbrowserWindow = findChild(desktopStage, "appWindow_webbrowser-app");
150+ function test_appFocusSwitch(data) {
164− verify(webbrowserWindow);
151+ var i;
165− var dashWindow = findChild(desktopStage, "appWindow_unity8-dash");
152+ for (i = 0; i < data.apps.length; i++) {
166− verify(dashWindow);
153+ startApplication(data.apps[i]);
154+ }
167
155
168− // some sanity check
156+ ApplicationManager.requestFocusApplication(data.apps[data.focusfrom]);
169− compare(rectsIntersect(dashWindow, webbrowserWindow), false);
157+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
170
158
171− tap(dashWindow);
159+ ApplicationManager.requestFocusApplication(data.apps[data.focusTo]);
172− compare(dashWindow.application.session.surface.activeFocus, true);
160+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
161+ }
173
162
174− tap(webbrowserWindow);
163+ function test_tappingOnWindowChangesFocusedApp_data() {
175− compare(webbrowserWindow.application.session.surface.activeFocus, true);
164+ return [
165+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
166+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
167+ ]
176 }
168 }
177
169
178− function test_tappingOnWindowTitleChangesFocusedApp() {
170+ function test_tappingOnWindowChangesFocusedApp(data) {
171+ var i;
172+ for (i = 0; i < data.apps.length; i++) {
179− ApplicationManager.startApplication("webbrowser-app");
173+ startApplication(data.apps[i]);
180− waitUntilAppSurfaceShowsUp("webbrowser-app");
174+ }
175+
176+ var fromAppWindow = findChild(desktopStage, "appWindow_" + data.apps[data.focusfrom]);
177+ verify(fromAppWindow);
178+ tap(fromAppWindow);
179+ compare(fromAppWindow.application.session.surface.activeFocus, true);
181
180
182− var webbrowserWindow = findChild(desktopStage, "decoratedWindow_webbrowser-app");
181+ var toAppWindow = findChild(desktopStage, "appWindow_" + data.apps[data.focusTo]);
183− verify(webbrowserWindow);
182+ verify(toAppWindow);
184− var webbrowserWindowTitle = findChild(webbrowserWindow, "windowDecorationTitle");
183+ tap(toAppWindow);
185− verify(webbrowserWindowTitle);
184+ compare(toAppWindow.application.session.surface.activeFocus, true);
186− var dashWindow = findChild(desktopStage, "decoratedWindow_unity8-dash");
185+ }
187− verify(dashWindow);
188− var dashWindowTitle = findChild(dashWindow, "windowDecorationTitle");
189− verify(dashWindowTitle);
190
186
191− // some sanity check
187+ function test_tappingOnDecorationFocusesApplication_data() {
192− compare(rectsIntersect(dashWindow, webbrowserWindow), false);
188+ return [
189+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 0, focusTo: 1 },
190+ {tag: "dash", apps: [ "unity8-dash", "dialer-app", "camera-app" ], focusfrom: 1, focusTo: 0 },
191+ ]
192+ }
193+
194+ function test_tappingOnDecorationFocusesApplication(data) {
195+ var i;
196+ for (i = 0; i < data.apps.length; i++) {
197+ startApplication(data.apps[i]);
198+ }
193
199
194− tap(dashWindowTitle);
200+ var fromAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusfrom]);
195− compare(dashWindow.application.session.surface.activeFocus, true);
201+ verify(fromAppDecoration);
202+ tap(fromAppDecoration);
203+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusfrom]).session.surface, "activeFocus", true);
196
204
197− tap(webbrowserWindowTitle);
205+ var toAppDecoration = findChild(desktopStage, "appWindowDecoration_" + data.apps[data.focusTo]);
198− compare(webbrowserWindow.application.session.surface.activeFocus, true);
206+ verify(toAppDecoration);
207+ tap(toAppDecoration);
208+ tryCompare(ApplicationManager.findApplication(data.apps[data.focusTo]).session.surface, "activeFocus", true);
199 }
209 }
200 }
210 }
201}
211}
tests/qmltests/Stages/tst_TabletStage.qml+1−1
@@ -162,7 +162,7 @@ Rectangle {
162
162
163 performEdgeSwipeToShowAppSpread();
163 performEdgeSwipeToShowAppSpread();
164
164
165− var appDelegate = findChild(tabletStage, "spreadDelegate_" + dialerCheckBox.appId);
165+ var appDelegate = findChild(tabletStage, "tabletSpreadDelegate_" + dialerCheckBox.appId);
166 verify(appDelegate);
166 verify(appDelegate);
167 tryCompare(appDelegate, "swipeToCloseEnabled", true);
167 tryCompare(appDelegate, "swipeToCloseEnabled", true);
168
168
tests/qmltests/tst_Shell.qml+136−39
@@ -31,6 +31,7 @@ import Powerd 0.1
31import Wizard 0.1 as Wizard
31import Wizard 0.1 as Wizard
32
32
33import "../../qml"
33import "../../qml"
34+import "Stages"
34
35
35Rectangle {
36Rectangle {
36 id: root
37 id: root
@@ -92,19 +93,25 @@ Rectangle {
92 }
93 }
93 }
94 }
94
95
95− Rectangle {
96+ Flickable {
96 id: controls
97 id: controls
97− color: "darkgrey"
98+ contentHeight: controlRect.height
98− width: units.gu(30)
99+
99 anchors.top: root.top
100 anchors.top: root.top
100 anchors.bottom: root.bottom
101 anchors.bottom: root.bottom
101 anchors.right: root.right
102 anchors.right: root.right
103+ width: units.gu(30)
104+
105+ Rectangle {
106+ id: controlRect
107+ anchors { left: parent.left; right: parent.right }
108+ color: "darkgrey"
109+ height: childrenRect.height + units.gu(2)
110+
111+ Column {
112+ anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
113+ spacing: units.gu(1)
102
114
103− Column {
104− anchors { left: parent.left; right: parent.right; top: parent.top; margins: units.gu(1) }
105− spacing: units.gu(1)
106− Row {
107− anchors { left: parent.left; right: parent.right }
108 Button {
115 Button {
109 text: "Show Greeter"
116 text: "Show Greeter"
110 activeFocusOnPress: false
117 activeFocusOnPress: false
@@ -118,30 +125,54 @@ Rectangle {
118 }
125 }
119 }
126 }
120 }
127 }
121− }
122− ListItem.ItemSelector {
128+ ListItem.ItemSelector {
123− anchors { left: parent.left; right: parent.right }
129+ anchors { left: parent.left; right: parent.right }
124− activeFocusOnPress: false
130+ activeFocusOnPress: false
125− text: "LightDM mock mode"
131+ text: "LightDM mock mode"
126− model: ["single", "single-passphrase", "single-pin", "full"]
132+ model: ["single", "single-passphrase", "single-pin", "full"]
127− onSelectedIndexChanged: {
133+ onSelectedIndexChanged: {
128− shellLoader.active = false;
134+ shellLoader.active = false;
129− LightDM.Greeter.mockMode = model[selectedIndex];
135+ LightDM.Greeter.mockMode = model[selectedIndex];
130− LightDM.Users.mockMode = model[selectedIndex];
136+ LightDM.Users.mockMode = model[selectedIndex];
131− shellLoader.active = true;
137+ shellLoader.active = true;
138+ }
132 }
139 }
133− }
134− ListItem.ItemSelector {
140+ ListItem.ItemSelector {
135− anchors { left: parent.left; right: parent.right }
141+ anchors { left: parent.left; right: parent.right }
136− activeFocusOnPress: false
142+ activeFocusOnPress: false
137− text: "Size"
143+ text: "Size"
138− model: ["phone", "tablet"]
144+ model: ["phone", "tablet"]
139− onSelectedIndexChanged: {
145+ onSelectedIndexChanged: {
140− shellLoader.active = false;
146+ shellLoader.active = false;
141− shellLoader.state = model[selectedIndex];
147+ shellLoader.state = model[selectedIndex];
142− shellLoader.active = true;
148+ shellLoader.active = true;
149+ }
150+ }
151+ ListItem.ItemSelector {
152+ id: usageModeSelector
153+ anchors { left: parent.left; right: parent.right }
154+ activeFocusOnPress: false
155+ text: "Usage mode"
156+ model: ["Staged", "Windowed"]
157+ onSelectedIndexChanged: {
158+ GSettingsController.setUsageMode(model[selectedIndex]);
159+ }
160+ }
161+ MouseTouchEmulationCheckbox {
162+ id: mouseEmulation
163+ checked: true
164+ color: "white"
165+ }
166+
167+ Label { text: "Applications"; font.bold: true }
168+
169+ Repeater {
170+ id: appRepeater
171+ model: ApplicationManager.availableApplications
172+ ApplicationCheckBox {
173+ appId: modelData
174+ }
143 }
175 }
144− MouseTouchEmulationCheckbox { color: "white" }
145 }
176 }
146 }
177 }
147 }
178 }
@@ -222,6 +253,7 @@ Rectangle {
222 function cleanup() {
253 function cleanup() {
223 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
254 tryCompare(shell, "enabled", true); // make sure greeter didn't leave us in disabled state
224 tearDown();
255 tearDown();
256+ GSettingsController.setUsageMode("Staged");
225 }
257 }
226
258
227 function loadShell(formFactor) {
259 function loadShell(formFactor) {
@@ -659,22 +691,57 @@ Rectangle {
659
691
660 function test_launchedAppHasActiveFocus_data() {
692 function test_launchedAppHasActiveFocus_data() {
661 return [
693 return [
662− {tag:"phone", formFactor:"phone"},
694+ {tag: "phone", formFactor: "phone", usageMode: "Staged"},
663− {tag:"tablet", formFactor:"tablet"},
695+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged"},
696+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed"}
664− ];
697+ ]
665 }
698 }
666
699
667 function test_launchedAppHasActiveFocus(data) {
700 function test_launchedAppHasActiveFocus(data) {
701+ GSettingsController.setUsageMode(data.usageMode);
668 loadShell(data.formFactor);
702 loadShell(data.formFactor);
669 swipeAwayGreeter();
703 swipeAwayGreeter();
670
704
671− var dialerApp = ApplicationManager.startApplication("webbrowser-app");
705+ var webApp = ApplicationManager.startApplication("webbrowser-app");
672− verify(dialerApp);
706+ verify(webApp);
673 waitUntilAppSurfaceShowsUp("webbrowser-app")
707 waitUntilAppSurfaceShowsUp("webbrowser-app")
674
708
675− verify(dialerApp.session.surface);
709+ verify(webApp.session.surface);
676
710
711+ tryCompare(webApp.session.surface, "activeFocus", true);
712+ }
713+
714+ function test_launchedAppKeepsActiveFocusOnUsageModeChange() {
715+ loadShell("tablet");
716+ swipeAwayGreeter();
717+
718+ var webApp = ApplicationManager.startApplication("webbrowser-app");
719+ verify(webApp);
720+ waitUntilAppSurfaceShowsUp("webbrowser-app")
721+
722+ verify(webApp.session.surface);
723+
724+ tryCompare(webApp.session.surface, "activeFocus", true);
725+
726+ GSettingsController.setUsageMode("Windowed");
727+
728+ // check that the desktop stage and window have been loaded
729+ {
730+ var desktopWindow = findChild(shell, "decoratedWindow_webbrowser-app");
731+ verify(desktopWindow);
732+ }
733+
734+ tryCompare(webApp.session.surface, "activeFocus", true);
735+
736+ GSettingsController.setUsageMode("Staged");
737+
738+ // check that the tablet stage and app surface delegate have been loaded
739+ {
740+ var desktopWindow = findChild(shell, "tabletSpreadDelegate_webbrowser-app");
741+ verify(desktopWindow);
742+ }
743+
677− tryCompare(dialerApp.session.surface, "activeFocus", true);
744+ tryCompare(webApp.session.surface, "activeFocus", true);
678 }
745 }
679
746
680 function waitUntilAppSurfaceShowsUp(appId) {
747 function waitUntilAppSurfaceShowsUp(appId) {
@@ -1076,8 +1143,7 @@ Rectangle {
1076 loadShell("phone");
1143 loadShell("phone");
1077 swipeAwayGreeter();
1144 swipeAwayGreeter();
1078 AccountsService.backgroundFile = data.accounts;
1145 AccountsService.backgroundFile = data.accounts;
1079− var backgroundSettings = findInvisibleChild(shell, "backgroundSettings");
1146+ GSettingsController.setPictureUri(data.gsettings);
1080− backgroundSettings.pictureUri = data.gsettings;
1081
1147
1082 if (data.output === "defaultBackground") {
1148 if (data.output === "defaultBackground") {
1083 tryCompare(shell, "background", shell.defaultBackground);
1149 tryCompare(shell, "background", shell.defaultBackground);
@@ -1134,5 +1200,36 @@ Rectangle {
1134 tryCompare(passwordInput, "focus", true)
1200 tryCompare(passwordInput, "focus", true)
1135 }
1201 }
1136 }
1202 }
1203+
1204+ function test_stageLoader_data() {
1205+ return [
1206+ {tag: "phone", source: "Stages/PhoneStage.qml", formFactor: "phone", usageMode: "Staged"},
1207+ {tag: "tablet", source: "Stages/TabletStage.qml", formFactor: "tablet", usageMode: "Staged"},
1208+ {tag: "desktop", source: "Stages/DesktopStage.qml", formFactor: "tablet", usageMode: "Windowed"}
1209+ ]
1210+ }
1211+
1212+ function test_stageLoader(data) {
1213+ GSettingsController.setUsageMode(data.usageMode);
1214+ loadShell(data.formFactor);
1215+ var stageLoader = findChild(shell, "applicationsDisplayLoader");
1216+ verify(String(stageLoader.source).indexOf(data.source) >= 0);
1217+ }
1218+
1219+ function test_launcherInverted_data() {
1220+ return [
1221+ {tag: "phone", formFactor: "phone", usageMode: "Staged", launcherInverted: true},
1222+ {tag: "tablet", formFactor: "tablet", usageMode: "Staged", launcherInverted: true},
1223+ {tag: "desktop", formFactor: "tablet", usageMode: "Windowed", launcherInverted: false}
1224+ ]
1225+ }
1226+
1227+ function test_launcherInverted(data) {
1228+ GSettingsController.setUsageMode(data.usageMode);
1229+ loadShell(data.formFactor);
1230+
1231+ var launcher = findChild(shell, "launcher");
1232+ compare(launcher.inverted, data.launcherInverted);
1233+ }
1137 }
1234 }
1138}
1235}
tests/uqmlscene/main.cpp−10
@@ -63,9 +63,6 @@
63#include <QtCore/QTranslator>
63#include <QtCore/QTranslator>
64#include <QtCore/QLibraryInfo>
64#include <QtCore/QLibraryInfo>
65
65
66−// UbuntuGestures lib
67−#include <TouchRegistry.h>
68−
69#define UQMLSCENE_DEBUG_ACTIVE_FOCUS 0
66#define UQMLSCENE_DEBUG_ACTIVE_FOCUS 0
70
67
71#if UQMLSCENE_DEBUG_ACTIVE_FOCUS
68#if UQMLSCENE_DEBUG_ACTIVE_FOCUS
@@ -434,11 +431,6 @@ int main(int argc, char ** argv)
434 app.setOrganizationName("Qt Project");
431 app.setOrganizationName("Qt Project");
435 app.setOrganizationDomain("qt-project.org");
432 app.setOrganizationDomain("qt-project.org");
436
433
437− // Create it before loading the module, so that TestUtil
438− // doesn't create one with a fake timer factory.
439− // When interacting manually with a test we want the real deal.
440− new TouchRegistry;
441−
442#ifndef QT_NO_TRANSLATION
434#ifndef QT_NO_TRANSLATION
443 QTranslator translator;
435 QTranslator translator;
444 QTranslator qtTranslator;
436 QTranslator qtTranslator;
@@ -512,8 +504,6 @@ int main(int argc, char ** argv)
512 #if UQMLSCENE_DEBUG_ACTIVE_FOCUS
504 #if UQMLSCENE_DEBUG_ACTIVE_FOCUS
513 activeFocusLogger.setWindow(qxView);
505 activeFocusLogger.setWindow(qxView);
514 #endif
506 #endif
515− TouchRegistry::instance()->setParent(qxView);
516− qxView->installEventFilter(TouchRegistry::instance());
517 window = qxView;
507 window = qxView;
518 // Set window default properties; the qml can still override them
508 // Set window default properties; the qml can still override them
519 QString oname = contentItem->objectName();
509 QString oname = contentItem->objectName();
tests/utils/modules/Unity/Test/MouseTouchEmulationCheckbox.qml+1
@@ -22,6 +22,7 @@ import Unity.Test 0.1
22RowLayout {
22RowLayout {
23 id: root
23 id: root
24 property alias color: label.color
24 property alias color: label.color
25+ property alias checked: checkbox.checked
25
26
26 Binding {
27 Binding {
27 target: MouseTouchAdaptor
28 target: MouseTouchAdaptor
tests/utils/modules/Unity/Test/UnityTestCase.qml−2
@@ -424,8 +424,6 @@ TestCase {
424 }
424 }
425
425
426 Component.onCompleted: {
426 Component.onCompleted: {
427− UT.Util.ensureTouchRegistryInstalled();
428−
429 var rootItem = parent;
427 var rootItem = parent;
430 while (rootItem.parent != undefined) {
428 while (rootItem.parent != undefined) {
431 rootItem = rootItem.parent;
429 rootItem = rootItem.parent;
tests/utils/modules/Unity/Test/plugin.h+1−1
@@ -26,7 +26,7 @@ class UnityTestPlugin : public QQmlExtensionPlugin
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
26 Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface")
27
27
28public:
28public:
29− void registerTypes(const char *uri);
29+ void registerTypes(const char *uri) override;
30};
30};
31
31
32#endif // UNITY_TEST_PLUGIN_H
32#endif // UNITY_TEST_PLUGIN_H
tests/utils/modules/Unity/Test/testutil.cpp+8−20
@@ -31,6 +31,7 @@ TestUtil::TestUtil(QObject *parent)
31 : QObject(parent)
31 : QObject(parent)
32 , m_targetWindow(0)
32 , m_targetWindow(0)
33 , m_touchDevice(0)
33 , m_touchDevice(0)
34+ , m_putFakeTimerFactoryInTouchRegistry(false)
34{
35{
35}
36}
36
37
@@ -59,7 +60,13 @@ TouchEventSequenceWrapper *TestUtil::touchEvent(QQuickItem *item)
59{
60{
60 ensureTargetWindow();
61 ensureTargetWindow();
61 ensureTouchDevice();
62 ensureTouchDevice();
62− ensureTouchRegistryInstalled();
63+
64+ // Tests can be *very* slow to run and we don't want things timing out because
65+ // of that. So give it fake timers to use (they will never time out)
66+ if (!m_putFakeTimerFactoryInTouchRegistry) {
67+ TouchRegistry::instance()->setTimerFactory(new FakeTimerFactory);
68+ m_putFakeTimerFactoryInTouchRegistry = true;
69+ }
63
70
64 return new TouchEventSequenceWrapper(
71 return new TouchEventSequenceWrapper(
65 QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false), item);
72 QTest::touchEvent(m_targetWindow, m_touchDevice, /* autoCommit */ false), item);
@@ -79,22 +86,3 @@ void TestUtil::ensureTouchDevice()
79 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
86 QWindowSystemInterface::registerTouchDevice(m_touchDevice);
80 }
87 }
81}
88}
82−
83−void TestUtil::ensureTouchRegistryInstalled()
84−{
85− if (TouchRegistry::instance())
86− return;
87−
88− if (!m_targetWindow)
89− return;
90−
91− // Tests can be *very* slow to run and we don't want things timing out because
92− // of that. So give it fake timers to use (they will never time out)
93− TouchRegistry *touchRegistry = new TouchRegistry(this, new FakeTimerFactory);
94−
95− QQuickView *view = qobject_cast<QQuickView*>(m_targetWindow);
96− if (view) {
97− view->installEventFilter(touchRegistry);
98− touchRegistry->setParent(view);
99− }
100−}
tests/utils/modules/Unity/Test/testutil.h+1−1
@@ -34,7 +34,6 @@ public:
34
34
35 Q_INVOKABLE bool isInstanceOf(QObject*, QString);
35 Q_INVOKABLE bool isInstanceOf(QObject*, QString);
36 Q_INVOKABLE TouchEventSequenceWrapper *touchEvent(QQuickItem *item);
36 Q_INVOKABLE TouchEventSequenceWrapper *touchEvent(QQuickItem *item);
37− Q_INVOKABLE void ensureTouchRegistryInstalled();
38
37
39private:
38private:
40 void ensureTargetWindow();
39 void ensureTargetWindow();
@@ -42,6 +41,7 @@ private:
42
41
43 QWindow *m_targetWindow;
42 QWindow *m_targetWindow;
44 QTouchDevice *m_touchDevice;
43 QTouchDevice *m_touchDevice;
44+ bool m_putFakeTimerFactoryInTouchRegistry;
45};
45};
46
46
47QML_DECLARE_TYPE(TestUtil)
47QML_DECLARE_TYPE(TestUtil)