replace spinboxes with extent selector in the mesh calculator dialog

This commit is contained in:
Alexander Bruy 2025-03-18 11:56:37 +00:00 committed by Nyall Dawson
parent b22d424d33
commit 0c228fdd4b
5 changed files with 33 additions and 181 deletions

View File

@ -25,6 +25,7 @@
#include "qgssettings.h"
#include "qgsgui.h"
#include "qgsvectorlayer.h"
#include "qgsmapcanvas.h"
#include "qgsmaplayerproxymodel.h"
#include "qgswkbtypes.h"
#include "qgsfeatureiterator.h"
@ -40,8 +41,10 @@
#include <QFontDatabase>
#include <QMap>
QgsMeshCalculatorDialog::QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer, QWidget *parent, Qt::WindowFlags f )
: QDialog( parent, f ), mLayer( meshLayer )
QgsMeshCalculatorDialog::QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer, QgsMapCanvas *mapCanvas, QWidget *parent, Qt::WindowFlags f )
: QDialog( parent, f )
, mLayer( meshLayer )
, mMapCanvas( mapCanvas )
{
setupUi( this );
QgsGui::enableAutoGeometryRestore( this );
@ -60,7 +63,6 @@ QgsMeshCalculatorDialog::QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer, QWidg
connect( mOutputGroupNameLineEdit, &QLineEdit::textChanged, this, &QgsMeshCalculatorDialog::updateInfoMessage );
connect( mDatasetsListWidget, &QListView::doubleClicked, this, &QgsMeshCalculatorDialog::datasetGroupEntry );
connect( mCurrentLayerExtentButton, &QPushButton::clicked, this, &QgsMeshCalculatorDialog::mCurrentLayerExtentButton_clicked );
connect( mAllTimesButton, &QPushButton::clicked, this, &QgsMeshCalculatorDialog::mAllTimesButton_clicked );
connect( mExpressionTextEdit, &QTextEdit::textChanged, this, &QgsMeshCalculatorDialog::updateInfoMessage );
@ -68,11 +70,6 @@ QgsMeshCalculatorDialog::QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer, QWidg
maskBox->setVisible( false );
useMaskCb->setEnabled( cboLayerMask->count() );
mXMaxSpinBox->setShowClearButton( false );
mXMinSpinBox->setShowClearButton( false );
mYMaxSpinBox->setShowClearButton( false );
mYMinSpinBox->setShowClearButton( false );
connect( mPlusPushButton, &QPushButton::clicked, this, &QgsMeshCalculatorDialog::mPlusPushButton_clicked );
connect( mMinusPushButton, &QPushButton::clicked, this, &QgsMeshCalculatorDialog::mMinusPushButton_clicked );
connect( mLessButton, &QPushButton::clicked, this, &QgsMeshCalculatorDialog::mLessButton_clicked );
@ -101,7 +98,16 @@ QgsMeshCalculatorDialog::QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer, QWidg
mExpressionTextEdit->setCurrentFont( QFontDatabase::systemFont( QFontDatabase::FixedFont ) );
useFullLayerExtent();
mExtentGroupBox->setCurrentExtent( mMapCanvas->extent(), mMapCanvas->mapSettings().destinationCrs() );
if ( mLayer )
{
mExtentGroupBox->setOutputExtentFromLayer( mLayer );
}
else
{
mExtentGroupBox->setOutputExtentFromCurrent();
}
repopulateTimeCombos();
mButtonBox->button( QDialogButtonBox::Ok )->setEnabled( false );
connect( mButtonBox, &QDialogButtonBox::helpRequested, this, [=] {
@ -140,13 +146,7 @@ QString QgsMeshCalculatorDialog::outputFile() const
QgsRectangle QgsMeshCalculatorDialog::outputExtent() const
{
const QgsRectangle ret(
mXMinSpinBox->value(),
mYMinSpinBox->value(),
mXMaxSpinBox->value(),
mYMaxSpinBox->value()
);
return ret;
return mExtentGroupBox->outputExtent();
}
QgsGeometry QgsMeshCalculatorDialog::maskGeometry() const
@ -286,7 +286,7 @@ void QgsMeshCalculatorDialog::datasetGroupEntry( const QModelIndex &index )
void QgsMeshCalculatorDialog::toggleExtendMask()
{
bool visible = useMaskCb->isChecked();
extendBox->setVisible( !visible );
mExtentGroupBox->setVisible( !visible );
maskBox->setVisible( visible );
}
@ -390,11 +390,6 @@ QString QgsMeshCalculatorDialog::datasetGroupName( const QModelIndex &index ) co
return index.data( Qt::DisplayRole ).toString();
}
void QgsMeshCalculatorDialog::mCurrentLayerExtentButton_clicked()
{
useFullLayerExtent();
}
void QgsMeshCalculatorDialog::mAllTimesButton_clicked()
{
useAllTimesFromLayer();
@ -591,19 +586,6 @@ void QgsMeshCalculatorDialog::populateDriversComboBox()
mOutputFormatComboBox->setCurrentIndex( 0 );
}
void QgsMeshCalculatorDialog::useFullLayerExtent()
{
QgsMeshLayer *layer = meshLayer();
if ( !layer )
return;
const QgsRectangle layerExtent = layer->extent();
mXMinSpinBox->setValue( layerExtent.xMinimum() );
mXMaxSpinBox->setValue( layerExtent.xMaximum() );
mYMinSpinBox->setValue( layerExtent.yMinimum() );
mYMaxSpinBox->setValue( layerExtent.yMaximum() );
}
void QgsMeshCalculatorDialog::useAllTimesFromLayer()
{
const QString datasetGroupName = currentDatasetGroup();

View File

@ -22,6 +22,8 @@
#include "qgsmeshcalculator.h"
#include "qgis_app.h"
class QgsMapCanvas;
//! A dialog to enter a mesh calculation expression
class APP_EXPORT QgsMeshCalculatorDialog : public QDialog, private Ui::QgsMeshCalculatorDialogBase
{
@ -33,7 +35,7 @@ class APP_EXPORT QgsMeshCalculatorDialog : public QDialog, private Ui::QgsMeshCa
* \param parent widget
* \param f window flags
*/
QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer = nullptr, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags() );
QgsMeshCalculatorDialog( QgsMeshLayer *meshLayer = nullptr, QgsMapCanvas *mapCanvas = nullptr, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags() );
~QgsMeshCalculatorDialog();
//! Returns new mesh calculator created from dialog options
@ -44,7 +46,6 @@ class APP_EXPORT QgsMeshCalculatorDialog : public QDialog, private Ui::QgsMeshCa
private slots:
void datasetGroupEntry( const QModelIndex &index );
void mCurrentLayerExtentButton_clicked();
void mAllTimesButton_clicked();
void toggleExtendMask();
void updateInfoMessage();
@ -127,6 +128,7 @@ class APP_EXPORT QgsMeshCalculatorDialog : public QDialog, private Ui::QgsMeshCa
void populateDriversComboBox();
QgsMeshLayer *mLayer;
QgsMapCanvas *mMapCanvas = nullptr;
QHash<QString, QgsMeshDriverMetadata> mMeshDrivers;
QStringList mVariableNames;

View File

@ -6214,7 +6214,7 @@ void QgisApp::showMeshCalculator()
QMessageBox::information( this, tr( "Mesh Calculator" ), tr( "Mesh calculator with mesh layer in edit mode is not supported." ) );
return;
}
QgsMeshCalculatorDialog d( meshLayer, this );
QgsMeshCalculatorDialog d( meshLayer, mMapCanvas, this );
if ( d.exec() == QDialog::Accepted )
{
//invoke analysis library

View File

@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>912</width>
<height>954</height>
<height>982</height>
</rect>
</property>
<property name="windowTitle">
@ -174,138 +174,10 @@
</widget>
</item>
<item>
<widget class="QWidget" name="extendBox" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
<widget class="QgsExtentGroupBox" name="mExtentGroupBox">
<property name="title">
<string>Spatial Extent</string>
</property>
<layout class="QGridLayout" name="gridLayout_3">
<property name="topMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="2" column="4">
<widget class="QgsDoubleSpinBox" name="mXMaxSpinBox">
<property name="decimals">
<number>5</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mYMinLabel">
<property name="text">
<string>Y min</string>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="mXMaxLabel">
<property name="text">
<string>X max</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsDoubleSpinBox" name="mYMinSpinBox">
<property name="decimals">
<number>5</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="3">
<widget class="QLabel" name="mYMaxLabel">
<property name="text">
<string>Y max</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QgsDoubleSpinBox" name="mXMinSpinBox">
<property name="decimals">
<number>5</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="4">
<widget class="QgsDoubleSpinBox" name="mYMaxSpinBox">
<property name="decimals">
<number>5</number>
</property>
<property name="minimum">
<double>-999999999.000000000000000</double>
</property>
<property name="maximum">
<double>999999999.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="mXMinLabel">
<property name="text">
<string>X min</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="5">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="mCurrentLayerExtentButton">
<property name="text">
<string>Use Selected Layer Extent</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="2" column="2">
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Orientation::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
</layout>
@ -665,11 +537,6 @@
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsDoubleSpinBox</class>
<extends>QDoubleSpinBox</extends>
<header>qgsdoublespinbox.h</header>
</customwidget>
<customwidget>
<class>QgsFileWidget</class>
<extends>QWidget</extends>
@ -681,6 +548,12 @@
<extends>QComboBox</extends>
<header>qgsmaplayercombobox.h</header>
</customwidget>
<customwidget>
<class>QgsExtentGroupBox</class>
<extends>QGroupBox</extends>
<header>qgsextentgroupbox.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>mDatasetsListWidget</tabstop>
@ -690,11 +563,6 @@
<tabstop>useExtentCb</tabstop>
<tabstop>useMaskCb</tabstop>
<tabstop>cboLayerMask</tabstop>
<tabstop>mCurrentLayerExtentButton</tabstop>
<tabstop>mXMinSpinBox</tabstop>
<tabstop>mXMaxSpinBox</tabstop>
<tabstop>mYMinSpinBox</tabstop>
<tabstop>mYMaxSpinBox</tabstop>
<tabstop>mAllTimesButton</tabstop>
<tabstop>mStartTimeComboBox</tabstop>
<tabstop>mEndTimeComboBox</tabstop>

View File

@ -85,7 +85,7 @@ void TestQgsMeshCalculatorDialog::testCalc()
if ( !QgsTest::runFlakyTests() )
QSKIP( "This test is disabled on Travis CI environment" );
auto dialog = std::make_unique<QgsMeshCalculatorDialog>( mpMeshLayer );
auto dialog = std::make_unique<QgsMeshCalculatorDialog>( mpMeshLayer, mQgisApp->mapCanvas() );
const int groupCount = mpMeshLayer->dataProvider()->datasetGroupCount();