Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutitempolyline.h 3 : : begin : March 2016 4 : : copyright : (C) 2016 Paul Blottiere, Oslandia 5 : : email : paul dot blottiere at oslandia dot com 6 : : ***************************************************************************/ 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 QGSLAYOUTITEMPOLYLINE_H 18 : : #define QGSLAYOUTITEMPOLYLINE_H 19 : : 20 : : #include "qgis_core.h" 21 : : #include "qgslayoutitemnodeitem.h" 22 : : #include "qgssymbol.h" 23 : : #include <QGraphicsPathItem> 24 : : #include "qgslogger.h" 25 : : #include "qgslayout.h" 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \brief Layout item for node based polyline shapes. 30 : : * \since QGIS 3.0 31 : : */ 32 : : class CORE_EXPORT QgsLayoutItemPolyline: public QgsLayoutNodesItem 33 : : { 34 : 0 : Q_OBJECT 35 : : 36 : : public: 37 : : 38 : : //! Vertex marker mode 39 : : enum MarkerMode 40 : : { 41 : : NoMarker, //!< Don't show marker 42 : : ArrowHead, //!< Show arrow marker 43 : : SvgMarker, //!< Show SVG marker 44 : : }; 45 : : 46 : : /** 47 : : * Constructor for QgsLayoutItemPolyline for the specified \a layout. 48 : : */ 49 : : QgsLayoutItemPolyline( QgsLayout *layout ); 50 : : 51 : : /** 52 : : * Constructor for QgsLayoutItemPolyline for the specified \a polyline 53 : : * and \a layout. 54 : : */ 55 : : QgsLayoutItemPolyline( const QPolygonF &polyline, QgsLayout *layout ); 56 : : 57 : : /** 58 : : * Returns a new polyline item for the specified \a layout. 59 : : * 60 : : * The caller takes responsibility for deleting the returned object. 61 : : */ 62 : : static QgsLayoutItemPolyline *create( QgsLayout *layout ) SIP_FACTORY; 63 : : 64 : : int type() const override; 65 : : QIcon icon() const override; 66 : : QString displayName() const override; 67 : : QPainterPath shape() const override; 68 : : 69 : : /** 70 : : * Returns the line symbol used to draw the shape. 71 : : * \see setSymbol() 72 : : */ 73 : : QgsLineSymbol *symbol() { return mPolylineStyleSymbol.get(); } 74 : : 75 : : /** 76 : : * Sets the \a symbol used to draw the shape. 77 : : * Ownership of \a symbol is not transferred. 78 : : * \see symbol() 79 : : */ 80 : : void setSymbol( QgsLineSymbol *symbol ); 81 : : 82 : : /** 83 : : * Returns the start marker mode, which controls what marker is drawn at the start of the line. 84 : : * \see setStartMarker() 85 : : * \see endMarker() 86 : : */ 87 : : MarkerMode startMarker() const { return mStartMarker; } 88 : : 89 : : /** 90 : : * Sets the start marker \a mode, which controls what marker is drawn at the start of the line. 91 : : * \see startMarker() 92 : : * \see setEndMarker() 93 : : */ 94 : : void setStartMarker( MarkerMode mode ); 95 : : 96 : : /** 97 : : * Returns the end marker mode, which controls what marker is drawn at the end of the line. 98 : : * \see setEndMarker() 99 : : * \see startMarker() 100 : : */ 101 : : MarkerMode endMarker() const { return mEndMarker; } 102 : : 103 : : /** 104 : : * Sets the end marker \a mode, which controls what marker is drawn at the end of the line. 105 : : * \see endMarker() 106 : : * \see setStartMarker() 107 : : */ 108 : : void setEndMarker( MarkerMode mode ); 109 : : 110 : : /** 111 : : * Sets the \a width of line arrow heads in mm. 112 : : * \see arrowHeadWidth() 113 : : */ 114 : : void setArrowHeadWidth( double width ); 115 : : 116 : : /** 117 : : * Returns the width of line arrow heads in mm. 118 : : * \see setArrowHeadWidth() 119 : : */ 120 : : double arrowHeadWidth() const { return mArrowHeadWidth; } 121 : : 122 : : /** 123 : : * Sets the \a path to a SVG marker to draw at the start of the line. 124 : : * \see startSvgMarkerPath() 125 : : * \see setEndSvgMarkerPath() 126 : : */ 127 : : void setStartSvgMarkerPath( const QString &path ); 128 : : 129 : : /** 130 : : * Returns the path the an SVG marker drawn at the start of the line. 131 : : * \see setStartSvgMarkerPath() 132 : : * \see endSvgMarkerPath 133 : : */ 134 : : QString startSvgMarkerPath() const { return mStartMarkerFile; } 135 : : 136 : : /** 137 : : * Sets the \a path to a SVG marker to draw at the end of the line. 138 : : * \see endSvgMarkerPath() 139 : : * \see setStartSvgMarkerPath() 140 : : */ 141 : : void setEndSvgMarkerPath( const QString &path ); 142 : : 143 : : /** 144 : : * Returns the path the an SVG marker drawn at the end of the line. 145 : : * \see setEndSvgMarkerPath() 146 : : * \see startSvgMarkerPath 147 : : */ 148 : : QString endSvgMarkerPath() const { return mEndMarkerFile; } 149 : : 150 : : /** 151 : : * Returns the color used to draw the stroke around the the arrow head. 152 : : * \see arrowHeadFillColor() 153 : : * \see setArrowHeadStrokeColor() 154 : : */ 155 : : QColor arrowHeadStrokeColor() const { return mArrowHeadStrokeColor; } 156 : : 157 : : /** 158 : : * Sets the \a color used to draw the stroke around the arrow head. 159 : : * \see setArrowHeadFillColor() 160 : : * \see arrowHeadStrokeColor() 161 : : */ 162 : : void setArrowHeadStrokeColor( const QColor &color ); 163 : : 164 : : /** 165 : : * Returns the color used to fill the arrow head. 166 : : * \see arrowHeadStrokeColor() 167 : : * \see setArrowHeadFillColor() 168 : : */ 169 : : QColor arrowHeadFillColor() const { return mArrowHeadFillColor; } 170 : : 171 : : /** 172 : : * Sets the \a color used to fill the arrow head. 173 : : * \see arrowHeadFillColor() 174 : : * \see setArrowHeadStrokeColor() 175 : : */ 176 : : void setArrowHeadFillColor( const QColor &color ); 177 : : 178 : : /** 179 : : * Sets the pen \a width in millimeters for the stroke of the arrow head 180 : : * \see arrowHeadStrokeWidth() 181 : : * \see setArrowHeadStrokeColor() 182 : : */ 183 : : void setArrowHeadStrokeWidth( double width ); 184 : : 185 : : /** 186 : : * Returns the pen width in millimeters for the stroke of the arrow head. 187 : : * \see setArrowHeadStrokeWidth() 188 : : * \see arrowHeadStrokeColor() 189 : : */ 190 : : double arrowHeadStrokeWidth() const { return mArrowHeadStrokeWidth; } 191 : : 192 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const override; 193 : : 194 : : protected: 195 : : 196 : : bool _addNode( int indexPoint, QPointF newPoint, double radius ) override; 197 : : bool _removeNode( int nodeIndex ) override; 198 : : void _draw( QgsLayoutItemRenderContext &context, const QStyleOptionGraphicsItem *itemStyle = nullptr ) override; 199 : : void _readXmlStyle( const QDomElement &elmt, const QgsReadWriteContext &context ) override; 200 : : void _writeXmlStyle( QDomDocument &doc, QDomElement &elmt, const QgsReadWriteContext &context ) const override; 201 : : bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override; 202 : : bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context ) override; 203 : : 204 : : protected slots: 205 : : 206 : : void updateBoundingRect() override; 207 : : 208 : : private: 209 : : 210 : : //! QgsSymbol use to draw the shape. 211 : : std::unique_ptr<QgsLineSymbol> mPolylineStyleSymbol; 212 : : 213 : : //! Marker to show at start of line 214 : : MarkerMode mStartMarker = NoMarker; 215 : : //! Marker to show at end of line 216 : : MarkerMode mEndMarker = NoMarker; 217 : : 218 : : //! Width of the arrow marker in mm. The height is automatically adapted. 219 : : double mArrowHeadWidth = 4.0; 220 : : 221 : : //! Height of the arrow marker in mm. Is calculated from arrow marker width and aspect ratio of svg 222 : : double mStartArrowHeadHeight = 0.0; 223 : : 224 : : //! Height of the arrow marker in mm. Is calculated from arrow marker width and aspect ratio of svg 225 : : double mEndArrowHeadHeight = 0.0; 226 : : 227 : : //! Path to the start marker file 228 : : QString mStartMarkerFile; 229 : : 230 : : //! Path to the end marker file 231 : : QString mEndMarkerFile; 232 : : 233 : : //! Arrow head stroke width, in mm 234 : : double mArrowHeadStrokeWidth = 1.0; 235 : : 236 : : QColor mArrowHeadStrokeColor = Qt::black; 237 : : QColor mArrowHeadFillColor = Qt::black; 238 : : 239 : : //! Create a default symbol. 240 : : void createDefaultPolylineStyleSymbol(); 241 : : 242 : : /** 243 : : * Should be called after the shape's symbol is changed. Redraws the shape and recalculates 244 : : * its selection bounds. 245 : : */ 246 : : void refreshSymbol(); 247 : : 248 : : void drawStartMarker( QPainter *painter ); 249 : : void drawEndMarker( QPainter *painter ); 250 : : 251 : : void drawArrow( QPainter *painter, QPointF center, double angle ); 252 : : 253 : : void updateMarkerSvgSizes(); 254 : : 255 : : /** 256 : : * Draws an arrow head on to a QPainter. 257 : : * \param p destination painter 258 : : * \param x x-coordinate of arrow center 259 : : * \param y y-coordinate of arrow center 260 : : * \param angle angle in degrees which arrow should point toward, measured 261 : : * clockwise from pointing vertical upward 262 : : * \param arrowHeadWidth size of arrow head 263 : : */ 264 : : static void drawArrowHead( QPainter *p, double x, double y, double angle, double arrowHeadWidth ); 265 : : void drawSvgMarker( QPainter *p, QPointF point, double angle, const QString &markerPath, double height ) const; 266 : : 267 : : double computeMarkerMargin() const; 268 : : 269 : : friend class TestQgsLayoutPolyline; 270 : : friend class QgsCompositionConverter; 271 : : 272 : : }; 273 : : 274 : : #endif // QGSLAYOUTITEMPOLYLINE_H 275 : :