Skip to content

Commit c68b573

Browse files
committed
Add eyelid to quickly enable or disable a symbol layer in the layer styling panel
The eyelid icon is only available if the layer is not driven by a data defined properties
1 parent 621ced7 commit c68b573

5 files changed

Lines changed: 110 additions & 5 deletions

File tree

‎python/PyQt6/gui/auto_generated/symbology/qgssymbolselectordialog.sip.in‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ Emitted when the symbol defined in the dialog is modified.
259259

260260
};
261261

262+
262263
/************************************************************************
263264
* This file has been generated automatically from *
264265
* *

‎src/gui/symbology/qgssymbollayermodel.cpp‎

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,11 +249,17 @@ QVariant QgsSymbolLayerModel::data( const QModelIndex &index, int role ) const
249249
if ( !index.isValid() )
250250
return QVariant();
251251

252-
QgsSymbolLayerModelNode *node = index2node( index );
253-
if ( !node )
254-
return QVariant();
255252

256-
return node->data( role );
253+
if ( index.column() == NameColumn )
254+
{
255+
QgsSymbolLayerModelNode *node = index2node( index );
256+
if ( !node )
257+
return QVariant();
258+
259+
return node->data( role );
260+
}
261+
262+
return QVariant();
257263
};
258264

259265
int QgsSymbolLayerModel::rowCount( const QModelIndex &parent ) const
@@ -267,7 +273,7 @@ int QgsSymbolLayerModel::rowCount( const QModelIndex &parent ) const
267273

268274
int QgsSymbolLayerModel::columnCount( const QModelIndex & ) const
269275
{
270-
return 1;
276+
return 2;
271277
};
272278

273279
QModelIndex QgsSymbolLayerModel::index( int row, int column, const QModelIndex &parent ) const

‎src/gui/symbology/qgssymbollayermodel.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,12 @@ class GUI_EXPORT QgsSymbolLayerModel : public QAbstractItemModel
244244
//! Returns the root node of the model.
245245
QgsSymbolLayerModelNode *rootNode() const { return mRootNode.get(); }
246246

247+
//! Columns in the model.
248+
enum Columns
249+
{
250+
NameColumn = 0,
251+
EyelidColumn
252+
};
247253

248254
private:
249255
QModelIndex indexOfParentTreeNode( QgsSymbolLayerModelNode *parentNode ) const;

‎src/gui/symbology/qgssymbolselectordialog.cpp‎

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,43 @@ void DataDefinedRestorer::restore()
115115
save();
116116
}
117117

118+
EyelidLayerDelegate::EyelidLayerDelegate( QTreeView *parent )
119+
: QStyledItemDelegate( parent )
120+
, mLayersTree( parent )
121+
{}
122+
123+
void EyelidLayerDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
124+
{
125+
QStyledItemDelegate::paint( painter, option, index );
126+
127+
128+
QgsSymbolLayerModel *symbolLayerModel = static_cast<QgsSymbolLayerModel *>( mLayersTree->model() );
129+
130+
QgsSymbolLayerModelNode *node = symbolLayerModel->index2node( index );
131+
132+
if ( !node || !node->isLayer() )
133+
return;
134+
135+
QgsSymbolLayer *symbolLayer = node->layer();
136+
137+
QIcon icon;
138+
if ( symbolLayer->dataDefinedProperties().isActive( QgsSymbolLayer::Property::LayerEnabled ) )
139+
{
140+
icon = QgsApplication::getThemeIcon( "/mIconDataDefineExpressionOn.svg" );
141+
}
142+
else if ( symbolLayer->enabled() )
143+
{
144+
icon = QgsApplication::getThemeIcon( "/mActionShowAllLayers.svg" );
145+
}
146+
else
147+
{
148+
icon = QgsApplication::getThemeIcon( "/mActionHideAllLayers.svg" );
149+
}
150+
151+
const QRect iconRect( option.rect.left() + ( option.rect.width() - 16 ) / 2, option.rect.top() + ( option.rect.height() - 16 ) / 2, 16, 16 );
152+
icon.paint( painter, iconRect );
153+
}
154+
118155
///@endcond
119156

120157
//////////
@@ -183,6 +220,15 @@ QgsSymbolSelectorWidget::QgsSymbolSelectorWidget( QgsSymbol *symbol, QgsStyle *s
183220
layersTree->setModel( mSymbolLayersModel );
184221
layersTree->setHeaderHidden( true );
185222

223+
layersTree->header()->setSectionResizeMode( QgsSymbolLayerModel::NameColumn, QHeaderView::Stretch );
224+
layersTree->header()->setMinimumSectionSize( 10 );
225+
layersTree->header()->setStretchLastSection( false );
226+
layersTree->header()->resizeSection( QgsSymbolLayerModel::EyelidColumn, 20 );
227+
228+
EyelidLayerDelegate *eyeDelegate = new EyelidLayerDelegate( layersTree );
229+
layersTree->setItemDelegateForColumn( QgsSymbolLayerModel::EyelidColumn, eyeDelegate );
230+
connect( layersTree, &QTreeView::clicked, this, &QgsSymbolSelectorWidget::eyelidClicked );
231+
186232
//get first feature from layer for previews
187233
if ( mVectorLayer )
188234
{
@@ -476,6 +522,35 @@ void QgsSymbolSelectorWidget::symbolChanged()
476522
connect( layersTree->selectionModel(), &QItemSelectionModel::currentChanged, this, &QgsSymbolSelectorWidget::layerChanged );
477523
}
478524

525+
void QgsSymbolSelectorWidget::eyelidClicked( const QModelIndex &index )
526+
{
527+
if ( index.column() == QgsSymbolLayerModel::EyelidColumn )
528+
{
529+
QgsSymbolLayerModel *symbolLayerModel = static_cast<QgsSymbolLayerModel *>( layersTree->model() );
530+
QgsSymbolLayerModelNode *node = symbolLayerModel->index2node( index );
531+
532+
if ( !node )
533+
return;
534+
535+
if ( !node->isLayer() )
536+
return;
537+
538+
QgsSymbolLayer *symbolLayer = node->layer();
539+
if ( symbolLayer->dataDefinedProperties().isActive( QgsSymbolLayer::Property::LayerEnabled ) )
540+
{
541+
return;
542+
}
543+
544+
symbolLayer->setEnabled( !symbolLayer->enabled() );
545+
546+
updatePreview();
547+
updateUi();
548+
updateLayerPreview();
549+
layerChanged();
550+
emit symbolModified();
551+
}
552+
}
553+
479554
void QgsSymbolSelectorWidget::setWidget( QWidget *widget )
480555
{
481556
const int index = stackedWidget->addWidget( widget );

‎src/gui/symbology/qgssymbolselectordialog.h‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <QDialogButtonBox>
3030
#include <QPointer>
3131
#include <QStandardItemModel>
32+
#include <QStyledItemDelegate>
3233

3334
class QgsStyle;
3435
class QgsSymbol;
@@ -76,6 +77,20 @@ class DataDefinedRestorer : public QObject
7677

7778
void save();
7879
};
80+
81+
class EyelidLayerDelegate : public QStyledItemDelegate SIP_SKIP
82+
{
83+
Q_OBJECT
84+
public:
85+
EyelidLayerDelegate( QTreeView *parent );
86+
87+
protected:
88+
void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const override;
89+
90+
private:
91+
QTreeView *mLayersTree;
92+
};
93+
7994
///@endcond
8095
#endif
8196

@@ -264,6 +279,7 @@ class GUI_EXPORT QgsSymbolSelectorWidget : public QgsPanelWidget, private Ui::Qg
264279
* \param widget The widget to set to configure the active symbol layer.
265280
*/
266281
void setWidget( QWidget *widget );
282+
void eyelidClicked( const QModelIndex &index );
267283

268284
QgsStyle *mStyle = nullptr;
269285
QgsSymbol *mSymbol = nullptr;
@@ -402,4 +418,5 @@ class GUI_EXPORT QgsSymbolSelectorDialog : public QDialog
402418
QDialogButtonBox *mButtonBox = nullptr;
403419
};
404420

421+
405422
#endif

0 commit comments

Comments
 (0)