21
21
#include " qgslayertreemodellegendnode.h"
22
22
#include " qgslayertreeview.h"
23
23
#include " qgsmaplayerregistry.h"
24
+ #include " qgsmaplayerstylemanager.h"
24
25
#include " qgsproject.h"
25
26
#include " qgsrendererv2.h"
26
27
#include " qgsvectorlayer.h"
@@ -104,12 +105,28 @@ void QgsVisibilityPresets::addPerLayerCheckedLegendSymbols( QgsVisibilityPresets
104
105
}
105
106
}
106
107
108
+ void QgsVisibilityPresets::addPerLayerCurrentStyle ( QgsVisibilityPresets::PresetRecord& rec )
109
+ {
110
+ QgsLayerTreeModel* model = QgisApp::instance ()->layerTreeView ()->layerTreeModel ();
111
+
112
+ foreach ( QString layerID, rec.mVisibleLayerIDs )
113
+ {
114
+ QgsLayerTreeLayer* nodeLayer = model->rootGroup ()->findLayer ( layerID );
115
+ if ( !nodeLayer )
116
+ continue ;
117
+
118
+ if ( nodeLayer->layer ()->styleManager () )
119
+ rec.mPerLayerCurrentStyle [layerID] = nodeLayer->layer ()->styleManager ()->currentStyle ();
120
+ }
121
+ }
122
+
107
123
QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentState ()
108
124
{
109
125
PresetRecord rec;
110
126
QgsLayerTreeGroup* root = QgsProject::instance ()->layerTreeRoot ();
111
127
addVisibleLayersToPreset ( root, rec );
112
128
addPerLayerCheckedLegendSymbols ( rec );
129
+ addPerLayerCurrentStyle ( rec );
113
130
return rec;
114
131
}
115
132
@@ -119,6 +136,7 @@ QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentStateFromLayerLi
119
136
foreach ( const QString& layerID, layerIDs )
120
137
rec.mVisibleLayerIDs << layerID;
121
138
addPerLayerCheckedLegendSymbols ( rec );
139
+ addPerLayerCurrentStyle ( rec );
122
140
return rec;
123
141
}
124
142
@@ -242,6 +260,13 @@ void QgsVisibilityPresets::applyStateToLayerTreeGroup( QgsLayerTreeGroup* parent
242
260
243
261
if ( isVisible )
244
262
{
263
+ if ( rec.mPerLayerCurrentStyle .contains ( nodeLayer->layerId () ) )
264
+ {
265
+ // apply desired style first
266
+ if ( nodeLayer->layer ()->styleManager () )
267
+ nodeLayer->layer ()->styleManager ()->setCurrentStyle ( rec.mPerLayerCurrentStyle [nodeLayer->layerId ()] );
268
+ }
269
+
245
270
QgsLayerTreeModel* model = QgisApp::instance ()->layerTreeView ()->layerTreeModel ();
246
271
if ( rec.mPerLayerCheckedLegendSymbols .contains ( nodeLayer->layerId () ) )
247
272
{
@@ -289,6 +314,18 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
289
314
if ( !vl || !vl->rendererV2 () )
290
315
continue ;
291
316
317
+ // first verify if the layer still has checkable legend items
318
+ // if not, remove the entry for the layer
319
+
320
+ if ( !vl->rendererV2 ()->legendSymbolItemsCheckable () )
321
+ {
322
+ rec.mPerLayerCheckedLegendSymbols .remove ( layerID );
323
+ continue ;
324
+ }
325
+
326
+ // now verify that all recorded legend items still exist
327
+ // if not, remove them from the layer's entry
328
+
292
329
QSet<QString> validRuleKeys;
293
330
foreach ( const QgsLegendSymbolItemV2& item, vl->rendererV2 ()->legendSymbolItemsV2 () )
294
331
validRuleKeys << item.ruleKey ();
@@ -301,6 +338,20 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
301
338
foreach ( QString invalidRuleKey, invalidRuleKeys )
302
339
rec.mPerLayerCheckedLegendSymbols [layerID].remove ( invalidRuleKey );
303
340
}
341
+
342
+ // fix non-existent layer styles
343
+ foreach ( QString layerID, rec.mPerLayerCurrentStyle .keys () )
344
+ {
345
+ QgsMapLayer* ml = QgsMapLayerRegistry::instance ()->mapLayer ( layerID );
346
+ if ( !ml )
347
+ continue ;
348
+
349
+ QString name = rec.mPerLayerCurrentStyle [layerID];
350
+ if ( !ml->styleManager () )
351
+ rec.mPerLayerCurrentStyle .remove ( layerID );
352
+ else if ( !ml->styleManager ()->styles ().contains ( name ) )
353
+ rec.mPerLayerCurrentStyle [layerID] = ml->styleManager ()->currentStyle ();
354
+ }
304
355
}
305
356
306
357
@@ -361,7 +412,11 @@ void QgsVisibilityPresets::readProject( const QDomDocument& doc )
361
412
{
362
413
QString layerID = visPresetLayerElem.attribute ( " id" );
363
414
if ( QgsMapLayerRegistry::instance ()->mapLayer ( layerID ) )
415
+ {
364
416
rec.mVisibleLayerIDs << layerID; // only use valid layer IDs
417
+ if ( visPresetLayerElem.hasAttribute ( " style" ) )
418
+ rec.mPerLayerCurrentStyle [layerID] = visPresetLayerElem.attribute ( " style" );
419
+ }
365
420
visPresetLayerElem = visPresetLayerElem.nextSiblingElement ( " layer" );
366
421
}
367
422
@@ -401,6 +456,8 @@ void QgsVisibilityPresets::writeProject( QDomDocument& doc )
401
456
{
402
457
QDomElement layerElem = doc.createElement ( " layer" );
403
458
layerElem.setAttribute ( " id" , layerID );
459
+ if ( rec.mPerLayerCurrentStyle .contains ( layerID ) )
460
+ layerElem.setAttribute ( " style" , rec.mPerLayerCurrentStyle [layerID] );
404
461
visPresetElem.appendChild ( layerElem );
405
462
}
406
463
@@ -432,6 +489,7 @@ void QgsVisibilityPresets::registryLayersRemoved( QStringList layerIDs )
432
489
PresetRecord& rec = mPresets [presetName];
433
490
rec.mVisibleLayerIDs .remove ( layerID );
434
491
rec.mPerLayerCheckedLegendSymbols .remove ( layerID );
492
+ rec.mPerLayerCurrentStyle .remove ( layerID );
435
493
}
436
494
}
437
495
}
0 commit comments