QGIS API Documentation  2.18.21-Las Palmas (9fba24a)
qgsfieldproxymodel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgsfieldproxymodel.cpp
3  --------------------------------------
4  Date : 01.04.2014
5  Copyright : (C) 2014 Denis Rouzaud
6  Email : [email protected]
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15 
16 #include "qgsfieldproxymodel.h"
17 #include "qgsfieldmodel.h"
18 #include "qgsvectorlayer.h"
19 
21  : QSortFilterProxyModel( parent )
22  , mFilters( All )
23  , mModel( new QgsFieldModel( this ) )
24 {
25  setSourceModel( mModel );
26 }
27 
29 {
30  mFilters = filters;
32  return this;
33 }
34 
35 bool QgsFieldProxyModel::isReadOnly( const QModelIndex& index ) const
36 {
37  QVariant originVariant = sourceModel()->data( index, QgsFieldModel::FieldOriginRole );
38  if ( originVariant.isNull() )
39  {
40  //expression
41  return true;
42  }
43 
44  QgsFields::FieldOrigin origin = static_cast< QgsFields::FieldOrigin >( originVariant.toInt() );
45  switch ( origin )
46  {
50  //read only
51  return true;
52 
55  //not read only
56  return false;
57  }
58  return false; // avoid warnings
59 }
60 
61 bool QgsFieldProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const
62 {
63  QModelIndex index = sourceModel()->index( source_row, 0, source_parent );
64 
65  if ( mFilters.testFlag( HideReadOnly ) && isReadOnly( index ) )
66  return false;
67 
68  if ( mFilters.testFlag( All ) )
69  return true;
70 
72 
73  // if expression, consider valid
74  if ( typeVar.isNull() )
75  return true;
76 
77  bool ok;
78  QVariant::Type type = ( QVariant::Type )typeVar.toInt( &ok );
79  if ( !ok )
80  return true;
81 
82  if (( mFilters.testFlag( String ) && type == QVariant::String ) ||
83  ( mFilters.testFlag( LongLong ) && type == QVariant::LongLong ) ||
84  ( mFilters.testFlag( Int ) && type == QVariant::Int ) ||
85  ( mFilters.testFlag( Double ) && type == QVariant::Double ) ||
86  ( mFilters.testFlag( Date ) && type == QVariant::Date ) ||
87  ( mFilters.testFlag( Date ) && type == QVariant::DateTime ) ||
88  ( mFilters.testFlag( Time ) && type == QVariant::Time ) )
89  return true;
90 
91  return false;
92 }
93 
94 bool QgsFieldProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
95 {
96  // order is field order, then expressions
97  bool lok, rok;
98  int leftId = sourceModel()->data( left, QgsFieldModel::FieldIndexRole ).toInt( &lok );
99  int rightId = sourceModel()->data( right, QgsFieldModel::FieldIndexRole ).toInt( &rok );
100 
101  if ( !lok )
102  return false;
103  if ( !rok )
104  return true;
105 
106  return leftId < rightId;
107 }
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const
QgsFieldProxyModel * setFilters(const QgsFieldProxyModel::Filters &filters)
Set flags that affect how fields are filtered in the model.
field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index w...
Definition: qgsfield.h:260
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const=0
virtual void setSourceModel(QAbstractItemModel *sourceModel)
field has been temporarily added in editing mode (originIndex = index in the list of added attributes...
Definition: qgsfield.h:261
The QgsFieldModel class is a model to display the list of fields of a layer in widgets.
Definition: qgsfieldmodel.h:31
field comes from the underlying data provider of the vector layer (originIndex = index in provider&#39;s ...
Definition: qgsfield.h:259
it has not been specified where the field comes from
Definition: qgsfield.h:258
The QgsFieldProxyModel class provides an easy to use model to display the list of fields of a layer...
int toInt(bool *ok) const
bool isNull() const
QgsFieldProxyModel(QObject *parent=nullptr)
QgsFieldProxModel creates a proxy model with a QgsFieldModel as source model.
virtual QVariant data(const QModelIndex &index, int role) const=0
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override
const Filters & filters() const
Returns the filters controlling displayed fields.
QAbstractItemModel * sourceModel() const
field is calculated from an expression
Definition: qgsfield.h:262
bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override