Skip to content

Commit

Permalink
Visibility presets also record layer's current style
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Jan 8, 2015
1 parent 603b3a5 commit 803e822
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 1 deletion.
58 changes: 58 additions & 0 deletions src/app/qgsvisibilitypresets.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qgslayertreemodellegendnode.h"
#include "qgslayertreeview.h"
#include "qgsmaplayerregistry.h"
#include "qgsmaplayerstylemanager.h"
#include "qgsproject.h"
#include "qgsrendererv2.h"
#include "qgsvectorlayer.h"
Expand Down Expand Up @@ -104,12 +105,28 @@ void QgsVisibilityPresets::addPerLayerCheckedLegendSymbols( QgsVisibilityPresets
}
}

void QgsVisibilityPresets::addPerLayerCurrentStyle( QgsVisibilityPresets::PresetRecord& rec )
{
QgsLayerTreeModel* model = QgisApp::instance()->layerTreeView()->layerTreeModel();

foreach ( QString layerID, rec.mVisibleLayerIDs )
{
QgsLayerTreeLayer* nodeLayer = model->rootGroup()->findLayer( layerID );
if ( !nodeLayer )
continue;

if ( nodeLayer->layer()->styleManager() )
rec.mPerLayerCurrentStyle[layerID] = nodeLayer->layer()->styleManager()->currentStyle();
}
}

QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentState()
{
PresetRecord rec;
QgsLayerTreeGroup* root = QgsProject::instance()->layerTreeRoot();
addVisibleLayersToPreset( root, rec );
addPerLayerCheckedLegendSymbols( rec );
addPerLayerCurrentStyle( rec );
return rec;
}

Expand All @@ -119,6 +136,7 @@ QgsVisibilityPresets::PresetRecord QgsVisibilityPresets::currentStateFromLayerLi
foreach ( const QString& layerID, layerIDs )
rec.mVisibleLayerIDs << layerID;
addPerLayerCheckedLegendSymbols( rec );
addPerLayerCurrentStyle( rec );
return rec;
}

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

if ( isVisible )
{
if ( rec.mPerLayerCurrentStyle.contains( nodeLayer->layerId() ) )
{
// apply desired style first
if ( nodeLayer->layer()->styleManager() )
nodeLayer->layer()->styleManager()->setCurrentStyle( rec.mPerLayerCurrentStyle[nodeLayer->layerId()] );
}

QgsLayerTreeModel* model = QgisApp::instance()->layerTreeView()->layerTreeModel();
if ( rec.mPerLayerCheckedLegendSymbols.contains( nodeLayer->layerId() ) )
{
Expand Down Expand Up @@ -289,6 +314,18 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
if ( !vl || !vl->rendererV2() )
continue;

// first verify if the layer still has checkable legend items
// if not, remove the entry for the layer

if ( !vl->rendererV2()->legendSymbolItemsCheckable() )
{
rec.mPerLayerCheckedLegendSymbols.remove( layerID );
continue;
}

// now verify that all recorded legend items still exist
// if not, remove them from the layer's entry

QSet<QString> validRuleKeys;
foreach ( const QgsLegendSymbolItemV2& item, vl->rendererV2()->legendSymbolItemsV2() )
validRuleKeys << item.ruleKey();
Expand All @@ -301,6 +338,20 @@ void QgsVisibilityPresets::applyState( const QString& presetName )
foreach ( QString invalidRuleKey, invalidRuleKeys )
rec.mPerLayerCheckedLegendSymbols[layerID].remove( invalidRuleKey );
}

// fix non-existent layer styles
foreach ( QString layerID, rec.mPerLayerCurrentStyle.keys() )
{
QgsMapLayer* ml = QgsMapLayerRegistry::instance()->mapLayer( layerID );
if ( !ml )
continue;

QString name = rec.mPerLayerCurrentStyle[layerID];
if ( !ml->styleManager() )
rec.mPerLayerCurrentStyle.remove( layerID );
else if ( !ml->styleManager()->styles().contains( name ) )
rec.mPerLayerCurrentStyle[layerID] = ml->styleManager()->currentStyle();
}
}


Expand Down Expand Up @@ -361,7 +412,11 @@ void QgsVisibilityPresets::readProject( const QDomDocument& doc )
{
QString layerID = visPresetLayerElem.attribute( "id" );
if ( QgsMapLayerRegistry::instance()->mapLayer( layerID ) )
{
rec.mVisibleLayerIDs << layerID; // only use valid layer IDs
if ( visPresetLayerElem.hasAttribute( "style" ) )
rec.mPerLayerCurrentStyle[layerID] = visPresetLayerElem.attribute( "style" );
}
visPresetLayerElem = visPresetLayerElem.nextSiblingElement( "layer" );
}

Expand Down Expand Up @@ -401,6 +456,8 @@ void QgsVisibilityPresets::writeProject( QDomDocument& doc )
{
QDomElement layerElem = doc.createElement( "layer" );
layerElem.setAttribute( "id", layerID );
if ( rec.mPerLayerCurrentStyle.contains( layerID ) )
layerElem.setAttribute( "style", rec.mPerLayerCurrentStyle[layerID] );
visPresetElem.appendChild( layerElem );
}

Expand Down Expand Up @@ -432,6 +489,7 @@ void QgsVisibilityPresets::registryLayersRemoved( QStringList layerIDs )
PresetRecord& rec = mPresets[presetName];
rec.mVisibleLayerIDs.remove( layerID );
rec.mPerLayerCheckedLegendSymbols.remove( layerID );
rec.mPerLayerCurrentStyle.remove( layerID );
}
}
}
7 changes: 6 additions & 1 deletion src/app/qgsvisibilitypresets.h
Expand Up @@ -41,7 +41,9 @@ class QgsVisibilityPresets : public QObject
{
bool operator==( const PresetRecord& other ) const
{
return mVisibleLayerIDs == other.mVisibleLayerIDs && mPerLayerCheckedLegendSymbols == other.mPerLayerCheckedLegendSymbols;
return mVisibleLayerIDs == other.mVisibleLayerIDs
&& mPerLayerCheckedLegendSymbols == other.mPerLayerCheckedLegendSymbols
&& mPerLayerCurrentStyle == other.mPerLayerCurrentStyle;
}
bool operator!=( const PresetRecord& other ) const
{
Expand All @@ -52,6 +54,8 @@ class QgsVisibilityPresets : public QObject
QSet<QString> mVisibleLayerIDs;
//! For layers that have checkable legend symbols and not all symbols are checked - list which ones are
QMap<QString, QSet<QString> > mPerLayerCheckedLegendSymbols;
//! For layers that use multiple styles - which one is currently selected
QMap<QString, QString> mPerLayerCurrentStyle;
} PresetRecord;


Expand Down Expand Up @@ -107,6 +111,7 @@ class QgsVisibilityPresets : public QObject
void addVisibleLayersToPreset( QgsLayerTreeGroup* parent, PresetRecord& rec );
void applyStateToLayerTreeGroup( QgsLayerTreeGroup* parent, const PresetRecord& rec );
void addPerLayerCheckedLegendSymbols( PresetRecord& rec );
void addPerLayerCurrentStyle( PresetRecord& rec );

PresetRecord currentState();
void applyState( const QString& presetName );
Expand Down

0 comments on commit 803e822

Please sign in to comment.