40 class CORE_EXPORT QgsLayoutAttributeTableCompare
47 QgsLayoutAttributeTableCompare() =
default;
50 return ( mAscending ?
qgsVariantLessThan( m1[mCurrentSortColumn], m2[mCurrentSortColumn] )
57 void setSortColumn(
int column ) { mCurrentSortColumn = column; }
63 void setAscending(
bool ascending ) { mAscending = ascending; }
66 int mCurrentSortColumn = 0;
67 bool mAscending =
true;
106 return tr(
"<Attribute table frame>" );
111 if ( layer == mVectorLayer.
get() )
141 if ( relationId == mRelationId )
149 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
171 void QgsLayoutItemAttributeTable::atlasLayerChanged(
QgsVectorLayer *layer )
180 if ( mCurrentAtlasLayer )
186 const bool mustRebuildColumns =
static_cast< bool >( mCurrentAtlasLayer ) ||
mColumns.empty();
187 mCurrentAtlasLayer = layer;
189 if ( mustRebuildColumns )
216 for (
const auto &field : sourceFields )
219 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
220 col->setAttribute( field.name() );
221 col->setHeading( currentAlias );
227 void QgsLayoutItemAttributeTable::disconnectCurrentMap()
236 disconnect( mMap, &QObject::destroyed,
this, &QgsLayoutItemAttributeTable::disconnectCurrentMap );
247 disconnectCurrentMap();
255 connect( mMap, &QObject::destroyed,
this, &QgsLayoutItemAttributeTable::disconnectCurrentMap );
263 if ( features == mMaximumNumberOfFeatures )
268 mMaximumNumberOfFeatures = features;
275 if ( uniqueOnly == mShowUniqueRowsOnly )
280 mShowUniqueRowsOnly = uniqueOnly;
287 if ( visibleOnly == mShowOnlyVisibleFeatures )
292 mShowOnlyVisibleFeatures = visibleOnly;
299 if ( filterToAtlas == mFilterToAtlasIntersection )
304 mFilterToAtlasIntersection = filterToAtlas;
311 if ( filter == mFilterFeatures )
316 mFilterFeatures = filter;
323 if ( expression == mFeatureFilter )
328 mFeatureFilter = expression;
347 if ( !fields.isEmpty() )
349 for (
const QString &field : fields )
356 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
357 col->setAttribute( layerFields.
at( attrIdx ).
name() );
358 col->setHeading( currentAlias );
366 for (
const QgsField &field : layerFields )
369 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
370 col->setAttribute( field.name() );
371 col->setHeading( currentAlias );
383 void QgsLayoutItemAttributeTable::restoreFieldAliasMap(
const QMap<int, QString> &
map )
394 if ( map.contains( attrIdx ) )
396 column->setHeading( map.value( attrIdx ) );
422 std::unique_ptr<QgsExpression> filterExpression;
423 bool activeFilter =
false;
424 if ( mFilterFeatures && !mFeatureFilter.isEmpty() )
426 filterExpression = qgis::make_unique< QgsExpression >( mFeatureFilter );
427 if ( !filterExpression->hasParserError() )
437 std::unique_ptr< QgsGeometryEngine > visibleMapEngine;
438 if ( mMap && mShowOnlyVisibleFeatures )
458 visibleMapEngine->prepareGeometry();
462 std::unique_ptr< QgsGeometryEngine > atlasGeometryEngine;
463 if ( mFilterToAtlasIntersection )
465 atlasGeometry =
mLayout->reportContext().currentGeometry( layer->
crs() );
466 if ( !atlasGeometry.
isNull() )
468 if ( selectionRect.
isNull() )
478 atlasGeometryEngine->prepareGeometry();
484 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
489 if ( !selectionRect.
isEmpty() )
505 while ( fit.
nextFeature( f ) && counter < mMaximumNumberOfFeatures )
509 if ( activeFilter && filterExpression )
511 QVariant result = filterExpression->evaluate( &context );
513 if ( !result.toBool() )
520 if ( visibleMapEngine )
530 if ( mFilterToAtlasIntersection )
542 currentRow.reserve(
mColumns.count() );
549 currentRow << replaceWrapChar( f.
attributes().at( idx ) );
554 std::unique_ptr< QgsExpression > expression = qgis::make_unique< QgsExpression >( column->attribute() );
556 expression->prepare( &context );
557 QVariant value = expression->evaluate( &context );
564 contents << currentRow;
570 QgsLayoutAttributeTableCompare
c;
572 for (
int i = sortColumns.size() - 1; i >= 0; --i )
574 c.setSortColumn( sortColumns.at( i ).first );
575 c.setAscending( sortColumns.at( i ).second );
576 std::stable_sort( contents.begin(), contents.end(),
c );
598 if ( !mMap && !mMapUuid.isEmpty() &&
mLayout )
617 mDataDefinedVectorLayer =
nullptr;
619 QString currentLayerIdentifier;
621 currentLayerIdentifier = currentLayer->id();
626 mDataDefinedVectorLayer = ddLayer;
632 QVariant QgsLayoutItemAttributeTable::replaceWrapChar(
const QVariant &variant )
const 635 if ( mWrapString.isEmpty() || !variant.toString().contains( mWrapString ) )
638 QString replaced = variant.toString();
639 replaced.replace( mWrapString, QLatin1String(
"\n" ) );
648 return mLayout->reportContext().layer();
651 if ( mDataDefinedVectorLayer )
652 return mDataDefinedVectorLayer;
654 return mVectorLayer.
get();
658 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
665 void QgsLayoutItemAttributeTable::removeLayer(
const QString &layerId )
669 if ( layerId == mVectorLayer->
id() )
679 static bool columnsBySortRank( QPair<int, QgsLayoutTableColumn * > a, QPair<int, QgsLayoutTableColumn * > b )
681 return a.second->sortByRank() < b.second->sortByRank();
687 QVector< QPair<int, QgsLayoutTableColumn * > > sortedColumns;
691 if ( column->sortByRank() > 0 )
693 sortedColumns.append( qMakePair( idx, column ) );
699 std::sort( sortedColumns.begin(), sortedColumns.end(), columnsBySortRank );
702 QVector<QPair<int, bool> > attributesBySortRank;
703 attributesBySortRank.reserve( sortedColumns.size() );
704 for (
auto &column : qgis::as_const( sortedColumns ) )
706 attributesBySortRank.append( qMakePair( column.first,
707 column.second->sortOrder() == Qt::AscendingOrder ) );
709 return attributesBySortRank;
714 if ( wrapString == mWrapString )
729 tableElem.setAttribute( QStringLiteral(
"source" ), QString::number( static_cast< int >( mSource ) ) );
730 tableElem.setAttribute( QStringLiteral(
"relationId" ), mRelationId );
731 tableElem.setAttribute( QStringLiteral(
"showUniqueRowsOnly" ), mShowUniqueRowsOnly );
732 tableElem.setAttribute( QStringLiteral(
"showOnlyVisibleFeatures" ), mShowOnlyVisibleFeatures );
733 tableElem.setAttribute( QStringLiteral(
"filterToAtlasIntersection" ), mFilterToAtlasIntersection );
734 tableElem.setAttribute( QStringLiteral(
"maxFeatures" ), mMaximumNumberOfFeatures );
735 tableElem.setAttribute( QStringLiteral(
"filterFeatures" ), mFilterFeatures ? QStringLiteral(
"true" ) : QStringLiteral(
"false" ) );
736 tableElem.setAttribute( QStringLiteral(
"featureFilter" ), mFeatureFilter );
737 tableElem.setAttribute( QStringLiteral(
"wrapString" ), mWrapString );
741 tableElem.setAttribute( QStringLiteral(
"mapUuid" ), mMap->
uuid() );
746 tableElem.setAttribute( QStringLiteral(
"vectorLayer" ), mVectorLayer.
layerId );
747 tableElem.setAttribute( QStringLiteral(
"vectorLayerName" ), mVectorLayer.
name );
748 tableElem.setAttribute( QStringLiteral(
"vectorLayerSource" ), mVectorLayer.
source );
749 tableElem.setAttribute( QStringLiteral(
"vectorLayerProvider" ), mVectorLayer.
provider );
767 mRelationId = itemElem.attribute( QStringLiteral(
"relationId" ), QString() );
771 mCurrentAtlasLayer =
mLayout->reportContext().layer();
774 mShowUniqueRowsOnly = itemElem.attribute( QStringLiteral(
"showUniqueRowsOnly" ), QStringLiteral(
"0" ) ).toInt();
775 mShowOnlyVisibleFeatures = itemElem.attribute( QStringLiteral(
"showOnlyVisibleFeatures" ), QStringLiteral(
"1" ) ).toInt();
776 mFilterToAtlasIntersection = itemElem.attribute( QStringLiteral(
"filterToAtlasIntersection" ), QStringLiteral(
"0" ) ).toInt();
777 mFilterFeatures = itemElem.attribute( QStringLiteral(
"filterFeatures" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" );
778 mFeatureFilter = itemElem.attribute( QStringLiteral(
"featureFilter" ), QString() );
779 mMaximumNumberOfFeatures = itemElem.attribute( QStringLiteral(
"maxFeatures" ), QStringLiteral(
"5" ) ).toInt();
780 mWrapString = itemElem.attribute( QStringLiteral(
"wrapString" ) );
783 mMapUuid = itemElem.attribute( QStringLiteral(
"mapUuid" ) );
793 QString layerId = itemElem.attribute( QStringLiteral(
"vectorLayer" ) );
794 QString layerName = itemElem.attribute( QStringLiteral(
"vectorLayerName" ) );
795 QString layerSource = itemElem.attribute( QStringLiteral(
"vectorLayerSource" ) );
796 QString layerProvider = itemElem.attribute( QStringLiteral(
"vectorLayerProvider" ) );
797 mVectorLayer =
QgsVectorLayerRef( layerId, layerName, layerSource, layerProvider );
811 if ( source == mSource )
820 if ( newLayer != prevLayer )
832 mCurrentAtlasLayer = newLayer;
QString displayName() const override
Returns the multiframe display name.
The class is used as a container of context for various read/write operations on other objects...
Wrapper for iterator of features from vector data provider or vector layer.
Single variable definition for use within a QgsExpressionContextScope.
A rectangle specified with double values.
bool isEmpty() const
Returns true if the rectangle is empty.
QgsExpressionContext createExpressionContext() const override
Creates an expression context relating to the objects' current state.
void setMaximumNumberOfFeatures(int features)
Sets the maximum number of features shown by the table.
bool isNull() const
Returns true if the geometry is null (ie, contains no underlying geometry accessible via geometry() )...
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
Use exact geometry intersection (slower) instead of bounding boxes.
int type() const override
Returns unique multiframe type id.
A class to display a table in the print layout, and allow the table to span over multiple frames...
QString valueAsString(int key, const QgsExpressionContext &context, const QString &defaultString=QString(), bool *ok=nullptr) const
Calculates the current value of the property with the specified key and interprets it as a string...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
void extentChanged()
Is emitted when the map's extent changes.
QgsVectorLayer referencingLayer
bool writePropertiesToElement(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Stores multiframe state within an XML DOM element.
TYPE * resolveWeakly(const QgsProject *project)
Resolves the map layer by attempting to find a matching layer in a project using a weak match...
bool isNull() const
Test if the rectangle is null (all coordinates zero or after call to setMinimal()).
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
virtual void refreshAttributes()
Refreshes the contents shown in the table by querying for new data.
Container of fields for a vector layer.
A geometry is the spatial representation of a feature.
static QIcon getThemeIcon(const QString &name)
Helper to get a theme icon.
bool readPropertiesFromElement(const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context) override
Sets multiframe state from a DOM element.
Table shows attributes from related child features.
bool contentsContainsRow(const QgsLayoutTableContents &contents, const QgsLayoutTableRow &row) const
Checks whether a table contents contains a given row.
ContentSource source() const
Returns the source for attributes shown in the table body.
TYPE * get() const
Returns a pointer to the layer, or nullptr if the reference has not yet been matched to a layer...
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
bool qgsVariantGreaterThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is greater than the second.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
void addVariable(const QgsExpressionContextScope::StaticVariable &variable)
Adds a variable into the context scope.
Table shows attributes from features in a vector layer.
bool qgsVariantLessThan(const QVariant &lhs, const QVariant &rhs)
Compares two QVariant values and returns whether the first is less than the second.
Stores properties of a column for a QgsLayoutTable.
void setFilterToAtlasFeature(bool filterToAtlas)
Sets attribute table to only show features which intersect the current atlas feature.
void resetColumns()
Resets the attribute table's columns to match the vector layer's fields.
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Attribute table source layer.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
QgsFeatureRequest & setFilterFid(QgsFeatureId fid)
Sets feature ID that should be fetched.
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
Layout graphical items for displaying a map.
QString provider
Weak reference to layer provider.
QString layerId
Original layer ID.
QgsPropertyCollection mDataDefinedProperties
QgsFields fields() const FINAL
Returns the list of fields of this layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsVectorLayer * sourceLayer() const
Returns the source layer for the table, considering the table source mode.
QString name
Weak reference to layer name.
void setFeatureFilter(const QString &expression)
Sets the expression used for filtering features in the table.
QPointer< QgsLayout > mLayout
This class wraps a request for features to a vector layer (or directly its vector data provider)...
void setFilterFeatures(bool filter)
Sets whether the feature filter is active for the attribute table.
void setDisplayOnlyVisibleFeatures(bool visibleOnly)
Sets the attribute table to only show features which are visible in a map item.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
Reads and writes project states.
A layout table subclass that displays attributes from a vector layer.
virtual QString uuid() const
Returns the item identification string.
Table shows attributes from the current atlas feature.
void layerChanged(QgsVectorLayer *layer)
Emitted when the context's layer is changed.
Encapsulate a field in an attribute table or data source.
int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
virtual void finalizeRestoreFromXml()
Called after all pending items have been restored from XML.
void setLayer(TYPE *l)
Sets the reference to point to a specified layer.
QgsFeatureRequest getRelatedFeaturesRequest(const QgsFeature &feature) const
Creates a request to return all the features on the referencing (child) layer which have a foreign ke...
QString source
Weak reference to layer public source.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
static QgsMapLayer * mapLayerFromString(const QString &string, QgsProject *project)
Resolves a string into a map layer from a given project.
static QgsLayoutItemAttributeTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemAttributeTable for the specified parent layout.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
void setVectorLayer(QgsVectorLayer *layer)
Sets the vector layer from which to display feature attributes.
QString attributeDisplayName(int index) const
Convenience function that returns the attribute alias if defined or the field name else...
void mapRotationChanged(double newRotation)
Is emitted when the map's rotation changes.
QgsExpressionContext createExpressionContext() const override
This method needs to be reimplemented in all classes which implement this interface and return an exp...
void setSource(ContentSource source)
Sets the source for attributes to show in table body.
QgsRectangle intersect(const QgsRectangle &rect) const
Returns the intersection with the given rectangle.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
void setDisplayedFields(const QStringList &fields, bool refresh=true)
Sets the attributes to display in the table.
void layerWillBeRemoved(const QString &layerId)
Emitted when a layer is about to be removed from the registry.
QgsLayoutTableColumns mColumns
Columns to show in table.
void setUniqueRowsOnly(bool uniqueOnly)
Sets attribute table to only show unique rows.
void finalizeRestoreFromXml() override
Called after all pending items have been restored from XML.
QgsLayoutTableContents & contents()
Returns the current contents of the table.
bool writePropertiesToElement(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Stores multiframe state within an XML DOM element.
QgsLayoutItemAttributeTable(QgsLayout *layout)
Constructor for QgsLayoutItemAttributeTable, attached to the specified layout.
void setWrapString(const QString &wrapString)
Sets a string to wrap the contents of the table cells by.
void appendScope(QgsExpressionContextScope *scope)
Appends a scope to the end of the context.
_LayerRef< QgsVectorLayer > QgsVectorLayerRef
bool hasGeometry() const
Returns true if the feature has an associated geometry.
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
QgsLayoutItemMap * map() const
Returns the layout map whose extents are controlling the features shown in the table.
void setRelationId(const QString &id)
Sets the relation id from which to display child features.
void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties) override
Refreshes a data defined property for the multi frame by reevaluating the property's value and redraw...
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Query the layer for features specified in request.
QString relationId() const
Returns the relation id which the table displays child features from.
void setMap(QgsLayoutItemMap *map)
Sets a layout map to use to limit the extent of features shown in the attribute table.
Custom exception class for Coordinate Reference System related exceptions.
const QgsLayout * layout() const
Returns the layout the object is attached to.
ContentSource
Specifies the content source for the attribute table.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
bool nextFeature(QgsFeature &f)
QVector< QPair< int, bool > > sortAttributes() const
Returns the attributes used to sort the table's features.
void changed()
Emitted when the object's properties change.
Represents a vector layer which manages a vector based data sets.
QString wrapString() const
Returns the string used to wrap the contents of the table cells by.
DataDefinedProperty
Data defined properties for different item types.
bool getTableContents(QgsLayoutTableContents &contents) override
Queries the attribute table's vector layer for attributes to show in the table.
QIcon icon() const override
Returns the item's icon.
void layerModified()
This signal is emitted when modifications has been done on layer.
QPolygonF visibleExtentPolygon() const
Returns a polygon representing the current visible map extent, considering map extents and rotation...
QVector< QgsLayoutTableRow > QgsLayoutTableContents
List of QgsLayoutTableRows, representing rows and column cell contents for a QgsLayoutTable.
QgsCoordinateReferenceSystem crs
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
bool readPropertiesFromElement(const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context) override
Sets multiframe state from a DOM element.
QVector< QVariant > QgsLayoutTableRow
List of QVariants, representing a the contents of a single row in a QgsComposerTable.
void recalculateTableSize()
Recalculates and updates the size of the table and all table frames.
virtual void refreshDataDefinedProperty(QgsLayoutObject::DataDefinedProperty property=QgsLayoutObject::AllProperties)
Refreshes a data defined property for the multi frame by reevaluating the property's value and redraw...