void QgsDualView::modifySort() { if ( !mLayer ) return; QgsAttributeTableConfig config = mConfig; QDialog orderByDlg; orderByDlg.setWindowTitle( tr( "Configure Attribute Table Sort Order" ) ); QDialogButtonBox *dialogButtonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel ); QGridLayout *layout = new QGridLayout(); connect( dialogButtonBox, &QDialogButtonBox::accepted, &orderByDlg, &QDialog::accept ); connect( dialogButtonBox, &QDialogButtonBox::rejected, &orderByDlg, &QDialog::reject ); orderByDlg.setLayout( layout ); QGroupBox *sortingGroupBox = new QGroupBox(); sortingGroupBox->setTitle( tr( "Defined sort order in attribute table" ) ); sortingGroupBox->setCheckable( true ); sortingGroupBox->setChecked( !sortExpression().isEmpty() ); layout->addWidget( sortingGroupBox ); sortingGroupBox->setLayout( new QGridLayout() ); QgsExpressionBuilderWidget *expressionBuilder = new QgsExpressionBuilderWidget(); QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( mLayer ) ); expressionBuilder->setExpressionContext( context ); expressionBuilder->setLayer( mLayer ); expressionBuilder->loadFieldNames(); expressionBuilder->loadRecent( QStringLiteral( "generic" ) ); expressionBuilder->setExpressionText( sortExpression().isEmpty() ? mLayer->displayExpression() : sortExpression() ); sortingGroupBox->layout()->addWidget( expressionBuilder ); QCheckBox *cbxSortAscending = new QCheckBox( tr( "Sort ascending" ) ); cbxSortAscending->setChecked( config.sortOrder() == Qt::AscendingOrder ); sortingGroupBox->layout()->addWidget( cbxSortAscending ); layout->addWidget( dialogButtonBox ); if ( orderByDlg.exec() ) { Qt::SortOrder sortOrder = cbxSortAscending->isChecked() ? Qt::AscendingOrder : Qt::DescendingOrder; if ( sortingGroupBox->isChecked() ) { setSortExpression( expressionBuilder->expressionText(), sortOrder ); config.setSortExpression( expressionBuilder->expressionText() ); config.setSortOrder( sortOrder ); } else { setSortExpression( QString(), sortOrder ); config.setSortExpression( QString() ); } setAttributeTableConfig( config ); } }
void QgsDualView::onSortColumnChanged() { QgsAttributeTableConfig cfg = attributeTableConfig(); if ( cfg.sortExpression() != mFilterModel->sortExpression() || cfg.sortOrder() != mFilterModel->sortOrder() ) { cfg.setSortExpression( mFilterModel->sortExpression() ); cfg.setSortOrder( mFilterModel->sortOrder() ); setAttributeTableConfig( cfg ); } }
void QgsAttributeTableFilterModel::setAttributeTableConfig( const QgsAttributeTableConfig& config ) { mConfig = config; mConfig.update( layer()->fields() ); QVector<int> newColumnMapping; Q_FOREACH ( const QgsAttributeTableConfig::ColumnConfig& columnConfig, mConfig.columns() ) { // Hidden? Forget about this column if ( columnConfig.hidden ) continue; // The new value for the mapping (field index or -1 for action column) int newValue = ( columnConfig.type == QgsAttributeTableConfig::Action ) ? -1 : layer()->fieldNameIndex( columnConfig.name ); newColumnMapping << newValue; } if ( newColumnMapping != mColumnMapping ) { bool requiresReset = false; int firstRemovedColumn = -1; int removedColumnCount = 0; // Check if there have a contiguous set of columns have been removed or if we require a full reset for ( int i = 0; i < qMin( newColumnMapping.size(), mColumnMapping.size() - removedColumnCount ); ++i ) { if ( newColumnMapping.at( i ) == mColumnMapping.at( i + removedColumnCount ) ) continue; if ( firstRemovedColumn == -1 ) { firstRemovedColumn = i; while ( i < mColumnMapping.size() - removedColumnCount && mColumnMapping.at( i + removedColumnCount ) != newColumnMapping.at( i ) ) { ++removedColumnCount; } } else { requiresReset = true; break; } } // No difference found so far if ( firstRemovedColumn == -1 ) { if ( newColumnMapping.size() > mColumnMapping.size() ) { // More columns: appended to the end beginInsertColumns( QModelIndex(), mColumnMapping.size(), newColumnMapping.size() - 1 ); mColumnMapping = newColumnMapping; endInsertColumns(); } else { // Less columns: removed from the end beginRemoveColumns( QModelIndex(), newColumnMapping.size(), mColumnMapping.size() - 1 ); mColumnMapping = newColumnMapping; endRemoveColumns(); } } else { if ( newColumnMapping.size() == mColumnMapping.size() - removedColumnCount ) { beginRemoveColumns( QModelIndex(), firstRemovedColumn, firstRemovedColumn + removedColumnCount ); mColumnMapping = newColumnMapping; endRemoveColumns(); } else { requiresReset = true; } } if ( requiresReset ) { beginResetModel(); mColumnMapping = newColumnMapping; endResetModel(); } } sort( config.sortExpression(), config.sortOrder() ); }