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 : : * Clipping behavior for line anchor calculation. 64 : : * 65 : : * \since QGIS 3.20 66 : : */ 67 : : enum class AnchorClipping : int 68 : : { 69 : : UseVisiblePartsOfLine, //!< Only visible parts of lines are considered when calculating the line anchor for labels 70 : : UseEntireLine, //!< Entire original feature line geometry is used when calculating the line anchor for labels 71 : : }; 72 : : 73 : : /** 74 : : * Returns the line placement flags, which dictate how line labels can be placed 75 : : * above or below the lines. 76 : : * 77 : : * \see setPlacementFlags() 78 : : */ 79 : 0 : QgsLabeling::LinePlacementFlags placementFlags() const { return mPlacementFlags; } 80 : : 81 : : /** 82 : : * Returns the line placement \a flags, which dictate how line labels can be placed 83 : : * above or below the lines. 84 : : * 85 : : * \see placementFlags() 86 : : */ 87 : 0 : void setPlacementFlags( QgsLabeling::LinePlacementFlags flags ) { mPlacementFlags = flags; } 88 : : 89 : : /** 90 : : * Returns TRUE if connected line features with identical label text should be merged 91 : : * prior to generating label positions. 92 : : * 93 : : * \see setMergeLines() 94 : : */ 95 : 0 : bool mergeLines() const { return mMergeLines; } 96 : : 97 : : /** 98 : : * Sets whether connected line features with identical label text should be merged 99 : : * prior to generating label positions. 100 : : * 101 : : * \see mergeLines() 102 : : */ 103 : 0 : void setMergeLines( bool merge ) { mMergeLines = merge; } 104 : : 105 : : /** 106 : : * Updates the thinning settings to respect any data defined properties 107 : : * set within the specified \a properties collection. 108 : : */ 109 : : void updateDataDefinedProperties( const QgsPropertyCollection &properties, QgsExpressionContext &context ); 110 : : 111 : : /** 112 : : * Returns TRUE if '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) 113 : : * will be automatically added to the label text, pointing in the 114 : : * direction of the line or polygon ring. 115 : : * 116 : : * \see setAddDirectionSymbol() 117 : : * \see leftDirectionSymbol() 118 : : * \see rightDirectionSymbol() 119 : : * \see directionSymbolPlacement() 120 : : * \see reverseDirectionSymbol() 121 : : */ 122 : 0 : bool addDirectionSymbol() const { return mAddDirectionSymbol; } 123 : : 124 : : /** 125 : : * Sets whether '<' or '>' (or custom strings set via leftDirectionSymbol and rightDirectionSymbol) 126 : : * will be automatically added to the label text, pointing in the 127 : : * direction of the line or polygon ring. 128 : : * 129 : : * \see addDirectionSymbol() 130 : : * \see setLeftDirectionSymbol() 131 : : * \see setRightDirectionSymbol() 132 : : * \see setDirectionSymbolPlacement() 133 : : * \see setReverseDirectionSymbol() 134 : : */ 135 : 0 : void setAddDirectionSymbol( bool enabled ) { mAddDirectionSymbol = enabled; } 136 : : 137 : : /** 138 : : * Returns the string to use for left direction arrows. 139 : : * 140 : : * \see setLeftDirectionSymbol() 141 : : * \see addDirectionSymbol() 142 : : * \see rightDirectionSymbol() 143 : : */ 144 : 0 : QString leftDirectionSymbol() const { return mLeftDirectionSymbol; } 145 : : 146 : : /** 147 : : * Sets the string to use for left direction arrows. 148 : : * 149 : : * \see leftDirectionSymbol() 150 : : * \see addDirectionSymbol() 151 : : * \see rightDirectionSymbol() 152 : : */ 153 : 0 : void setLeftDirectionSymbol( const QString &symbol ) { mLeftDirectionSymbol = symbol; } 154 : : 155 : : /** 156 : : * Returns the string to use for right direction arrows. 157 : : * 158 : : * \see setRightDirectionSymbol() 159 : : * \see addDirectionSymbol() 160 : : * \see leftDirectionSymbol() 161 : : */ 162 : 0 : QString rightDirectionSymbol() const { return mRightDirectionSymbol; } 163 : : 164 : : /** 165 : : * Sets the string to use for right direction arrows. 166 : : * 167 : : * \see setLeftDirectionSymbol() 168 : : * \see addDirectionSymbol() 169 : : * \see rightDirectionSymbol() 170 : : */ 171 : 0 : void setRightDirectionSymbol( const QString &symbol ) { mRightDirectionSymbol = symbol; } 172 : : 173 : : /** 174 : : * Returns TRUE if direction symbols should be reversed. 175 : : * 176 : : * \see setReverseDirectionSymbol() 177 : : */ 178 : 0 : bool reverseDirectionSymbol() const { return mReverseDirectionSymbol; } 179 : : 180 : : /** 181 : : * Sets whether the direction symbols should be \a reversed. 182 : : * 183 : : * \see reverseDirectionSymbol() 184 : : */ 185 : 0 : void setReverseDirectionSymbol( bool reversed ) { mReverseDirectionSymbol = reversed; } 186 : : 187 : : /** 188 : : * Returns the placement for direction symbols. 189 : : * 190 : : * This setting controls whether to place direction symbols to the left/right, above or below label. 191 : : * 192 : : * \see setDirectionSymbolPlacement() 193 : : * \see addDirectionSymbol() 194 : : */ 195 : 0 : DirectionSymbolPlacement directionSymbolPlacement() const { return mPlaceDirectionSymbol; } 196 : : 197 : : /** 198 : : * Sets the \a placement for direction symbols. 199 : : * 200 : : * This setting controls whether to place direction symbols to the left/right, above or below label. 201 : : * 202 : : * \see directionSymbolPlacement() 203 : : * \see addDirectionSymbol() 204 : : */ 205 : 0 : void setDirectionSymbolPlacement( DirectionSymbolPlacement placement ) { mPlaceDirectionSymbol = placement; } 206 : : 207 : : /** 208 : : * Returns the distance which labels are allowed to overrun past the start or end of line features. 209 : : * \see setOverrunDistance() 210 : : * \see overrunDistanceUnit() 211 : : * \see overrunDistanceMapUnitScale() 212 : : */ 213 : 0 : double overrunDistance() const { return mOverrunDistance; } 214 : : 215 : : /** 216 : : * Sets the \a distance which labels are allowed to overrun past the start or end of line features. 217 : : * \see overrunDistance() 218 : : * \see overrunDistanceUnit() 219 : : * \see overrunDistanceMapUnitScale() 220 : : */ 221 : 0 : void setOverrunDistance( double distance ) { mOverrunDistance = distance; } 222 : : 223 : : /** 224 : : * Returns the units for label overrun distance. 225 : : * \see setOverrunDistanceUnit() 226 : : * \see overrunDistance() 227 : : * \see overrunDistanceMapUnitScale() 228 : : */ 229 : 0 : QgsUnitTypes::RenderUnit overrunDistanceUnit() const {return mOverrunDistanceUnit; } 230 : : 231 : : /** 232 : : * Sets the \a unit for label overrun distance. 233 : : * \see overrunDistanceUnit() 234 : : * \see overrunDistance() 235 : : * \see overrunDistanceMapUnitScale() 236 : : */ 237 : 0 : void setOverrunDistanceUnit( const QgsUnitTypes::RenderUnit &unit ) { mOverrunDistanceUnit = unit;} 238 : : 239 : : /** 240 : : * Returns the map unit scale for label overrun distance. 241 : : * \see setOverrunDistanceMapUnitScale() 242 : : * \see overrunDistance() 243 : : * \see overrunDistanceUnit() 244 : : */ 245 : 0 : QgsMapUnitScale overrunDistanceMapUnitScale() const { return mOverrunDistanceMapUnitScale; } 246 : : 247 : : /** 248 : : * Sets the map unit \a scale for label overrun distance. 249 : : * \see overrunDistanceMapUnitScale() 250 : : * \see overrunDistance() 251 : : * \see overrunDistanceUnit() 252 : : */ 253 : 0 : void setOverrunDistanceMapUnitScale( const QgsMapUnitScale &scale ) { mOverrunDistanceMapUnitScale = scale; } 254 : : 255 : : /** 256 : : * Returns the percent along the line at which labels should be placed. 257 : : * 258 : : * By default, this is 0.5 which indicates that labels should be placed as close to the 259 : : * center of the line as possible. A value of 0.0 indicates that the labels should be placed 260 : : * as close to the start of the line as possible, while a value of 1.0 pushes labels towards 261 : : * the end of the line. 262 : : * 263 : : * \see setLineAnchorPercent() 264 : : * \see anchorType() 265 : : * \see anchorClipping() 266 : : */ 267 : 0 : double lineAnchorPercent() const { return mLineAnchorPercent; } 268 : : 269 : : /** 270 : : * Sets the \a percent along the line at which labels should be placed. 271 : : * 272 : : * By default, this is 0.5 which indicates that labels should be placed as close to the 273 : : * center of the line as possible. A value of 0.0 indicates that the labels should be placed 274 : : * as close to the start of the line as possible, while a value of 1.0 pushes labels towards 275 : : * the end of the line. 276 : : * 277 : : * \see lineAnchorPercent() 278 : : * \see setAnchorType() 279 : : * \see setAnchorClipping() 280 : : */ 281 : 0 : void setLineAnchorPercent( double percent ) { mLineAnchorPercent = percent; } 282 : : 283 : : /** 284 : : * Returns the line anchor type, which dictates how the lineAnchorPercent() setting is 285 : : * handled. 286 : : * 287 : : * \see setAnchorType() 288 : : * \see lineAnchorPercent() 289 : : * \see anchorClipping() 290 : : */ 291 : 0 : AnchorType anchorType() const { return mAnchorType; } 292 : : 293 : : /** 294 : : * Sets the line anchor \a type, which dictates how the lineAnchorPercent() setting is 295 : : * handled. 296 : : * 297 : : * \see anchorType() 298 : : * \see setLineAnchorPercent() 299 : : * \see setAnchorClipping() 300 : : */ 301 : 0 : void setAnchorType( AnchorType type ) { mAnchorType = type; } 302 : : 303 : : /** 304 : : * Returns the line anchor clipping mode, which dictates how line strings are clipped 305 : : * before calculating the line anchor placement. 306 : : * 307 : : * \see setAnchorClipping() 308 : : * \see anchorType() 309 : : * \see lineAnchorPercent() 310 : : * 311 : : * \since QGIS 3.20 312 : : */ 313 : 0 : AnchorClipping anchorClipping() const { return mAnchorClipping; } 314 : : 315 : : /** 316 : : * Sets the line anchor \a clipping mode, which dictates how line strings are clipped 317 : : * before calculating the line anchor placement. 318 : : * 319 : : * \see anchorClipping() 320 : : * \see setAnchorType() 321 : : * \see setLineAnchorPercent() 322 : : * 323 : : * \since QGIS 3.20 324 : : */ 325 : 0 : void setAnchorClipping( AnchorClipping clipping ) { mAnchorClipping = clipping; } 326 : : 327 : : private: 328 : 0 : QgsLabeling::LinePlacementFlags mPlacementFlags = QgsLabeling::LinePlacementFlag::AboveLine | QgsLabeling::LinePlacementFlag::MapOrientation; 329 : 0 : bool mMergeLines = false; 330 : 0 : bool mAddDirectionSymbol = false; 331 : 0 : QString mLeftDirectionSymbol = QString( '<' ); 332 : 0 : QString mRightDirectionSymbol = QString( '>' ); 333 : 0 : bool mReverseDirectionSymbol = false; 334 : 0 : DirectionSymbolPlacement mPlaceDirectionSymbol = DirectionSymbolPlacement::SymbolLeftRight; 335 : 0 : double mOverrunDistance = 0; 336 : 0 : QgsUnitTypes::RenderUnit mOverrunDistanceUnit = QgsUnitTypes::RenderMillimeters; 337 : : QgsMapUnitScale mOverrunDistanceMapUnitScale; 338 : : 339 : 0 : double mLineAnchorPercent = 0.5; 340 : 0 : AnchorType mAnchorType = AnchorType::HintOnly; 341 : 0 : AnchorClipping mAnchorClipping = AnchorClipping::UseVisiblePartsOfLine; 342 : : }; 343 : : 344 : : #endif // QGSLABELLINESETTINGS_H