-
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
qgslayerrestorer.cpp
115 lines (99 loc) · 3.8 KB
/
qgslayerrestorer.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/***************************************************************************
qgslayerrestorer.cpp
--------------------
begin : April 24, 2017
copyright : (C) 2017 by Paul Blottiere
email : paul.blottiere@oslandia.com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgslayerrestorer.h"
#include "qgsvectorlayer.h"
#include "qgsrasterlayer.h"
#include "qgsrasterrenderer.h"
#include "qgsmaplayerstylemanager.h"
const QString DEFAULT_NAMED_STYLE = "server_default_style";
QgsLayerRestorer::QgsLayerRestorer( const QList<QgsMapLayer *> &layers )
{
Q_FOREACH ( QgsMapLayer *layer, layers )
{
QgsLayerSettings settings;
QString style = layer->styleManager()->currentStyle();
if ( style.isEmpty() )
{
layer->styleManager()->addStyleFromLayer( DEFAULT_NAMED_STYLE );
settings.mNamedStyle = DEFAULT_NAMED_STYLE;
}
else
{
settings.mNamedStyle = style;
}
// set a custom property allowing to keep in memory if a SLD file has
// been loaded for rendering
layer->setCustomProperty( "readSLD", false );
QString errMsg;
QDomDocument sldDoc;
layer->exportSldStyle( sldDoc, errMsg );
( void )settings.mSldStyle.setContent( sldDoc.toString(), true ); // for namespace processing
if ( layer->type() == QgsMapLayer::LayerType::VectorLayer )
{
QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( layer );
if ( vLayer )
{
settings.mOpacity = vLayer->opacity();
settings.mSelectedFeatureIds = vLayer->selectedFeatureIds();
settings.mFilter = vLayer->subsetString();
}
}
else if ( layer->type() == QgsMapLayer::LayerType::RasterLayer )
{
QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
if ( rLayer )
{
settings.mOpacity = rLayer->renderer()->opacity();
}
}
mLayerSettings[layer] = settings;
}
}
QgsLayerRestorer::~QgsLayerRestorer()
{
for ( QgsMapLayer *layer : mLayerSettings.keys() )
{
QgsLayerSettings settings = mLayerSettings[layer];
layer->styleManager()->setCurrentStyle( settings.mNamedStyle );
// if a SLD file has been loaded for rendering, we restore the previous one
QString errMsg;
QDomElement root = settings.mSldStyle.firstChildElement( "StyledLayerDescriptor" );
QDomElement el = root.firstChildElement( "NamedLayer" );
if ( layer->customProperty( "readSLD", false ).toBool() )
{
layer->readSld( el, errMsg );
}
layer->removeCustomProperty( "readSLD" );
if ( layer->type() == QgsMapLayer::LayerType::VectorLayer )
{
QgsVectorLayer *vLayer = qobject_cast<QgsVectorLayer *>( layer );
if ( vLayer )
{
vLayer->setOpacity( settings.mOpacity );
vLayer->selectByIds( settings.mSelectedFeatureIds );
vLayer->setSubsetString( settings.mFilter );
}
}
else if ( layer->type() == QgsMapLayer::LayerType::RasterLayer )
{
QgsRasterLayer *rLayer = qobject_cast<QgsRasterLayer *>( layer );
if ( rLayer )
{
rLayer->renderer()->setOpacity( settings.mOpacity );
}
}
}
}