// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors // Based on Lightscreen areadialog.h, Copyright 2017 Christian Kaiser // released under the GNU GPL2 // // Based on KDE's KSnapshot regiongrabber.cpp, revision 796531, Copyright 2007 // Luca Gugelmann released under the GNU LGPL // #pragma once #include "buttonhandler.h" #include "capturetoolbutton.h" #include "capturetoolobjects.h" #include "src/tools/capturecontext.h" #include "src/tools/capturetool.h" #include "src/utils/confighandler.h" #include "src/widgets/capture/selectionwidget.h" #include #include #include class QLabel; class QPaintEvent; class QResizeEvent; class QMouseEvent; class QShortcut; class QNetworkAccessManager; class QNetworkReply; class ColorPicker; class NotifierBox; class HoverEventFilter; class UpdateNotificationWidget; class UtilityPanel; class SidePanelWidget; class CaptureWidget : public QWidget { Q_OBJECT public: explicit CaptureWidget(const CaptureRequest& req, bool fullScreen = true, QWidget* parent = nullptr); ~CaptureWidget(); QPixmap pixmap(); void showAppUpdateNotification(const QString& appLatestVersion, const QString& appLatestUrl); void setCaptureToolObjects(const CaptureToolObjects& captureToolObjects); public slots: bool commitCurrentTool(); void deleteToolWidgetOrClose(); signals: void colorChanged(const QColor& c); void toolSizeChanged(int size); private slots: void undo(); void redo(); void togglePanel(); void childEnter(); void childLeave(); void deleteCurrentTool(); void setState(CaptureToolButton* b); void handleToolSignal(CaptureTool::Request r); void handleButtonLeftClick(CaptureToolButton* b); void handleButtonRightClick(CaptureToolButton* b); void setDrawColor(const QColor& c); void onToolSizeChanged(int size); void onToolSizeSettled(int size); void updateActiveLayer(int layer); void selectAll(); public: void removeToolObject(int index = -1); protected: void paintEvent(QPaintEvent* paintEvent) override; void mousePressEvent(QMouseEvent* mouseEvent) override; void mouseMoveEvent(QMouseEvent* mouseEvent) override; void mouseReleaseEvent(QMouseEvent* mouseEvent) override; void mouseDoubleClickEvent(QMouseEvent* event) override; void keyPressEvent(QKeyEvent* keyEvent) override; void keyReleaseEvent(QKeyEvent* keyEvent) override; void wheelEvent(QWheelEvent* wheelEvent) override; void resizeEvent(QResizeEvent* resizeEvent) override; void moveEvent(QMoveEvent* moveEvent) override; void changeEvent(QEvent* changeEvent) override; private: void pushObjectsStateToUndoStack(); void releaseActiveTool(); void uncheckActiveTool(); int selectToolItemAtPos(const QPoint& pos); void showColorPicker(const QPoint& pos); bool startDrawObjectTool(const QPoint& pos); QPointer activeToolObject(); void initContext(bool fullscreen, const CaptureRequest& req); void initPanel(); void initSelection(); void initShortcuts(); void initButtons(); void initHelpMessage(); void updateSizeIndicator(); void updateCursor(); void updateSelectionState(); void updateTool(CaptureTool* tool); void updateLayersPanel(); void pushToolToStack(); void makeChild(QWidget* w); QList newShortcut(const QKeySequence& key, QWidget* parent, const char* slot); void setToolSize(int size); QRect extendedSelection() const; QRect extendedRect(const QRect& r) const; QRect paddedUpdateRect(const QRect& r) const; void drawErrorMessage(const QString& msg, QPainter* painter); void drawInactiveRegion(QPainter* painter); void drawToolsData(); void drawObjectSelection(); void processPixmapWithTool(QPixmap* pixmap, CaptureTool* tool); CaptureTool* activeButtonTool() const; CaptureTool::Type activeButtonToolType() const; //////////////////////////////////////// // Class members // Context information CaptureContext m_context; // Main ui color QColor m_uiColor; // Secondary ui color QColor m_contrastUiColor; // Outside selection opacity int m_opacity; int m_toolSizeByKeyboard; // utility flags bool m_mouseIsClicked; bool m_newSelection; bool m_movingSelection; bool m_captureDone; bool m_previewEnabled; bool m_adjustmentButtonPressed; bool m_configError; bool m_configErrorResolved; UpdateNotificationWidget* m_updateNotificationWidget; quint64 m_lastMouseWheel; QPointer m_sizeIndButton; // Last pressed button QPointer m_activeButton; QPointer m_activeTool; bool m_activeToolIsMoved; QPointer m_toolWidget; ButtonHandler* m_buttonHandler; UtilityPanel* m_panel; SidePanelWidget* m_sidePanel; ColorPicker* m_colorPicker; ConfigHandler m_config; NotifierBox* m_notifierBox; HoverEventFilter* m_eventFilter; SelectionWidget* m_selection; QString m_helpMessage; SelectionWidget::SideType m_mouseOverHandle; QMap m_tools; CaptureToolObjects m_captureToolObjects; CaptureToolObjects m_captureToolObjectsBackup; QPoint m_mousePressedPos; QPoint m_activeToolOffsetToMouseOnStart; QUndoStack m_undoStack; bool m_existingObjectIsChanged; // For start moving after more than X offset QPoint m_startMovePos; bool m_startMove; };