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