Skip to content

Commit 803e822

Browse files
committed
Visibility presets also record layer's current style
1 parent 603b3a5 commit 803e822

File tree

2 files changed

+64
-1
lines changed

2 files changed

+64
-1
lines changed

src/app/qgsvisibilitypresets.cpp

+58
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgslayertreemodellegendnode.h"
2222
#include "qgslayertreeview.h"
2323
#include "qgsmaplayerregistry.h"
24+
#include "qgsmaplayerstylemanager.h"
2425
#include "qgsproject.h"
2526
#include "qgsrendererv2.h"
2627
#include "qgsvectorlayer.h"
@@ -104,12 +105,28 @@ void QgsVisibilityPresets::addPerLayerCheckedLegendSymbols( QgsVisibilityPresets
104105
}
105106
}
106107

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+
107123
QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentState()
108124
{
109125
PresetRecord rec;
110126
QgsLayerTreeGroup* root = QgsProject::instance()->layerTreeRoot();
111127
addVisibleLayersToPreset( root, rec );
112128
addPerLayerCheckedLegendSymbols( rec );
129+
addPerLayerCurrentStyle( rec );
113130
return rec;
114131
}
115132

@@ -119,6 +136,7 @@ QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentStateFromLayerLi
119136
foreach ( const QString& layerID, layerIDs )
120137
rec.mVisibleLayerIDs << layerID;
121138
addPerLayerCheckedLegendSymbols( rec );
139+
addPerLayerCurrentStyle( rec );
122140
return rec;
123141
}
124142

@@ -242,6 +260,13 @@ void QgsVisibilityPresets::applyStateToLayerTreeGroup( QgsLayerTreeGroup* parent
242260

243261
if ( isVisible )
244262
{
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+
245270
QgsLayerTreeModel* model = QgisApp::instance()->layerTreeView()->layerTreeModel();
246271
if ( rec.mPerLayerCheckedLegendSymbols.contains( nodeLayer->layerId() ) )
247272
{
@@ -289,6 +314,18 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
289314
if ( !vl || !vl->rendererV2() )
290315
continue;
291316

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+
292329
QSet<QString> validRuleKeys;
293330
foreach ( const QgsLegendSymbolItemV2& item, vl->rendererV2()->legendSymbolItemsV2() )
294331
validRuleKeys << item.ruleKey();
@@ -301,6 +338,20 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
301338
foreach ( QString invalidRuleKey, invalidRuleKeys )
302339
rec.mPerLayerCheckedLegendSymbols[layerID].remove( invalidRuleKey );
303340
}
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+
}
304355
}
305356

306357

@@ -361,7 +412,11 @@ void QgsVisibilityPresets::readProject( const QDomDocument& doc )
361412
{
362413
QString layerID = visPresetLayerElem.attribute( "id" );
363414
if ( QgsMapLayerRegistry::instance()->mapLayer( layerID ) )
415+
{
364416
rec.mVisibleLayerIDs << layerID; // only use valid layer IDs
417+
if ( visPresetLayerElem.hasAttribute( "style" ) )
418+
rec.mPerLayerCurrentStyle[layerID] = visPresetLayerElem.attribute( "style" );
419+
}
365420
visPresetLayerElem = visPresetLayerElem.nextSiblingElement( "layer" );
366421
}
367422

@@ -401,6 +456,8 @@ void QgsVisibilityPresets::writeProject( QDomDocument& doc )
401456
{
402457
QDomElement layerElem = doc.createElement( "layer" );
403458
layerElem.setAttribute( "id", layerID );
459+
if ( rec.mPerLayerCurrentStyle.contains( layerID ) )
460+
layerElem.setAttribute( "style", rec.mPerLayerCurrentStyle[layerID] );
404461
visPresetElem.appendChild( layerElem );
405462
}
406463

@@ -432,6 +489,7 @@ void QgsVisibilityPresets::registryLayersRemoved( QStringList layerIDs )
432489
PresetRecord& rec = mPresets[presetName];
433490
rec.mVisibleLayerIDs.remove( layerID );
434491
rec.mPerLayerCheckedLegendSymbols.remove( layerID );
492+
rec.mPerLayerCurrentStyle.remove( layerID );
435493
}
436494
}
437495
}

src/app/qgsvisibilitypresets.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ class QgsVisibilityPresets : public QObject
4141
{
4242
bool operator==( const PresetRecord& other ) const
4343
{
44-
return mVisibleLayerIDs == other.mVisibleLayerIDs && mPerLayerCheckedLegendSymbols == other.mPerLayerCheckedLegendSymbols;
44+
return mVisibleLayerIDs == other.mVisibleLayerIDs
45+
&& mPerLayerCheckedLegendSymbols == other.mPerLayerCheckedLegendSymbols
46+
&& mPerLayerCurrentStyle == other.mPerLayerCurrentStyle;
4547
}
4648
bool operator!=( const PresetRecord& other ) const
4749
{
@@ -52,6 +54,8 @@ class QgsVisibilityPresets : public QObject
5254
QSet<QString> mVisibleLayerIDs;
5355
//! For layers that have checkable legend symbols and not all symbols are checked - list which ones are
5456
QMap<QString, QSet<QString> > mPerLayerCheckedLegendSymbols;
57+
//! For layers that use multiple styles - which one is currently selected
58+
QMap<QString, QString> mPerLayerCurrentStyle;
5559
} PresetRecord;
5660

5761

@@ -107,6 +111,7 @@ class QgsVisibilityPresets : public QObject
107111
void addVisibleLayersToPreset( QgsLayerTreeGroup* parent, PresetRecord& rec );
108112
void applyStateToLayerTreeGroup( QgsLayerTreeGroup* parent, const PresetRecord& rec );
109113
void addPerLayerCheckedLegendSymbols( PresetRecord& rec );
114+
void addPerLayerCurrentStyle( PresetRecord& rec );
110115

111116
PresetRecord currentState();
112117
void applyState( const QString& presetName );

0 commit comments

Comments
 (0)