void QgsAttributeTableModel::loadAttributes() { if ( !layer() ) { return; } bool ins = false, rm = false; QgsAttributeList attributes; const QgsFields &fields = layer()->fields(); mWidgetFactories.clear(); mAttributeWidgetCaches.clear(); mWidgetConfigs.clear(); for ( int idx = 0; idx < fields.count(); ++idx ) { const QgsEditorWidgetSetup setup = QgsGui::editorWidgetRegistry()->findBest( layer(), fields[idx].name() ); QgsEditorWidgetFactory *widgetFactory = QgsGui::editorWidgetRegistry()->factory( setup.type() ); QgsFieldFormatter *fieldFormatter = QgsApplication::fieldFormatterRegistry()->fieldFormatter( setup.type() ); mWidgetFactories.append( widgetFactory ); mWidgetConfigs.append( setup.config() ); mAttributeWidgetCaches.append( fieldFormatter->createCache( layer(), idx, setup.config() ) ); mFieldFormatters.append( fieldFormatter ); attributes << idx; } if ( mFieldCount + mExtraColumns < attributes.size() + mExtraColumns ) { ins = true; beginInsertColumns( QModelIndex(), mFieldCount + mExtraColumns, attributes.size() - 1 ); } else if ( attributes.size() + mExtraColumns < mFieldCount + mExtraColumns ) { rm = true; beginRemoveColumns( QModelIndex(), attributes.size(), mFieldCount + mExtraColumns - 1 ); } mFieldCount = attributes.size(); mAttributes = attributes; for ( SortCache &cache : mSortCaches ) { if ( cache.sortFieldIndex >= mAttributes.count() ) cache.sortFieldIndex = -1; } if ( ins ) { endInsertColumns(); } else if ( rm ) { endRemoveColumns(); } }
void QgsAttributeTypeDialog::defaultExpressionChanged() { QString expression = mExpressionWidget->expression(); if ( expression.isEmpty() ) { mDefaultPreviewLabel->setText( QString() ); return; } QgsExpressionContext context = mLayer->createExpressionContext(); if ( !mPreviewFeature.isValid() ) { // get first feature QgsFeatureIterator it = mLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) ); it.nextFeature( mPreviewFeature ); } context.setFeature( mPreviewFeature ); QgsExpression exp = QgsExpression( expression ); exp.prepare( &context ); if ( exp.hasParserError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.parserErrorString() + "</i>" ); return; } QVariant val = exp.evaluate( &context ); if ( exp.hasEvalError() ) { mDefaultPreviewLabel->setText( "<i>" + exp.evalErrorString() + "</i>" ); return; } QgsFieldFormatter *fieldFormatter = QgsApplication::fieldFormatterRegistry()->fieldFormatter( editorWidgetType() ); QString previewText = fieldFormatter->representValue( mLayer, mFieldIdx, editorWidgetConfig(), QVariant(), val ); mDefaultPreviewLabel->setText( "<i>" + previewText + "</i>" ); }
void QgsAttributeTableModel::featureAdded( QgsFeatureId fid, bool resettingModel ) { QgsDebugMsgLevel( QStringLiteral( "(%2) fid: %1" ).arg( fid ).arg( mFeatureRequest.filterType() ), 4 ); bool featOk = true; if ( mFeat.id() != fid ) featOk = loadFeatureAtId( fid ); if ( featOk && mFeatureRequest.acceptFeature( mFeat ) ) { for ( SortCache &cache : mSortCaches ) { if ( cache.sortFieldIndex >= 0 ) { QgsFieldFormatter *fieldFormatter = mFieldFormatters.at( cache.sortFieldIndex ); const QVariant &widgetCache = mAttributeWidgetCaches.at( cache.sortFieldIndex ); const QVariantMap &widgetConfig = mWidgetConfigs.at( cache.sortFieldIndex ); QVariant sortValue = fieldFormatter->representValue( layer(), cache.sortFieldIndex, widgetConfig, widgetCache, mFeat.attribute( cache.sortFieldIndex ) ); cache.sortCache.insert( mFeat.id(), sortValue ); } else if ( cache.sortCacheExpression.isValid() ) { mExpressionContext.setFeature( mFeat ); cache.sortCache[mFeat.id()] = cache.sortCacheExpression.evaluate( &mExpressionContext ); } } // Skip if the fid is already in the map (do not add twice)! if ( ! mIdRowMap.contains( fid ) ) { int n = mRowIdMap.size(); if ( !resettingModel ) beginInsertRows( QModelIndex(), n, n ); mIdRowMap.insert( fid, n ); mRowIdMap.insert( n, fid ); if ( !resettingModel ) endInsertRows(); reload( index( rowCount() - 1, 0 ), index( rowCount() - 1, columnCount() ) ); } } }
void QgsAttributeTableModel::attributeValueChanged( QgsFeatureId fid, int idx, const QVariant &value ) { // Defer all updates if a bulk edit/rollback command is running if ( mBulkEditCommandRunning ) { mAttributeValueChanges.insert( QPair<QgsFeatureId, int>( fid, idx ), value ); return; } QgsDebugMsgLevel( QStringLiteral( "(%4) fid: %1, idx: %2, value: %3" ).arg( fid ).arg( idx ).arg( value.toString() ).arg( mFeatureRequest.filterType() ), 2 ); for ( SortCache &cache : mSortCaches ) { if ( cache.sortCacheAttributes.contains( idx ) ) { if ( cache.sortFieldIndex == -1 ) { if ( loadFeatureAtId( fid ) ) { mExpressionContext.setFeature( mFeat ); cache.sortCache[fid] = cache.sortCacheExpression.evaluate( &mExpressionContext ); } } else { QgsFieldFormatter *fieldFormatter = mFieldFormatters.at( cache.sortFieldIndex ); const QVariant &widgetCache = mAttributeWidgetCaches.at( cache.sortFieldIndex ); const QVariantMap &widgetConfig = mWidgetConfigs.at( cache.sortFieldIndex ); QVariant sortValue = fieldFormatter->representValue( layer(), cache.sortFieldIndex, widgetConfig, widgetCache, value ); cache.sortCache.insert( fid, sortValue ); } } } // No filter request: skip all possibly heavy checks if ( mFeatureRequest.filterType() == QgsFeatureRequest::FilterNone ) { if ( loadFeatureAtId( fid ) ) setData( index( idToRow( fid ), fieldCol( idx ) ), value, Qt::EditRole ); } else { if ( loadFeatureAtId( fid ) ) { if ( mFeatureRequest.acceptFeature( mFeat ) ) { if ( !mIdRowMap.contains( fid ) ) { // Feature changed in such a way, it will be shown now featureAdded( fid ); } else { // Update representation setData( index( idToRow( fid ), fieldCol( idx ) ), value, Qt::EditRole ); } } else { if ( mIdRowMap.contains( fid ) ) { // Feature changed such, that it is no longer shown featuresDeleted( QgsFeatureIds() << fid ); } // else: we don't care } } } }