1 /* This file is part of Spectacle, the KDE screenshot utility
2  * SPDX-FileCopyrightText: 2015 Boudhayan Gupta <bgupta@kde.org>
3  * SPDX-License-Identifier: LGPL-2.0-or-later
4  */
5 
6 #pragma once
7 
8 #include <SpectacleCommon.h>
9 
10 #include <KLocalizedString>
11 #include <QDateTime>
12 #include <QIODevice>
13 #include <QMap>
14 #include <QObject>
15 #include <QPixmap>
16 #include <QPrinter>
17 #include <QUrl>
18 
19 class QTemporaryDir;
20 
21 class ExportManager : public QObject
22 {
23     Q_OBJECT
24 
25     // singleton-ize the class
26 
27 public:
28     static ExportManager *instance();
29 
30 private:
31     explicit ExportManager(QObject *parent = nullptr);
32     ~ExportManager() override;
33 
34     ExportManager(ExportManager const &) = delete;
35     void operator=(ExportManager const &) = delete;
36 
37     // now the usual stuff
38 
39 public:
40     QString defaultSaveLocation() const;
41     bool isFileExists(const QUrl &url) const;
42     bool isImageSavedNotInTemp() const;
43     void setPixmap(const QPixmap &pixmap);
44     QPixmap pixmap() const;
45     void updatePixmapTimestamp();
46     void setTimestamp(const QDateTime &timestamp);
47     QString windowTitle() const;
48     Spectacle::CaptureMode captureMode() const;
49     void setCaptureMode(Spectacle::CaptureMode theCaptureMode);
50     QString formatFilename(const QString &nameTemplate);
51 
52     static const QMap<QString, KLocalizedString> filenamePlaceholders;
53 
54 Q_SIGNALS:
55 
56     void errorMessage(const QString &str);
57     void imageSaved(const QUrl &savedAt);
58     void imageCopied();
59     void imageLocationCopied(const QUrl &savedAt);
60     void imageSavedAndCopied(const QUrl &savedAt);
61     void forceNotify(const QUrl &savedAt);
62 
63 public Q_SLOTS:
64 
65     QUrl getAutosaveFilename();
66     QUrl tempSave();
67 
68     void setWindowTitle(const QString &windowTitle);
69     void doSave(const QUrl &url = QUrl(), bool notify = false);
70     bool doSaveAs(QWidget *parentWindow = nullptr, bool notify = false);
71     void doSaveAndCopy(const QUrl &url = QUrl());
72     void doCopyToClipboard(bool notify = false);
73     void doCopyLocationToClipboard(bool notify = false);
74     void doPrint(QPrinter *printer);
75 
76 private:
77     QString truncatedFilename(const QString &filename);
78     QString makeAutosaveFilename();
79     using FileNameAlreadyUsedCheck = bool (ExportManager::*)(const QUrl &) const;
80     QString autoIncrementFilename(const QString &baseName, const QString &extension, FileNameAlreadyUsedCheck isFileNameUsed);
81     QString makeSaveMimetype(const QUrl &url);
82     bool writeImage(QIODevice *device, const QByteArray &format);
83     bool save(const QUrl &url);
84     bool localSave(const QUrl &url, const QString &mimetype);
85     bool remoteSave(const QUrl &url, const QString &mimetype);
86     bool isTempFileAlreadyUsed(const QUrl &url) const;
87 
88     bool mImageSavedNotInTemp;
89     QPixmap mSavePixmap;
90     QDateTime mPixmapTimestamp;
91     QUrl mTempFile;
92     QTemporaryDir *mTempDir = nullptr;
93     QList<QUrl> mUsedTempFileNames;
94     QString mWindowTitle;
95     Spectacle::CaptureMode mCaptureMode{Spectacle::CaptureMode::AllScreens};
96 };
97