File indexing completed on 2024-04-14 04:47:21
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 };