Skip to content

Commit 8dba8af

Browse files
committedSep 1, 2014
Support for custom labels in symbol-v2 legend node
1 parent 89941f6 commit 8dba8af

File tree

5 files changed

+54
-12
lines changed

5 files changed

+54
-12
lines changed
 

‎src/core/layertree/qgslayertreemodellegendnode.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -312,13 +312,13 @@ void QgsSymbolV2LegendNode::updateLabel()
312312

313313
if ( mEmbeddedInParent )
314314
{
315-
mLabel = mParent->layerName();
315+
mLabel = mUserLabel.isEmpty() ? mParent->layerName() : mUserLabel;
316316
if ( showFeatureCount && vl && vl->pendingFeatureCount() >= 0 )
317317
mLabel += QString( " [%1]" ).arg( vl->pendingFeatureCount() );
318318
}
319319
else
320320
{
321-
mLabel = mItem.label();
321+
mLabel = mUserLabel.isEmpty() ? mItem.label() : mUserLabel;
322322
if ( showFeatureCount && vl && mItem.legacyRuleKey() )
323323
mLabel += QString( " [%1]" ).arg( vl->featureCount( mItem.legacyRuleKey() ) );
324324
}
@@ -329,9 +329,10 @@ void QgsSymbolV2LegendNode::updateLabel()
329329
// -------------------------------------------------------------------------
330330

331331

332-
QgsSimpleLegendNode::QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon )
332+
QgsSimpleLegendNode::QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QString& id, const QIcon& icon )
333333
: QgsLayerTreeModelLegendNode( nodeLayer )
334334
, mLabel( label )
335+
, mId( id )
335336
, mIcon( icon )
336337
{
337338
}

‎src/core/layertree/qgslayertreemodellegendnode.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class CORE_EXPORT QgsLayerTreeModelLegendNode : public QObject
4141
/** Return pointer to the parent layer node */
4242
QgsLayerTreeLayer* parent() const { return mParent; }
4343

44+
virtual QString id() const { return QString(); }
45+
4446
/** Return item flags associated with the item. Default implementation returns Qt::ItemIsEnabled. */
4547
virtual Qt::ItemFlags flags() const;
4648

@@ -113,6 +115,8 @@ class CORE_EXPORT QgsSymbolV2LegendNode : public QgsLayerTreeModelLegendNode
113115
QgsSymbolV2LegendNode( QgsLayerTreeLayer* nodeLayer, const QgsLegendSymbolItemV2& item );
114116
~QgsSymbolV2LegendNode();
115117

118+
virtual QString id() const { return mItem.ruleKey(); }
119+
116120
virtual Qt::ItemFlags flags() const;
117121
virtual QVariant data( int role ) const;
118122
virtual bool setData( const QVariant& value, int role );
@@ -123,12 +127,16 @@ class CORE_EXPORT QgsSymbolV2LegendNode : public QgsLayerTreeModelLegendNode
123127

124128
virtual void setEmbeddedInParent( bool embedded );
125129

130+
void setUserLabel( const QString& userLabel ) { mUserLabel = userLabel; }
131+
QString userLabel() const { return mUserLabel; }
132+
126133
private:
127134
void updateLabel();
128135

129136
private:
130137
QgsLegendSymbolItemV2 mItem;
131138
mutable QIcon mIcon; // cached symbol preview
139+
QString mUserLabel;
132140
QString mLabel;
133141
};
134142

@@ -141,12 +149,13 @@ class CORE_EXPORT QgsSymbolV2LegendNode : public QgsLayerTreeModelLegendNode
141149
class CORE_EXPORT QgsSimpleLegendNode : public QgsLayerTreeModelLegendNode
142150
{
143151
public:
144-
QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QIcon& icon = QIcon() );
152+
QgsSimpleLegendNode( QgsLayerTreeLayer* nodeLayer, const QString& label, const QString& id, const QIcon& icon = QIcon() );
145153

146154
virtual QVariant data( int role ) const;
147155

148156
private:
149157
QString mLabel;
158+
QString mId;
150159
QIcon mIcon;
151160
};
152161

‎src/core/qgsmaplayerlegend.cpp

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,15 @@ QList<QgsLayerTreeModelLegendNode*> QgsDefaultVectorLayerLegend::createLayerTree
6969
QSettings settings;
7070
if ( settings.value( "/qgis/showLegendClassifiers", false ).toBool() && !r->legendClassificationAttribute().isEmpty() )
7171
{
72-
nodes.append( new QgsSimpleLegendNode( nodeLayer, r->legendClassificationAttribute() ) );
72+
nodes.append( new QgsSimpleLegendNode( nodeLayer, r->legendClassificationAttribute(), "_class_attribute_" ) );
7373
}
7474

7575
foreach ( const QgsLegendSymbolItemV2& i, r->legendSymbolItemsV2() )
7676
{
77-
nodes.append( new QgsSymbolV2LegendNode( nodeLayer, i ) );
77+
QgsSymbolV2LegendNode* legendNode = new QgsSymbolV2LegendNode( nodeLayer, i );
78+
if ( mUserLabels.contains( i.ruleKey() ) )
79+
legendNode->setUserLabel( mUserLabels[i.ruleKey()] );
80+
nodes.append( legendNode );
7881
}
7982

8083
if ( nodes.count() == 1 && nodes[0]->data( Qt::EditRole ).toString().isEmpty() )
@@ -83,6 +86,25 @@ QList<QgsLayerTreeModelLegendNode*> QgsDefaultVectorLayerLegend::createLayerTree
8386
return nodes;
8487
}
8588

89+
void QgsDefaultVectorLayerLegend::setRuleUserLabel( const QString& ruleKey, const QString& label )
90+
{
91+
if ( label.isEmpty() )
92+
mUserLabels.remove( ruleKey );
93+
else
94+
mUserLabels[ruleKey] = label;
95+
emit itemsChanged();
96+
}
97+
98+
QString QgsDefaultVectorLayerLegend::ruleUserLabel( const QString& ruleKey ) const
99+
{
100+
return mUserLabels.value( ruleKey );
101+
}
102+
103+
QStringList QgsDefaultVectorLayerLegend::rulesWithUserLabel() const
104+
{
105+
return mUserLabels.keys();
106+
}
107+
86108

87109
// -------------------------------------------------------------------------
88110

@@ -125,7 +147,7 @@ QList<QgsLayerTreeModelLegendNode*> QgsDefaultRasterLayerLegend::createLayerTree
125147
if ( count == max_count )
126148
{
127149
QString label = tr( "following %1 items\nnot displayed" ).arg( rasterItemList.size() - max_count );
128-
nodes << new QgsSimpleLegendNode( nodeLayer, label );
150+
nodes << new QgsSimpleLegendNode( nodeLayer, label, "_more_items_" );
129151
break;
130152
}
131153
}
@@ -152,10 +174,11 @@ QList<QgsLayerTreeModelLegendNode*> QgsDefaultPluginLayerLegend::createLayerTree
152174
if ( symbologyList.count() == 0 )
153175
return nodes;
154176

177+
int i = 0;
155178
typedef QPair<QString, QPixmap> XY;
156179
foreach ( XY item, symbologyList )
157180
{
158-
nodes << new QgsSimpleLegendNode( nodeLayer, item.first, QIcon( item.second ) );
181+
nodes << new QgsSimpleLegendNode( nodeLayer, item.first, QString::number( i++ ), QIcon( item.second ) );
159182
}
160183

161184
return nodes;

‎src/core/qgsmaplayerlegend.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class CORE_EXPORT QgsMapLayerLegend : public QObject
6161
void itemsChanged();
6262
};
6363

64+
#include <QHash>
6465

6566
/** Default legend implementation for vector layers
6667
* @note added in 2.6
@@ -72,8 +73,15 @@ class CORE_EXPORT QgsDefaultVectorLayerLegend : public QgsMapLayerLegend
7273

7374
virtual QList<QgsLayerTreeModelLegendNode*> createLayerTreeModelLegendNodes( QgsLayerTreeLayer* nodeLayer );
7475

76+
void setRuleUserLabel( const QString& ruleKey, const QString& label );
77+
78+
QString ruleUserLabel( const QString& ruleKey ) const;
79+
80+
QStringList rulesWithUserLabel() const;
81+
7582
private:
7683
QgsVectorLayer* mLayer;
84+
QHash<QString, QString> mUserLabels;
7785
};
7886

7987

‎tests/src/core/testqgslegendrenderer.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,17 @@ void TestQgsLegendRenderer::testModel()
177177
QVERIFY( lstNodes.count() == 1 );
178178
QCOMPARE( lstNodes[0]->data( Qt::DisplayRole ).toString(), QString( "Line Layer" ) );
179179

180-
#if 0 // TODO: implement custom legend entry labels
180+
QgsDefaultVectorLayerLegend* legendVL1 = dynamic_cast<QgsDefaultVectorLayerLegend*>( mVL1->legend() );
181+
QVERIFY( legendVL1 );
182+
181183
// set user text
182-
mVL1->legend()->setNodeUserText( lstNodes[0].id(), "Hurray" );
184+
legendVL1->setRuleUserLabel( lstNodes[0]->id(), "Hurray" );
183185

184186
QList<QgsLayerTreeModelLegendNode*> lstNodes2 = legendModel.layerLegendNodes( nodeVL1 );
185187
QCOMPARE( lstNodes2[0]->data( Qt::DisplayRole ).toString(), QString( "Hurray" ) );
186188

187189
// reset user text
188-
mVL1->legend()->setNodeUserText( lstNodes2[0].id(), QString() );
189-
#endif
190+
legendVL1->setRuleUserLabel( lstNodes2[0]->id(), QString() );
190191
}
191192

192193

0 commit comments

Comments
 (0)
Please sign in to comment.