File indexing completed on 2024-04-28 08:44:49

0001 /*
0002     SPDX-FileCopyrightText: 2008 Marco Gittler <g.marco@freenet.de>
0003     SPDX-FileCopyrightText: 2008 Jean-Baptiste Mardelle <jb@kdenlive.org>
0004 
0005 SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006 */
0007 
0008 #pragma once
0009 
0010 #include <QGraphicsEffect>
0011 #include <QGraphicsScene>
0012 #include <QGraphicsSvgItem>
0013 #include <QGraphicsTextItem>
0014 
0015 enum resizeModes { NoResize = 0, TopLeft, BottomLeft, TopRight, BottomRight, Left, Right, Up, Down };
0016 enum TITLETOOL { TITLE_SELECT = 0, TITLE_RECTANGLE = 1, TITLE_TEXT = 2, TITLE_IMAGE = 3, TITLE_ELLIPSE = 4 };
0017 
0018 class MyQGraphicsEffect : public QGraphicsEffect
0019 {
0020 public:
0021     explicit MyQGraphicsEffect(QObject *parent = nullptr);
0022     void setOffset(int xOffset, int yOffset, int blur);
0023     void setShadow(const QImage &image);
0024 
0025 protected:
0026     void draw(QPainter *painter) override;
0027 
0028 private:
0029     int m_xOffset{0};
0030     int m_yOffset{0};
0031     int m_blur{0};
0032     QImage m_shadow;
0033 };
0034 
0035 class MyTextItem : public QGraphicsTextItem
0036 {
0037     Q_OBJECT
0038 public:
0039     MyTextItem(const QString& txt, QGraphicsItem* parent = nullptr);
0040     void setAlignment(Qt::Alignment alignment);
0041     /** @brief returns an extended bounding containing shadow */
0042     QRectF boundingRect() const override;
0043     /** @brief returns the normal bounding rect around text */
0044     QRectF baseBoundingRect() const;
0045     Qt::Alignment alignment() const;
0046     void updateShadow(bool enabled, int blur, int xoffset, int yoffset, QColor color);
0047     QStringList shadowInfo() const;
0048     void loadShadow(const QStringList &info);
0049     void updateTW(bool enabled, int step, int mode, int sigma, int seed);
0050     QStringList twInfo() const;
0051     void loadTW(const QStringList &info);
0052     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *evt) override;
0053     void setTextColor(const QColor &col);
0054 
0055 protected:
0056     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
0057     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *w) override;
0058 
0059 private:
0060     Qt::Alignment m_alignment;
0061     QPoint m_shadowOffset;
0062     int m_shadowBlur;
0063     QColor m_shadowColor;
0064     QPainterPath m_path;
0065     MyQGraphicsEffect *m_shadowEffect;
0066     void updateShadow();
0067     void blurShadow(QImage &image, int radius);
0068     void refreshFormat();
0069     bool m_tw_enabled;
0070     int m_tw_step;
0071     int m_tw_mode;
0072     int m_tw_sigma;
0073     int m_tw_seed;
0074 
0075 public Q_SLOTS:
0076     void doUpdateGeometry();
0077     void updateGeometry();
0078 };
0079 
0080 class MyRectItem : public QGraphicsRectItem
0081 {
0082 public:
0083     explicit MyRectItem(QGraphicsItem *parent = nullptr);
0084     void setRect(const QRectF &rectangle);
0085 
0086 protected:
0087     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
0088 
0089 private:
0090     QRectF m_rect;
0091 };
0092 
0093 class MyEllipseItem : public QGraphicsEllipseItem
0094 {
0095 public:
0096     explicit MyEllipseItem(QGraphicsItem *parent = nullptr);
0097     void setRect(const QRectF &rectangle);
0098 
0099 protected:
0100     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
0101 
0102 private:
0103     QRectF m_ellipse;
0104 };
0105 
0106 class MyPixmapItem : public QGraphicsPixmapItem
0107 {
0108 public:
0109     MyPixmapItem(const QPixmap &pixmap, QGraphicsItem *parent = nullptr);
0110 
0111 protected:
0112     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
0113 };
0114 
0115 class MySvgItem : public QGraphicsSvgItem
0116 {
0117 public:
0118     MySvgItem(const QString &fileName = QString(), QGraphicsItem *parent = nullptr);
0119 
0120 protected:
0121     QVariant itemChange(GraphicsItemChange change, const QVariant &value) override;
0122 };
0123 
0124 class GraphicsSceneRectMove : public QGraphicsScene
0125 {
0126     Q_OBJECT
0127 public:
0128     explicit GraphicsSceneRectMove(int titlerVersion, QObject *parent = nullptr);
0129     void setSelectedItem(QGraphicsItem *item);
0130     void setScale(double s);
0131     void setZoom(double s);
0132     void setTool(TITLETOOL tool);
0133     TITLETOOL tool() const;
0134     /** @brief Get out of text edit mode. If reset is true, we also unselect all items */
0135     void clearTextSelection(bool reset = true);
0136     int gridSize() const;
0137     void addNewItem(QGraphicsItem *item);
0138 
0139 public Q_SLOTS:
0140     void slotUpdateFontSize(int s);
0141     void slotUseGrid(bool enableGrid);
0142 
0143 protected:
0144     void keyPressEvent(QKeyEvent *keyEvent) override;
0145     void mousePressEvent(QGraphicsSceneMouseEvent *) override;
0146     void mouseReleaseEvent(QGraphicsSceneMouseEvent *) override;
0147     void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *e) override;
0148     /** @brief Resizes and moves items */
0149     void mouseMoveEvent(QGraphicsSceneMouseEvent *) override;
0150     void wheelEvent(QGraphicsSceneWheelEvent *wheelEvent) override;
0151     void drawForeground(QPainter *painter, const QRectF &rect) override;
0152     void contextMenuEvent(QGraphicsSceneContextMenuEvent *contextMenuEvent) override;
0153 
0154 private:
0155     void setCursor(const QCursor &);
0156     double m_zoom;
0157     QGraphicsItem *m_selectedItem{nullptr};
0158     resizeModes m_resizeMode{NoResize};
0159     resizeModes m_possibleAction{NoResize};
0160     QPointF m_sceneClickPoint;
0161     TITLETOOL m_tool{TITLE_RECTANGLE};
0162     QPointF m_clickPoint;
0163     int m_fontSize;
0164     int m_gridSize{20};
0165     bool m_createdText{false};
0166     bool m_moveStarted{false};
0167     bool m_pan{false};
0168 
0169 Q_SIGNALS:
0170     void itemMoved();
0171     void sceneZoom(bool);
0172     void newRect(QGraphicsRectItem *);
0173     void newEllipse(QGraphicsEllipseItem *);
0174     void newText(MyTextItem *);
0175     void actionFinished();
0176     void doubleClickEvent();
0177 };