Skip to content

Commit a112dfe

Browse files
author
Patrick Valsecchi
committed
Make out of range layers greyed out in the tree
1 parent 3efc73b commit a112dfe

File tree

3 files changed

+36
-0
lines changed

3 files changed

+36
-0
lines changed

python/core/layertree/qgslayertreemodel.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ class QgsLayerTreeModel : QAbstractItemModel
230230

231231
//! emit dataChanged() for layer tree node items
232232
void recursivelyEmitDataChanged( const QModelIndex& index = QModelIndex() );
233+
void refreshScaleBasedLayers( const QModelIndex& index = QModelIndex() );
233234

234235
static const QIcon& iconGroup();
235236

src/core/layertree/qgslayertreemodel.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,19 @@ QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const
271271
f.setUnderline( true );
272272
return f;
273273
}
274+
else if ( role == Qt::ForegroundRole )
275+
{
276+
QBrush brush( Qt::black, Qt::SolidPattern );
277+
if ( QgsLayerTree::isLayer( node ) )
278+
{
279+
const QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer();
280+
if ( layer && !layer->isInScaleRange( mLegendMapViewScale ) )
281+
{
282+
brush.setColor( Qt::lightGray );
283+
}
284+
}
285+
return brush;
286+
}
274287
else if ( role == Qt::ToolTipRole )
275288
{
276289
if ( QgsLayerTree::isLayer( node ) )
@@ -633,6 +646,8 @@ void QgsLayerTreeModel::setLegendMapViewData( double mapUnitsPerPixel, int dpi,
633646

634647
// now invalidate legend nodes!
635648
legendInvalidateMapBasedData();
649+
650+
refreshScaleBasedLayers();
636651
}
637652

638653
void QgsLayerTreeModel::legendMapViewData( double* mapUnitsPerPixel, int* dpi, double* scale )
@@ -919,6 +934,24 @@ void QgsLayerTreeModel::recursivelyEmitDataChanged( const QModelIndex& idx )
919934
recursivelyEmitDataChanged( index( i, 0, idx ) );
920935
}
921936

937+
void QgsLayerTreeModel::refreshScaleBasedLayers( const QModelIndex& idx )
938+
{
939+
QgsLayerTreeNode* node = index2node( idx );
940+
if ( !node )
941+
return;
942+
943+
if ( node->nodeType() == QgsLayerTreeNode::NodeLayer )
944+
{
945+
const QgsMapLayer* layer = QgsLayerTree::toLayer( node )->layer();
946+
if ( layer->hasScaleBasedVisibility() )
947+
{
948+
emit dataChanged( idx, idx );
949+
}
950+
}
951+
int count = node->children().count();
952+
for ( int i = 0; i < count; ++i )
953+
refreshScaleBasedLayers( index( i, 0, idx ) );
954+
}
922955

923956
Qt::DropActions QgsLayerTreeModel::supportedDropActions() const
924957
{

src/core/layertree/qgslayertreemodel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,8 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
254254

255255
//! emit dataChanged() for layer tree node items
256256
void recursivelyEmitDataChanged( const QModelIndex& index = QModelIndex() );
257+
//! emit dataChanged() for scale dependent layers
258+
void refreshScaleBasedLayers( const QModelIndex& index = QModelIndex() );
257259

258260
static const QIcon& iconGroup();
259261

0 commit comments

Comments
 (0)