Skip to content

Commit

Permalink
[quick] Add Z range support to map canvas / map settings items
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Mar 12, 2024
1 parent 130a10c commit 4ae7d5a
Show file tree
Hide file tree
Showing 4 changed files with 125 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/quickgui/qgsquickmapcanvasmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

#include "qgis.h"
#include "qgsexpressioncontextutils.h"
#include "qgsgrouplayer.h"
#include "qgsmaplayerelevationproperties.h"
#include "qgsmaplayertemporalproperties.h"
#include "qgsmaprenderercache.h"
#include "qgsmaprendererparalleljob.h"
Expand All @@ -45,6 +47,7 @@ QgsQuickMapCanvasMap::QgsQuickMapCanvasMap( QQuickItem *parent )
connect( mMapSettings.get(), &QgsQuickMapSettings::extentChanged, this, &QgsQuickMapCanvasMap::onExtentChanged );
connect( mMapSettings.get(), &QgsQuickMapSettings::layersChanged, this, &QgsQuickMapCanvasMap::onLayersChanged );
connect( mMapSettings.get(), &QgsQuickMapSettings::temporalStateChanged, this, &QgsQuickMapCanvasMap::onTemporalStateChanged );
connect( mMapSettings.get(), &QgsQuickMapSettings::zRangeChanged, this, &QgsQuickMapCanvasMap::onzRangeChanged );

connect( this, &QgsQuickMapCanvasMap::renderStarting, this, &QgsQuickMapCanvasMap::isRenderingChanged );
connect( this, &QgsQuickMapCanvasMap::mapCanvasRefreshed, this, &QgsQuickMapCanvasMap::isRenderingChanged );
Expand Down Expand Up @@ -286,6 +289,14 @@ void QgsQuickMapCanvasMap::onTemporalStateChanged()
refresh();
}

void QgsQuickMapCanvasMap::onzRangeChanged()
{
clearElevationCache();

// And trigger a new rendering job
refresh();
}

void QgsQuickMapCanvasMap::updateTransform()
{
QgsRectangle imageExtent = mImageMapSettings.visibleExtent();
Expand Down Expand Up @@ -525,3 +536,48 @@ void QgsQuickMapCanvasMap::clearTemporalCache()
}
}

void QgsQuickMapCanvasMap::clearElevationCache()
{
if ( mCache )
{
bool invalidateLabels = false;
const QList<QgsMapLayer *> layerList = mMapSettings->mapSettings().layers();
for ( QgsMapLayer *layer : layerList )
{
if ( layer->elevationProperties() && layer->elevationProperties()->hasElevation() )
{
if ( QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( layer ) )
{
if ( vl->labelsEnabled() || vl->diagramsEnabled() )
invalidateLabels = true;
}

if ( layer->elevationProperties()->flags() & QgsMapLayerElevationProperties::FlagDontInvalidateCachedRendersWhenRangeChanges )
continue;

mCache->invalidateCacheForLayer( layer );
}
else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>( layer ) )
{
const QList<QgsMapLayer *> childLayerList = gl->childLayers();
for ( QgsMapLayer *childLayer : childLayerList )
{
if ( childLayer->elevationProperties() && childLayer->elevationProperties()->hasElevation() )
{
if ( childLayer->elevationProperties()->flags() & QgsMapLayerElevationProperties::FlagDontInvalidateCachedRendersWhenRangeChanges )
continue;

mCache->invalidateCacheForLayer( layer );
break;
}
}
}
}

if ( invalidateLabels )
{
mCache->clearCacheImage( QStringLiteral( "_labels_" ) );
mCache->clearCacheImage( QStringLiteral( "_preview_labels_" ) );
}
}
}
2 changes: 2 additions & 0 deletions src/quickgui/qgsquickmapcanvasmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ class QUICK_EXPORT QgsQuickMapCanvasMap : public QQuickItem
void onExtentChanged();
void onLayersChanged();
void onTemporalStateChanged();
void onzRangeChanged();

private:

Expand All @@ -196,6 +197,7 @@ class QUICK_EXPORT QgsQuickMapCanvasMap : public QQuickItem
void updateTransform();
void zoomToFullExtent();
void clearTemporalCache();
void clearElevationCache();

std::unique_ptr<QgsQuickMapSettings> mMapSettings;
bool mPinching = false;
Expand Down
37 changes: 37 additions & 0 deletions src/quickgui/qgsquickmapsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,7 @@ void QgsQuickMapSettings::onReadProject( const QDomDocument &doc )
emit outputDpiChanged();
emit layersChanged();
emit temporalStateChanged();
emit zRangeChanged();
}

double QgsQuickMapSettings::rotation() const
Expand Down Expand Up @@ -344,3 +345,39 @@ void QgsQuickMapSettings::setTemporalEnd( const QDateTime &end )
mMapSettings.setTemporalRange( QgsDateTimeRange( range.begin(), end ) );
emit temporalStateChanged();
}

double QgsQuickMapSettings::zRangeLower() const
{
const QgsDoubleRange zRange = mMapSettings.zRange();
return zRange.lower();
}

void QgsQuickMapSettings::setZRangeLower( const double &lower )
{
const QgsDoubleRange zRange = mMapSettings.zRange();
if ( zRange.lower() == lower )
{
return;
}

mMapSettings.setZRange( QgsDoubleRange( lower, zRange.upper(), zRange.includeLower(), zRange.includeUpper() ) );
emit zRangeChanged();
}

double QgsQuickMapSettings::zRangeUpper() const
{
const QgsDoubleRange zRange = mMapSettings.zRange();
return zRange.upper();
}

void QgsQuickMapSettings::setZRangeUpper( const double &upper )
{
const QgsDoubleRange zRange = mMapSettings.zRange();
if ( zRange.upper() == upper )
{
return;
}

mMapSettings.setZRange( QgsDoubleRange( zRange.lower(), upper, zRange.includeLower(), zRange.includeUpper() ) );
emit zRangeChanged();
}
30 changes: 30 additions & 0 deletions src/quickgui/qgsquickmapsettings.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,16 @@ class QUICK_EXPORT QgsQuickMapSettings : public QObject
*/
Q_PROPERTY( QDateTime temporalEnd READ temporalEnd WRITE setTemporalEnd NOTIFY temporalStateChanged )

/**
* The Z range's lower value (since QGIS 3.38)
*/
Q_PROPERTY( double zRangeLower READ zRangeLower WRITE setZRangeLower NOTIFY zRangeChanged )

/**
* The Z range's upper value (since QGIS 3.38)
*/
Q_PROPERTY( double zRangeUpper READ zRangeUpper WRITE setZRangeUpper NOTIFY zRangeChanged )

public:
//! Create new map settings
explicit QgsQuickMapSettings( QObject *parent = nullptr );
Expand Down Expand Up @@ -288,6 +298,18 @@ class QUICK_EXPORT QgsQuickMapSettings : public QObject
//! \copydoc QgsQuickMapSettings::temporalEnd
void setTemporalEnd( const QDateTime &end );

//! \copydoc QgsQuickMapSettings::zRangeLower
double zRangeLower() const;

//! \copydoc QgsQuickMapSettings::zRangeLower
void setZRangeLower( const double &lower );

//! \copydoc QgsQuickMapSettings::zRangeLower
double zRangeUpper() const;

//! \copydoc QgsQuickMapSettings::zRangeLower
void setZRangeUpper( const double &upper );

signals:
//! \copydoc QgsQuickMapSettings::project
void projectChanged();
Expand Down Expand Up @@ -329,6 +351,14 @@ class QUICK_EXPORT QgsQuickMapSettings : public QObject
*/
void temporalStateChanged();

/**
* Emitted when the Z range has changed.
* \see zRangeLower()
* \see zRangeUpper()
* \since QGIS 3.38
*/
void zRangeChanged();

//! \copydoc QgsQuickMapSettings::devicePixelRatio
void devicePixelRatioChanged();

Expand Down

0 comments on commit 4ae7d5a

Please sign in to comment.