File selectionwidget.h#
File List > capture > selectionwidget.h
Go to the documentation of this file.
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: 2017-2019 Alejandro Sirgo Rica & Contributors
#pragma once
#include <QWidget>
class QPropertyAnimation;
class SelectionWidget : public QWidget
{
    Q_OBJECT
public:
    enum SideType
    {
        NO_SIDE = 0,
        TOP_SIDE = 0b0001,
        BOTTOM_SIDE = 0b0010,
        RIGHT_SIDE = 0b0100,
        LEFT_SIDE = 0b1000,
        TOPLEFT_SIDE = TOP_SIDE | LEFT_SIDE,
        BOTTOMLEFT_SIDE = BOTTOM_SIDE | LEFT_SIDE,
        TOPRIGHT_SIDE = TOP_SIDE | RIGHT_SIDE,
        BOTTOMRIGHT_SIDE = BOTTOM_SIDE | RIGHT_SIDE,
        CENTER = 0b10000,
    };
    explicit SelectionWidget(QColor c, QWidget* parent = nullptr);
    SideType getMouseSide(const QPoint& mousePos) const;
    QVector<QRect> handlerAreas();
    void setIgnoreMouse(bool ignore);
    void setIdleCentralCursor(const QCursor& cursor);
    void setGeometryAnimated(const QRect& r);
    void setGeometry(const QRect& r);
    QRect geometry() const;
    QRect fullGeometry() const;
    QRect rect() const;
protected:
    bool eventFilter(QObject*, QEvent*) override;
    void parentMousePressEvent(QMouseEvent* e);
    void parentMouseReleaseEvent(QMouseEvent* e);
    void parentMouseMoveEvent(QMouseEvent* e);
    void paintEvent(QPaintEvent*) override;
    void resizeEvent(QResizeEvent*) override;
    void moveEvent(QMoveEvent*) override;
    void showEvent(QShowEvent*) override;
    void hideEvent(QHideEvent*) override;
signals:
    void animationEnded();
    void geometryChanged();
    void geometrySettled();
    void visibilityChanged();
public slots:
    void updateColor(const QColor& c);
    void moveLeft();
    void moveRight();
    void moveUp();
    void moveDown();
    void resizeLeft();
    void resizeRight();
    void resizeUp();
    void resizeDown();
    void symResizeLeft();
    void symResizeRight();
    void symResizeUp();
    void symResizeDown();
private:
    void updateAreas();
    void updateCursor();
    void setGeometryByKeyboard(const QRect& r);
    QPropertyAnimation* m_animation;
    QColor m_color;
    QPoint m_areaOffset;
    QPoint m_handleOffset;
    QPoint m_dragStartPos;
    SideType m_activeSide;
    QCursor m_idleCentralCursor;
    bool m_ignoreMouse;
    bool m_mouseStartMove;
    // naming convention for handles
    // T top, B bottom, R Right, L left
    // 2 letters: a corner
    // 1 letter: the handle on the middle of the corresponding side
    QRect m_TLHandle, m_TRHandle, m_BLHandle, m_BRHandle;
    QRect m_LHandle, m_THandle, m_RHandle, m_BHandle;
    QRect m_TLArea, m_TRArea, m_BLArea, m_BRArea;
    QRect m_LArea, m_TArea, m_RArea, m_BArea;
};