Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutitemlabel.h 3 : : ------------------- 4 : : begin : October 2017 5 : : copyright : (C) 2017 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : #ifndef QGSLAYOUTITEMLABEL_H 18 : : #define QGSLAYOUTITEMLABEL_H 19 : : 20 : : #include "qgis_core.h" 21 : : #include "qgslayoutitem.h" 22 : : #include "qgswebpage.h" 23 : : #include <QFont> 24 : : #include <QUrl> 25 : : 26 : : class QgsVectorLayer; 27 : : class QgsFeature; 28 : : class QgsDistanceArea; 29 : : 30 : : /** 31 : : * \ingroup core 32 : : * \brief A layout item subclass for text labels. 33 : : * \since QGIS 3.0 34 : : */ 35 : : class CORE_EXPORT QgsLayoutItemLabel: public QgsLayoutItem 36 : : { 37 : 0 : Q_OBJECT 38 : : 39 : : public: 40 : : 41 : : //! Label modes 42 : : enum Mode 43 : : { 44 : : ModeFont, //!< Label displays text rendered using a single font 45 : : ModeHtml, //!< Label displays rendered HTML content 46 : : }; 47 : : 48 : : /** 49 : : * Constructor for QgsLayoutItemLabel, with the specified parent \a layout. 50 : : */ 51 : : QgsLayoutItemLabel( QgsLayout *layout ); 52 : : 53 : : /** 54 : : * Returns a new label item for the specified \a layout. 55 : : * 56 : : * The caller takes responsibility for deleting the returned object. 57 : : */ 58 : : static QgsLayoutItemLabel *create( QgsLayout *layout ) SIP_FACTORY; 59 : : 60 : : int type() const override; 61 : : QIcon icon() const override; 62 : : //Overridden to contain part of label's text 63 : : QString displayName() const override; 64 : : 65 : : /** 66 : : * Resizes the item so that the label's text fits to the item. Keeps the top left point stationary. 67 : : * \see sizeForText() 68 : : */ 69 : : void adjustSizeToText(); 70 : : 71 : : /** 72 : : * Returns the required item size (in layout units) for the label's text to fill the item. 73 : : * \see adjustSizeToText() 74 : : */ 75 : : QSizeF sizeForText() const; 76 : : 77 : : /** 78 : : * Returns the label's preset text. 79 : : * \see currentText() 80 : : * \see setText() 81 : : */ 82 : : QString text() const { return mText; } 83 : : 84 : : /** 85 : : * Sets the label's preset \a text. 86 : : * \see text() 87 : : */ 88 : : void setText( const QString &text ); 89 : : 90 : : /** 91 : : * Returns the text as it appears on the label (with evaluated expressions 92 : : * and other dynamic content). 93 : : * \see text() 94 : : */ 95 : : QString currentText() const; 96 : : 97 : : /** 98 : : * Returns the label's current mode. 99 : : * \see setMode() 100 : : */ 101 : : Mode mode() const { return mMode; } 102 : : 103 : : /** 104 : : * Sets the label's current \a mode, allowing the label 105 : : * to switch between font based and HTML based rendering. 106 : : * \see mode() 107 : : */ 108 : : void setMode( Mode mode ); 109 : : 110 : : /** 111 : : * Returns the label's current font. 112 : : * \see setFont() 113 : : */ 114 : : QFont font() const; 115 : : 116 : : /** 117 : : * Sets the label's current \a font. 118 : : * \see font() 119 : : */ 120 : : void setFont( const QFont &font ); 121 : : 122 : : /** 123 : : * Returns for the vertical alignment of the label. 124 : : * \see setVAlign() 125 : : * \see hAlign() 126 : : */ 127 : : Qt::AlignmentFlag vAlign() const { return mVAlignment; } 128 : : 129 : : /** 130 : : * Returns the horizontal alignment of the label. 131 : : * \see vAlign() 132 : : * \see setHAlign() 133 : : */ 134 : : Qt::AlignmentFlag hAlign() const { return mHAlignment; } 135 : : 136 : : /** 137 : : * Sets the horizontal \a alignment of the label. 138 : : * \see hAlign() 139 : : * \see setVAlign() 140 : : */ 141 : 0 : void setHAlign( Qt::AlignmentFlag alignment ) { mHAlignment = alignment; } 142 : : 143 : : /** 144 : : * Sets for the vertical \a alignment of the label. 145 : : * \see vAlign() 146 : : * \see setHAlign() 147 : : */ 148 : 0 : void setVAlign( Qt::AlignmentFlag alignment ) { mVAlignment = alignment; } 149 : : 150 : : /** 151 : : * Returns the horizontal margin between the edge of the frame and the label 152 : : * contents, in layout units. 153 : : * \see setMargin() 154 : : * \see marginY() 155 : : */ 156 : : double marginX() const { return mMarginX; } 157 : : 158 : : /** 159 : : * Returns the vertical margin between the edge of the frame and the label 160 : : * contents, in layout units. 161 : : * \see setMargin() 162 : : * \see marginX() 163 : : */ 164 : : double marginY() const { return mMarginY; } 165 : : 166 : : /** 167 : : * Sets the \a margin between the edge of the frame and the label contents. 168 : : * This method sets both the horizontal and vertical margins to the same 169 : : * value. The margins can be individually controlled using the setMarginX() 170 : : * and setMarginY() methods. 171 : : * 172 : : * Margins are set using the current layout units. 173 : : 174 : : * \see setMarginX() 175 : : * \see setMarginY() 176 : : */ 177 : : void setMargin( double margin ); 178 : : 179 : : /** 180 : : * Sets the horizontal \a margin between the edge of the frame and the label 181 : : * contents, in layout units. 182 : : * \see setMargin() 183 : : * \see setMarginY() 184 : : */ 185 : : void setMarginX( double margin ); 186 : : 187 : : /** 188 : : * Sets the vertical \a margin between the edge of the frame and the label 189 : : * contents, in layout units. 190 : : * \see setMargin() 191 : : * \see setMarginX() 192 : : */ 193 : : void setMarginY( double margin ); 194 : : 195 : : /** 196 : : * Sets the label font \a color. 197 : : * \see fontColor() 198 : : */ 199 : 0 : void setFontColor( const QColor &color ) { mFontColor = color; } 200 : : 201 : : /** 202 : : * Returns the label font color. 203 : : * \see setFontColor() 204 : : */ 205 : : QColor fontColor() const { return mFontColor; } 206 : : 207 : : // In case of negative margins, the bounding rect may be larger than the 208 : : // label's frame 209 : : QRectF boundingRect() const override; 210 : : 211 : : // Reimplemented to call prepareGeometryChange after toggling frame 212 : : void setFrameEnabled( bool drawFrame ) override; 213 : : 214 : : // Reimplemented to call prepareGeometryChange after changing stroke width 215 : : void setFrameStrokeWidth( QgsLayoutMeasurement strokeWidth ) override; 216 : : 217 : : public slots: 218 : : 219 : : void refresh() override; 220 : : 221 : : protected: 222 : : void draw( QgsLayoutItemRenderContext &context ) override; 223 : : bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override; 224 : : bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context ) override; 225 : : 226 : : private slots: 227 : : 228 : : //! Track when QWebPage has finished loading its html contents 229 : : void loadingHtmlFinished( bool ); 230 : : 231 : : void refreshExpressionContext(); 232 : : 233 : : private: 234 : : bool mFirstRender = true; 235 : : 236 : : // Text 237 : : QString mText; 238 : : 239 : : Mode mMode = ModeFont; 240 : : double mHtmlUnitsToLayoutUnits = 1.0; 241 : : double htmlUnitsToLayoutUnits(); //calculate scale factor 242 : : bool mHtmlLoaded = false; 243 : : 244 : : //! Helper function to calculate x/y shift for adjustSizeToText() depending on rotation, current size and alignment 245 : : void itemShiftAdjustSize( double newWidth, double newHeight, double &xShift, double &yShift ) const; 246 : : 247 : : //! Called when the content is changed to handle HTML loading 248 : : void contentChanged(); 249 : : 250 : : //! Font 251 : : QFont mFont; 252 : : 253 : : //! Horizontal margin between contents and frame (in mm) 254 : : double mMarginX = 0.0; 255 : : //! Vertical margin between contents and frame (in mm) 256 : : double mMarginY = 0.0; 257 : : 258 : : //! Font color 259 : : QColor mFontColor = QColor( 0, 0, 0 ); 260 : : 261 : : //! Horizontal Alignment 262 : : Qt::AlignmentFlag mHAlignment = Qt::AlignJustify; 263 : : 264 : : //! Vertical Alignment 265 : : Qt::AlignmentFlag mVAlignment = Qt::AlignTop; 266 : : 267 : : //! Replaces replace '$CURRENT_DATE<(FORMAT)>' with the current date (e.g. $CURRENT_DATE(d 'June' yyyy) 268 : : void replaceDateText( QString &text ) const; 269 : : 270 : : //! Creates an encoded stylesheet url using the current font and label appearance settings 271 : : QUrl createStylesheetUrl() const; 272 : : 273 : : std::unique_ptr< QgsDistanceArea > mDistanceArea; 274 : : 275 : : std::unique_ptr< QgsWebPage > mWebPage; 276 : : }; 277 : : 278 : : #endif //QGSLAYOUTITEMLABEL_H