Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgstextlabelfeature.h 3 : : --------------------- 4 : : begin : December 2015 5 : : copyright : (C) 2015 by Martin Dobias 6 : : email : wonder dot sk at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #ifndef QGSTEXTLABELFEATURE_H 16 : : #define QGSTEXTLABELFEATURE_H 17 : : 18 : : #define SIP_NO_FILE 19 : : 20 : : #include "qgslabelfeature.h" 21 : : #include "qgstextdocument.h" 22 : : #include "qgstextmetrics.h" 23 : : #include <optional> 24 : : 25 : : class QgsTextCharacterFormat; 26 : : 27 : : /** 28 : : * \ingroup core 29 : : * \brief Class that adds extra information to QgsLabelFeature for text labels 30 : : * 31 : : * \note not part of public API 32 : : */ 33 : : class QgsTextLabelFeature : public QgsLabelFeature 34 : : { 35 : : public: 36 : : //! Construct text label feature 37 : : QgsTextLabelFeature( QgsFeatureId id, geos::unique_ptr geometry, QSizeF size ); 38 : : 39 : : //! Clean up 40 : : ~QgsTextLabelFeature() override; 41 : : 42 : : /** 43 : : * Returns the text component corresponding to a specified label part 44 : : * \param partId Set to -1 for labels which are not broken into parts (e.g., non-curved labels), or the required 45 : : * part index for labels which are broken into parts (curved labels) 46 : : * \since QGIS 2.10 47 : : */ 48 : : QString text( int partId ) const; 49 : : 50 : : /** 51 : : * Returns the character format corresponding to the specified label part 52 : : * \param partId Set to the required part index for labels which are broken into parts (curved labels) 53 : : * 54 : : * This only returns valid formats for curved label placements. 55 : : * 56 : : * \since QGIS 3.14 57 : : */ 58 : : QgsTextCharacterFormat characterFormat( int partId ) const; 59 : : 60 : : /** 61 : : * Returns TRUE if the feature contains specific character formatting for the part with matching ID. 62 : : * 63 : : * \since QGIS 3.14 64 : : */ 65 : : bool hasCharacterFormat( int partId ) const; 66 : : 67 : : //! Gets data-defined values 68 : 0 : const QMap< QgsPalLayerSettings::Property, QVariant > &dataDefinedValues() const { return mDataDefinedValues; } 69 : : //! Sets data-defined values 70 : 0 : void setDataDefinedValues( const QMap< QgsPalLayerSettings::Property, QVariant > &values ) { mDataDefinedValues = values; } 71 : : 72 : : //! Sets font to be used for rendering 73 : 0 : void setDefinedFont( const QFont &f ) { mDefinedFont = f; } 74 : : //! Font to be used for rendering 75 : 0 : QFont definedFont() { return mDefinedFont; } 76 : : 77 : : /** 78 : : * Metrics of the font for rendering. 79 : : * 80 : : * May be NULLPTR. 81 : : */ 82 : 0 : QFontMetricsF *labelFontMetrics() { return mFontMetrics.has_value() ? &mFontMetrics.value() : nullptr; } 83 : : 84 : : /** 85 : : * Sets the font \a metrics. 86 : : */ 87 : : void setFontMetrics( const QFontMetricsF &metrics ); 88 : : 89 : : /** 90 : : * Returns additional info required for curved label placement. 91 : : * 92 : : * Returns NULLPTR if not set. 93 : : * 94 : : * \see setTextMetrics() 95 : : * \since QGIS 3.20 96 : : */ 97 : 0 : const QgsPrecalculatedTextMetrics *textMetrics() const { return mTextMetrics.has_value() ? &mTextMetrics.value() : nullptr; } 98 : : 99 : : /** 100 : : * Sets additional text \a metrics required for curved label placement. 101 : : * 102 : : * \see textMetrics() 103 : : * \since QGIS 3.20 104 : : */ 105 : 0 : void setTextMetrics( const QgsPrecalculatedTextMetrics &metrics ) { mTextMetrics = metrics; } 106 : : 107 : : /** 108 : : * Calculate text metrics for later retrieval via textMetrics(). 109 : : * 110 : : * \since QGIS 3.20 111 : : */ 112 : : static QgsPrecalculatedTextMetrics calculateTextMetrics( const QgsMapToPixel *xform, const QFontMetricsF &fontMetrics, double letterSpacing, 113 : : double wordSpacing, const QString &text = QString(), QgsTextDocument *document = nullptr ); 114 : : 115 : : /** 116 : : * Returns the document for the label. 117 : : * \see setDocument() 118 : : * \since QGIS 3.14 119 : : */ 120 : : QgsTextDocument document() const; 121 : : 122 : : /** 123 : : * Sets the \a document for the label. 124 : : * \see document() 125 : : * \since QGIS 3.14 126 : : */ 127 : : void setDocument( const QgsTextDocument &document ); 128 : : 129 : : /** 130 : : * Sets the maximum \a angle (in radians) between inside curved label characters. 131 : : * \see maximumCharacterAngleInside() 132 : : * \see setMaximumCharacterAngleOutside() 133 : : * \since QGIS 3.20 134 : : */ 135 : 0 : void setMaximumCharacterAngleInside( double angle ) { mMaximumCharacterAngleInside = angle; } 136 : : 137 : : /** 138 : : * Returns the maximum angle (in radians) between inside curved label characters. 139 : : * \see setMaximumCharacterAngleInside() 140 : : * \see maximumCharacterAngleOutside() 141 : : * \since QGIS 3.20 142 : : */ 143 : 0 : double maximumCharacterAngleInside() const { return mMaximumCharacterAngleInside; } 144 : : 145 : : /** 146 : : * Sets the maximum \a angle (in radians) between outside curved label characters. 147 : : * \see maximumCharacterAngleOutside() 148 : : * \see setMaximumCharacterAngleInside() 149 : : * \since QGIS 3.20 150 : : */ 151 : 0 : void setMaximumCharacterAngleOutside( double angle ) { mMaximumCharacterAngleOutside = angle; } 152 : : 153 : : /** 154 : : * Returns the maximum angle (in radians) between outside curved label characters. 155 : : * \see setMaximumCharacterAngleOutside() 156 : : * \see maximumCharacterAngleInside() 157 : : * \since QGIS 3.20 158 : : */ 159 : 0 : double maximumCharacterAngleOutside() const { return mMaximumCharacterAngleOutside; } 160 : : 161 : : protected: 162 : : 163 : : //! Font for rendering 164 : : QFont mDefinedFont; 165 : : 166 : : //! Metrics of the font for rendering 167 : : std::optional< QFontMetricsF > mFontMetrics; 168 : : 169 : : //! Stores attribute values for data defined properties 170 : : QMap< QgsPalLayerSettings::Property, QVariant > mDataDefinedValues; 171 : : 172 : : QgsTextDocument mDocument; 173 : : 174 : : double mMaximumCharacterAngleInside = 0; 175 : : double mMaximumCharacterAngleOutside = 0; 176 : : 177 : : std::optional< QgsPrecalculatedTextMetrics > mTextMetrics; 178 : : 179 : : }; 180 : : 181 : : #endif //QGSTEXTLABELFEATURE_H