QGIS API Documentation 4.1.0-Master (9af12b5a203)
Loading...
Searching...
No Matches
qgslayerstylewatcher.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgslayerstylewatcher.cpp
3 --------------------------------------
4 Date : May 2026
5 Copyright : (C) 2026 by Oslandia
6 Email : benoit dot de dot mezzo at oslandia dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17
18#include "qgs3dmapsettings.h"
19
20#include "moc_qgslayerstylewatcher.cpp"
21
22using namespace Qt::StringLiterals;
23
26QgsLayerStyleWatcher::QgsLayerStyleWatcher( Qgs3DMapSettings *mapSettings )
27 : QObject()
28 , mMapSettings( mapSettings )
29{
30 onLayersChanged();
31 connect( mMapSettings, &Qgs3DMapSettings::layersChanged, this, &QgsLayerStyleWatcher::onLayersChanged );
32}
33
34void QgsLayerStyleWatcher::onLayersChanged()
35{
36 // disconnect all watched layers
37 const QList<QgsMapLayer *> keys = mLayers.keys();
38 for ( QgsMapLayer *layer : keys )
39 {
40 disconnect( layer, &QgsMapLayer::renderer3DChanged, this, &QgsLayerStyleWatcher::onLayer3DRendererChanged );
41 disconnect( layer, &QgsMapLayer::repaintRequested, this, &QgsLayerStyleWatcher::onLayerRepaintRequested );
42 disconnect( layer, &QgsMapLayer::destroyed, this, &QgsLayerStyleWatcher::onLayerDestroyed );
43 }
44
45 mLayers.clear();
46
47 // connect on all layer renderer3DChanged and styleChanged signals
48 // then keep if they have or not a 3D renderer
49 const QList<QgsMapLayer *> layers = mMapSettings->layers();
50 for ( QgsMapLayer *layer : layers )
51 {
52 mLayers[layer] = static_cast< bool >( layer->renderer3D() );
53 connect( layer, &QgsMapLayer::renderer3DChanged, this, &QgsLayerStyleWatcher::onLayer3DRendererChanged );
54 connect( layer, &QgsMapLayer::repaintRequested, this, &QgsLayerStyleWatcher::onLayerRepaintRequested );
55 connect( layer, &QgsMapLayer::destroyed, this, &QgsLayerStyleWatcher::onLayerDestroyed );
56 }
57
58 emit styleChanged();
59}
60
61void QgsLayerStyleWatcher::onLayerRepaintRequested()
62{
63 if ( QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() ) )
64 {
65 // if layer has no 3D renderer and its 2D style changed, we must invalidate the map images.
66 if ( mLayers.contains( layer ) && !static_cast< bool >( layer->renderer3D() ) )
67 {
68 emit styleChanged();
69 }
70 }
71}
72
73void QgsLayerStyleWatcher::onLayer3DRendererChanged()
74{
75 if ( QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() ) )
76 {
77 // if layer has gone from having a 3d renderer to not having one, or vice versa, we must invalidate the map images.
78 if ( mLayers.contains( layer ) && mLayers[layer] != static_cast< bool >( layer->renderer3D() ) )
79 {
80 mLayers[layer] = static_cast< bool >( layer->renderer3D() );
81 emit styleChanged();
82 }
83 }
84}
85void QgsLayerStyleWatcher::onLayerDestroyed()
86{
87 if ( QgsMapLayer *layer = qobject_cast<QgsMapLayer *>( sender() ) )
88 {
89 mLayers.remove( layer );
90 }
91}
92
Definition of the world.
void layersChanged()
Emitted when the list of map layers for 3d rendering has changed.
Base class for all map layer types.
Definition qgsmaplayer.h:83
void renderer3DChanged()
Signal emitted when 3D renderer associated with the layer has changed.
void repaintRequested(bool deferredUpdate=false)
By emitting this signal the layer tells that either appearance or content have been changed and any v...