Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutitemshape.h 3 : : --------------------- 4 : : begin : July 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : /*************************************************************************** 9 : : * * 10 : : * This program is free software; you can redistribute it and/or modify * 11 : : * it under the terms of the GNU General Public License as published by * 12 : : * the Free Software Foundation; either version 2 of the License, or * 13 : : * (at your option) any later version. * 14 : : * * 15 : : ***************************************************************************/ 16 : : 17 : : #ifndef QGSLAYOUTITEMSHAPE_H 18 : : #define QGSLAYOUTITEMSHAPE_H 19 : : 20 : : #include "qgis_core.h" 21 : : #include "qgslayoutitem.h" 22 : : #include "qgslayoutitemregistry.h" 23 : : #include "qgssymbol.h" 24 : : #include "qgslayoutmeasurement.h" 25 : : 26 : : /** 27 : : * \ingroup core 28 : : * \class QgsLayoutItemShape 29 : : * \brief Layout item for basic filled shapes (e.g. rectangles, ellipses). 30 : : * \since QGIS 3.0 31 : : */ 32 : : class CORE_EXPORT QgsLayoutItemShape : public QgsLayoutItem 33 : : { 34 : 0 : Q_OBJECT 35 : : 36 : : public: 37 : : 38 : : //! Shape type 39 : : enum Shape 40 : : { 41 : : Ellipse, //!< Ellipse shape 42 : : Rectangle, //!< Rectangle shape 43 : : Triangle //!< Triangle shape 44 : : }; 45 : : 46 : : 47 : : /** 48 : : * Constructor for QgsLayoutItemShape, with the specified parent \a layout. 49 : : */ 50 : : explicit QgsLayoutItemShape( QgsLayout *layout ); 51 : : 52 : : /** 53 : : * Returns a new shape item for the specified \a layout. 54 : : * 55 : : * The caller takes responsibility for deleting the returned object. 56 : : */ 57 : : static QgsLayoutItemShape *create( QgsLayout *layout ) SIP_FACTORY; 58 : : 59 : : 60 : : int type() const override; 61 : : QIcon icon() const override; 62 : : 63 : : //Overridden to return shape type 64 : : QString displayName() const override; 65 : : QgsLayoutItem::Flags itemFlags() const override; 66 : : 67 : : /** 68 : : * Returns the type of shape (e.g. rectangle, ellipse, etc). 69 : : * \see setShapeType() 70 : : */ 71 : : QgsLayoutItemShape::Shape shapeType() const { return mShape; } 72 : : 73 : : /** 74 : : * Sets the \a type of shape (e.g. rectangle, ellipse, etc). 75 : : * \see shapeType() 76 : : */ 77 : : void setShapeType( QgsLayoutItemShape::Shape type ); 78 : : 79 : : /** 80 : : * Sets the fill \a symbol used to draw the shape. Ownership is not transferred 81 : : * and a clone of the symbol is made. 82 : : * \see symbol() 83 : : */ 84 : : void setSymbol( QgsFillSymbol *symbol ); 85 : : 86 : : /** 87 : : * Returns the fill symbol used to draw the shape. 88 : : * \see setSymbol() 89 : : */ 90 : 0 : QgsFillSymbol *symbol() { return mShapeStyleSymbol.get(); } 91 : : 92 : : /** 93 : : * Sets the corner \a radius for rounded rectangle corners. 94 : : * \see cornerRadius() 95 : : */ 96 : : void setCornerRadius( QgsLayoutMeasurement radius ); 97 : : 98 : : /** 99 : : * Returns the corner radius for rounded rectangle corners. 100 : : * \see setCornerRadius() 101 : : */ 102 : : QgsLayoutMeasurement cornerRadius() const { return mCornerRadius; } 103 : : 104 : : QgsGeometry clipPath() const override; 105 : : 106 : : // Depending on the symbol style, the bounding rectangle can be larger than the shape 107 : : QRectF boundingRect() const override; 108 : : 109 : : // Reimplement estimatedFrameBleed, since frames on shapes are drawn using symbology 110 : : // rather than the item's pen 111 : : double estimatedFrameBleed() const override; 112 : : 113 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const override; 114 : : 115 : : protected: 116 : : 117 : : void draw( QgsLayoutItemRenderContext &context ) override; 118 : : 119 : : bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override; 120 : : bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context ) override; 121 : : 122 : : private slots: 123 : : 124 : : /** 125 : : * Should be called after the shape's symbol is changed. Redraws the shape and recalculates 126 : : * its selection bounds. 127 : : */ 128 : : void refreshSymbol(); 129 : : 130 : : //! Updates the bounding rect of this item 131 : : void updateBoundingRect(); 132 : : 133 : : private: 134 : : 135 : : Shape mShape = Rectangle; 136 : : 137 : : std::unique_ptr< QgsFillSymbol > mShapeStyleSymbol; 138 : : 139 : : double mMaxSymbolBleed = 0.0; 140 : : //! Current bounding rectangle of shape 141 : : QRectF mCurrentRectangle; 142 : : 143 : : QgsLayoutMeasurement mCornerRadius; 144 : : 145 : : QPolygonF calculatePolygon( double scale ) const; 146 : : }; 147 : : 148 : : 149 : : #endif //QGSLAYOUTITEMSHAPE_H