39 class CORE_EXPORT QgsLayoutAttributeTableCompare
46 QgsLayoutAttributeTableCompare() =
default;
49 return ( mAscending ?
qgsVariantLessThan( m1[mCurrentSortColumn], m2[mCurrentSortColumn] )
56 void setSortColumn(
int column ) { mCurrentSortColumn = column; }
62 void setAscending(
bool ascending ) { mAscending = ascending; }
65 int mCurrentSortColumn = 0;
66 bool mAscending =
true;
105 return tr(
"<Attribute table frame>" );
110 if ( layer == mVectorLayer.
get() )
140 if ( relationId == mRelationId )
148 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
170 void QgsLayoutItemAttributeTable::atlasLayerChanged(
QgsVectorLayer *layer )
179 if ( mCurrentAtlasLayer )
185 mCurrentAtlasLayer = layer;
210 for (
const auto &field : sourceFields )
213 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
214 col->setAttribute( field.name() );
215 col->setHeading( currentAlias );
246 if ( features == mMaximumNumberOfFeatures )
251 mMaximumNumberOfFeatures = features;
258 if ( uniqueOnly == mShowUniqueRowsOnly )
263 mShowUniqueRowsOnly = uniqueOnly;
270 if ( visibleOnly == mShowOnlyVisibleFeatures )
275 mShowOnlyVisibleFeatures = visibleOnly;
282 if ( filterToAtlas == mFilterToAtlasIntersection )
287 mFilterToAtlasIntersection = filterToAtlas;
294 if ( filter == mFilterFeatures )
299 mFilterFeatures = filter;
306 if ( expression == mFeatureFilter )
311 mFeatureFilter = expression;
330 if ( !fields.isEmpty() )
332 for (
const QString &field : fields )
339 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
340 col->setAttribute( layerFields.
at( attrIdx ).
name() );
341 col->setHeading( currentAlias );
349 for (
const QgsField &field : layerFields )
352 std::unique_ptr< QgsLayoutTableColumn > col = qgis::make_unique< QgsLayoutTableColumn >();
353 col->setAttribute( field.name() );
354 col->setHeading( currentAlias );
366 void QgsLayoutItemAttributeTable::restoreFieldAliasMap(
const QMap<int, QString> &
map )
377 if ( map.contains( attrIdx ) )
379 column->setHeading( map.value( attrIdx ) );
403 std::unique_ptr<QgsExpression> filterExpression;
404 bool activeFilter =
false;
405 if ( mFilterFeatures && !mFeatureFilter.isEmpty() )
407 filterExpression = qgis::make_unique< QgsExpression >( mFeatureFilter );
408 if ( !filterExpression->hasParserError() )
415 if ( mMap && mShowOnlyVisibleFeatures )
417 selectionRect = mMap->
extent();
438 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
443 if ( !selectionRect.
isEmpty() )
459 while ( fit.
nextFeature( f ) && counter < mMaximumNumberOfFeatures )
463 if ( activeFilter && filterExpression )
465 QVariant result = filterExpression->evaluate( &context );
467 if ( !result.toBool() )
473 if ( mFilterToAtlasIntersection )
495 currentRow << replaceWrapChar( f.
attributes().at( idx ) );
500 std::unique_ptr< QgsExpression > expression = qgis::make_unique< QgsExpression >( column->attribute() );
502 expression->prepare( &context );
503 QVariant value = expression->evaluate( &context );
510 contents << currentRow;
516 QgsLayoutAttributeTableCompare
c;
518 for (
int i = sortColumns.size() - 1; i >= 0; --i )
520 c.setSortColumn( sortColumns.at( i ).first );
521 c.setAscending( sortColumns.at( i ).second );
522 std::stable_sort( contents.begin(), contents.end(),
c );
544 if ( !mMap && !mMapUuid.isEmpty() &&
mLayout )
562 mDataDefinedVectorLayer =
nullptr;
564 QString currentLayerIdentifier;
566 currentLayerIdentifier = currentLayer->id();
571 mDataDefinedVectorLayer = ddLayer;
577 QVariant QgsLayoutItemAttributeTable::replaceWrapChar(
const QVariant &variant )
const 580 if ( mWrapString.isEmpty() || !variant.toString().contains( mWrapString ) )
583 QString replaced = variant.toString();
584 replaced.replace( mWrapString, QLatin1String(
"\n" ) );
593 return mLayout->reportContext().layer();
596 if ( mDataDefinedVectorLayer )
597 return mDataDefinedVectorLayer;
599 return mVectorLayer.
get();
603 QgsRelation relation =
mLayout->project()->relationManager()->relation( mRelationId );
610 void QgsLayoutItemAttributeTable::removeLayer(
const QString &layerId )
614 if ( layerId == mVectorLayer->
id() )
624 static bool columnsBySortRank( QPair<int, QgsLayoutTableColumn * > a, QPair<int, QgsLayoutTableColumn * > b )
626 return a.second->sortByRank() < b.second->sortByRank();
632 QVector< QPair<int, QgsLayoutTableColumn * > > sortedColumns;
636 if ( column->sortByRank() > 0 )
638 sortedColumns.append( qMakePair( idx, column ) );
644 std::sort( sortedColumns.begin(), sortedColumns.end(), columnsBySortRank );
647 QVector<QPair<int, bool> > attributesBySortRank;
648 for (
auto &column : qgis::as_const( sortedColumns ) )
650 attributesBySortRank.append( qMakePair( column.first,
651 column.second->sortOrder() == Qt::AscendingOrder ) );
653 return attributesBySortRank;
658 if ( wrapString == mWrapString )
673 tableElem.setAttribute( QStringLiteral(
"source" ), QString::number( static_cast< int >( mSource ) ) );
674 tableElem.setAttribute( QStringLiteral(
"relationId" ), mRelationId );
675 tableElem.setAttribute( QStringLiteral(
"showUniqueRowsOnly" ), mShowUniqueRowsOnly );
676 tableElem.setAttribute( QStringLiteral(
"showOnlyVisibleFeatures" ), mShowOnlyVisibleFeatures );
677 tableElem.setAttribute( QStringLiteral(
"filterToAtlasIntersection" ), mFilterToAtlasIntersection );
678 tableElem.setAttribute( QStringLiteral(
"maxFeatures" ), mMaximumNumberOfFeatures );
679 tableElem.setAttribute( QStringLiteral(
"filterFeatures" ), mFilterFeatures ? QStringLiteral(
"true" ) : QStringLiteral(
"false" ) );
680 tableElem.setAttribute( QStringLiteral(
"featureFilter" ), mFeatureFilter );
681 tableElem.setAttribute( QStringLiteral(
"wrapString" ), mWrapString );
685 tableElem.setAttribute( QStringLiteral(
"mapUuid" ), mMap->
uuid() );
690 tableElem.setAttribute( QStringLiteral(
"vectorLayer" ), mVectorLayer.
layerId );
691 tableElem.setAttribute( QStringLiteral(
"vectorLayerName" ), mVectorLayer.
name );
692 tableElem.setAttribute( QStringLiteral(
"vectorLayerSource" ), mVectorLayer.
source );
693 tableElem.setAttribute( QStringLiteral(
"vectorLayerProvider" ), mVectorLayer.
provider );
711 mRelationId = itemElem.attribute( QStringLiteral(
"relationId" ), QLatin1String(
"" ) );
715 mCurrentAtlasLayer =
mLayout->reportContext().layer();
718 mShowUniqueRowsOnly = itemElem.attribute( QStringLiteral(
"showUniqueRowsOnly" ), QStringLiteral(
"0" ) ).toInt();
719 mShowOnlyVisibleFeatures = itemElem.attribute( QStringLiteral(
"showOnlyVisibleFeatures" ), QStringLiteral(
"1" ) ).toInt();
720 mFilterToAtlasIntersection = itemElem.attribute( QStringLiteral(
"filterToAtlasIntersection" ), QStringLiteral(
"0" ) ).toInt();
721 mFilterFeatures = itemElem.attribute( QStringLiteral(
"filterFeatures" ), QStringLiteral(
"false" ) ) == QLatin1String(
"true" );
722 mFeatureFilter = itemElem.attribute( QStringLiteral(
"featureFilter" ), QLatin1String(
"" ) );
723 mMaximumNumberOfFeatures = itemElem.attribute( QStringLiteral(
"maxFeatures" ), QStringLiteral(
"5" ) ).toInt();
724 mWrapString = itemElem.attribute( QStringLiteral(
"wrapString" ) );
727 mMapUuid = itemElem.attribute( QStringLiteral(
"mapUuid" ) );
736 QString layerId = itemElem.attribute( QStringLiteral(
"vectorLayer" ) );
737 QString layerName = itemElem.attribute( QStringLiteral(
"vectorLayerName" ) );
738 QString layerSource = itemElem.attribute( QStringLiteral(
"vectorLayerSource" ) );
739 QString layerProvider = itemElem.attribute( QStringLiteral(
"vectorLayerProvider" ) );
740 mVectorLayer =
QgsVectorLayerRef( layerId, layerName, layerSource, layerProvider );
754 if ( source == mSource )
763 if ( newLayer != prevLayer )
775 mCurrentAtlasLayer = newLayer;
int lookupField(const QString &fieldName) const
Look up field's index from the field name.
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.
QString relationId() const
Returns the relation id which the table displays child features from.
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.
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...
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...
virtual void refreshAttributes()
Refreshes the contents shown in the table by querying for new data.
Container of fields for a vector layer.
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.
QString wrapString() const
Returns the string used to wrap the contents of the table cells by.
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.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
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.
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1)
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.
bool intersects(const QgsRectangle &rectangle) const
Returns true if this geometry exactly intersects with a rectangle.
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 & setFilterFid(QgsFeatureId fid)
Sets feature ID that should be fetched.
QgsExpressionContextScope * lastScope()
Returns the last scope added to the context.
QgsRectangle extent() const
Returns the current map extent.
Layout graphical items for displaying a map.
QString provider
Weak reference to layer provider.
QString layerId
Original layer ID.
QgsPropertyCollection mDataDefinedProperties
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
const QgsLayout * layout() const
Returns the layout the object is attached to.
QgsFields fields() const override
Returns the list of fields of this layer.
bool isEmpty() const
Returns true if the rectangle is empty.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
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
QgsVectorLayer * sourceLayer() const
Returns the source layer for the table, considering the table source mode.
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 the layer's spatial reference system.
Reads and writes project states.
A layout table subclass that displays attributes from a vector layer.
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.
QgsFeatureRequest getRelatedFeaturesRequest(const QgsFeature &feature) const
Creates a request to return all the features on the referencing (child) layer which have a foreign ke...
QgsGeometry geometry() const
Returns the geometry associated with this feature.
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.
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.
QVector< QPair< int, bool > > sortAttributes() const
Returns the attributes used to sort the table's features.
void setVectorLayer(QgsVectorLayer *layer)
Sets the vector layer from which to display feature attributes.
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.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override
Query the layer for features specified in request.
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.
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...
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.
QgsCoordinateReferenceSystem crs() const
Returns coordinate reference system used for rendering the map.
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.
virtual QString uuid() const
Returns the item identification string.
_LayerRef< QgsVectorLayer > QgsVectorLayerRef
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...
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.
ContentSource
Specifies the content source for the attribute table.
ContentSource source() const
Returns the source for attributes shown in the table body.
QgsLayoutItemMap * map() const
Returns the layout map whose extents are controlling the features shown in the table.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
bool nextFeature(QgsFeature &f)
void changed()
Emitted when the object's properties change.
Represents a vector layer which manages a vector based data sets.
TYPE * get() const
Returns a pointer to the layer, or nullptr if the reference has not yet been matched to a layer...
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.
QString attributeDisplayName(int index) const
Convenience function that returns the attribute alias if defined or the field name else...
bool contentsContainsRow(const QgsLayoutTableContents &contents, const QgsLayoutTableRow &row) const
Checks whether a table contents contains a given row.
QVector< QgsLayoutTableRow > QgsLayoutTableContents
List of QgsLayoutTableRows, representing rows and column cell contents for a QgsLayoutTable.
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...