Skip to content

Commit 503d32b

Browse files
committed
Merge pull request #894 from sbrunner/legend-scale
Use scale parameter to display concerned class
2 parents 7e171ef + 9494365 commit 503d32b

File tree

9 files changed

+60
-43
lines changed

9 files changed

+60
-43
lines changed

src/core/composer/qgscomposerlegenditem.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ void QgsComposerLayerItem::readXML( const QDomElement& itemElem, bool xServerAva
286286
}
287287
}
288288

289-
void QgsComposerLayerItem::setDefaultStyle()
289+
void QgsComposerLayerItem::setDefaultStyle( double scaleDenominator )
290290
{
291291
// set default style according to number of symbols
292292
QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerID() ) );
@@ -295,7 +295,7 @@ void QgsComposerLayerItem::setDefaultStyle()
295295
QgsFeatureRendererV2* renderer = vLayer->rendererV2();
296296
if ( renderer )
297297
{
298-
QPair<QString, QgsSymbolV2*> symbolItem = renderer->legendSymbolItems().value( 0 );
298+
QPair<QString, QgsSymbolV2*> symbolItem = renderer->legendSymbolItems( scaleDenominator ).value( 0 );
299299
if ( renderer->legendSymbolItems().size() > 1 || !symbolItem.first.isEmpty() )
300300
{
301301
setStyle( QgsComposerLegendStyle::Subgroup );

src/core/composer/qgscomposerlegenditem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ class CORE_EXPORT QgsComposerLayerItem : public QgsComposerLegendItem
138138
void setShowFeatureCount( bool show ) { mShowFeatureCount = show; }
139139
bool showFeatureCount() const { return mShowFeatureCount; }
140140

141-
void setDefaultStyle();
141+
void setDefaultStyle( double scaleDenominator=-1 );
142142

143143
private:
144144
QString mLayerID;

src/core/composer/qgslegendmodel.cpp

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ void QgsLegendModel::setLayerSetAndGroups( const QStringList& layerIds, const QL
9898
}
9999
}
100100

101-
void QgsLegendModel::setLayerSet( const QStringList& layerIds )
101+
void QgsLegendModel::setLayerSet( const QStringList& layerIds, double scaleDenominator )
102102
{
103103
mLayerIds = layerIds;
104104

@@ -111,7 +111,7 @@ void QgsLegendModel::setLayerSet( const QStringList& layerIds )
111111
for ( ; idIter != mLayerIds.constEnd(); ++idIter )
112112
{
113113
currentLayer = QgsMapLayerRegistry::instance()->mapLayer( *idIter );
114-
addLayer( currentLayer );
114+
addLayer( currentLayer, scaleDenominator );
115115
}
116116
}
117117

@@ -135,7 +135,7 @@ QStandardItem* QgsLegendModel::addGroup( QString text, int position )
135135
return groupItem;
136136
}
137137

138-
int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer )
138+
int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer, double scaleDenominator )
139139
{
140140
QgsComposerLayerItem* lItem = dynamic_cast<QgsComposerLayerItem*>( layerItem );
141141

@@ -158,42 +158,55 @@ int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLa
158158
}
159159
}
160160

161-
QgsLegendSymbolList lst = renderer->legendSymbolItems();
161+
QgsLegendSymbolList lst = renderer->legendSymbolItems( scaleDenominator );
162162
QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin();
163163
int row = 0;
164164
for ( ; symbolIt != lst.constEnd(); ++symbolIt )
165165
{
166-
QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( "" );
167-
168-
// Get userText from old item if exists
169-
QgsComposerSymbolV2Item* oldSymbolItem = dynamic_cast<QgsComposerSymbolV2Item*>( layerItem->child( row, 0 ) );
170-
if ( oldSymbolItem )
166+
if ( scaleDenominator == -1 )
171167
{
172-
currentSymbolItem->setUserText( oldSymbolItem->userText() );
168+
QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( "" );
173169

174-
}
170+
// Get userText from old item if exists
171+
QgsComposerSymbolV2Item* oldSymbolItem = dynamic_cast<QgsComposerSymbolV2Item*>( layerItem->child( row, 0 ) );
172+
if ( oldSymbolItem )
173+
{
174+
currentSymbolItem->setUserText( oldSymbolItem->userText() );
175+
}
175176

176-
currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
177-
if ( symbolIt->second )
178-
{
179-
if ( mHasTopLevelWindow ) //only use QIcon / QPixmap if we have a running x-server
177+
currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
178+
if ( symbolIt->second )
180179
{
181-
currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) );
180+
if ( mHasTopLevelWindow ) //only use QIcon / QPixmap if we have a running x-server
181+
{
182+
currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) );
183+
}
184+
currentSymbolItem->setSymbolV2( symbolIt->second->clone() );
182185
}
183-
currentSymbolItem->setSymbolV2( symbolIt->second->clone() );
184-
}
185-
layerItem->setChild( row, 0, currentSymbolItem );
186+
layerItem->setChild( row, 0, currentSymbolItem );
186187

187-
// updateSymbolV2ItemText needs layer set
188-
updateSymbolV2ItemText( currentSymbolItem );
188+
// updateSymbolV2ItemText needs layer set
189+
updateSymbolV2ItemText( currentSymbolItem );
189190

190-
row++;
191+
row++;
192+
}
193+
else
194+
{
195+
QgsComposerSymbolV2Item* currentSymbolItem = new QgsComposerSymbolV2Item( "" );
196+
currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) );
197+
currentSymbolItem->setSymbolV2( symbolIt->second );
198+
layerItem->setChild( 0, 0, currentSymbolItem );
199+
currentSymbolItem->setText( symbolIt->first );
200+
}
191201
}
192202

193-
// Delete following old items (if current number of items decreased)
194-
for ( int i = layerItem->rowCount() - 1; i >= row; --i )
203+
if ( scaleDenominator == -1 )
195204
{
196-
layerItem->removeRow( i );
205+
// Delete following old items (if current number of items decreased)
206+
for ( int i = layerItem->rowCount() - 1; i >= row; --i )
207+
{
208+
layerItem->removeRow( i );
209+
}
197210
}
198211

199212
return 0;
@@ -454,7 +467,7 @@ void QgsLegendModel::removeLayer( const QString& layerId )
454467
}
455468
}
456469

457-
void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer )
470+
void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer, double scaleDenominator )
458471
{
459472
if ( !theMapLayer )
460473
{
@@ -468,7 +481,7 @@ void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer )
468481
layerItem->setUserText( theMapLayer->title() );
469482
}
470483
layerItem->setLayerID( theMapLayer->id() );
471-
layerItem->setDefaultStyle();
484+
layerItem->setDefaultStyle( scaleDenominator );
472485
layerItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
473486

474487
QList<QStandardItem *> itemsList;
@@ -482,7 +495,7 @@ void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer )
482495
QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( theMapLayer );
483496
if ( vl )
484497
{
485-
addVectorLayerItemsV2( layerItem, vl );
498+
addVectorLayerItemsV2( layerItem, vl, scaleDenominator );
486499
}
487500
break;
488501
}

src/core/composer/qgslegendmodel.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class CORE_EXPORT QgsLegendModel: public QStandardItemModel
5454

5555
/**Sets layer set and groups*/
5656
void setLayerSetAndGroups( const QStringList& layerIds, const QList< GroupLayerInfo >& groupInfo );
57-
void setLayerSet( const QStringList& layerIds );
57+
void setLayerSet( const QStringList& layerIds, double scaleDenominator=-1 );
5858
/**Adds a group
5959
@param text name of group (defaults to translation of "Group")
6060
@param position insertion position (toplevel position (or -1 if it should be placed at the end of the legend).
@@ -97,14 +97,14 @@ class CORE_EXPORT QgsLegendModel: public QStandardItemModel
9797

9898
public slots:
9999
void removeLayer( const QString& layerId );
100-
void addLayer( QgsMapLayer* theMapLayer );
100+
void addLayer( QgsMapLayer* theMapLayer, double scaleDenominator=-1 );
101101

102102
signals:
103103
void layersChanged();
104104

105105
private:
106106
/**Adds classification items of vector layers using new symbology*/
107-
int addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer );
107+
int addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer, double scaleDenominator=-1 );
108108

109109
/**Adds item of raster layer
110110
@return 0 in case of success*/

src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems( QSize iconSiz
507507
return QgsLegendSymbologyList();
508508
}
509509

510-
QgsLegendSymbolList QgsFeatureRendererV2::legendSymbolItems()
510+
QgsLegendSymbolList QgsFeatureRendererV2::legendSymbolItems( double scaleDenominator )
511511
{
512512
return QgsLegendSymbolList();
513513
}

src/core/symbology-ng/qgsrendererv2.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ class CORE_EXPORT QgsFeatureRendererV2
149149
//! return a list of item text / symbol
150150
//! @note: this method was added in version 1.5
151151
//! @note: not available in python bindings
152-
virtual QgsLegendSymbolList legendSymbolItems();
152+
virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator=-1 );
153153

154154
//! set type and size of editing vertex markers for subsequent rendering
155155
void setVertexMarkerAppearance( int type, int size );

src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ void QgsRuleBasedRendererV2::Rule::setSymbol( QgsSymbolV2* sym )
175175
mSymbol = sym;
176176
}
177177

178-
QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems()
178+
QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems( double scaleDenominator )
179179
{
180180
QgsLegendSymbolList lst;
181181
if ( mSymbol )
@@ -184,7 +184,11 @@ QgsLegendSymbolList QgsRuleBasedRendererV2::Rule::legendSymbolItems()
184184
for ( RuleList::iterator it = mChildren.begin(); it != mChildren.end(); ++it )
185185
{
186186
Rule* rule = *it;
187-
lst << rule->legendSymbolItems();
187+
if ( scaleDenominator == -1 || (
188+
( rule->mScaleMinDenom == -1 || rule->mScaleMinDenom < scaleDenominator ) &&
189+
( rule->mScaleMaxDenom == -1 || scaleDenominator < rule->mScaleMaxDenom ) ) ) {
190+
lst << rule->legendSymbolItems( scaleDenominator );
191+
}
188192
}
189193
return lst;
190194
}
@@ -844,9 +848,9 @@ QgsLegendSymbologyList QgsRuleBasedRendererV2::legendSymbologyItems( QSize iconS
844848
return lst;
845849
}
846850

847-
QgsLegendSymbolList QgsRuleBasedRendererV2::legendSymbolItems()
851+
QgsLegendSymbolList QgsRuleBasedRendererV2::legendSymbolItems( double scaleDenominator )
848852
{
849-
return mRootRule->legendSymbolItems();
853+
return mRootRule->legendSymbolItems( scaleDenominator );
850854
}
851855

852856

src/core/symbology-ng/qgsrulebasedrendererv2.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
9393
QSet<QString> usedAttributes();
9494
QgsSymbolV2List symbols();
9595
//! @note not available in python bindings
96-
QgsLegendSymbolList legendSymbolItems();
96+
QgsLegendSymbolList legendSymbolItems( double scaleDenominator=-1 );
9797
bool isFilterOK( QgsFeature& f ) const;
9898
bool isScaleOK( double scale ) const;
9999

@@ -226,7 +226,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
226226
//! return a list of item text / symbol
227227
//! @note: this method was added in version 1.5
228228
//! @note not available in python bindings
229-
virtual QgsLegendSymbolList legendSymbolItems();
229+
virtual QgsLegendSymbolList legendSymbolItems( double scaleDenominator=-1 );
230230

231231
//! for debugging
232232
virtual QString dump() const;

src/mapserver/qgswmsserver.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ QImage* QgsWMSServer::getLegendGraphics()
334334
}
335335

336336
QgsLegendModel legendModel;
337-
legendModel.setLayerSet( layerIds );
337+
legendModel.setLayerSet( layerIds, scaleDenominator );
338338

339339
//create first image (to find out dpi)
340340
QImage* theImage = createImage( 10, 10 );

0 commit comments

Comments
 (0)