Store elevation filter fixed range size in project

Remember this setting between sessions for a project
This commit is contained in:
Nyall Dawson 2024-04-23 10:05:50 +10:00
parent d5dea0721c
commit 1698bd3391
9 changed files with 152 additions and 4 deletions

View File

@ -84,6 +84,34 @@ elevation limits associated with the project.
.. seealso:: :py:func:`elevationRangeChanged`
.. versionadded:: 3.38
%End
void setElevationFilterRangeSize( double size );
%Docstring
Sets the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
Set to -1 if no fixed elevation range size is desired.
A fixed size forces the selected elevation range to have a matching difference between
the upper and lower elevation.
.. seealso:: :py:func:`elevationFilterRangeSize`
.. versionadded:: 3.38
%End
double elevationFilterRangeSize() const;
%Docstring
Returns the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
Returns -1 if no fixed elevation range size is desired.
A fixed size forces the selected elevation range to have a matching difference between
the upper and lower elevation.
.. seealso:: :py:func:`setElevationFilterRangeSize`
.. versionadded:: 3.38
%End

View File

@ -112,6 +112,8 @@ A fixed size forces the selected elevation range to have a matching difference b
the upper and lower elevation.
.. seealso:: :py:func:`fixedRangeSize`
.. seealso:: :py:func:`fixedRangeSizeChanged`
%End
signals:
@ -123,6 +125,15 @@ Emitted when the visible range from the widget is changed.
.. seealso:: :py:func:`setRange`
.. seealso:: :py:func:`range`
%End
void fixedRangeSizeChanged( double size );
%Docstring
Emitted when the fixed range size is changed from the widget.
.. seealso:: :py:func:`fixedRangeSize`
.. seealso:: :py:func:`setFixedRangeSize`
%End
};

View File

@ -84,6 +84,34 @@ elevation limits associated with the project.
.. seealso:: :py:func:`elevationRangeChanged`
.. versionadded:: 3.38
%End
void setElevationFilterRangeSize( double size );
%Docstring
Sets the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
Set to -1 if no fixed elevation range size is desired.
A fixed size forces the selected elevation range to have a matching difference between
the upper and lower elevation.
.. seealso:: :py:func:`elevationFilterRangeSize`
.. versionadded:: 3.38
%End
double elevationFilterRangeSize() const;
%Docstring
Returns the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
Returns -1 if no fixed elevation range size is desired.
A fixed size forces the selected elevation range to have a matching difference between
the upper and lower elevation.
.. seealso:: :py:func:`setElevationFilterRangeSize`
.. versionadded:: 3.38
%End

View File

@ -112,6 +112,8 @@ A fixed size forces the selected elevation range to have a matching difference b
the upper and lower elevation.
.. seealso:: :py:func:`fixedRangeSize`
.. seealso:: :py:func:`fixedRangeSizeChanged`
%End
signals:
@ -123,6 +125,15 @@ Emitted when the visible range from the widget is changed.
.. seealso:: :py:func:`setRange`
.. seealso:: :py:func:`range`
%End
void fixedRangeSizeChanged( double size );
%Docstring
Emitted when the fixed range size is changed from the widget.
.. seealso:: :py:func:`fixedRangeSize`
.. seealso:: :py:func:`setFixedRangeSize`
%End
};

View File

@ -15,6 +15,7 @@
#include "qgsappcanvasfiltering.h"
#include "qgselevationcontrollerwidget.h"
#include "qgsprojectelevationproperties.h"
#include "qgsmapcanvas.h"
#include "qgisapp.h"
#include <QInputDialog>
@ -58,6 +59,16 @@ void QgsAppCanvasFiltering::setupElevationControllerAction( QAction *action, Qgs
{
mCanvasElevationControllerMap.remove( canvas );
} );
if ( canvas == QgisApp::instance()->mapCanvas() )
{
// for main canvas, attach settings to project settings
controller->setFixedRangeSize( QgsProject::instance()->elevationProperties()->elevationFilterRangeSize() );
connect( controller, &QgsElevationControllerWidget::fixedRangeSizeChanged, this, []( double size )
{
QgsProject::instance()->elevationProperties()->setElevationFilterRangeSize( size );
} );
}
}
else
{

View File

@ -76,6 +76,10 @@ bool QgsProjectElevationProperties::readXml( const QDomElement &element, const Q
rangeUpper = storedRangeUpper;
mElevationRange = QgsDoubleRange( rangeLower, rangeUpper );
mElevationFilterRangeSize = element.attribute( QStringLiteral( "FilterRangeSize" ) ).toDouble( &ok );
if ( !ok )
mElevationFilterRangeSize = -1;
emit changed();
emit elevationRangeChanged( mElevationRange );
return true;
@ -98,6 +102,10 @@ QDomElement QgsProjectElevationProperties::writeXml( QDomDocument &document, con
if ( mElevationRange.upper() != std::numeric_limits< double >::max() )
element.setAttribute( QStringLiteral( "RangeUpper" ), qgsDoubleToString( mElevationRange.upper() ) );
if ( mElevationFilterRangeSize >= 0 )
{
element.setAttribute( QStringLiteral( "FilterRangeSize" ), mElevationFilterRangeSize );
}
return element;
}
@ -118,6 +126,15 @@ void QgsProjectElevationProperties::setTerrainProvider( QgsAbstractTerrainProvid
emit changed();
}
void QgsProjectElevationProperties::setElevationFilterRangeSize( double size )
{
if ( mElevationFilterRangeSize == size )
return;
mElevationFilterRangeSize = size;
emit changed();
}
void QgsProjectElevationProperties::setElevationRange( const QgsDoubleRange &range )
{
if ( mElevationRange == range )

View File

@ -100,6 +100,34 @@ class CORE_EXPORT QgsProjectElevationProperties : public QObject
*/
QgsDoubleRange elevationRange() const { return mElevationRange; }
/**
* Sets the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
*
* Set to -1 if no fixed elevation range size is desired.
*
* A fixed size forces the selected elevation range to have a matching difference between
* the upper and lower elevation.
*
* \see elevationFilterRangeSize()
*
* \since QGIS 3.38
*/
void setElevationFilterRangeSize( double size );
/**
* Returns the fixed size for elevation range filtering in the project, used when interactively filtering by elevation.
*
* Returns -1 if no fixed elevation range size is desired.
*
* A fixed size forces the selected elevation range to have a matching difference between
* the upper and lower elevation.
*
* \see setElevationFilterRangeSize()
*
* \since QGIS 3.38
*/
double elevationFilterRangeSize() const { return mElevationFilterRangeSize; }
public slots:
/**
@ -140,6 +168,7 @@ class CORE_EXPORT QgsProjectElevationProperties : public QObject
std::unique_ptr< QgsAbstractTerrainProvider > mTerrainProvider;
QgsDoubleRange mElevationRange;
double mElevationFilterRangeSize = -1;
};

View File

@ -49,11 +49,11 @@ QgsElevationControllerWidget::QgsElevationControllerWidget( QWidget *parent )
mMenu = new QMenu( this );
mConfigureButton->setMenu( mMenu );
QgsElevationControllerSettingsAction *settingsAction = new QgsElevationControllerSettingsAction( mMenu );
mMenu->addAction( settingsAction );
mSettingsAction = new QgsElevationControllerSettingsAction( mMenu );
mMenu->addAction( mSettingsAction );
settingsAction->sizeSpin()->clear();
connect( settingsAction->sizeSpin(), qOverload< double >( &QgsDoubleSpinBox::valueChanged ), this, [this]( double size )
mSettingsAction->sizeSpin()->clear();
connect( mSettingsAction->sizeSpin(), qOverload< double >( &QgsDoubleSpinBox::valueChanged ), this, [this]( double size )
{
setFixedRangeSize( size < 0 ? -1 : size );
} );
@ -225,6 +225,9 @@ void QgsElevationControllerWidget::setFixedRangeSize( double size )
{
mSlider->setFixedRangeSize( static_cast< int >( std::round( mFixedRangeSize * mSliderPrecision ) ) );
}
if ( mFixedRangeSize != mSettingsAction->sizeSpin()->value() )
mSettingsAction->sizeSpin()->setValue( mFixedRangeSize );
emit fixedRangeSizeChanged( mFixedRangeSize );
}
//

View File

@ -149,6 +149,7 @@ class GUI_EXPORT QgsElevationControllerWidget : public QWidget
* the upper and lower elevation.
*
* \see fixedRangeSize()
* \see fixedRangeSizeChanged()
*/
void setFixedRangeSize( double size );
@ -162,11 +163,20 @@ class GUI_EXPORT QgsElevationControllerWidget : public QWidget
*/
void rangeChanged( const QgsDoubleRange &range );
/**
* Emitted when the fixed range size is changed from the widget.
*
* \see fixedRangeSize()
* \see setFixedRangeSize()
*/
void fixedRangeSizeChanged( double size );
private:
void updateWidgetMask();
QToolButton *mConfigureButton = nullptr;
QgsElevationControllerSettingsAction *mSettingsAction = nullptr;
QMenu *mMenu = nullptr;
QgsRangeSlider *mSlider = nullptr;
QgsElevationControllerLabels *mSliderLabels = nullptr;