Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslabellinesettings.h 3 : : -------------------------- 4 : : Date : August 2020 5 : : Copyright : (C) 2020 by Nyall Dawson 6 : : Email : nyall dot dawson 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 : : 16 : : #ifndef QGSLABELLINESETTINGS_H 17 : : #define QGSLABELLINESETTINGS_H 18 : : 19 : : #include "qgis_core.h" 20 : : #include "qgis_sip.h" 21 : : #include "qgslabeling.h" 22 : : #include "qgsunittypes.h" 23 : : #include "qgsmapunitscale.h" 24 : : #include <QString> 25 : : 26 : : class QgsPropertyCollection; 27 : : class QgsExpressionContext; 28 : : 29 : : /** 30 : : * \ingroup core 31 : : * \class QgsLabelLineSettings 32 : : * 33 : : * \brief Contains settings related to how the label engine places and formats 34 : : * labels for line features (or polygon features which are labeled in 35 : : * a "perimeter" style mode). 36 : : * 37 : : * \since QGIS 3.16 38 : : */ 39 : 0 : class CORE_EXPORT QgsLabelLineSettings 40 : : { 41 : : public: 42 : : 43 : : /** 44 : : * Placement options for direction symbols. 45 : : */ 46 : : enum class DirectionSymbolPlacement : int 47 : : { 48 : : SymbolLeftRight, //!< Place direction symbols on left/right of label 49 : : SymbolAbove, //!< Place direction symbols on above label 50 : : SymbolBelow //!< Place direction symbols on below label 51 : : }; 52 : : 53 : : /** 54 : : * Line anchor types 55 : : */ 56 : : enum class AnchorType : int 57 : : { 58 : : HintOnly, //!< Line anchor is a hint for preferred placement only, but other placements close to the hint are permitted 59 : : Strict, //!< Line anchor is a strict placement, and other placements are not permitted 60 : : }; 61 : : 62 : : /** 63 : : * Returns the line placement flags, which dictate how line labels can be placed 64 : : * above or below the lines. 65 : : * 66 : : * \see setPlacementFlags() 67 : : */ 68 : 0 : QgsLabeling::LinePlacementFlags placementFlags() const { return mPlacementFlags; } 69 : : 70 : : /** 71 : : * Returns the line placement \a flags, which dictate how line labels can be placed 72 : : * above or below the lines. 73 : : * 74 : : * \see placementFlags() 75 : : */ 76 : 0 : void setPlacementFlags( QgsLabeling::LinePlacementFlags flags ) { mPlacementFlags = flags; } 77 : : 78 : : /** 79 : : * Returns TRUE if connected line features with identical label text should be merged 80 : : * prior to generating label positions. 81 : : * 82 : : * \see setMergeLines() 83 : : */ 84 : 0 : bool mergeLines() const { return mMergeLines; } 85 : : 86 : : /** 87 : : * Sets whether connected line features with identical label text should be merged 88 : : * prior to generating label positions. 89 : : * 90 : : * \see mergeLines() 91 : : */ 92 : 0 : void setMergeLines( bool merge ) { mMergeLines = merge; } 93 : : 94 : : /** 95 : : * Updates the thinning settings to respect any data defined properties 96 : : * set within the specified \a properties collection. 97 : : */ 98 : : void updateDataDefinedProperties( const QgsPropertyCollection &properties, QgsExpressionContext &context ); 99 : : 100 : : /** 101 : : * Returns TRUE if '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) 102 : : * will be automatically added to the label text, pointing in the 103 : : * direction of the line or polygon ring. 104 : : * 105 : : * \see setAddDirectionSymbol() 106 : : * \see leftDirectionSymbol() 107 : : * \see rightDirectionSymbol() 108 : : * \see directionSymbolPlacement() 109 : : * \see reverseDirectionSymbol() 110 : : */ 111 : 0 : bool addDirectionSymbol() const { return mAddDirectionSymbol; } 112 : : 113 : : /** 114 : : * Sets whether '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) 115 : : * will be automatically added to the label text, pointing in the 116 : : * direction of the line or polygon ring. 117 : : * 118 : : * \see addDirectionSymbol() 119 : : * \see setLeftDirectionSymbol() 120 : : * \see setRightDirectionSymbol() 121 : : * \see setDirectionSymbolPlacement() 122 : : * \see setReverseDirectionSymbol() 123 : : */ 124 : 0 : void setAddDirectionSymbol( bool enabled ) { mAddDirectionSymbol = enabled; } 125 : : 126 : : /** 127 : : * Returns the string to use for left direction arrows. 128 : : * 129 : : * \see setLeftDirectionSymbol() 130 : : * \see addDirectionSymbol() 131 : : * \see rightDirectionSymbol() 132 : : */ 133 : 0 : QString leftDirectionSymbol() const { return mLeftDirectionSymbol; } 134 : : 135 : : /** 136 : : * Sets the string to use for left direction arrows. 137 : : * 138 : : * \see leftDirectionSymbol() 139 : : * \see addDirectionSymbol() 140 : : * \see rightDirectionSymbol() 141 : : */ 142 : 0 : void setLeftDirectionSymbol( const QString &symbol ) { mLeftDirectionSymbol = symbol; } 143 : : 144 : : /** 145 : : * Returns the string to use for right direction arrows. 146 : : * 147 : : * \see setRightDirectionSymbol() 148 : : * \see addDirectionSymbol() 149 : : * \see leftDirectionSymbol() 150 : : */ 151 : 0 : QString rightDirectionSymbol() const { return mRightDirectionSymbol; } 152 : : 153 : : /** 154 : : * Sets the string to use for right direction arrows. 155 : : * 156 : : * \see setLeftDirectionSymbol() 157 : : * \see addDirectionSymbol() 158 : : * \see rightDirectionSymbol() 159 : : */ 160 : 0 : void setRightDirectionSymbol( const QString &symbol ) { mRightDirectionSymbol = symbol; } 161 : : 162 : : /** 163 : : * Returns TRUE if direction symbols should be reversed. 164 : : * 165 : : * \see setReverseDirectionSymbol() 166 : : */ 167 : 0 : bool reverseDirectionSymbol() const { return mReverseDirectionSymbol; } 168 : : 169 : : /** 170 : : * Sets whether the direction symbols should be \a reversed. 171 : : * 172 : : * \see reverseDirectionSymbol() 173 : : */ 174 : 0 : void setReverseDirectionSymbol( bool reversed ) { mReverseDirectionSymbol = reversed; } 175 : : 176 : : /** 177 : : * Returns the placement for direction symbols. 178 : : * 179 : : * This setting controls whether to place direction symbols to the left/right, above or below label. 180 : : * 181 : : * \see setDirectionSymbolPlacement() 182 : : * \see addDirectionSymbol() 183 : : */ 184 : 0 : DirectionSymbolPlacement directionSymbolPlacement() const { return mPlaceDirectionSymbol; } 185 : : 186 : : /** 187 : : * Sets the \a placement for direction symbols. 188 : : * 189 : : * This setting controls whether to place direction symbols to the left/right, above or below label. 190 : : * 191 : : * \see directionSymbolPlacement() 192 : : * \see addDirectionSymbol() 193 : : */ 194 : 0 : void setDirectionSymbolPlacement( DirectionSymbolPlacement placement ) { mPlaceDirectionSymbol = placement; } 195 : : 196 : : /** 197 : : * Returns the distance which labels are allowed to overrun past the start or end of line features. 198 : : * \see setOverrunDistance() 199 : : * \see overrunDistanceUnit() 200 : : * \see overrunDistanceMapUnitScale() 201 : : */ 202 : 0 : double overrunDistance() const { return mOverrunDistance; } 203 : : 204 : : /** 205 : : * Sets the \a distance which labels are allowed to overrun past the start or end of line features. 206 : : * \see overrunDistance() 207 : : * \see overrunDistanceUnit() 208 : : * \see overrunDistanceMapUnitScale() 209 : : */ 210 : 0 : void setOverrunDistance( double distance ) { mOverrunDistance = distance; } 211 : : 212 : : /** 213 : : * Returns the units for label overrun distance. 214 : : * \see setOverrunDistanceUnit() 215 : : * \see overrunDistance() 216 : : * \see overrunDistanceMapUnitScale() 217 : : */ 218 : 0 : QgsUnitTypes::RenderUnit overrunDistanceUnit() const {return mOverrunDistanceUnit; } 219 : : 220 : : /** 221 : : * Sets the \a unit for label overrun distance. 222 : : * \see overrunDistanceUnit() 223 : : * \see overrunDistance() 224 : : * \see overrunDistanceMapUnitScale() 225 : : */ 226 : 0 : void setOverrunDistanceUnit( const QgsUnitTypes::RenderUnit &unit ) { mOverrunDistanceUnit = unit;} 227 : : 228 : : /** 229 : : * Returns the map unit scale for label overrun distance. 230 : : * \see setOverrunDistanceMapUnitScale() 231 : : * \see overrunDistance() 232 : : * \see overrunDistanceUnit() 233 : : */ 234 : 0 : QgsMapUnitScale overrunDistanceMapUnitScale() const { return mOverrunDistanceMapUnitScale; } 235 : : 236 : : /** 237 : : * Sets the map unit \a scale for label overrun distance. 238 : : * \see overrunDistanceMapUnitScale() 239 : : * \see overrunDistance() 240 : : * \see overrunDistanceUnit() 241 : : */ 242 : 0 : void setOverrunDistanceMapUnitScale( const QgsMapUnitScale &scale ) { mOverrunDistanceMapUnitScale = scale; } 243 : : 244 : : /** 245 : : * Returns the percent along the line at which labels should be placed. 246 : : * 247 : : * By default, this is 0.5 which indicates that labels should be placed as close to the 248 : : * center of the line as possible. A value of 0.0 indicates that the labels should be placed 249 : : * as close to the start of the line as possible, while a value of 1.0 pushes labels towards 250 : : * the end of the line. 251 : : * 252 : : * \see setLineAnchorPercent() 253 : : * \see anchorType() 254 : : */ 255 : 0 : double lineAnchorPercent() const { return mLineAnchorPercent; } 256 : : 257 : : /** 258 : : * Sets the \a percent along the line at which labels should be placed. 259 : : * 260 : : * By default, this is 0.5 which indicates that labels should be placed as close to the 261 : : * center of the line as possible. A value of 0.0 indicates that the labels should be placed 262 : : * as close to the start of the line as possible, while a value of 1.0 pushes labels towards 263 : : * the end of the line. 264 : : * 265 : : * \see lineAnchorPercent() 266 : : * \see setAnchorType() 267 : : */ 268 : 0 : void setLineAnchorPercent( double percent ) { mLineAnchorPercent = percent; } 269 : : 270 : : /** 271 : : * Returns the line anchor type, which dictates how the lineAnchorPercent() setting is 272 : : * handled. 273 : : * 274 : : * \see setAnchorType() 275 : : * \see lineAnchorPercent() 276 : : */ 277 : 0 : AnchorType anchorType() const { return mAnchorType; } 278 : : 279 : : /** 280 : : * Sets the line anchor \a type, which dictates how the lineAnchorPercent() setting is 281 : : * handled. 282 : : * 283 : : * \see anchorType() 284 : : * \see setLineAnchorPercent() 285 : : */ 286 : 0 : void setAnchorType( AnchorType type ) { mAnchorType = type; } 287 : : 288 : : private: 289 : 0 : QgsLabeling::LinePlacementFlags mPlacementFlags = QgsLabeling::LinePlacementFlag::AboveLine | QgsLabeling::LinePlacementFlag::MapOrientation; 290 : 0 : bool mMergeLines = false; 291 : 0 : bool mAddDirectionSymbol = false; 292 : 0 : QString mLeftDirectionSymbol = QString( '<' ); 293 : 0 : QString mRightDirectionSymbol = QString( '>' ); 294 : 0 : bool mReverseDirectionSymbol = false; 295 : 0 : DirectionSymbolPlacement mPlaceDirectionSymbol = DirectionSymbolPlacement::SymbolLeftRight; 296 : 0 : double mOverrunDistance = 0; 297 : 0 : QgsUnitTypes::RenderUnit mOverrunDistanceUnit = QgsUnitTypes::RenderMillimeters; 298 : : QgsMapUnitScale mOverrunDistanceMapUnitScale; 299 : : 300 : 0 : double mLineAnchorPercent = 0.5; 301 : 0 : AnchorType mAnchorType = AnchorType::HintOnly; 302 : : }; 303 : : 304 : : #endif // QGSLABELLINESETTINGS_H