LCOV - code coverage report
Current view: top level - core/layout - qgslayoutitemattributetable.h (source / functions) Hit Total Coverage
Test: coverage.info.cleaned Lines: 0 6 0.0 %
Date: 2021-04-10 08:29:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : /***************************************************************************
       2                 :            :                          qgslayoutitemattributetable.h
       3                 :            :                          ---------------------------
       4                 :            :     begin                : November 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 QGSLAYOUTITEMATTRIBUTETABLE_H
      19                 :            : #define QGSLAYOUTITEMATTRIBUTETABLE_H
      20                 :            : 
      21                 :            : #include "qgis_core.h"
      22                 :            : #include "qgis_sip.h"
      23                 :            : #include "qgslayouttable.h"
      24                 :            : #include "qgsvectorlayerref.h"
      25                 :            : 
      26                 :            : class QgsLayoutItemMap;
      27                 :            : class QgsVectorLayer;
      28                 :            : 
      29                 :            : /**
      30                 :            :  * \ingroup core
      31                 :            :  * \brief A layout table subclass that displays attributes from a vector layer.
      32                 :            :  * \since QGIS 3.0
      33                 :            : */
      34                 :            : class CORE_EXPORT QgsLayoutItemAttributeTable: public QgsLayoutTable
      35                 :            : {
      36                 :          0 :     Q_OBJECT
      37                 :            : 
      38                 :            :   public:
      39                 :            : 
      40                 :            :     /**
      41                 :            :      * Specifies the content source for the attribute table
      42                 :            :      */
      43                 :            :     enum ContentSource
      44                 :            :     {
      45                 :            :       LayerAttributes = 0, //!< Table shows attributes from features in a vector layer
      46                 :            :       AtlasFeature, //!< Table shows attributes from the current atlas feature
      47                 :            :       RelationChildren //!< Table shows attributes from related child features
      48                 :            :     };
      49                 :            : 
      50                 :            :     /**
      51                 :            :      * Constructor for QgsLayoutItemAttributeTable, attached to the specified \a layout.
      52                 :            :      *
      53                 :            :      * Ownership is transferred to the layout.
      54                 :            :      */
      55                 :            :     QgsLayoutItemAttributeTable( QgsLayout *layout SIP_TRANSFERTHIS );
      56                 :            : 
      57                 :            :     int type() const override;
      58                 :            :     QIcon icon() const override;
      59                 :            :     QString displayName() const override;
      60                 :            : 
      61                 :            :     /**
      62                 :            :      * Returns a new QgsLayoutItemAttributeTable for the specified parent \a layout.
      63                 :            :      */
      64                 :            :     static QgsLayoutItemAttributeTable *create( QgsLayout *layout ) SIP_FACTORY;
      65                 :            : 
      66                 :            :     /**
      67                 :            :      * Sets the \a source for attributes to show in table body.
      68                 :            :      * \see source()
      69                 :            :      */
      70                 :            :     void setSource( ContentSource source );
      71                 :            : 
      72                 :            :     /**
      73                 :            :      * Returns the source for attributes shown in the table body.
      74                 :            :      * \see setSource()
      75                 :            :      */
      76                 :            :     ContentSource source() const { return mSource; }
      77                 :            : 
      78                 :            :     /**
      79                 :            :      * Returns the source layer for the table, considering the table source mode. For example,
      80                 :            :      * if the table is set to atlas feature mode, then the source layer will be the
      81                 :            :      * atlas coverage layer. If the table is set to layer attributes mode, then
      82                 :            :      * the source layer will be the user specified vector layer.
      83                 :            :      */
      84                 :            :     QgsVectorLayer *sourceLayer() const;
      85                 :            : 
      86                 :            :     /**
      87                 :            :      * Sets the vector \a layer from which to display feature attributes.
      88                 :            :      *
      89                 :            :      * This is only considered if the table source() is LayerAttributes.
      90                 :            :      *
      91                 :            :      * \see vectorLayer()
      92                 :            :      */
      93                 :            :     void setVectorLayer( QgsVectorLayer *layer );
      94                 :            : 
      95                 :            :     /**
      96                 :            :      * Returns the vector layer the attribute table is currently using.
      97                 :            :      *
      98                 :            :      * This is only considered if the table source() is LayerAttributes.
      99                 :            :      *
     100                 :            :      * \see setVectorLayer()
     101                 :            :      * \see sourceLayer()
     102                 :            :      */
     103                 :            :     QgsVectorLayer *vectorLayer() const { return mVectorLayer.get(); }
     104                 :            : 
     105                 :            :     /**
     106                 :            :      * Sets the relation \a id from which to display child features
     107                 :            :      * \see relationId()
     108                 :            :      * \see setSource()
     109                 :            :      * \note Only used if table source() is set to RelationChildren.
     110                 :            :      */
     111                 :            :     void setRelationId( const QString &id );
     112                 :            : 
     113                 :            :     /**
     114                 :            :      * Returns the relation id which the table displays child features from.
     115                 :            :      * \see setRelationId()
     116                 :            :      * \see source()
     117                 :            :      * \note Only used if table source() is set to RelationChildren.
     118                 :            :      */
     119                 :            :     QString relationId() const { return mRelationId; }
     120                 :            : 
     121                 :            :     /**
     122                 :            :      * Resets the attribute table's columns to match the vector layer's fields.
     123                 :            :      * \see setVectorLayer()
     124                 :            :      */
     125                 :            :     void resetColumns();
     126                 :            : 
     127                 :            :     /**
     128                 :            :      * Sets a layout \a map to use to limit the extent of features shown in the
     129                 :            :      * attribute table. This setting only has an effect if setDisplayOnlyVisibleFeatures is
     130                 :            :      * set to TRUE. Changing the map forces the table to refetch features from its
     131                 :            :      * vector layer, and may result in the table changing size to accommodate the new displayed
     132                 :            :      * feature attributes.
     133                 :            :      * \see map()
     134                 :            :      * \see setDisplayOnlyVisibleFeatures
     135                 :            :      */
     136                 :            :     void setMap( QgsLayoutItemMap *map );
     137                 :            : 
     138                 :            :     /**
     139                 :            :      * Returns the layout map whose extents are controlling the features shown in the
     140                 :            :      * table. The extents of the map are only used if displayOnlyVisibleFeatures() is TRUE.
     141                 :            :      * \see setMap()
     142                 :            :      * \see displayOnlyVisibleFeatures()
     143                 :            :      */
     144                 :            :     QgsLayoutItemMap *map() const { return mMap; }
     145                 :            : 
     146                 :            :     /**
     147                 :            :      * Sets the maximum number of \a features shown by the table. Changing this setting may result
     148                 :            :      * in the attribute table changing its size to accommodate the new number of rows, and requires
     149                 :            :      * the table to refetch features from its vector layer.
     150                 :            :      * \see maximumNumberOfFeatures()
     151                 :            :      */
     152                 :            :     void setMaximumNumberOfFeatures( int features );
     153                 :            : 
     154                 :            :     /**
     155                 :            :      * Returns the maximum number of features to be shown by the table.
     156                 :            :      * \see setMaximumNumberOfFeatures()
     157                 :            :      */
     158                 :            :     int maximumNumberOfFeatures() const { return mMaximumNumberOfFeatures; }
     159                 :            : 
     160                 :            :     /**
     161                 :            :      * Sets attribute table to only show unique rows.
     162                 :            :      *
     163                 :            :      * Set \a uniqueOnly to TRUE to show only unique rows. Duplicate rows
     164                 :            :      * will be stripped from the table.
     165                 :            :      *
     166                 :            :      * \see uniqueRowsOnly()
     167                 :            :      */
     168                 :            :     void setUniqueRowsOnly( bool uniqueOnly );
     169                 :            : 
     170                 :            :     /**
     171                 :            :      * Returns TRUE if the table is set to show only unique rows.
     172                 :            :      *
     173                 :            :      * \see setUniqueRowsOnly()
     174                 :            :      */
     175                 :            :     bool uniqueRowsOnly() const { return mShowUniqueRowsOnly; }
     176                 :            : 
     177                 :            :     /**
     178                 :            :      * Sets the attribute table to only show features which are visible in a map item. Changing
     179                 :            :      * this setting forces the table to refetch features from its vector layer, and may result in
     180                 :            :      * the table changing size to accommodate the new displayed feature attributes.
     181                 :            :      *
     182                 :            :      * \see displayOnlyVisibleFeatures()
     183                 :            :      * \see setMap()
     184                 :            :      */
     185                 :            :     void setDisplayOnlyVisibleFeatures( bool visibleOnly );
     186                 :            : 
     187                 :            :     /**
     188                 :            :      * Returns TRUE if the table is set to show only features visible on a corresponding
     189                 :            :      * map item.
     190                 :            :      *
     191                 :            :      * \see map()
     192                 :            :      * \see setDisplayOnlyVisibleFeatures()
     193                 :            :      */
     194                 :            :     bool displayOnlyVisibleFeatures() const { return mShowOnlyVisibleFeatures; }
     195                 :            : 
     196                 :            :     /**
     197                 :            :      * Sets attribute table to only show features which intersect the current atlas
     198                 :            :      * feature.
     199                 :            :      *
     200                 :            :      * \see filterToAtlasFeature()
     201                 :            :      */
     202                 :            :     void setFilterToAtlasFeature( bool filterToAtlas );
     203                 :            : 
     204                 :            :     /**
     205                 :            :      * Returns TRUE if the table is set to only show features which intersect the current atlas
     206                 :            :      * feature.
     207                 :            :      *
     208                 :            :      * \see setFilterToAtlasFeature()
     209                 :            :      */
     210                 :            :     bool filterToAtlasFeature() const { return mFilterToAtlasIntersection; }
     211                 :            : 
     212                 :            :     /**
     213                 :            :      * Returns TRUE if a feature filter is active on the attribute table.
     214                 :            :      *
     215                 :            :      * \see setFilterFeatures()
     216                 :            :      * \see featureFilter()
     217                 :            :      */
     218                 :            :     bool filterFeatures() const { return mFilterFeatures; }
     219                 :            : 
     220                 :            :     /**
     221                 :            :      * Sets whether the feature filter is active for the attribute table. Changing
     222                 :            :      * this setting forces the table to refetch features from its vector layer, and may result in
     223                 :            :      * the table changing size to accommodate the new displayed feature attributes.
     224                 :            :      * \see filterFeatures()
     225                 :            :      * \see setFeatureFilter()
     226                 :            :      */
     227                 :            :     void setFilterFeatures( bool filter );
     228                 :            : 
     229                 :            :     /**
     230                 :            :      * Returns the current expression used to filter features for the table. The filter is only
     231                 :            :      * active if filterFeatures() is TRUE.
     232                 :            :      *
     233                 :            :      * \see setFeatureFilter()
     234                 :            :      * \see filterFeatures()
     235                 :            :      */
     236                 :            :     QString featureFilter() const { return mFeatureFilter; }
     237                 :            : 
     238                 :            :     /**
     239                 :            :      * Sets the \a expression used for filtering features in the table. The filter is only
     240                 :            :      * active if filterFeatures() is set to TRUE. Changing this setting forces the table
     241                 :            :      * to refetch features from its vector layer, and may result in
     242                 :            :      * the table changing size to accommodate the new displayed feature attributes.
     243                 :            :      *
     244                 :            :      * \see featureFilter()
     245                 :            :      * \see setFilterFeatures()
     246                 :            :      */
     247                 :            :     void setFeatureFilter( const QString &expression );
     248                 :            : 
     249                 :            :     /**
     250                 :            :      * Sets the attributes to display in the table.
     251                 :            :      * \param fields list of fields names from the vector layer to show.
     252                 :            :      * Set to an empty list to show all feature attributes.
     253                 :            :      * \param refresh set to TRUE to force the table to refetch features from its vector layer
     254                 :            :      * and immediately update the display of the table. This may result in the table changing size
     255                 :            :      * to accommodate the new displayed feature attributes.
     256                 :            :      */
     257                 :            :     void setDisplayedFields( const QStringList &fields, bool refresh = true );
     258                 :            : 
     259                 :            :     /**
     260                 :            :      * Sets a string to wrap the contents of the table cells by. Occurrences of this string will
     261                 :            :      * be replaced by a line break.
     262                 :            :      * \param wrapString string to replace with line break
     263                 :            :      * \see wrapString()
     264                 :            :      */
     265                 :            :     void setWrapString( const QString &wrapString );
     266                 :            : 
     267                 :            :     /**
     268                 :            :      * Returns the string used to wrap the contents of the table cells by. Occurrences of this string will
     269                 :            :      * be replaced by a line break.
     270                 :            :      * \see setWrapString()
     271                 :            :      */
     272                 :            :     QString wrapString() const { return mWrapString; }
     273                 :            : 
     274                 :            :     /**
     275                 :            :      * Queries the attribute table's vector layer for attributes to show in the table.
     276                 :            :      * \param contents table content
     277                 :            :      * \returns TRUE if attributes were successfully fetched
     278                 :            :      */
     279                 :            :     bool getTableContents( QgsLayoutTableContents &contents ) override;
     280                 :            : 
     281                 :            :     QgsConditionalStyle conditionalCellStyle( int row, int column ) const override;
     282                 :            :     QgsExpressionContextScope *scopeForCell( int row, int column ) const override SIP_FACTORY;
     283                 :            : 
     284                 :            :     QgsExpressionContext createExpressionContext() const override;
     285                 :            :     void finalizeRestoreFromXml() override;
     286                 :            : 
     287                 :            :     void refreshDataDefinedProperty( QgsLayoutObject::DataDefinedProperty property = QgsLayoutObject::AllProperties ) override;
     288                 :            : 
     289                 :            :     /**
     290                 :            :      * Returns TRUE if the attribute table will be rendered using the conditional styling
     291                 :            :      * properties of the linked vector layer.
     292                 :            :      *
     293                 :            :      * \see setUseConditionalStyling()
     294                 :            :      * \since QGIS 3.12
     295                 :            :      */
     296                 :            :     bool useConditionalStyling() const;
     297                 :            : 
     298                 :            :     /**
     299                 :            :      * Sets whether the attribute table will be rendered using the conditional styling
     300                 :            :      * properties of the linked vector layer.
     301                 :            :      *
     302                 :            :      * \see useConditionalStyling()
     303                 :            :      * \since QGIS 3.12
     304                 :            :      */
     305                 :            :     void setUseConditionalStyling( bool enabled );
     306                 :            : 
     307                 :            :   protected:
     308                 :            : 
     309                 :            :     bool writePropertiesToElement( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const override;
     310                 :            :     bool readPropertiesFromElement( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context ) override;
     311                 :            : 
     312                 :            :   private slots:
     313                 :            : 
     314                 :            :     void disconnectCurrentMap();
     315                 :            : 
     316                 :            :   private:
     317                 :            : 
     318                 :            :     //! Attribute source
     319                 :            :     ContentSource mSource = LayerAttributes;
     320                 :            :     //! Associated vector layer
     321                 :            :     QgsVectorLayerRef mVectorLayer = nullptr;
     322                 :            : 
     323                 :            :     //! Data defined vector layer - only
     324                 :            :     QPointer< QgsVectorLayer > mDataDefinedVectorLayer;
     325                 :            : 
     326                 :            :     //! Relation id, if in relation children mode
     327                 :            :     QString mRelationId;
     328                 :            : 
     329                 :            :     //! Current vector layer, if in atlas feature mode
     330                 :            :     QgsVectorLayer *mCurrentAtlasLayer = nullptr;
     331                 :            : 
     332                 :            :     //! Associated map (used to display the visible features)
     333                 :            :     QgsLayoutItemMap *mMap = nullptr;
     334                 :            :     QString mMapUuid;
     335                 :            : 
     336                 :            :     //! Maximum number of features that is displayed
     337                 :            :     int mMaximumNumberOfFeatures = 30;
     338                 :            : 
     339                 :            :     //! True if only unique rows should be shown
     340                 :            :     bool mShowUniqueRowsOnly = false;
     341                 :            : 
     342                 :            :     //! Shows only the features that are visible in the associated layout map (TRUE by default)
     343                 :            :     bool mShowOnlyVisibleFeatures = false;
     344                 :            : 
     345                 :            :     //! Shows only the features that intersect the current atlas feature
     346                 :            :     bool mFilterToAtlasIntersection = false;
     347                 :            : 
     348                 :            :     //! True if feature filtering enabled
     349                 :            :     bool mFilterFeatures = false;
     350                 :            : 
     351                 :            :     //! Feature filter expression
     352                 :            :     QString mFeatureFilter;
     353                 :            : 
     354                 :            :     QString mWrapString;
     355                 :            : 
     356                 :            :     bool mUseConditionalStyling = false;
     357                 :            : 
     358                 :            :     QList< QList< QgsConditionalStyle > > mConditionalStyles;
     359                 :            :     QList< QgsFeature > mFeatures;
     360                 :            : 
     361                 :          0 :     struct Cell
     362                 :            :     {
     363                 :            :       Cell() = default;
     364                 :            : 
     365                 :          0 :       Cell( const QVariant &content, const QgsConditionalStyle &style, const QgsFeature &feature )
     366                 :          0 :         : content( content )
     367                 :          0 :         , style( style )
     368                 :          0 :         , feature( feature ) {}
     369                 :            :       QVariant content;
     370                 :            :       QgsConditionalStyle style;
     371                 :            :       QgsFeature feature;
     372                 :            :     };
     373                 :            : 
     374                 :            :     /**
     375                 :            :      * Returns a list of attribute indices corresponding to displayed fields in the table.
     376                 :            :      * \note kept for compatibility with 2.0 api only
     377                 :            :      */
     378                 :            :     QList<int> fieldsToDisplay() const;
     379                 :            : 
     380                 :            :     /**
     381                 :            :      * Restores a field alias map from a pre 2.4 format project file format
     382                 :            :      * \param map QMap of integers to strings, where the string is the alias to use for the
     383                 :            :      * corresponding field, and the integer is the field index from the vector layer
     384                 :            :      */
     385                 :            :     void restoreFieldAliasMap( const QMap<int, QString> &map );
     386                 :            : 
     387                 :            :     /**
     388                 :            :      * Replaces occurrences of the wrap character with line breaks.
     389                 :            :      * \param variant input cell contents
     390                 :            :      */
     391                 :            :     QVariant replaceWrapChar( const QVariant &variant ) const;
     392                 :            : 
     393                 :            : #ifdef HAVE_SERVER_PYTHON_PLUGINS
     394                 :            : 
     395                 :            :     /**
     396                 :            :      * Returns the list of visible columns filtered by feature filter provider.
     397                 :            :      */
     398                 :            :     QgsLayoutTableColumns filteredColumns( );
     399                 :            : #endif
     400                 :            : 
     401                 :            :   private slots:
     402                 :            :     //! Checks if this vector layer will be removed (and sets mVectorLayer to 0 if yes)
     403                 :            :     void removeLayer( const QString &layerId );
     404                 :            : 
     405                 :            :     void atlasLayerChanged( QgsVectorLayer *layer );
     406                 :            : 
     407                 :            : };
     408                 :            : 
     409                 :            : #endif // QGSLAYOUTITEMATTRIBUTETABLE_H

Generated by: LCOV version 1.14