Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsscalebarrenderer.h 3 : : --------------------- 4 : : begin : June 2008 5 : : copyright : (C) 2008 by Marco Hugentobler 6 : : email : marco.hugentobler@karto.baug.ethz.ch 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 QGSSCALEBARRENDERER_H 18 : : #define QGSSCALEBARRENDERER_H 19 : : 20 : : #include "qgis_core.h" 21 : : #include "qgis_sip.h" 22 : : #include <QRectF> 23 : : #include <QList> 24 : : 25 : : class QgsRenderContext; 26 : : class QgsScaleBarSettings; 27 : : 28 : : /** 29 : : * \ingroup core 30 : : * \class QgsScaleBarRenderer 31 : : * \brief Abstract base class for scale bar renderers. 32 : : * 33 : : * Scalebar renderer subclasses implement custom drawing logic, with the possibility to implement 34 : : * custom labeling. 35 : : * 36 : : * \since QGIS 3.0 37 : : */ 38 : 0 : class CORE_EXPORT QgsScaleBarRenderer 39 : : { 40 : : public: 41 : : 42 : : /** 43 : : * Flags which control scalebar renderer behavior. 44 : : * \since QGIS 3.14 45 : : */ 46 : : enum class Flag 47 : : { 48 : : FlagUsesLineSymbol = 1 << 0, //!< Renderer utilizes the scalebar line symbol (see QgsScaleBarSettings::lineSymbol() ) 49 : : FlagUsesFillSymbol = 1 << 1, //!< Renderer utilizes the scalebar fill symbol (see QgsScaleBarSettings::fillSymbol() ) 50 : : FlagUsesAlternateFillSymbol = 1 << 2, //!< Renderer utilizes the alternate scalebar fill symbol (see QgsScaleBarSettings::alternateFillSymbol() ) 51 : : FlagRespectsUnits = 1 << 3, //!< Renderer respects the QgsScaleBarSettings::units() setting 52 : : FlagRespectsMapUnitsPerScaleBarUnit = 1 << 4, //!< Renderer respects the QgsScaleBarSettings::mapUnitsPerScaleBarUnit() setting 53 : : FlagUsesUnitLabel = 1 << 5, //!< Renderer uses the QgsScaleBarSettings::unitLabel() setting 54 : : FlagUsesSegments = 1 << 6, //!< Renderer uses the scalebar segments 55 : : FlagUsesLabelBarSpace = 1 << 7, //!< Renderer uses the QgsScaleBarSettings::labelBarSpace() setting 56 : : FlagUsesLabelVerticalPlacement = 1 << 8, //!< Renderer uses the QgsScaleBarSettings::labelVerticalPlacement() setting 57 : : FlagUsesLabelHorizontalPlacement = 1 << 8, //!< Renderer uses the QgsScaleBarSettings::labelHorizontalPlacement() setting 58 : : FlagUsesAlignment = 1 << 9, //!< Renderer uses the QgsScaleBarSettings::alignment() setting 59 : : FlagUsesSubdivisions = 1 << 10, //!< Renderer uses the scalebar subdivisions (see QgsScaleBarSettings::numberOfSubdivisions() ) 60 : : FlagUsesDivisionSymbol = 1 << 11, //!< Renderer utilizes the scalebar division symbol (see QgsScaleBarSettings::divisionLineSymbol() ) 61 : : FlagUsesSubdivisionSymbol = 1 << 12, //!< Renderer utilizes the scalebar subdivision symbol (see QgsScaleBarSettings::subdivisionLineSymbol() ) 62 : : FlagUsesSubdivisionsHeight = 1 << 13, //!< Renderer uses the scalebar subdivisions height (see QgsScaleBarSettings::subdivisionsHeight() ) 63 : : }; 64 : : Q_DECLARE_FLAGS( Flags, Flag ) 65 : : 66 : : /** 67 : : * Contains parameters regarding scalebar calculations. 68 : : * \note The need to attribute the parameters vary depending on the targeted scalebar. 69 : : */ 70 : 0 : struct ScaleBarContext 71 : : { 72 : : 73 : : /** 74 : : * The width, in millimeters, of each individual segment drawn. 75 : : * \note The number of map units per segment needs to be set via QgsScaleBarSettings::setUnitsPerSegment. 76 : : */ 77 : 0 : double segmentWidth { 0.0 }; 78 : : 79 : : /** 80 : : * Destination size for scalebar. This is used for scalebars which 81 : : * alter their appearance or alignment based on the desired scalebar 82 : : * size (e.g. correctly aligning text in a numeric scale bar). 83 : : */ 84 : : QSizeF size; 85 : : 86 : : //! Scale denominator 87 : 0 : double scale { 1.0 }; 88 : : 89 : : //! Scalebar renderer flags 90 : : Flags flags; 91 : : 92 : : }; 93 : : 94 : : /** 95 : : * Constructor for QgsScaleBarRenderer. 96 : : */ 97 : 40 : QgsScaleBarRenderer() = default; 98 : 40 : virtual ~QgsScaleBarRenderer() = default; 99 : : 100 : : /** 101 : : * Returns the unique name for this style. 102 : : * \deprecated use id() instead 103 : : */ 104 : : Q_DECL_DEPRECATED QString name() const SIP_DEPRECATED { return id(); } 105 : : 106 : : /** 107 : : * Returns the unique ID for this renderer. 108 : : * \since QGIS 3.14 109 : : */ 110 : : virtual QString id() const = 0; 111 : : 112 : : /** 113 : : * Returns the user friendly, translated name for the renderer. 114 : : * \since QGIS 3.14 115 : : */ 116 : : virtual QString visibleName() const = 0; 117 : : 118 : : /** 119 : : * Returns the scalebar rendering flags, which dictates the renderer's behavior. 120 : : * 121 : : * \since QGIS 3.14 122 : : */ 123 : : virtual Flags flags() const; 124 : : 125 : : /** 126 : : * Returns a sorting key value, where renderers with a lower sort key will be shown earlier in lists. 127 : : * 128 : : * Generally, subclasses should return QgsScaleBarRenderer::sortKey() as their sorting key. 129 : : */ 130 : : virtual int sortKey() const; 131 : : 132 : : /** 133 : : * Returns a clone of the renderer. The caller takes ownership of the returned value. 134 : : */ 135 : : virtual QgsScaleBarRenderer *clone() const = 0 SIP_FACTORY; 136 : : 137 : : /** 138 : : * Draws the scalebar using the specified \a settings and \a scaleContext to a destination render \a context. 139 : : */ 140 : : virtual void draw( QgsRenderContext &context, 141 : : const QgsScaleBarSettings &settings, 142 : : const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const = 0; 143 : : 144 : : /** 145 : : * Calculates the required box size (in millimeters) for a scalebar using the specified \a settings and \a scaleContext. 146 : : * \deprecated Use the version with a QgsRenderContext instead. 147 : : */ 148 : : Q_DECL_DEPRECATED virtual QSizeF calculateBoxSize( const QgsScaleBarSettings &settings, 149 : : const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const SIP_DEPRECATED; 150 : : 151 : : /** 152 : : * Calculates the required box size (in millimeters) for a scalebar using the specified \a settings and \a scaleContext. 153 : : * 154 : : * \since QGIS 3.14 155 : : */ 156 : : virtual QSizeF calculateBoxSize( QgsRenderContext &context, 157 : : const QgsScaleBarSettings &settings, 158 : : const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const; 159 : : 160 : : /** 161 : : * Applies any default settings relating to the scalebar to the passed \a settings object. 162 : : * 163 : : * Returns TRUE if settings were applied. 164 : : * 165 : : * \since QGIS 3.14 166 : : */ 167 : : virtual bool applyDefaultSettings( QgsScaleBarSettings &settings ) const; 168 : : 169 : : protected: 170 : : 171 : : /** 172 : : * Draws default scalebar labels using the specified \a settings and \a scaleContext to a destination render \a context. 173 : : */ 174 : : void drawDefaultLabels( QgsRenderContext &context, 175 : : const QgsScaleBarSettings &settings, 176 : : const QgsScaleBarRenderer::ScaleBarContext &scaleContext ) const; 177 : : 178 : : /** 179 : : * Returns the text used for the first label in the scalebar. 180 : : */ 181 : : QString firstLabelString( const QgsScaleBarSettings &settings ) const; 182 : : 183 : : /** 184 : : * Returns the x-offset (in millimeters) used for the first label in the scalebar. 185 : : * \deprecated Use the version with QgsRenderContext instead. 186 : : */ 187 : : Q_DECL_DEPRECATED double firstLabelXOffset( const QgsScaleBarSettings &settings ) const SIP_DEPRECATED; 188 : : 189 : : /** 190 : : * Returns the x-offset (in render context painter units) used for the first label in the scalebar. 191 : : * \since QGIS 3.2 192 : : */ 193 : : double firstLabelXOffset( const QgsScaleBarSettings &settings, const QgsRenderContext &context, const ScaleBarContext &scaleContext ) const; 194 : : 195 : : /** 196 : : * Returns a list of positions for each segment within the scalebar. 197 : : * \deprecated use the version with a QgsRenderContext instead 198 : : */ 199 : : Q_DECL_DEPRECATED QList<double> segmentPositions( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const SIP_DEPRECATED; 200 : : 201 : : /** 202 : : * Returns a list of positions for each segment within the scalebar. 203 : : * \since QGIS 3.14 204 : : */ 205 : : QList<double> segmentPositions( QgsRenderContext &context, const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const; 206 : : 207 : : /** 208 : : * Returns a list of widths of each segment of the scalebar. 209 : : */ 210 : : QList<double> segmentWidths( const QgsScaleBarRenderer::ScaleBarContext &scaleContext, const QgsScaleBarSettings &settings ) const; 211 : : 212 : : }; 213 : : 214 : 0 : Q_DECLARE_OPERATORS_FOR_FLAGS( QgsScaleBarRenderer::Flags ) 215 : : 216 : : #endif //QGSSCALEBARRENDERER_H