Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutitemmapoverview.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 : : 18 : : #ifndef QgsLayoutItemMapOVERVIEW_H 19 : : #define QgsLayoutItemMapOVERVIEW_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgis_sip.h" 23 : : #include "qgslayoutitemmapitem.h" 24 : : #include "qgssymbol.h" 25 : : #include <QString> 26 : : #include <QObject> 27 : : #include <QPainter> 28 : : 29 : : class QDomDocument; 30 : : class QDomElement; 31 : : class QgsLayoutItemMapOverview; 32 : : 33 : : /** 34 : : * \ingroup core 35 : : * \class QgsLayoutItemMapOverviewStack 36 : : * \brief A collection of overviews which are drawn above the map content in a 37 : : * QgsLayoutItemMap. The overview stack controls which overviews are drawn and the 38 : : * order they are drawn in. 39 : : * \see QgsLayoutItemMapOverview 40 : : * \since QGIS 3.0 41 : : */ 42 : 0 : class CORE_EXPORT QgsLayoutItemMapOverviewStack : public QgsLayoutItemMapItemStack 43 : : { 44 : : public: 45 : : 46 : : /** 47 : : * Constructor for QgsLayoutItemMapOverviewStack, attached to the specified 48 : : * \a map. 49 : : */ 50 : : QgsLayoutItemMapOverviewStack( QgsLayoutItemMap *map ); 51 : : 52 : : /** 53 : : * Adds a new map \a overview to the stack and takes ownership of the overview. 54 : : * The overview will be added to the end of the stack, and rendered 55 : : * above any existing map overviews already present in the stack. 56 : : * \note After adding a overview to the stack, update() 57 : : * should be called for the QgsLayoutItemMap to prevent rendering artifacts. 58 : : * \see removeOverview() 59 : : */ 60 : : void addOverview( QgsLayoutItemMapOverview *overview SIP_TRANSFER ); 61 : : 62 : : /** 63 : : * Removes an overview with matching overviewId from the stack and deletes the corresponding QgsLayoutItemMapOverview 64 : : * \note After removing an overview from the stack, update() 65 : : * should be called for the QgsLayoutItemMap to prevent rendering artifacts. 66 : : * \see addOverview() 67 : : */ 68 : : void removeOverview( const QString &overviewId ); 69 : : 70 : : /** 71 : : * Moves an overview with matching overviewId up the stack, causing it to be rendered above other overviews. 72 : : * \note After moving an overview within the stack, update() should be 73 : : * called for the QgsLayoutItemMap to redraw the map with the new overview stack order. 74 : : * \see moveOverviewDown() 75 : : */ 76 : : void moveOverviewUp( const QString &overviewId ); 77 : : 78 : : /** 79 : : * Moves an overview with matching overviewId down the stack, causing it to be rendered below other overviews. 80 : : * \note After moving an overview within the stack, update() should be 81 : : * called for the QgsLayoutItemMap to redraw the map with the new overview stack order. 82 : : * \see moveOverviewUp() 83 : : */ 84 : : void moveOverviewDown( const QString &overviewId ); 85 : : 86 : : /** 87 : : * Returns a reference to an overview with matching overviewId within the stack. 88 : : */ 89 : : QgsLayoutItemMapOverview *overview( const QString &overviewId ) const; 90 : : 91 : : /** 92 : : * Returns a reference to an overview at the specified \a index within the stack. 93 : : */ 94 : : QgsLayoutItemMapOverview *overview( int index ) const; 95 : : 96 : : /** 97 : : * Returns a reference to an overview at the specified \a index within the stack. 98 : : * \see overview() 99 : : */ 100 : : QgsLayoutItemMapOverview &operator[]( int index ); 101 : : 102 : : /** 103 : : * Returns a list of QgsLayoutItemMapOverviews contained by the stack. 104 : : */ 105 : : QList< QgsLayoutItemMapOverview * > asList() const; 106 : : bool readXml( const QDomElement &elem, const QDomDocument &doc, const QgsReadWriteContext &context ) override; 107 : : 108 : : /** 109 : : * Alters the list of map \a layers which will be rendered for the link map item, inserting 110 : : * temporary layers which represent overview extents as required. 111 : : * 112 : : * \since QGIS 3.6 113 : : */ 114 : : QList< QgsMapLayer * > modifyMapLayerList( const QList< QgsMapLayer * > &layers ); 115 : : 116 : : }; 117 : : 118 : : /** 119 : : * \ingroup core 120 : : * \class QgsLayoutItemMapOverview 121 : : * \brief An individual overview which is drawn above the map content in a 122 : : * QgsLayoutItemMap, and shows the extent of another QgsLayoutItemMap. 123 : : * \see QgsLayoutItemMapOverviewStack 124 : : * \since QGIS 3.0 125 : : */ 126 : : class CORE_EXPORT QgsLayoutItemMapOverview : public QgsLayoutItemMapItem 127 : : { 128 : 0 : Q_OBJECT 129 : : 130 : : public: 131 : : 132 : : /** 133 : : * Constructor for QgsLayoutItemMapOverview. 134 : : * \param name friendly display name for overview 135 : : * \param map QgsLayoutItemMap the overview is attached to 136 : : */ 137 : : QgsLayoutItemMapOverview( const QString &name, QgsLayoutItemMap *map ); 138 : : ~QgsLayoutItemMapOverview() override; 139 : : 140 : : void draw( QPainter *painter ) override; 141 : : bool writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override; 142 : : bool readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override; 143 : : void finalizeRestoreFromXml() override; 144 : : bool usesAdvancedEffects() const override; 145 : : 146 : : /** 147 : : * Sets the \a map to show the overview extent of. 148 : : * \see linkedMap() 149 : : */ 150 : : void setLinkedMap( QgsLayoutItemMap *map ); 151 : : 152 : : /** 153 : : * Returns the source map to show the overview extent of. 154 : : * \see setLinkedMap() 155 : : */ 156 : : QgsLayoutItemMap *linkedMap(); 157 : : 158 : : /** 159 : : * Sets the fill \a symbol used for drawing the overview extent. Ownership 160 : : * is transferred to the overview. 161 : : * \see frameSymbol() 162 : : */ 163 : : void setFrameSymbol( QgsFillSymbol *symbol SIP_TRANSFER ); 164 : : 165 : : /** 166 : : * Returns the fill symbol used for drawing the overview extent. 167 : : * \see setFrameSymbol() 168 : : */ 169 : : QgsFillSymbol *frameSymbol(); 170 : : 171 : : /** 172 : : * Returns the fill symbol used for drawing the overview extent. 173 : : * \see setFrameSymbol() 174 : : * \note not available in Python bindings 175 : : */ 176 : : const QgsFillSymbol *frameSymbol() const; SIP_SKIP 177 : : 178 : : /** 179 : : * Retrieves the blending mode used for drawing the overview. 180 : : * \see setBlendMode() 181 : : */ 182 : : QPainter::CompositionMode blendMode() const { return mBlendMode; } 183 : : 184 : : /** 185 : : * Sets the blending \a mode used for drawing the overview. 186 : : * \see blendMode() 187 : : */ 188 : : void setBlendMode( QPainter::CompositionMode mode ); 189 : : 190 : : /** 191 : : * Returns whether the overview frame is inverted, ie, whether the shaded area is drawn outside 192 : : * the extent of the overview map. 193 : : * \see setInverted() 194 : : */ 195 : : bool inverted() const { return mInverted; } 196 : : 197 : : /** 198 : : * Sets whether the overview frame is \a inverted, ie, whether the shaded area is drawn outside 199 : : * the extent of the overview map. 200 : : * \see inverted() 201 : : */ 202 : : void setInverted( bool inverted ); 203 : : 204 : : /** 205 : : * Returns whether the extent of the map is forced to center on the overview. 206 : : * \see setCentered() 207 : : */ 208 : : bool centered() const { return mCentered; } 209 : : 210 : : /** 211 : : * Sets whether the extent of the map is forced to center on the overview 212 : : * \see centered() 213 : : */ 214 : : void setCentered( bool centered ); 215 : : 216 : : /** 217 : : * Reconnects signals for overview map, so that overview correctly follows changes to source 218 : : * map's extent. 219 : : */ 220 : : void connectSignals(); 221 : : 222 : : /** 223 : : * Returns a vector layer to render as part of the QgsLayoutItemMap render, containing 224 : : * a feature representing the overview extent (and with an appropriate renderer set matching 225 : : * the overview's frameSymbol() ). 226 : : * 227 : : * Ownership of the layer remain with the overview item. 228 : : * 229 : : * \since QGIS 3.6 230 : : */ 231 : : QgsVectorLayer *asMapLayer(); 232 : : 233 : : QgsMapLayer *mapLayer() override; 234 : : 235 : : bool accept( QgsStyleEntityVisitorInterface *visitor ) const override; 236 : : 237 : : public slots: 238 : : 239 : : /** 240 : : * Handles recentering of the map and redrawing of the map's overview 241 : : */ 242 : : void overviewExtentChanged(); 243 : : 244 : : private: 245 : : 246 : : QgsLayoutItemMapOverview() = delete; 247 : : 248 : : QString mFrameMapUuid; 249 : : QPointer< QgsLayoutItemMap > mFrameMap; 250 : : 251 : : //! Drawing style for overview farme 252 : : std::unique_ptr< QgsFillSymbol > mFrameSymbol; 253 : : 254 : : //! Blend mode for overview 255 : : QPainter::CompositionMode mBlendMode = QPainter::CompositionMode_SourceOver; 256 : : 257 : : //! True if overview is inverted 258 : : bool mInverted = false; 259 : : 260 : : //! True if map is centered on overview 261 : : bool mCentered = false; 262 : : 263 : : std::unique_ptr< QgsVectorLayer > mExtentLayer; 264 : : 265 : : //! Creates default overview symbol 266 : : void createDefaultFrameSymbol(); 267 : : 268 : : }; 269 : : 270 : : #endif // QgsLayoutItemMapOVERVIEW_H