Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsvectorlayerrenderer.h 3 : : -------------------------------------- 4 : : Date : December 2013 5 : : Copyright : (C) 2013 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 : : 16 : : #ifndef QGSVECTORLAYERRENDERER_H 17 : : #define QGSVECTORLAYERRENDERER_H 18 : : 19 : : class QgsFeatureRenderer; 20 : : class QgsRenderContext; 21 : : class QgsVectorLayer; 22 : : class QgsVectorLayerFeatureSource; 23 : : 24 : : class QgsDiagramRenderer; 25 : : class QgsDiagramLayerSettings; 26 : : 27 : : class QgsFeatureIterator; 28 : : class QgsSingleSymbolRenderer; 29 : : class QgsMapClippingRegion; 30 : : 31 : : #define SIP_NO_FILE 32 : : 33 : : #include <QList> 34 : : #include <QPainter> 35 : : #include <QElapsedTimer> 36 : : 37 : : typedef QList<int> QgsAttributeList; 38 : : 39 : : #include "qgis_sip.h" 40 : : #include "qgsfields.h" // QgsFields 41 : : #include "qgsfeatureiterator.h" 42 : : #include "qgsvectorsimplifymethod.h" 43 : : #include "qgsfeedback.h" 44 : : #include "qgsfeatureid.h" 45 : : 46 : : #include "qgsmaplayerrenderer.h" 47 : : 48 : : class QgsVectorLayerLabelProvider; 49 : : class QgsVectorLayerDiagramProvider; 50 : : 51 : : /** 52 : : * \ingroup core 53 : : * \brief Interruption checker used by QgsVectorLayerRenderer::render() 54 : : * \note not available in Python bindings 55 : : */ 56 : : class QgsVectorLayerRendererInterruptionChecker: public QgsFeedback 57 : : { 58 : : Q_OBJECT 59 : : 60 : : public: 61 : : //! Constructor 62 : : explicit QgsVectorLayerRendererInterruptionChecker( const QgsRenderContext &context ); 63 : : 64 : : private: 65 : : const QgsRenderContext &mContext; 66 : : QTimer *mTimer = nullptr; 67 : : }; 68 : : 69 : : /** 70 : : * \ingroup core 71 : : * \brief Implementation of threaded rendering for vector layers. 72 : : * 73 : : * \note not available in Python bindings 74 : : * \since QGIS 2.4 75 : : */ 76 : : class QgsVectorLayerRenderer : public QgsMapLayerRenderer 77 : : { 78 : : public: 79 : : QgsVectorLayerRenderer( QgsVectorLayer *layer, QgsRenderContext &context ); 80 : : ~QgsVectorLayerRenderer() override; 81 : : QgsFeedback *feedback() const override; 82 : : bool forceRasterRender() const override; 83 : : 84 : : /** 85 : : * Returns the feature renderer. 86 : : * This may be used for tweaking it before the actual rendering of the layer. 87 : : * \since QGIS 3.12 88 : : */ 89 : 0 : QgsFeatureRenderer *featureRenderer() SIP_SKIP { return mRenderer; } 90 : : 91 : : bool render() override; 92 : : 93 : : void setLayerRenderingTimeHint( int time ) override; 94 : : 95 : : private: 96 : : 97 : : /** 98 : : * Registers label and diagram layer 99 : : * \param layer diagram layer 100 : : * \param attributeNames attributes needed for labeling and diagrams will be added to the list 101 : : */ 102 : : void prepareLabeling( QgsVectorLayer *layer, QSet<QString> &attributeNames ); 103 : : void prepareDiagrams( QgsVectorLayer *layer, QSet<QString> &attributeNames ); 104 : : 105 : : /** 106 : : * Draw layer with \a renderer. QgsFeatureRenderer::startRender() needs to be called before using this method 107 : : */ 108 : : void drawRenderer( QgsFeatureRenderer *renderer, QgsFeatureIterator &fit ); 109 : : 110 : : /** 111 : : * Draw layer with \a renderer using symbol levels. QgsFeatureRenderer::startRender() needs to be called before using this method 112 : : */ 113 : : void drawRendererLevels( QgsFeatureRenderer *renderer, QgsFeatureIterator &fit ); 114 : : 115 : : //! Stop version 2 renderer and selected renderer (if required) 116 : : void stopRenderer( QgsFeatureRenderer *renderer, QgsSingleSymbolRenderer *selRenderer ); 117 : : 118 : : 119 : : bool renderInternal( QgsFeatureRenderer *renderer ); 120 : : protected: 121 : : 122 : : std::unique_ptr< QgsVectorLayerRendererInterruptionChecker > mInterruptionChecker; 123 : : 124 : : //! The rendered layer 125 : : QgsVectorLayer *mLayer = nullptr; 126 : : 127 : : QgsFields mFields; // TODO: use fields from mSource 128 : : 129 : : QgsFeatureIds mSelectedFeatureIds; 130 : : 131 : : QString mTemporalFilter; 132 : : 133 : : std::unique_ptr< QgsVectorLayerFeatureSource > mSource; 134 : : 135 : : QgsFeatureRenderer *mRenderer = nullptr; 136 : : std::vector< std::unique_ptr< QgsFeatureRenderer> > mRenderers; 137 : : 138 : : bool mDrawVertexMarkers; 139 : : bool mVertexMarkerOnlyForSelection; 140 : : int mVertexMarkerStyle = 0; 141 : : double mVertexMarkerSize = 2.0; 142 : : 143 : : QgsWkbTypes::GeometryType mGeometryType; 144 : : 145 : : QSet<QString> mAttrNames; 146 : : 147 : : //! used with old labeling engine (QgsPalLabeling): whether labeling is enabled 148 : : bool mLabeling; 149 : : //! used with new labeling engine (QgsPalLabeling): whether diagrams are enabled 150 : : bool mDiagrams; 151 : : 152 : : /** 153 : : * used with new labeling engine (QgsLabelingEngine): provider for labels. 154 : : * may be NULLPTR. no need to delete: if exists it is owned by labeling engine 155 : : */ 156 : : QgsVectorLayerLabelProvider *mLabelProvider = nullptr; 157 : : 158 : : /** 159 : : * used with new labeling engine (QgsLabelingEngine): provider for diagrams. 160 : : * may be NULLPTR. no need to delete: if exists it is owned by labeling engine 161 : : */ 162 : : QgsVectorLayerDiagramProvider *mDiagramProvider = nullptr; 163 : : 164 : : QPainter::CompositionMode mFeatureBlendMode; 165 : : 166 : : QgsVectorSimplifyMethod mSimplifyMethod; 167 : : bool mSimplifyGeometry; 168 : : 169 : : QList< QgsMapClippingRegion > mClippingRegions; 170 : : QgsGeometry mClipFilterGeom; 171 : : bool mApplyClipFilter = false; 172 : : QgsGeometry mClipFeatureGeom; 173 : : bool mApplyClipGeometries = false; 174 : : QgsGeometry mLabelClipFeatureGeom; 175 : : bool mApplyLabelClipGeometries = false; 176 : : bool mForceRasterRender = false; 177 : : 178 : : int mRenderTimeHint = 0; 179 : : bool mBlockRenderUpdates = false; 180 : : QElapsedTimer mElapsedTimer; 181 : : 182 : : }; 183 : : 184 : : 185 : : #endif // QGSVECTORLAYERRENDERER_H