1 /*
2  *  Copyright (C) 2016 Damir Porobic <damir.porobic@gmx.com>
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; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #ifndef KSNIP_MAINWINDOW_H
22 #define KSNIP_MAINWINDOW_H
23 
24 #include <QtWidgets>
25 
26 #include <functional>
27 
28 #include "src/gui/actions/ActionProcessor.h"
29 #include "src/gui/actions/ActionsMenu.h"
30 #include "src/gui/TrayIcon.h"
31 #include "src/gui/IImageProcessor.h"
32 #include "src/gui/imageAnnotator/KImageAnnotatorAdapter.h"
33 #include "src/gui/aboutDialog/AboutDialog.h"
34 #include "src/gui/settingsDialog/SettingsDialog.h"
35 #include "src/gui/notificationService/NotificationServiceFactory.h"
36 #include "src/gui/operations/AddWatermarkOperation.h"
37 #include "src/gui/operations/CopyAsDataUriOperation.h"
38 #include "src/gui/operations/UploadOperation.h"
39 #include "src/gui/operations/HandleUploadResultOperation.h"
40 #include "src/gui/operations/LoadImageFromFileOperation.h"
41 #include "src/gui/globalHotKeys/GlobalHotKeyHandler.h"
42 #include "src/gui/captureHandler/CaptureHandlerFactory.h"
43 #include "src/gui/captureHandler/ICaptureChangeListener.h"
44 #include "src/gui/widgetVisibilityHandler/WidgetVisibilityHandlerFactory.h"
45 #include "src/gui/pinWindow/PinWindowHandler.h"
46 #include "src/gui/serviceLocator/ServiceLocator.h"
47 #include "src/gui/RecentImagesMenu.h"
48 #include "src/gui/dragAndDrop/DragAndDropProcessor.h"
49 #include "src/gui/dragAndDrop/IDragContentProvider.h"
50 #include "src/gui/windowResizer/IResizableWindow.h"
51 #include "src/gui/windowResizer/WindowResizer.h"
52 #include "src/widgets/MainToolBar.h"
53 #include "src/backend/imageGrabber/AbstractImageGrabber.h"
54 #include "src/backend/config/KsnipConfigProvider.h"
55 #include "src/backend/uploader/UploaderProvider.h"
56 #include "src/backend/CapturePrinter.h"
57 #include "src/common/loader/IconLoader.h"
58 #include "src/common/enum/RunMode.h"
59 #include "src/common/provider/ApplicationTitleProvider.h"
60 #include "src/common/dtos/CaptureFromFileDto.h"
61 #include "src/common/adapter/fileDialog/FileDialogAdapterFactory.h"
62 
63 class MainWindow : public QMainWindow, public ICaptureChangeListener, public IImageProcessor, public IResizableWindow, public IDragContentProvider
64 {
65     Q_OBJECT
66 public:
67     explicit MainWindow(AbstractImageGrabber *imageGrabber, RunMode mode = RunMode::GUI);
68     ~MainWindow() override;
69     void showEmpty();
70 	void showHidden();
71     void showDefault();
72     void captureScreenshot(CaptureModes captureMode, bool captureCursor, int delay);
73 	void resizeToContent() override;
74 	bool isWindowMaximized() override;
75 	void processImage(const CaptureDto &capture) override;
76 	DragContent dragContent() const override;
77 
78 public slots:
79     void processCapture(const CaptureDto &capture);
80 	void quit();
81 
82 signals:
83 	void imageLoaded() const;
84 
85 protected:
86     void moveEvent(QMoveEvent *event) override;
87     void closeEvent(QCloseEvent *event) override;
88 	void changeEvent(QEvent *event) override;
89     QMenu *createPopupMenu() override;
90     QSize sizeHint() const override;
91 
92 private:
93     AbstractImageGrabber *mImageGrabber;
94 	IServiceLocator *mServiceLocator;
95     RunMode mMode;
96     bool mSessionManagerRequestedQuit;
97     QAction *mSaveAsAction;
98     QAction *mUploadAction;
99     QAction *mCopyAsDataUriAction;
100     QAction *mPrintAction;
101     QAction *mPrintPreviewAction;
102     QAction *mQuitAction;
103     QAction *mCopyPathAction;
104     QAction *mRenameAction;
105     QAction *mOpenDirectoryAction;
106     QAction *mToggleDocksAction;
107     QAction *mSettingsAction;
108     QAction *mAboutAction;
109     QAction *mOpenImageAction;
110     QAction *mScaleAction;
111     QAction *mRotateAction;
112 	QAction *mAddWatermarkAction;
113 	QAction *mPasteAction;
114 	QAction *mPasteEmbeddedAction;
115 	QAction *mPinAction;
116 	QAction *mRemoveImageAction;
117 	QAction *mModifyCanvasAction;
118 	MainToolBar *mToolBar;
119 	QLayout *mMainLayout;
120 	KsnipConfig *mConfig;
121 	ActionsMenu *mActionsMenu;
122 	RecentImagesMenu *mRecentImagesMenu;
123 	IClipboard *mClipboard;
124 	CapturePrinter *mCapturePrinter;
125     IImageAnnotator *mImageAnnotator;
126     SavePathProvider mSavePathProvider;
127     GlobalHotKeyHandler *mGlobalHotKeyHandler;
128     TrayIcon *mTrayIcon;
129 	DragAndDropProcessor *mDragAndDropProcessor;
130 	UploaderProvider *mUploaderProvider;
131 	ICaptureHandler *mCaptureHandler;
132 	PinWindowHandler *mPinWindowHandler;
133 	WidgetVisibilityHandler *mVisibilityHandler;
134 	IFileDialogAdapter *mFileDialog;
135 	WindowResizer *mWindowResizer;
136 	ActionProcessor *mActionProcessor;
137 
138     void setEnablements(bool enabled);
139     void loadSettings();
140     void triggerCapture(CaptureModes captureMode);
141     void capture(CaptureModes captureMode, bool captureCursor, int delay);
142     void initGui();
143 	void processInstantCapture(const CaptureDto &capture);
144 	void showDialog(const std::function<void ()>& showDialogMethod);
145 
146 private slots:
147 	void captureChanged() override;
148 	void captureEmpty() override;
149     void copyCaptureToClipboard();
150     void upload();
151     void uploadFinished(const UploadResult &result);
152     void copyAsDataUri();
153     void printClicked();
154     void printPreviewClicked();
155     void showOpenImageDialog();
156     void pasteFromClipboard();
157     void pasteEmbeddedFromClipboard();
158     void setupImageAnnotator();
159     void captureDelayChanged(int delay);
160     void addWatermark();
161     void showSettingsDialog();
162     void showAboutDialog();
163     void showScaleDialog();
164     void showRotateDialog();
165 	void setPosition();
166 	void handleGuiStartup();
167 	void saveClicked();
168 	void saveAsClicked();
169 	void updateApplicationTitle();
170 	void capturePostProcessing();
171 	void loadImageFromFile(const QString &path);
172 	void loadImageFromPixmap(const QPixmap &pixmap);
173 	void sessionFinished();
174 	void captureCanceled();
175 	void showPinWindow();
176 	void hideMainWindowIfRequired();
177 	void toggleDocks();
178 	void actionTriggered(const Action &action);
179 	void showAfterAction(bool minimized);
180 };
181 
182 #endif // KSNIP_MAINWINDOW_H
183