From 5639f144fe325f40512913ed3fa976315cdf839e Mon Sep 17 00:00:00 2001 From: Juho Ervasti Date: Tue, 10 Dec 2024 15:44:47 +0200 Subject: [PATCH] Add a way to set split feature sort expression in the GUI --- .../qgsvectorlayerdigitizingproperties.cpp | 31 +++++++++++- src/app/qgsvectorlayerdigitizingproperties.h | 12 ++++- src/ui/qgsvectorlayerdigitizingproperties.ui | 48 +++++++++++++++++++ 3 files changed, 88 insertions(+), 3 deletions(-) diff --git a/src/app/qgsvectorlayerdigitizingproperties.cpp b/src/app/qgsvectorlayerdigitizingproperties.cpp index 42ee25e9dda9..a3f7391a52db 100644 --- a/src/app/qgsvectorlayerdigitizingproperties.cpp +++ b/src/app/qgsvectorlayerdigitizingproperties.cpp @@ -15,10 +15,10 @@ ***************************************************************************/ #include "qgsvectorlayerdigitizingproperties.h" -#include "moc_qgsvectorlayerdigitizingproperties.cpp" #include "qgsanalysis.h" #include "qgscollapsiblegroupbox.h" #include "qgsdoublespinbox.h" +#include "qgsexpressioncontextutils.h" #include "qgsgeometrycheckfactory.h" #include "qgsgeometrycheckregistry.h" #include "qgsgeometrycheck.h" @@ -118,12 +118,29 @@ QgsVectorLayerDigitizingPropertiesPage::QgsVectorLayerDigitizingPropertiesPage( } mTopologyChecksGroupBox->setLayout( topologyCheckLayout ); mTopologyChecksGroupBox->setVisible( !topologyCheckFactories.isEmpty() ); + + if ( vlayer->geometryType() != Qgis::GeometryType::Point ) + { + const QString splitFeaturesOrderByExpression = vlayer->geometryOptions()->splitFeaturesOrderByExpression(); + const Qt::SortOrder splitFeaturesSortOrder = vlayer->geometryOptions()->splitFeaturesSortOrder(); + mSplitFeaturesExpressionLineEdit->setExpression( splitFeaturesOrderByExpression ); + mSplitFeaturesOrderComboBox->setCurrentIndex( splitFeaturesSortOrder ); + + mSplitFeaturesExpressionLineEdit->setExpectedOutputFormat( tr( "numeric" ) ); + mSplitFeaturesExpressionLineEdit->registerExpressionContextGenerator( this ); + mSplitFeaturesExpressionLineEdit->setLayer( vlayer ); + } + else + { + mSplitFeaturesSortGroupBox->hide(); + } } else { mRemoveDuplicateNodesCheckbox->setEnabled( false ); mGeometryPrecisionLineEdit->setEnabled( false ); mGeometryAutoFixesGroupBox->setEnabled( false ); + mSplitFeaturesSortGroupBox->setEnabled( false ); } setProperty( "helpPage", QStringLiteral( "working_with_vector/vector_properties.html#digitizing-properties" ) ); @@ -163,8 +180,20 @@ void QgsVectorLayerDigitizingPropertiesPage::apply() vlayer->geometryOptions()->setCheckConfiguration( QStringLiteral( "QgsGeometryGapCheck" ), gapCheckConfig ); } + + vlayer->geometryOptions()->setSplitFeaturesOrderByExpression( mSplitFeaturesExpressionLineEdit->expression() ); + vlayer->geometryOptions()->setSplitFeaturesSortOrder( static_cast( mSplitFeaturesOrderComboBox->currentIndex() ) ); } +QgsExpressionContext QgsVectorLayerDigitizingPropertiesPage::createExpressionContext() const +{ + QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( mLayer ) ); + context << QgsExpressionContextUtils::splitFeaturesScope( QgsGeometry() ); + + context.setHighlightedVariables( QStringList() << QStringLiteral( "split_geometry" ) ); + + return context; +} QgsVectorLayerDigitizingPropertiesFactory::QgsVectorLayerDigitizingPropertiesFactory( QObject *parent ) : QObject( parent ) diff --git a/src/app/qgsvectorlayerdigitizingproperties.h b/src/app/qgsvectorlayerdigitizingproperties.h index 52868274ab31..8ad2b7e12c9a 100644 --- a/src/app/qgsvectorlayerdigitizingproperties.h +++ b/src/app/qgsvectorlayerdigitizingproperties.h @@ -17,6 +17,7 @@ #ifndef QGSVECTORLAYERDIGITIZINGPROPERTIES_H #define QGSVECTORLAYERDIGITIZINGPROPERTIES_H +#include "qgsexpressioncontextgenerator.h" #include "qgsmaplayerconfigwidget.h" #include "qgsmaplayerconfigwidgetfactory.h" #include "ui_qgsvectorlayerdigitizingproperties.h" @@ -26,15 +27,22 @@ class QgsMapLayerComboBox; class QgsDoubleSpinBox; -class QgsVectorLayerDigitizingPropertiesPage : public QgsMapLayerConfigWidget, private Ui::QgsVectorLayerDigitizingPropertiesPage +class QgsVectorLayerDigitizingPropertiesPage : public QgsMapLayerConfigWidget, private Ui::QgsVectorLayerDigitizingPropertiesPage, private QgsExpressionContextGenerator { Q_OBJECT public: explicit QgsVectorLayerDigitizingPropertiesPage( QgsMapLayer *layer, QgsMapCanvas *canvas, QWidget *parent = nullptr ); + /* + * Creates the expression context for this widget. + * + * \since QGIS 3.42 + */ + QgsExpressionContext createExpressionContext() const override; + public slots: - virtual void apply(); + virtual void apply() override; private: bool mRemoveDuplicateNodesManuallyActivated = false; diff --git a/src/ui/qgsvectorlayerdigitizingproperties.ui b/src/ui/qgsvectorlayerdigitizingproperties.ui index 8f2efc085dd6..4d53239b8572 100644 --- a/src/ui/qgsvectorlayerdigitizingproperties.ui +++ b/src/ui/qgsvectorlayerdigitizingproperties.ui @@ -120,6 +120,48 @@ + + + + Split features + + + + + + <html><head/><body><p>Controls the order in which the split features digitizing tool creates new features, for example according to the split geometries using the @split_geometry variable. This affects autogenerating fields (such as id fields) so that the first feature in the resulting list will inherit the original feature's attributes.</p></body></html> + + + Sort expression + + + + + + + + + + + 0 + 0 + + + + + Ascending + + + + + Descending + + + + + + + @@ -146,6 +188,12 @@
qgsscrollarea.h
1 + + QgsExpressionLineEdit + QWidget +
qgsexpressionlineedit.h
+ 1 +