26   : QAbstractItemModel( parent )
 
   28   mReloadTimer.setInterval( 100 );
 
   29   mReloadTimer.setSingleShot( 
true );
 
   30   connect( &mReloadTimer, &QTimer::timeout, 
this, &QgsFeaturePickerModelBase::scheduledReload );
 
   37     connect( mGatherer, &QgsFeatureExpressionValuesGatherer::finished, mGatherer, &QgsFeatureExpressionValuesGatherer::deleteLater );
 
  100   return mFilterExpression;
 
  129   return createIndex( row, column, 
nullptr );
 
  136   return QModelIndex();
 
  150   if ( !
index.isValid() )
 
  155     case Qt::DisplayRole:
 
  168       const QVariantList values = 
mEntries.value( 
index.row() ).identifierFields;
 
  169       return values.value( 0 );
 
  175 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) 
  176     case Qt::BackgroundColorRole:
 
  177     case Qt::TextColorRole:
 
  179     case Qt::BackgroundRole:
 
  180     case Qt::ForegroundRole:
 
  182     case Qt::DecorationRole:
 
  189 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) 
  190         if ( role == Qt::TextColorRole )
 
  192         if ( role == Qt::ForegroundRole )
 
  195           return QBrush( QColor( Qt::gray ) );
 
  197         if ( role == Qt::FontRole )
 
  199           QFont font = QFont();
 
  201             font.setBold( 
true );
 
  203             font.setItalic( 
true );
 
  214 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) 
  220 #if QT_VERSION < QT_VERSION_CHECK(5, 13, 0) 
  226           if ( role == Qt::DecorationRole )
 
  228           if ( role == Qt::FontRole )
 
  240 void QgsFeaturePickerModelBase::updateCompleter()
 
  244   QgsFeatureExpressionValuesGatherer *gatherer = qobject_cast<QgsFeatureExpressionValuesGatherer *>( sender() );
 
  245   if ( gatherer->wasCanceled() )
 
  251   QVector<QgsFeatureExpressionValuesGatherer::Entry> entries = mGatherer->entries();
 
  259   bool reloadCurrentFeatureOnly = mGatherer->data().toBool();
 
  260   if ( reloadCurrentFeatureOnly )
 
  262     if ( !entries.isEmpty() )
 
  266       mShouldReloadCurrentFeature = 
false;
 
  267       setExtraValueDoesNotExist( 
false );
 
  271       setExtraValueDoesNotExist( 
true );
 
  274     mKeepCurrentEntry = 
true;
 
  275     mShouldReloadCurrentFeature = 
false;
 
  277     if ( mFilterValue.isEmpty() )
 
  283     std::sort( entries.begin(), entries.end(), []( 
const QgsFeatureExpressionValuesGatherer::Entry & a, 
const QgsFeatureExpressionValuesGatherer::Entry & b ) { return a.value.localeAwareCompare( b.value ) < 0; } );
 
  285     if ( mAllowNull && mSourceLayer )
 
  287       entries.prepend( QgsFeatureExpressionValuesGatherer::nullEntry( mSourceLayer ) );
 
  290     const int newEntriesSize = entries.size();
 
  293     const int nbFixedEntry = ( mKeepCurrentEntry ? 1 : 0 ) + ( mAllowNull ? 1 : 0 );
 
  296     int currentEntryInNewList = -1;
 
  299       for ( 
int i = 0; i < newEntriesSize; ++i )
 
  304           currentEntryInNewList = i;
 
  305           setExtraValueDoesNotExist( 
false );
 
  327     beginRemoveRows( QModelIndex(), firstRow, 
mEntries.size() - firstRow );
 
  333     mIsSettingExtraIdentifierValue = 
true;
 
  335     mIsSettingExtraIdentifierValue = 
false;
 
  337     if ( currentEntryInNewList == -1 )
 
  339       beginInsertRows( QModelIndex(), firstRow, entries.size() + 1 );
 
  346       setExtraIdentifierValueIndex( firstRow == 0 && mAllowNull && !entries.isEmpty() ? 1 : 0, firstRow == 0 );
 
  350       if ( currentEntryInNewList != 0 )
 
  352         beginInsertRows( QModelIndex(), 0, currentEntryInNewList - 1 );
 
  358         mEntries.replace( 0, entries.at( 0 ) );
 
  362       if ( currentEntryInNewList >= nbFixedEntry )
 
  364         emit dataChanged( 
index( currentEntryInNewList, 0, QModelIndex() ), 
index( currentEntryInNewList, 0, QModelIndex() ) );
 
  367       beginInsertRows( QModelIndex(), currentEntryInNewList + 1, newEntriesSize - currentEntryInNewList - 1 );
 
  368       mEntries += entries.mid( currentEntryInNewList + 1 );
 
  370       setExtraIdentifierValueIndex( currentEntryInNewList );
 
  375     mKeepCurrentEntry = 
false;
 
  381   Q_ASSERT( gatherer == mGatherer );
 
  388 void QgsFeaturePickerModelBase::scheduledReload()
 
  393   bool wasLoading = 
false;
 
  403   if ( mShouldReloadCurrentFeature )
 
  409     QString filterClause;
 
  411     if ( mFilterValue.isEmpty() && !mFilterExpression.isEmpty() )
 
  412       filterClause = mFilterExpression;
 
  413     else if ( mFilterExpression.isEmpty() && !mFilterValue.isEmpty() )
 
  414       filterClause = QStringLiteral( 
"(%1) ILIKE '%%2%'" ).arg( mDisplayExpression, mFilterValue );
 
  415     else if ( !mFilterExpression.isEmpty() && !mFilterValue.isEmpty() )
 
  416       filterClause = QStringLiteral( 
"(%1) AND ((%2) ILIKE '%%3%')" ).arg( mFilterExpression, mDisplayExpression, mFilterValue );
 
  418     if ( !filterClause.isEmpty() )
 
  422   if ( !attributes.isEmpty() )
 
  425       attributes += lFilterExpression->referencedColumns();
 
  426     attributes += requestedAttributesForStyle();
 
  431   if ( !mFetchGeometry )
 
  433   if ( mFetchLimit > 0 )
 
  437   mGatherer->setData( mShouldReloadCurrentFeature );
 
  438   connect( mGatherer, &QgsFeatureExpressionValuesGatherer::finished, 
this, &QgsFeaturePickerModelBase::updateCompleter );
 
  446 QSet<QString> QgsFeaturePickerModelBase::requestedAttributesForStyle()
 const 
  448   QSet<QString> requestedAttrs;
 
  455     requestedAttrs += exp.referencedColumns();
 
  458   if ( mDisplayExpression.
isField() )
 
  465       requestedAttrs += exp.referencedColumns();
 
  469   return requestedAttrs;
 
  473 void QgsFeaturePickerModelBase::setExtraIdentifierValueIndex( 
int index, 
bool force )
 
  483 void QgsFeaturePickerModelBase::reloadCurrentFeature()
 
  485   mShouldReloadCurrentFeature = 
true;
 
  486   mReloadTimer.start();
 
  492   const QVector<QgsFeatureExpressionValuesGatherer::Entry> entries = 
mEntries;
 
  495   for ( 
const QgsFeatureExpressionValuesGatherer::Entry &entry : entries )
 
  499       setExtraIdentifierValueIndex( 
index );
 
  510     if ( !isNull || mAllowNull )
 
  512       beginInsertRows( QModelIndex(), 0, 0 );
 
  516         reloadCurrentFeature();
 
  520         mEntries.prepend( QgsFeatureExpressionValuesGatherer::nullEntry( mSourceLayer ) );
 
  524       setExtraIdentifierValueIndex( 0, 
true );
 
  548     styles += matchingFieldStyles;
 
  553   mEntryStylesMap.insert( fid, style );
 
  578   return mFetchGeometry;
 
  607   return mExtraValueDoesNotExist;
 
  611 void QgsFeaturePickerModelBase::setExtraValueDoesNotExist( 
bool extraValueDoesNotExist )
 
  627 void QgsFeaturePickerModelBase::reload()
 
  629   mReloadTimer.start();
 
  638   if ( mIsSettingExtraIdentifierValue )
 
  641   mIsSettingExtraIdentifierValue = 
true;
 
  647   mIsSettingExtraIdentifierValue = 
false;
 
QgsConditionalStyles rowStyles() const
Returns a list of row styles associated with the layer.
QList< QgsConditionalStyle > fieldStyles(const QString &fieldName) const
Returns the conditional styles set for the field with matching fieldName.
Conditional styling for a rule.
static QgsConditionalStyle compressStyles(const QList< QgsConditionalStyle > &styles)
Compress a list of styles into a single style.
static QList< QgsConditionalStyle > matchingConditionalStyles(const QList< QgsConditionalStyle > &styles, const QVariant &value, QgsExpressionContext &context)
Find and return the matching styles for the value and feature.
QColor backgroundColor() const
The background color for style.
QColor textColor() const
The text color set for style.
QFont font() const
The font for the style.
bool validTextColor() const
Check if the text color is valid for render.
bool isValid() const
isValid Check if this rule is valid.
QPixmap icon() const
The icon set for style generated from the set symbol.
bool validBackgroundColor() const
Check if the background color is valid for render.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Class for parsing and evaluation of expressions (formerly called "search strings").
QString expression() const
Returns the original, unmodified expression string.
bool isField() const
Checks whether an expression consists only of a single field reference.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
void extraIdentifierValueIndexChanged(int index)
The index at which the extra identifier value is available within the model.
void beginUpdate()
Notification that the model is about to be changed because a job was completed.
virtual QVariant entryIdentifier(const QgsFeatureExpressionValuesGatherer::Entry &entry) const =0
Returns the identifier of the given entry.
void filterValueChanged()
This value will be used to filter the features available from this model.
void setFilterValue(const QString &filterValue)
This value will be used to filter the features available from this model.
void setExtraIdentifierValue(const QVariant &extraIdentifierValue)
Allows specifying one value that does not need to match the filter criteria but will still be availab...
virtual void requestToReloadCurrentFeature(QgsFeatureRequest &request)=0
Update the request to match the current feature to be reloaded.
void filterExpressionChanged()
An additional filter expression to apply, next to the filterValue.
void setFetchLimit(int fetchLimit)
Defines the feature request fetch limit If set to 0, no limit is applied when fetching.
QVariant extraIdentifierValue() const
Allows specifying one value that does not need to match the filter criteria but will still be availab...
void setFetchGeometry(bool fetchGeometry)
Defines if the geometry will be fetched.
void setExtraIdentifierValueUnguarded(const QVariant &identifierValue)
This will set the identifier value to be set in the model even if it doesn't exist currently in the d...
void extraIdentifierValueChanged()
Allows specifying one value that does not need to match the filter criteria but will still be availab...
int mExtraValueIndex
The current index.
QModelIndex parent(const QModelIndex &child) const override
void filterJobCompleted()
Indicates that a filter job has been completed and new data may be available.
void setAllowNull(bool allowNull)
Add a NULL entry to the list.
void setDisplayExpression(const QString &displayExpression)
The display expression will be used for.
QVariant mExtraIdentifierValue
The current identifier value.
QgsFeaturePickerModelBase(QObject *parent=nullptr)
Create a new QgsFeaturePickerModelBase, optionally specifying a parent.
virtual QgsFeatureExpressionValuesGatherer * createValuesGatherer(const QgsFeatureRequest &request) const =0
Creates the value gatherer.
virtual QgsFeatureExpressionValuesGatherer::Entry createEntry(const QVariant &identifier) const =0
Creates an entry with just the identifier so the feature can be retrieved in a next iteration.
bool isLoading() const
Indicator if the model is currently performing any feature iteration in the background.
virtual bool identifierIsNull(const QVariant &identifier) const =0
Returns true if the entry is null The identifier can be either the feature ID or the list of identifi...
QgsVectorLayer * sourceLayer
QVariant data(const QModelIndex &index, int role) const override
QModelIndex index(int row, int column, const QModelIndex &parent) const override
int extraIdentifierValueIndex
void fetchLimitChanged()
Emitted when the fetching limit for the feature request changes.
void sourceLayerChanged()
The source layer from which features will be fetched.
~QgsFeaturePickerModelBase() override
virtual QSet< QString > requestedAttributes() const
Returns the attributes to be fetched in the request.
@ FeatureIdRole
Used to retrieve the id of a feature.
@ IdentifierValuesRole
Used to retrieve the identifierValues (primary keys) of a feature.
@ FeatureRole
Used to retrieve the feature, it might be incomplete if the request doesn't fetch all attributes or g...
@ ValueRole
Used to retrieve the displayExpression of a feature.
void setFilterExpression(const QString &filterExpression)
An additional filter expression to apply, next to the filterValue.
void allowNullChanged()
Add a NULL entry to the list.
int rowCount(const QModelIndex &parent) const override
virtual bool compareEntries(const QgsFeatureExpressionValuesGatherer::Entry &a, const QgsFeatureExpressionValuesGatherer::Entry &b) const =0
Returns true if the 2 entries refers to the same feature.
void isLoadingChanged()
Indicator if the model is currently performing any feature iteration in the background.
QString displayExpression
QVector< QgsFeatureExpressionValuesGatherer::Entry > mEntries
virtual QVariant nullIdentifier() const =0
Returns a null identifier.
void endUpdate()
Notification that the model change is finished.
void displayExpressionChanged()
The display expression will be used for.
void extraValueDoesNotExistChanged()
Flag indicating that the extraIdentifierValue does not exist in the data.
void setSourceLayer(QgsVectorLayer *sourceLayer)
The source layer from which features will be fetched.
bool extraValueDoesNotExist() const
Flag indicating that the extraIdentifierValue does not exist in the data.
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsExpression * filterExpression() const
Returns the filter expression if set.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setLimit(long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name.
Represents a vector layer which manages a vector based data sets.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QString displayExpression
QgsConditionalLayerStyles * conditionalStyles() const
Returns the conditional styles that are set for this layer.
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features