~mterry/+junk/u8.2

« back to all changes in this revision

Viewing changes to plugins/ScreenGrabber/screengrabber.cpp

  • Committer: Michael Terry
  • Date: 2014-11-17 14:56:04 UTC
  • mfrom: (1317.1.118 unity8)
  • Revision ID: michael.terry@canonical.com-20141117145604-96dn9p5nwkifq2f4
MergeĀ fromĀ trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2014 Canonical, Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 *
 
16
 * Authors: Alberto Aguirre <alberto.aguirre@canonical.com>
 
17
 */
 
18
 
 
19
#include "screengrabber.h"
 
20
 
 
21
#include <QDir>
 
22
#include <QDateTime>
 
23
#include <QStandardPaths>
 
24
#include <QtGui/QImage>
 
25
#include <QtGui/QGuiApplication>
 
26
#include <QtQuick/QQuickWindow>
 
27
#include <QtConcurrent/QtConcurrentRun>
 
28
 
 
29
#include <QDebug>
 
30
 
 
31
void saveScreenshot(QImage screenshot, QString filename, QString format, int quality)
 
32
{
 
33
    if (!screenshot.save(filename, format.toLatin1().data(), quality))
 
34
        qWarning() << "ScreenShotter: failed to save snapshot!";
 
35
}
 
36
 
 
37
ScreenGrabber::ScreenGrabber(QObject *parent)
 
38
    : QObject(parent),
 
39
      screenshotQuality(0)
 
40
{
 
41
    QDir screenshotsDir(QStandardPaths::displayName(QStandardPaths::PicturesLocation));
 
42
    screenshotsDir.mkdir("Screenshots");
 
43
    screenshotsDir.cd("Screenshots");
 
44
    if (screenshotsDir.exists())
 
45
    {
 
46
        fileNamePrefix = screenshotsDir.absolutePath();
 
47
        fileNamePrefix.append("/screenshot");
 
48
    }
 
49
    else
 
50
    {
 
51
        qWarning() << "ScreenShotter: failed to create directory at: " << screenshotsDir.absolutePath();
 
52
    }
 
53
}
 
54
 
 
55
void ScreenGrabber::captureAndSave()
 
56
{
 
57
    if (fileNamePrefix.isEmpty())
 
58
    {
 
59
        qWarning() << "ScreenShotter: no directory to save screenshot";
 
60
        return;
 
61
    }
 
62
 
 
63
    const QWindowList windows = QGuiApplication::topLevelWindows();
 
64
    if (windows.empty())
 
65
    {
 
66
        qWarning() << "ScreenShotter: no top level windows found!";
 
67
        return;
 
68
    }
 
69
 
 
70
    QQuickWindow *main_window = qobject_cast<QQuickWindow *>(windows[0]);
 
71
    if (!main_window)
 
72
    {
 
73
        qWarning() << "ScreenShotter: can only take screenshots of QQuickWindows";
 
74
        return;
 
75
    }
 
76
 
 
77
    QImage screenshot = main_window->grabWindow();
 
78
    QtConcurrent::run(saveScreenshot, screenshot, makeFileName(), getFormat(), screenshotQuality);
 
79
}
 
80
 
 
81
QString ScreenGrabber::makeFileName()
 
82
{
 
83
    QString fileName(fileNamePrefix);
 
84
    fileName.append(QDateTime::currentDateTime().toString("yyyymmdd_hhmmsszzz"));
 
85
    fileName.append(".");
 
86
    fileName.append(getFormat());
 
87
    return fileName;
 
88
}
 
89
 
 
90
QString ScreenGrabber::getFormat()
 
91
{
 
92
    //TODO: This should be configurable (perhaps through gsettings?)
 
93
    return "png";
 
94
}