Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsmaphittest.h 3 : : --------------------- 4 : : begin : September 2014 5 : : copyright : (C) 2014 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 : : #ifndef QGSMAPHITTEST_H 16 : : #define QGSMAPHITTEST_H 17 : : 18 : : #include "qgis_core.h" 19 : : #include "qgis_sip.h" 20 : : #include "qgsmapsettings.h" 21 : : #include "qgsgeometry.h" 22 : : 23 : : #include <QSet> 24 : : 25 : : class QgsRenderContext; 26 : : class QgsSymbol; 27 : : class QgsVectorLayer; 28 : : class QgsExpression; 29 : : 30 : : /** 31 : : * \ingroup core 32 : : * \brief Class that runs a hit test with given map settings. Based on the hit test it returns which symbols 33 : : * will be visible on the map - this is useful for content based legend. 34 : : * 35 : : * \since QGIS 2.6 36 : : */ 37 : 0 : class CORE_EXPORT QgsMapHitTest 38 : : { 39 : : public: 40 : : //! Maps an expression string to a layer id 41 : : typedef QMap<QString, QString> LayerFilterExpression; 42 : : 43 : : /** 44 : : * \param settings Map settings used to evaluate symbols 45 : : * \param polygon Polygon geometry to refine the hit test 46 : : * \param layerFilterExpression Expression string for each layer id to evaluate in order to refine the symbol selection 47 : : */ 48 : : QgsMapHitTest( const QgsMapSettings &settings, const QgsGeometry &polygon = QgsGeometry(), const QgsMapHitTest::LayerFilterExpression &layerFilterExpression = QgsMapHitTest::LayerFilterExpression() ); 49 : : 50 : : //! Constructor version used with only expressions to filter symbols (no extent or polygon intersection) 51 : : QgsMapHitTest( const QgsMapSettings &settings, const QgsMapHitTest::LayerFilterExpression &layerFilterExpression ); 52 : : 53 : : //! Runs the map hit test 54 : : void run(); 55 : : 56 : : /** 57 : : * Tests whether a symbol is visible for a specified layer. 58 : : * \param symbol symbol to find 59 : : * \param layer vector layer 60 : : * \see legendKeyVisible() 61 : : * \since QGIS 2.12 62 : : */ 63 : : bool symbolVisible( QgsSymbol *symbol, QgsVectorLayer *layer ) const; 64 : : 65 : : /** 66 : : * Tests whether a given legend key is visible for a specified layer. 67 : : * \param ruleKey legend rule key 68 : : * \param layer vector layer 69 : : * \see symbolVisible() 70 : : * \since QGIS 2.14 71 : : */ 72 : : bool legendKeyVisible( const QString &ruleKey, QgsVectorLayer *layer ) const; 73 : : 74 : : private: 75 : : 76 : : //! \note not available in Python bindings 77 : : typedef QSet<QString> SymbolSet; 78 : : 79 : : //! \note not available in Python bindings 80 : : typedef QMap<QgsVectorLayer *, SymbolSet> HitTest; 81 : : 82 : : /** 83 : : * Runs test for visible symbols within a layer 84 : : * \param vl vector layer 85 : : * \param usedSymbols set for storage of visible symbols 86 : : * \param usedSymbolsRuleKey set of storage of visible legend rule keys 87 : : * \param context render context 88 : : * \note not available in Python bindings 89 : : * \since QGIS 2.12 90 : : */ 91 : : void runHitTestLayer( QgsVectorLayer *vl, SymbolSet &usedSymbols, SymbolSet &usedSymbolsRuleKey, QgsRenderContext &context ); 92 : : 93 : : //! The initial map settings 94 : : QgsMapSettings mSettings; 95 : : 96 : : //! The hit test 97 : : HitTest mHitTest; 98 : : 99 : : //! The hit test, using legend rule keys 100 : : HitTest mHitTestRuleKey; 101 : : 102 : : //! List of expression filter for each layer 103 : : QgsMapHitTest::LayerFilterExpression mLayerFilterExpression; 104 : : 105 : : //! Polygon used for filtering items. May be empty 106 : : QgsGeometry mPolygon; 107 : : 108 : : //! Whether to use only expressions during the filtering 109 : : bool mOnlyExpressions; 110 : : }; 111 : : 112 : : #endif // QGSMAPHITTEST_H