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 <QDialog>
9 #include <QDialogButtonBox>
10 #include <QFrame>
11 #include <QMenu>
12 #include <QStackedLayout>
13 #include <QToolButton>
14 
15 #include <KMessageWidget>
16 #include <KNS3/KMoreToolsMenuFactory>
17 
18 #include "SpectacleCommon.h"
19 
20 #include "Config.h"
21 #include "ExportMenu.h"
22 #include "KSWidget.h"
23 #include "Platforms/Platform.h"
24 
25 #include <memory>
26 
27 class KSMainWindow : public QDialog
28 {
29     Q_OBJECT
30 
31 public:
32     explicit KSMainWindow(Platform::GrabModes theGrabModes, Platform::ShutterModes theShutterModes, QWidget *parent = nullptr);
33     ~KSMainWindow() override = default;
34 
35     enum class MessageDuration { AutoHide, Persistent };
36 
37 private:
38     enum class QuitBehavior { QuitImmediately, QuitExternally };
39     void quit(const QuitBehavior quitBehavior = QuitBehavior::QuitImmediately);
40     void showInlineMessage(const QString &message,
41                            const KMessageWidget::MessageType messageType,
42                            const MessageDuration messageDuration = MessageDuration::AutoHide,
43                            const QList<QAction *> &actions = {});
44     int windowWidth(const QPixmap &pixmap) const;
45 
46 private Q_SLOTS:
47 
48     void captureScreenshot(Spectacle::CaptureMode theCaptureMode, int theTimeout, bool theIncludePointer, bool theIncludeDecorations);
49     void showPrintDialog();
50     void openScreenshotsFolder();
51     void showPreferencesDialog();
52     void showImageSharedFeedback(bool error, const QString &message);
53     void imageCopied();
54     void imageSavedAndLocationCopied(const QUrl &location);
55     void init();
56     void setDefaultSaveAction();
57     void setDefaultCopyAction();
58     void save();
59     void saveAs();
60     void copyImage();
61     void copyLocation();
62     void restoreWindowTitle();
63 
64 public Q_SLOTS:
65 
66     void setScreenshotAndShow(const QPixmap &pixmap);
67     void imageSaved(const QUrl &location);
68     void imageSavedAndCopied(const QUrl &location);
69     void screenshotFailed();
70     void setPlaceholderTextOnLaunch();
71 
72 Q_SIGNALS:
73 
74     void newScreenshotRequest(Spectacle::CaptureMode theCaptureMode, int theTimeout, bool theIncludePointer, bool theIncludeDecorations);
75     void dragAndDropRequest();
76 
77 protected:
78     void moveEvent(QMoveEvent *event) override;
79     QSize sizeHint() const override;
80 
81 private:
82     void keyPressEvent(QKeyEvent *event) override;
83 
84     KSWidget *const mKSWidget;
85     QFrame *const mDivider;
86     QDialogButtonBox *const mDialogButtonBox;
87     QToolButton *const mConfigureButton;
88     QPushButton *const mToolsButton;
89     QPushButton *const mSendToButton;
90     QToolButton *const mClipboardButton;
91     QMenu *const mClipboardMenu;
92     QAction *mClipboardLocationAction = nullptr;
93     QAction *mClipboardImageAction = nullptr;
94     QToolButton *const mSaveButton;
95     QMenu *const mSaveMenu;
96     QAction *mSaveAsAction = nullptr;
97     QAction *mSaveAction = nullptr;
98     QAction *mOpenContaining = nullptr;
99     KMessageWidget *const mMessageWidget;
100     QMenu *const mToolsMenu;
101     QMenu *mScreenRecorderToolsMenu = nullptr;
102     std::unique_ptr<KMoreToolsMenuFactory> mScreenrecorderToolsMenuFactory;
103     ExportMenu *const mExportMenu;
104     Platform::ShutterModes mShutterModes;
105     QTimer *mHideMessageWidgetTimer = nullptr;
106     QStackedLayout *mStack = nullptr;
107     bool mPixmapExists = false;
108 
109 #ifdef KIMAGEANNOTATOR_FOUND
110     QToolButton *const mAnnotateButton;
111     bool mAnnotatorActive;
112 #endif
113 };
114