Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[quick] Add Z range support to map canvas / map settings items #56814

Merged
merged 2 commits into from
Mar 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
95 changes: 91 additions & 4 deletions src/quickgui/qgsquickmapcanvasmap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,19 @@
#include <QScreen>

#include "qgis.h"
#include "qgsannotationlayer.h"
#include "qgsexpressioncontextutils.h"
#include "qgsgrouplayer.h"
#include "qgslabelingresults.h"
#include "qgsmaplayerelevationproperties.h"
#include "qgsmaplayertemporalproperties.h"
#include "qgsmaprenderercache.h"
#include "qgsmaprendererparalleljob.h"
#include "qgsmessagelog.h"
#include "qgspallabeling.h"
#include "qgsproject.h"
#include "qgsannotationlayer.h"
#include "qgssymbollayerutils.h"
#include "qgsvectorlayer.h"
#include "qgslabelingresults.h"

#include "qgsquickmapcanvasmap.h"
#include "qgsquickmapsettings.h"
Expand All @@ -45,6 +48,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 +290,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 @@ -502,9 +514,23 @@ void QgsQuickMapCanvasMap::clearTemporalCache()
const QList<QgsMapLayer *> layerList = mMapSettings->mapSettings().layers();
for ( QgsMapLayer *layer : layerList )
{
bool alreadyInvalidatedThisLayer = false;
if ( QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( layer ) )
{
if ( vl->renderer() && QgsSymbolLayerUtils::rendererFrameRate( vl->renderer() ) > -1 )
{
// layer has an animated symbol assigned, so we have to redraw it regardless of whether
// or not it has temporal settings
mCache->invalidateCacheForLayer( layer );
alreadyInvalidatedThisLayer = true;
// we can't shortcut and "continue" here, as we still need to check whether the layer
// will cause label invalidation using the logic below
}
}

if ( layer->temporalProperties() && layer->temporalProperties()->isActive() )
{
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( layer ) )
if ( QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( layer ) )
{
if ( vl->labelsEnabled() || vl->diagramsEnabled() )
invalidateLabels = true;
Expand All @@ -513,7 +539,23 @@ void QgsQuickMapCanvasMap::clearTemporalCache()
if ( layer->temporalProperties()->flags() & QgsTemporalProperty::FlagDontInvalidateCachedRendersWhenRangeChanges )
continue;

mCache->invalidateCacheForLayer( layer );
if ( !alreadyInvalidatedThisLayer )
mCache->invalidateCacheForLayer( layer );
}
else if ( QgsGroupLayer *gl = qobject_cast<QgsGroupLayer *>( layer ) )
{
const QList<QgsMapLayer *> childLayerList = gl->childLayers();
for ( QgsMapLayer *childLayer : childLayerList )
{
if ( childLayer->temporalProperties() && childLayer->temporalProperties()->isActive() )
{
if ( childLayer->temporalProperties()->flags() & QgsTemporalProperty::FlagDontInvalidateCachedRendersWhenRangeChanges )
continue;

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

Expand All @@ -525,3 +567,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