Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsfieldproxymodel.cpp 3 : : -------------------------------------- 4 : : Date : 01.04.2014 5 : : Copyright : (C) 2014 Denis Rouzaud 6 : : Email : denis.rouzaud@gmail.com 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 : : 20 : 0 : QgsFieldProxyModel::QgsFieldProxyModel( QObject *parent ) 21 : 0 : : QSortFilterProxyModel( parent ) 22 : 0 : , mFilters( AllTypes ) 23 : 0 : , mModel( new QgsFieldModel( this ) ) 24 : 0 : { 25 : 0 : setSourceModel( mModel ); 26 : 0 : } 27 : : 28 : 0 : QgsFieldProxyModel *QgsFieldProxyModel::setFilters( QgsFieldProxyModel::Filters filters ) 29 : : { 30 : 0 : mFilters = filters; 31 : 0 : invalidateFilter(); 32 : 0 : return this; 33 : : } 34 : : 35 : 0 : bool QgsFieldProxyModel::isReadOnly( const QModelIndex &index ) const 36 : : { 37 : 0 : QVariant originVariant = sourceModel()->data( index, QgsFieldModel::FieldOriginRole ); 38 : 0 : if ( originVariant.isNull() ) 39 : : { 40 : : //expression 41 : 0 : return true; 42 : : } 43 : : 44 : 0 : QgsFields::FieldOrigin origin = static_cast< QgsFields::FieldOrigin >( originVariant.toInt() ); 45 : 0 : switch ( origin ) 46 : : { 47 : : case QgsFields::OriginJoin: 48 : : { 49 : : // show joined fields (e.g. auxiliary fields) only if they have a non-hidden editor widget. 50 : : // This enables them to be bulk field-calculated when a user needs to, but hides them by default 51 : : // (since there's often MANY of these, e.g. after using the label properties tool on a layer) 52 : 0 : if ( sourceModel()->data( index, QgsFieldModel::EditorWidgetType ).toString() == QLatin1String( "Hidden" ) ) 53 : 0 : return true; 54 : : 55 : 0 : return !sourceModel()->data( index, QgsFieldModel::JoinedFieldIsEditable ).toBool(); 56 : : } 57 : : 58 : : case QgsFields::OriginUnknown: 59 : : case QgsFields::OriginExpression: 60 : : //read only 61 : 0 : return true; 62 : : 63 : : case QgsFields::OriginEdit: 64 : : case QgsFields::OriginProvider: 65 : : { 66 : 0 : if ( !sourceModel()->data( index, QgsFieldModel::FieldIsWidgetEditable ).toBool() ) 67 : : { 68 : 0 : return true; 69 : : } 70 : : else 71 : : { 72 : : //not read only 73 : 0 : return false; 74 : : } 75 : : } 76 : : 77 : : } 78 : 0 : return false; // avoid warnings 79 : 0 : } 80 : : 81 : 0 : bool QgsFieldProxyModel::filterAcceptsRow( int source_row, const QModelIndex &source_parent ) const 82 : : { 83 : 0 : QModelIndex index = sourceModel()->index( source_row, 0, source_parent ); 84 : : 85 : 0 : if ( mFilters.testFlag( HideReadOnly ) && isReadOnly( index ) ) 86 : 0 : return false; 87 : : 88 : 0 : if ( mFilters.testFlag( AllTypes ) ) 89 : 0 : return true; 90 : : 91 : 0 : QVariant typeVar = sourceModel()->data( index, QgsFieldModel::FieldTypeRole ); 92 : : 93 : : // if expression, consider valid 94 : 0 : if ( typeVar.isNull() ) 95 : 0 : return true; 96 : : 97 : : bool ok; 98 : 0 : QVariant::Type type = ( QVariant::Type )typeVar.toInt( &ok ); 99 : 0 : if ( !ok ) 100 : 0 : return true; 101 : : 102 : 0 : if ( ( mFilters.testFlag( String ) && type == QVariant::String ) || 103 : 0 : ( mFilters.testFlag( LongLong ) && type == QVariant::LongLong ) || 104 : 0 : ( mFilters.testFlag( Int ) && type == QVariant::Int ) || 105 : 0 : ( mFilters.testFlag( Double ) && type == QVariant::Double ) || 106 : 0 : ( mFilters.testFlag( Date ) && type == QVariant::Date ) || 107 : 0 : ( mFilters.testFlag( Date ) && type == QVariant::DateTime ) || 108 : 0 : ( mFilters.testFlag( DateTime ) && type == QVariant::DateTime ) || 109 : 0 : ( mFilters.testFlag( Time ) && type == QVariant::Time ) ) 110 : 0 : return true; 111 : : 112 : 0 : return false; 113 : 0 : } 114 : : 115 : 0 : bool QgsFieldProxyModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const 116 : : { 117 : : // empty field is always first 118 : 0 : if ( sourceModel()->data( left, QgsFieldModel::IsEmptyRole ).toBool() ) 119 : 0 : return true; 120 : 0 : else if ( sourceModel()->data( right, QgsFieldModel::IsEmptyRole ).toBool() ) 121 : 0 : return false; 122 : : 123 : : // order is field order, then expressions 124 : : bool lok, rok; 125 : 0 : int leftId = sourceModel()->data( left, QgsFieldModel::FieldIndexRole ).toInt( &lok ); 126 : 0 : int rightId = sourceModel()->data( right, QgsFieldModel::FieldIndexRole ).toInt( &rok ); 127 : : 128 : 0 : if ( !lok ) 129 : 0 : return false; 130 : 0 : if ( !rok ) 131 : 0 : return true; 132 : : 133 : 0 : return leftId < rightId; 134 : 0 : }