on xenial help sign in
Make saving screenshots really async

Approved by: Michael Zanetti

commita205b3ec4e377924c5a9d3f7a6e7834e0d7f6417 authorLukáš Tinkl <lukas.tinkl@canonical.com> dateThu 26 Nov 2015, 13:51 (11 years ago) parent5df11ae49cb9ee
4 files changed+25−9
plugins/ScreenGrabber/screengrabber.cpp+18−8 plugins/ScreenGrabber/screengrabber.h+5 tests/plugins/ScreenGrabber/CMakeLists.txt+1−1 tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp+1
plugins/ScreenGrabber/screengrabber.cpp+18−8
@@ -23,23 +23,27 @@
2323#include <QtGui/QImage>
2424#include <QtGui/QGuiApplication>
2525#include <QtQuick/QQuickWindow>
26−#include <QtConcurrent/QtConcurrentRun>
2726
2827#include <QDebug>
2928
30−bool saveScreenshot(const QImage &screenshot, const QString &filename, const QString &format, int quality)
29+QString saveScreenshot(const QImage &screenshot, const QString &filename, const QString &format, int quality)
3130{
32− if (!screenshot.save(filename, format.toLatin1().data(), quality)) {
31+ if (screenshot.save(filename, format.toLatin1().data(), quality)) {
32+ return filename;
33+ } else {
3334 qWarning() << "ScreenGrabber: failed to save snapshot!";
34− return false;
3535 }
36−
37− return true;
36+ return QString();
3837}
3938
4039ScreenGrabber::ScreenGrabber(QObject *parent)
4140 : QObject(parent)
4241{
42+ QObject::connect(&m_watcher,
43+ &QFutureWatcher<QString>::finished,
44+ this,
45+ &ScreenGrabber::onScreenshotSaved);
46+
4347 QDir screenshotsDir;
4448 if (qEnvironmentVariableIsSet("UNITY_TESTING")) {
4549 qDebug() << "Using test environment";
@@ -85,8 +89,14 @@ void ScreenGrabber::captureAndSave(int angle)
8589 const QImage screenshot = main_window->grabWindow().transformed(QTransform().rotate(angle));
8690 const QString filename = makeFileName();
8791 qDebug() << "Saving screenshot to" << filename;
88− auto saveOp = QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality);
89− if (saveOp.result()) {
92+ QFuture<QString> saveFuture(QtConcurrent::run(saveScreenshot, screenshot, filename, getFormat(), screenshotQuality));
93+ m_watcher.setFuture(saveFuture);
94+}
95+
96+void ScreenGrabber::onScreenshotSaved()
97+{
98+ const QString filename = m_watcher.future().result();
99+ if (!filename.isEmpty()) {
90100 Q_EMIT screenshotSaved(filename);
91101 }
92102}
plugins/ScreenGrabber/screengrabber.h+5
@@ -19,6 +19,7 @@
1919
2020#include <QObject>
2121#include <QString>
22+#include <QtConcurrent>
2223
2324class ScreenGrabber: public QObject
2425{
@@ -34,11 +35,15 @@ public Q_SLOTS:
3435Q_SIGNALS:
3536 void screenshotSaved(const QString &filename);
3637
38+private Q_SLOTS:
39+ void onScreenshotSaved();
40+
3741private:
3842 QString makeFileName() const;
3943 QString getFormat() const;
4044 QString fileNamePrefix;
4145 int screenshotQuality = -1; // default quality for the format
46+ QFutureWatcher<QString> m_watcher;
4247};
4348
4449#endif
tests/plugins/ScreenGrabber/CMakeLists.txt+1−1
@@ -9,6 +9,6 @@ add_definitions(
99add_definitions(-DBUILT_PLUGINS_DIR="${CMAKE_BINARY_DIR}/plugins")
1010
1111add_executable(ScreenGrabberTestExec ScreenGrabberTest.cpp ${CMAKE_SOURCE_DIR}/plugins/ScreenGrabber/screengrabber.cpp)
12−qt5_use_modules(ScreenGrabberTestExec Test Quick)
12+qt5_use_modules(ScreenGrabberTestExec Test Quick Concurrent)
1313target_link_libraries(ScreenGrabberTestExec ${Qt5Quick_LIBRARIES} ScreenGrabber-qml)
1414add_unity8_uitest(ScreenGrabber ScreenGrabberTestExec DEPENDS ScreenGrabber-qml)
tests/plugins/ScreenGrabber/ScreenGrabberTest.cpp+1
@@ -59,6 +59,7 @@ private Q_SLOTS:
5959 {
6060 QSignalSpy grabberSpy(m_grabber, &ScreenGrabber::screenshotSaved);
6161 m_grabber->captureAndSave(90); // rotate by 90°
62+ QTRY_VERIFY(grabberSpy.count() == 1);
6263 const QVariantList args = grabberSpy.takeFirst();
6364 const QString filename = args.first().toString();
6465 QVERIFY(!filename.isEmpty());