Skip to content

Commit 12d6b44

Browse files
committedMar 5, 2023
Expose field split policy choice in layer properties > form dialog
Allows users to easily determine the current policy and change as desired
1 parent 4a41c82 commit 12d6b44

File tree

5 files changed

+109
-5
lines changed

5 files changed

+109
-5
lines changed
 

‎src/gui/attributeformconfig/qgsattributetypedialog.cpp

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,6 @@
1616
***************************************************************************/
1717

1818
#include "qgsattributetypedialog.h"
19-
#include "qgsattributeeditorelement.h"
20-
#include "qgsattributetypeloaddialog.h"
21-
#include "qgsvectordataprovider.h"
22-
#include "qgsmapcanvas.h"
23-
#include "qgsexpressionbuilderdialog.h"
2419
#include "qgsproject.h"
2520
#include "qgslogger.h"
2621
#include "qgsfieldformatterregistry.h"
@@ -37,6 +32,7 @@
3732
#include <QFileDialog>
3833
#include <QTextStream>
3934
#include <QScrollBar>
35+
#include <QStandardItemModel>
4036

4137
#include <climits>
4238
#include <cfloat>
@@ -109,6 +105,25 @@ QgsAttributeTypeDialog::QgsAttributeTypeDialog( QgsVectorLayer *vl, int fieldIdx
109105
constraintExpressionWidget->setAllowEmptyFieldName( true );
110106
constraintExpressionWidget->setLayer( vl );
111107

108+
if ( mLayer->isSpatial() && mLayer->geometryType() != Qgis::GeometryType::Point )
109+
{
110+
mSplitPolicyComboBox->addItem( tr( "Duplicate Value" ), QVariant::fromValue( Qgis::FieldDomainSplitPolicy::Duplicate ) );
111+
mSplitPolicyComboBox->addItem( tr( "Use Default Value" ), QVariant::fromValue( Qgis::FieldDomainSplitPolicy::DefaultValue ) );
112+
mSplitPolicyComboBox->addItem( tr( "Remove Value" ), QVariant::fromValue( Qgis::FieldDomainSplitPolicy::UnsetField ) );
113+
if ( mLayer->fields().at( mFieldIdx ).isNumeric() )
114+
{
115+
mSplitPolicyComboBox->addItem( tr( "Use Ratio of Geometries" ), QVariant::fromValue( Qgis::FieldDomainSplitPolicy::GeometryRatio ) );
116+
}
117+
}
118+
else
119+
{
120+
mSplitPolicyComboBox->setEnabled( false );
121+
mSplitPolicyLabel->setEnabled( false );
122+
mSplitPolicyDescriptionLabel->hide();
123+
}
124+
125+
connect( mSplitPolicyComboBox, qOverload<int>( &QComboBox::currentIndexChanged ), this, &QgsAttributeTypeDialog::updateSplitPolicyLabel );
126+
updateSplitPolicyLabel();
112127
}
113128

114129
QgsAttributeTypeDialog::~QgsAttributeTypeDialog()
@@ -355,6 +370,17 @@ void QgsAttributeTypeDialog::setApplyDefaultValueOnUpdate( bool applyDefaultValu
355370
mApplyDefaultValueOnUpdateCheckBox->setChecked( applyDefaultValueOnUpdate );
356371
}
357372

373+
Qgis::FieldDomainSplitPolicy QgsAttributeTypeDialog::splitPolicy() const
374+
{
375+
return mSplitPolicyComboBox->currentData().value< Qgis::FieldDomainSplitPolicy >();
376+
}
377+
378+
void QgsAttributeTypeDialog::setSplitPolicy( Qgis::FieldDomainSplitPolicy policy )
379+
{
380+
mSplitPolicyComboBox->setCurrentIndex( mSplitPolicyComboBox->findData( QVariant::fromValue( policy ) ) );
381+
updateSplitPolicyLabel();
382+
}
383+
358384
QString QgsAttributeTypeDialog::constraintExpression() const
359385
{
360386
return constraintExpressionWidget->asExpression();
@@ -448,6 +474,30 @@ void QgsAttributeTypeDialog::defaultExpressionChanged()
448474
mDefaultPreviewLabel->setText( "<i>" + previewText + "</i>" );
449475
}
450476

477+
void QgsAttributeTypeDialog::updateSplitPolicyLabel()
478+
{
479+
QString helperText;
480+
switch ( mSplitPolicyComboBox->currentData().value< Qgis::FieldDomainSplitPolicy >() )
481+
{
482+
case Qgis::FieldDomainSplitPolicy::DefaultValue:
483+
helperText = tr( "Resets the field by recalculating its default value." );
484+
break;
485+
486+
case Qgis::FieldDomainSplitPolicy::Duplicate:
487+
helperText = tr( "Copies the current field value without change." );
488+
break;
489+
490+
case Qgis::FieldDomainSplitPolicy::GeometryRatio:
491+
helperText = tr( "Recalculates the field value for all split portions by multiplying the existing value by the ratio of the split parts lengths or areas." );
492+
break;
493+
494+
case Qgis::FieldDomainSplitPolicy::UnsetField:
495+
helperText = tr( "Clears the field to an unset state." );
496+
break;
497+
}
498+
mSplitPolicyDescriptionLabel->setText( QStringLiteral( "<i>%1</i>" ).arg( helperText ) );
499+
}
500+
451501
QStandardItem *QgsAttributeTypeDialog::currentItem() const
452502
{
453503
QStandardItemModel *widgetTypeModel = qobject_cast<QStandardItemModel *>( mWidgetTypeComboBox->model() );

‎src/gui/attributeformconfig/qgsattributetypedialog.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,23 @@ class GUI_EXPORT QgsAttributeTypeDialog: public QWidget, private Ui::QgsAttribut
231231
bool applyDefaultValueOnUpdate() const;
232232
void setApplyDefaultValueOnUpdate( bool applyDefaultValueOnUpdate );
233233

234+
/**
235+
* Returns the field's split policy.
236+
*
237+
* \see setSplitPolicy()
238+
*
239+
* \since QGIS 3.32
240+
*/
241+
Qgis::FieldDomainSplitPolicy splitPolicy() const;
242+
243+
/**
244+
* Sets the field's split policy.
245+
*
246+
* \see splitPolicy()
247+
*
248+
* \since QGIS 3.32
249+
*/
250+
void setSplitPolicy( Qgis::FieldDomainSplitPolicy policy );
234251

235252
private slots:
236253

@@ -242,6 +259,8 @@ class GUI_EXPORT QgsAttributeTypeDialog: public QWidget, private Ui::QgsAttribut
242259

243260
void defaultExpressionChanged();
244261

262+
void updateSplitPolicyLabel();
263+
245264
private:
246265
QgsVectorLayer *mLayer = nullptr;
247266
int mFieldIdx;

‎src/gui/vector/qgsattributesformproperties.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ void QgsAttributesFormProperties::loadAttributeTypeDialog()
290290
mAttributeTypeDialog->setNotNullEnforced( constraints.constraintStrength( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintStrengthHard );
291291
mAttributeTypeDialog->setUnique( constraints.constraints() & QgsFieldConstraints::ConstraintUnique );
292292
mAttributeTypeDialog->setUniqueEnforced( constraints.constraintStrength( QgsFieldConstraints::ConstraintUnique ) == QgsFieldConstraints::ConstraintStrengthHard );
293+
mAttributeTypeDialog->setSplitPolicy( cfg.mSplitPolicy );
293294

294295
QgsFieldConstraints::Constraints providerConstraints = QgsFieldConstraints::Constraints();
295296
if ( constraints.constraintOrigin( QgsFieldConstraints::ConstraintNotNull ) == QgsFieldConstraints::ConstraintOriginProvider )
@@ -373,6 +374,8 @@ void QgsAttributesFormProperties::storeAttributeTypeDialog()
373374
cfg.mEditorWidgetType = mAttributeTypeDialog->editorWidgetType();
374375
cfg.mEditorWidgetConfig = mAttributeTypeDialog->editorWidgetConfig();
375376

377+
cfg.mSplitPolicy = mAttributeTypeDialog->splitPolicy();
378+
376379
const QString fieldName = mLayer->fields().at( mAttributeTypeDialog->fieldIdx() ).name();
377380

378381
for ( auto itemIt = QTreeWidgetItemIterator( mAvailableWidgetsTree ); *itemIt; ++itemIt )
@@ -973,6 +976,7 @@ void QgsAttributesFormProperties::apply()
973976
}
974977

975978
mLayer->setFieldAlias( idx, cfg.mAlias );
979+
mLayer->setFieldSplitPolicy( idx, cfg.mSplitPolicy );
976980
}
977981

978982
// tabs and groups
@@ -1043,6 +1047,7 @@ QgsAttributesFormProperties::FieldConfig::FieldConfig( QgsVectorLayer *layer, in
10431047
const QgsEditorWidgetSetup setup = QgsGui::editorWidgetRegistry()->findBest( layer, layer->fields().field( idx ).name() );
10441048
mEditorWidgetType = setup.type();
10451049
mEditorWidgetConfig = setup.config();
1050+
mSplitPolicy = layer->fields().at( idx ).splitPolicy();
10461051
}
10471052

10481053
QgsAttributesFormProperties::FieldConfig::operator QVariant()

‎src/gui/vector/qgsattributesformproperties.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,7 @@ class GUI_EXPORT QgsAttributesFormProperties : public QWidget, public QgsExpress
290290
QString mAlias;
291291
QgsPropertyCollection mDataDefinedProperties;
292292
QString mComment;
293+
Qgis::FieldDomainSplitPolicy mSplitPolicy = Qgis::FieldDomainSplitPolicy::Duplicate;
293294

294295
operator QVariant();
295296
};

‎src/ui/attributeformconfig/qgsattributetypeedit.ui

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,35 @@
278278
</layout>
279279
</widget>
280280
</item>
281+
<item>
282+
<widget class="QgsCollapsibleGroupBox" name="groupBox_5">
283+
<property name="title">
284+
<string>Policies</string>
285+
</property>
286+
<layout class="QGridLayout" name="gridLayout_4" columnstretch="1,2">
287+
<item row="0" column="1">
288+
<widget class="QComboBox" name="mSplitPolicyComboBox"/>
289+
</item>
290+
<item row="0" column="0">
291+
<widget class="QLabel" name="mSplitPolicyLabel">
292+
<property name="text">
293+
<string>When splitting features</string>
294+
</property>
295+
</widget>
296+
</item>
297+
<item row="1" column="0" colspan="2">
298+
<widget class="QLabel" name="mSplitPolicyDescriptionLabel">
299+
<property name="text">
300+
<string>TextLabel</string>
301+
</property>
302+
<property name="wordWrap">
303+
<bool>true</bool>
304+
</property>
305+
</widget>
306+
</item>
307+
</layout>
308+
</widget>
309+
</item>
281310
<item>
282311
<spacer name="verticalSpacer">
283312
<property name="orientation">

0 commit comments

Comments
 (0)
Please sign in to comment.