36  setSelectionMode( QAbstractItemView::ExtendedSelection );
 
   38  mUpdateEditSelectionTimerWithSelection.setSingleShot( 
true );
 
   39  connect( &mUpdateEditSelectionTimerWithSelection, &QTimer::timeout, 
this, [ 
this ]()
 
   41    updateEditSelection( 
true );
 
   44  mUpdateEditSelectionTimerWithSelection.setInterval( 0 );
 
   46  mUpdateEditSelectionTimerWithoutSelection.setSingleShot( 
true );
 
   47  connect( &mUpdateEditSelectionTimerWithoutSelection, &QTimer::timeout, 
this, [ 
this ]()
 
   49    updateEditSelection( 
false );
 
   52  mUpdateEditSelectionTimerWithoutSelection.setInterval( 0 );
 
 
   65  delete mFeatureSelectionModel;
 
   66  delete mCurrentEditSelectionModel;
 
   68  mCurrentEditSelectionModel = 
new QItemSelectionModel( mModel->
masterModel(), 
this );
 
   69  if ( !mFeatureSelectionManager )
 
   72    mFeatureSelectionManager = mOwnedFeatureSelectionManager;
 
   76  setSelectionModel( mFeatureSelectionModel );
 
   79    ensureEditSelection( true );
 
   82  if ( mItemDelegate && mItemDelegate->parent() == 
this )
 
   89  setItemDelegate( mItemDelegate );
 
   96  connect( mCurrentEditSelectionModel, &QItemSelectionModel::selectionChanged, 
this, &QgsFeatureListView::editSelectionChanged );
 
   98  connect( 
featureListModel, &QgsFeatureListModel::rowsRemoved, 
this, [ 
this ]() { ensureEditSelection(); } );
 
   99  connect( 
featureListModel, &QgsFeatureListModel::rowsInserted, 
this, [ 
this ]() { ensureEditSelection(); } );
 
  100  connect( 
featureListModel, &QgsFeatureListModel::modelReset, 
this, [ 
this ]() { ensureEditSelection(); } );
 
 
  129  const QModelIndexList selectedIndexes = mCurrentEditSelectionModel->selectedIndexes();
 
  130  for ( 
const QModelIndex &idx : selectedIndexes )
 
 
  140  viewport()->update( visualRegionForSelection( mCurrentEditSelectionModel->selection() ) );
 
 
  145  if ( event->button() != Qt::LeftButton )
 
  147    QListView::mousePressEvent( event );
 
  153    const QPoint pos = 
event->pos();
 
  155    const QModelIndex index = indexAt( pos );
 
  159      mDragMode = DragMode::MoveSelection;
 
  160      if ( index.isValid() )
 
  165      mDragMode = DragMode::ExpandSelection;
 
  167      selectRow( index, 
true );
 
  173    QgsDebugError( QStringLiteral( 
"No model assigned to this view" ) );
 
 
  177void QgsFeatureListView::editSelectionChanged( 
const QItemSelection &selected, 
const QItemSelection &deselected )
 
  179  if ( isVisible() && updatesEnabled() )
 
  183    viewport()->update( visualRegionForSelection( localDeselected ) | visualRegionForSelection( localSelected ) );
 
  187  if ( !selected.isEmpty() )
 
  189    const QModelIndexList indexList = selected.indexes();
 
  190    if ( !indexList.isEmpty() )
 
  194      mLastEditSelectionFid = selectedFeature.
id();
 
  198  const QItemSelection currentSelection = mCurrentEditSelectionModel->selection();
 
  199  if ( currentSelection.size() == 1 )
 
  201    QModelIndexList indexList = currentSelection.indexes();
 
  202    if ( !indexList.isEmpty() )
 
  219  QItemSelection selection;
 
  220  selection.append( QItemSelectionRange( mModel->index( 0, 0 ), mModel->index( mModel->
rowCount() - 1, 0 ) ) );
 
  222  mFeatureSelectionModel->
selectFeatures( selection, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows );
 
 
  227  QItemSelection selection;
 
  228  QModelIndex firstModelIdx;
 
  230  const auto constFids = fids;
 
  233    const QModelIndex modelIdx = mModel->
fidToIdx( fid );
 
  235    if ( ! firstModelIdx.isValid() )
 
  236      firstModelIdx = modelIdx;
 
  238    selection.append( QItemSelectionRange( mModel->
mapToMaster( modelIdx ) ) );
 
  246    mCurrentEditSelectionModel->select( selection, QItemSelectionModel::ClearAndSelect );
 
  247    scrollTo( firstModelIdx );
 
 
  257  Q_ASSERT( index.model() == mModel->
masterModel() || !index.isValid() );
 
  261    mCurrentEditSelectionModel->select( index, command );
 
 
  268  const auto constIndexes = indexes;
 
  269  for ( 
const QModelIndex &index : constIndexes )
 
 
  277  setDirtyRegion( viewport()->rect() );
 
 
  284    const QPoint pos = 
event->pos();
 
  285    const QModelIndex index = indexAt( pos );
 
  289      case QgsFeatureListView::DragMode::Inactive:
 
  292      case QgsFeatureListView::DragMode::ExpandSelection:
 
  294        selectRow( index, 
false );
 
  298      case QgsFeatureListView::DragMode::MoveSelection:
 
  300        if ( index.isValid() )
 
  308    QgsDebugError( QStringLiteral( 
"No model assigned to this view" ) );
 
 
  314  if ( event->button() != Qt::LeftButton )
 
  316    QListView::mouseReleaseEvent( event );
 
  322    case QgsFeatureListView::DragMode::ExpandSelection:
 
  323      if ( mFeatureSelectionModel )
 
  326    case QgsFeatureListView::DragMode::Inactive:
 
  327    case QgsFeatureListView::DragMode::MoveSelection:
 
  331  mDragMode = DragMode::Inactive;
 
 
  336  switch ( event->key() )
 
  339      editOtherFeature( Previous );
 
  343      editOtherFeature( Next );
 
  347      QListView::keyPressEvent( event );
 
 
  351void QgsFeatureListView::editOtherFeature( QgsFeatureListView::PositionInList positionInList )
 
  354  if ( 0 != mCurrentEditSelectionModel->selectedIndexes().count() )
 
  356    const QModelIndex localIndex = mModel->
mapFromMaster( mCurrentEditSelectionModel->selectedIndexes().first() );
 
  357    currentRow = localIndex.row();
 
  360  QModelIndex newLocalIndex;
 
  361  QModelIndex newIndex;
 
  363  switch ( positionInList )
 
  366      newLocalIndex = mModel->index( 0, 0 );
 
  370      newLocalIndex = mModel->index( currentRow - 1, 0 );
 
  374      newLocalIndex = mModel->index( currentRow + 1, 0 );
 
  378      newLocalIndex = mModel->index( mModel->
rowCount() - 1, 0 );
 
  383  if ( newIndex.isValid() )
 
  386    scrollTo( newLocalIndex );
 
  392  const QModelIndex index = indexAt( event->pos() );
 
  394  if ( index.isValid() )
 
  406    menu->exec( event->globalPos() );
 
 
  410void QgsFeatureListView::selectRow( 
const QModelIndex &index, 
bool anchor )
 
  412  QItemSelectionModel::SelectionFlags command = selectionCommand( index );
 
  413  const int row = index.row();
 
  418  if ( selectionMode() != QListView::SingleSelection
 
  419       && command.testFlag( QItemSelectionModel::Toggle ) )
 
  422      mCtrlDragSelectionFlag = mFeatureSelectionModel->
isSelected( index )
 
  423                               ? QItemSelectionModel::Deselect : QItemSelectionModel::Select;
 
  424    command &= ~QItemSelectionModel::Toggle;
 
  425    command |= mCtrlDragSelectionFlag;
 
  427      command |= QItemSelectionModel::Current;
 
  430  const QModelIndex tl = model()->index( std::min( mRowAnchor, row ), 0 );
 
  431  const QModelIndex br = model()->index( std::max( mRowAnchor, row ), model()->columnCount() - 1 );
 
  433  mFeatureSelectionModel->
selectFeatures( QItemSelection( tl, br ), command );
 
  436void QgsFeatureListView::ensureEditSelection( 
bool inSelection )
 
  441    mUpdateEditSelectionTimerWithSelection.start();
 
  445    mUpdateEditSelectionTimerWithoutSelection.start();
 
  449void QgsFeatureListView::updateEditSelection( 
bool inSelection )
 
  459  const QModelIndexList selectedIndexes = mCurrentEditSelectionModel->selectedIndexes();
 
  465  bool editSelectionUpdateRequested = 
false;
 
  468  bool validEditSelectionAvailable = 
false;
 
  470  if ( selectedIndexes.isEmpty() || !selectedIndexes.first().isValid() || mModel->
mapFromMaster( selectedIndexes.first() ).row() == -1 )
 
  472    validEditSelectionAvailable = 
false;
 
  476    validEditSelectionAvailable = 
true;
 
  484    if ( !validEditSelectionAvailable )
 
  486      editSelectionUpdateRequested = 
true;
 
  493      if ( !selectedFids.contains( mModel->
idxToFid( mModel->
mapFromMaster( selectedIndexes.first() ) ) ) )
 
  495        editSelectionUpdateRequested = 
true;
 
  503    if ( !validEditSelectionAvailable )
 
  504      editSelectionUpdateRequested = 
true;
 
  507  if ( editSelectionUpdateRequested )
 
  514    int rowToSelect = -1;
 
  524    if ( selectedFids.isEmpty() )
 
  530    const int rowCount = mModel->
rowCount();
 
  531    for ( 
int i = 0; i < rowCount; i++ )
 
  533      if ( selectedFids.contains( mModel->
idxToFid( mModel->index( i, 0 ) ) ) )
 
  540    if ( rowToSelect == -1 && !validEditSelectionAvailable )
 
  546    if ( rowToSelect != -1 )
 
  555  mFeatureSelectionManager = featureSelectionManager;
 
  557  if ( mFeatureSelectionModel )
 
  561  if ( mOwnedFeatureSelectionManager )
 
  563    mOwnedFeatureSelectionManager->deleteLater();
 
  564    mOwnedFeatureSelectionManager = 
nullptr;
 
 
@ FeatureId
Get the feature id of the feature in this row.
 
QgsFeatureId idxToFid(const QModelIndex &index) const
Returns the feature ID corresponding to an index from the model.
 
int rowCount(const QModelIndex &parent=QModelIndex()) const override
 
bool featureByIndex(const QModelIndex &index, QgsFeature &feat)
 
virtual QModelIndex mapToMaster(const QModelIndex &proxyIndex) const
 
QModelIndex fidToIdx(QgsFeatureId fid) const
Returns the model index corresponding to a feature ID.
 
QString parserErrorString()
Returns a detailed message about errors while parsing a QgsExpression.
 
QVariant data(const QModelIndex &index, int role) const override
 
bool setDisplayExpression(const QString &expression)
 
virtual QModelIndex mapFromMaster(const QModelIndex &sourceIndex) const
 
QString displayExpression() const
 
QgsVectorLayerCache * layerCache()
Returns the vector layer cache which is being used to populate the model.
 
QModelIndex mapToSource(const QModelIndex &proxyIndex) const override
 
virtual QItemSelection mapSelectionFromMaster(const QItemSelection &selection) const
 
QgsAttributeTableModel * masterModel()
 
void setEditSelectionModel(QItemSelectionModel *editSelectionModel)
 
void setCurrentFeatureEdited(bool state)
 
void setFeatureSelectionModel(QgsFeatureSelectionModel *featureSelectionModel)
 
Element positionToElement(QPoint pos)
 
Shows a list of features and renders a edit button next to each feature.
 
void currentEditSelectionProgressChanged(int progress, int count)
Emitted whenever the current edit selection has been changed.
 
const QString displayExpression() const
Returns the expression which is currently used to render the features.
 
void keyPressEvent(QKeyEvent *event) override
 
void contextMenuEvent(QContextMenuEvent *event) override
 
void setCurrentFeatureEdited(bool state)
Sets if the currently shown form has received any edit events so far.
 
void displayExpressionChanged(const QString &expression)
Emitted whenever the display expression is successfully changed.
 
void mouseMoveEvent(QMouseEvent *event) override
 
void setEditSelection(const QgsFeatureIds &fids)
Set the feature(s) to be edited.
 
void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
setFeatureSelectionManager
 
QgsFeatureIds currentEditSelection()
Gets the currentEditSelection.
 
void mousePressEvent(QMouseEvent *event) override
 
bool setDisplayExpression(const QString &displayExpression)
The display expression is an expression used to render the fields into a single string which is displ...
 
void selectAll() override
Select all currently visible features.
 
QgsVectorLayerCache * layerCache()
Returns the layer cache.
 
QString parserErrorString()
Returns a detailed message about errors while parsing a QgsExpression.
 
void mouseReleaseEvent(QMouseEvent *event) override
 
void willShowContextMenu(QgsActionMenu *menu, const QModelIndex &atIndex)
Emitted when the context menu is created to add the specific actions to it.
 
QgsFeatureListModel * featureListModel()
Gets the featureListModel used by this view.
 
QgsFeatureListView(QWidget *parent=nullptr)
Creates a feature list view.
 
virtual void setModel(QgsFeatureListModel *featureListModel)
Set the QgsFeatureListModel which is used to retrieve information.
 
void currentEditSelectionChanged(QgsFeature &feat)
Emitted whenever the current edit selection has been changed.
 
void aboutToChangeEditSelection(bool &ok)
 
void enableSync(bool enable)
Enables or disables synchronisation to the QgsVectorLayer When synchronisation is disabled,...
 
virtual void selectFeatures(const QItemSelection &selection, QItemSelectionModel::SelectionFlags command)
Select features on this table.
 
virtual bool isSelected(QgsFeatureId fid)
Returns the selection status of a given feature id.
 
virtual void setFeatureSelectionManager(QgsIFeatureSelectionManager *featureSelectionManager)
 
void requestRepaint()
Request a repaint of the visible items of connected views.
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
Is an interface class to abstract feature selection handling.
 
This class caches features of a given QgsVectorLayer.
 
QgsVectorLayer * layer()
Returns the layer to which this cache belongs.
 
Q_INVOKABLE const QgsFeatureIds & selectedFeatureIds() const
Returns a list of the selected features IDs in this layer.
 
void attributeValueChanged(QgsFeatureId fid, int idx, const QVariant &value)
Emitted whenever an attribute value change is done in the edit buffer.
 
void selectionChanged(const QgsFeatureIds &selected, const QgsFeatureIds &deselected, bool clearAndSelect)
Emitted when selection was changed.
 
QSet< QgsFeatureId > QgsFeatureIds
 
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
 
#define QgsDebugError(str)