Add filter for provider origin fields only to QgsFieldProxyModel

This commit is contained in:
Nyall Dawson 2024-02-28 09:31:01 +10:00
parent 4e67c71484
commit bb379242fc
6 changed files with 39 additions and 11 deletions

View File

@ -10,6 +10,7 @@ QgsFieldProxyModel.HideReadOnly = QgsFieldProxyModel.Filter.HideReadOnly
QgsFieldProxyModel.DateTime = QgsFieldProxyModel.Filter.DateTime
QgsFieldProxyModel.Binary = QgsFieldProxyModel.Filter.Binary
QgsFieldProxyModel.Boolean = QgsFieldProxyModel.Filter.Boolean
QgsFieldProxyModel.OriginProvider = QgsFieldProxyModel.Filter.OriginProvider
QgsFieldProxyModel.AllTypes = QgsFieldProxyModel.Filter.AllTypes
QgsFieldProxyModel.Filters = lambda flags=0: QgsFieldProxyModel.Filter(flags)
QgsFieldProxyModel.Filters.baseClass = QgsFieldProxyModel

View File

@ -35,6 +35,7 @@ The :py:class:`QgsFieldProxyModel` class provides an easy to use model to displa
DateTime,
Binary,
Boolean,
OriginProvider,
AllTypes,
};
typedef QFlags<QgsFieldProxyModel::Filter> Filters;

View File

@ -35,6 +35,7 @@ The :py:class:`QgsFieldProxyModel` class provides an easy to use model to displa
DateTime,
Binary,
Boolean,
OriginProvider,
AllTypes,
};
typedef QFlags<QgsFieldProxyModel::Filter> Filters;

View File

@ -15,7 +15,7 @@
#include "qgsfieldproxymodel.h"
#include "qgsfieldmodel.h"
#include "qgsvectorlayer.h"
#include "qgsvariantutils.h"
QgsFieldProxyModel::QgsFieldProxyModel( QObject *parent )
: QSortFilterProxyModel( parent )
@ -85,6 +85,22 @@ bool QgsFieldProxyModel::filterAcceptsRow( int source_row, const QModelIndex &so
if ( mFilters.testFlag( HideReadOnly ) && isReadOnly( index ) )
return false;
if ( mFilters.testFlag( QgsFieldProxyModel::OriginProvider ) )
{
const QgsFields::FieldOrigin origin = static_cast< QgsFields::FieldOrigin >( sourceModel()->data( index, static_cast< int >( QgsFieldModel::CustomRole::FieldOrigin ) ).toInt() );
switch ( origin )
{
case QgsFields::OriginUnknown:
case QgsFields::OriginJoin:
case QgsFields::OriginEdit:
case QgsFields::OriginExpression:
return false;
case QgsFields::OriginProvider:
break;
}
}
if ( mFilters.testFlag( AllTypes ) )
return true;

View File

@ -37,17 +37,18 @@ class CORE_EXPORT QgsFieldProxyModel : public QSortFilterProxyModel
//! Field type filters
enum Filter SIP_ENUM_BASETYPE( IntFlag )
{
String = 1, //!< String fields
Int = 2, //!< Integer fields
LongLong = 4, //!< Longlong fields
Double = 8, //!< Double fields
String = 1 << 0, //!< String fields
Int = 1 << 1, //!< Integer fields
LongLong = 1 << 2, //!< Longlong fields
Double = 1 << 3, //!< Double fields
Numeric = Int | LongLong | Double, //!< All numeric fields
Date = 16, //!< Date or datetime fields
Time = 32, //!< Time fields
HideReadOnly = 64, //!< Hide read-only fields
DateTime = 128, //!< Datetime fields
Binary = 256, //!< Binary fields, since QGIS 3.34
Boolean = 512, //!< Boolean fields, since QGIS 3.34
Date = 1 << 4, //!< Date or datetime fields
Time = 1 << 5, //!< Time fields
HideReadOnly = 1 << 6, //!< Hide read-only fields
DateTime = 1 << 7, //!< Datetime fields
Binary = 1 << 8, //!< Binary fields, since QGIS 3.34
Boolean = 1 << 9, //!< Boolean fields, since QGIS 3.34
OriginProvider = 1 << 10, //!< Fields with a provider origin, since QGIS 3.38
AllTypes = Numeric | Date | String | Time | DateTime | Binary | Boolean, //!< All field types
};
Q_DECLARE_FLAGS( Filters, Filter )

View File

@ -348,6 +348,14 @@ class TestQgsFieldModel(QgisTestCase):
self.assertEqual(proxy_m.rowCount(), 1)
self.assertEqual(proxy_m.data(proxy_m.index(0, 0)), 'id_a')
proxy_m.setFilters(QgsFieldProxyModel.Filter.AllTypes | QgsFieldProxyModel.Filter.OriginProvider)
proxy_m.sourceFieldModel().setLayer(layer)
self.assertEqual(proxy_m.rowCount(), 1)
self.assertEqual(proxy_m.data(proxy_m.index(0, 0)), 'id_a')
proxy_m.sourceFieldModel().setLayer(layer3)
self.assertEqual(proxy_m.rowCount(), 1)
self.assertEqual(proxy_m.data(proxy_m.index(0, 0)), 'id_a')
def testFieldIsWidgetEditableRole(self):
l, m = create_model()
self.assertTrue(m.data(m.indexFromName('fldtxt'), QgsFieldModel.FieldRoles.FieldIsWidgetEditable))