diff --git a/images/images.qrc b/images/images.qrc
index be2580e021a..cf0cd27e2c3 100644
--- a/images/images.qrc
+++ b/images/images.qrc
@@ -990,6 +990,10 @@
themes/default/mActionAddTiledSceneLayer.svg
themes/default/mIconTiledScene.svg
themes/default/mIconTiledSceneLayer.svg
+ themes/default/mIconColorUnlocked.svg
+ themes/default/mIconColorLocked.svg
+ themes/default/mIconSelectUnlocked.svg
+ themes/default/mIconSelectLocked.svg
qgis_tips/symbol_levels.png
diff --git a/images/themes/default/mIconColorLocked.svg b/images/themes/default/mIconColorLocked.svg
new file mode 100644
index 00000000000..eddf96f2d1e
--- /dev/null
+++ b/images/themes/default/mIconColorLocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/themes/default/mIconColorUnlocked.svg b/images/themes/default/mIconColorUnlocked.svg
new file mode 100644
index 00000000000..76611506be8
--- /dev/null
+++ b/images/themes/default/mIconColorUnlocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/themes/default/mIconSelectLocked.svg b/images/themes/default/mIconSelectLocked.svg
new file mode 100644
index 00000000000..60a4c44f5de
--- /dev/null
+++ b/images/themes/default/mIconSelectLocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/images/themes/default/mIconSelectUnlocked.svg b/images/themes/default/mIconSelectUnlocked.svg
new file mode 100644
index 00000000000..70be7b9852b
--- /dev/null
+++ b/images/themes/default/mIconSelectUnlocked.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/gui/symbology/qgssymbolselectordialog.cpp b/src/gui/symbology/qgssymbolselectordialog.cpp
index 73b6513cca1..b8c1da44fca 100644
--- a/src/gui/symbology/qgssymbolselectordialog.cpp
+++ b/src/gui/symbology/qgssymbolselectordialog.cpp
@@ -273,7 +273,35 @@ QgsSymbolSelectorWidget::QgsSymbolSelectorWidget( QgsSymbol *symbol, QgsStyle *s
iconLock.addFile( QgsApplication::iconPath( QStringLiteral( "locked.svg" ) ), QSize(), QIcon::Active, QIcon::On );
iconLock.addFile( QgsApplication::iconPath( QStringLiteral( "unlocked.svg" ) ), QSize(), QIcon::Normal, QIcon::Off );
iconLock.addFile( QgsApplication::iconPath( QStringLiteral( "unlocked.svg" ) ), QSize(), QIcon::Active, QIcon::Off );
- btnLock->setIcon( iconLock );
+
+ QIcon iconColorLock;
+ iconColorLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconColorLocked.svg" ) ), QSize(), QIcon::Normal, QIcon::On );
+ iconColorLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconColorLocked.svg" ) ), QSize(), QIcon::Active, QIcon::On );
+ iconColorLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconColorUnlocked.svg" ) ), QSize(), QIcon::Normal, QIcon::Off );
+ iconColorLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconColorUnlocked.svg" ) ), QSize(), QIcon::Active, QIcon::Off );
+
+ mLockColorAction = new QAction( tr( "Lock Color" ), this );
+ mLockColorAction->setToolTip( tr( "Avoid changing the color of the layer when the symbol color is changed" ) );
+ mLockColorAction->setCheckable( true );
+ mLockColorAction->setIcon( iconColorLock );
+
+ QIcon iconSelectLock;
+ iconSelectLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconSelectLocked.svg" ) ), QSize(), QIcon::Normal, QIcon::On );
+ iconSelectLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconSelectLocked.svg" ) ), QSize(), QIcon::Active, QIcon::On );
+ iconSelectLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconSelectUnlocked.svg" ) ), QSize(), QIcon::Normal, QIcon::Off );
+ iconSelectLock.addFile( QgsApplication::iconPath( QStringLiteral( "mIconSelectUnlocked.svg" ) ), QSize(), QIcon::Active, QIcon::Off );
+
+ mLockSelectionColorAction = new QAction( tr( "Lock Color When Selected" ), this );
+ mLockSelectionColorAction->setToolTip( tr( "Avoid changing the color of the layer when a feature is selected" ) );
+ mLockSelectionColorAction->setCheckable( true );
+ mLockSelectionColorAction->setIcon( iconSelectLock );
+
+ QMenu *lockMenu = new QMenu( this );
+ lockMenu->addAction( mLockColorAction );
+ lockMenu->addAction( mLockSelectionColorAction );
+ btnLock->setMenu( lockMenu );
+ btnLock->setPopupMode( QToolButton::InstantPopup );
+
btnDuplicate->setIcon( QIcon( QgsApplication::iconPath( "mActionDuplicateLayer.svg" ) ) );
btnUp->setIcon( QIcon( QgsApplication::iconPath( "mActionArrowUp.svg" ) ) );
btnDown->setIcon( QIcon( QgsApplication::iconPath( "mActionArrowDown.svg" ) ) );
@@ -311,10 +339,24 @@ QgsSymbolSelectorWidget::QgsSymbolSelectorWidget( QgsSymbol *symbol, QgsStyle *s
connect( btnDown, &QAbstractButton::clicked, this, &QgsSymbolSelectorWidget::moveLayerDown );
connect( btnAddLayer, &QAbstractButton::clicked, this, &QgsSymbolSelectorWidget::addLayer );
connect( btnRemoveLayer, &QAbstractButton::clicked, this, &QgsSymbolSelectorWidget::removeLayer );
- connect( btnLock, &QAbstractButton::clicked, this, &QgsSymbolSelectorWidget::lockLayer );
+ connect( mLockColorAction, &QAction::toggled, this, &QgsSymbolSelectorWidget::lockLayer );
+ connect( mLockSelectionColorAction, &QAction::toggled, this, [ = ]( bool checked )
+ {
+ QgsSymbolLayer *layer = currentLayer();
+ if ( !layer )
+ return;
+
+ Qgis::SymbolLayerUserFlags flags = layer->userFlags();
+ flags.setFlag( Qgis::SymbolLayerUserFlag::DisableSelectionRecoloring, checked );
+ layer->setUserFlags( flags );
+ updateLockButtonIcon();
+ emit symbolModified();
+ } );
connect( btnDuplicate, &QAbstractButton::clicked, this, &QgsSymbolSelectorWidget::duplicateLayer );
connect( this, &QgsSymbolSelectorWidget::symbolModified, this, &QgsPanelWidget::widgetChanged );
+ updateLockButtonIcon();
+
updateUi();
// set symbol as active item in the tree
@@ -587,7 +629,22 @@ void QgsSymbolSelectorWidget::updateLockButton()
QgsSymbolLayer *layer = currentLayer();
if ( !layer )
return;
- btnLock->setChecked( layer->isLocked() );
+ mLockColorAction->setChecked( layer->isLocked() );
+ mLockSelectionColorAction->setChecked( layer->userFlags() & Qgis::SymbolLayerUserFlag::DisableSelectionRecoloring );
+
+ updateLockButtonIcon();
+}
+
+void QgsSymbolSelectorWidget::updateLockButtonIcon()
+{
+ if ( mLockColorAction->isChecked() && mLockSelectionColorAction->isChecked() )
+ btnLock->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "locked.svg" ) ) );
+ else if ( mLockColorAction->isChecked() )
+ btnLock->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mIconColorLocked.svg" ) ) );
+ else if ( mLockSelectionColorAction->isChecked() )
+ btnLock->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mIconSelectLocked.svg" ) ) );
+ else
+ btnLock->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "unlocked.svg" ) ) );
}
void QgsSymbolSelectorWidget::addLayer()
@@ -703,7 +760,8 @@ void QgsSymbolSelectorWidget::lockLayer()
QgsSymbolLayer *layer = currentLayer();
if ( !layer )
return;
- layer->setLocked( btnLock->isChecked() );
+ layer->setLocked( mLockColorAction->isChecked() );
+ updateLockButtonIcon();
emit symbolModified();
}
diff --git a/src/gui/symbology/qgssymbolselectordialog.h b/src/gui/symbology/qgssymbolselectordialog.h
index 1f0c130905e..3ca23dc3244 100644
--- a/src/gui/symbology/qgssymbolselectordialog.h
+++ b/src/gui/symbology/qgssymbolselectordialog.h
@@ -234,6 +234,8 @@ class GUI_EXPORT QgsSymbolSelectorWidget: public QgsPanelWidget, private Ui::Qgs
*/
void updateLockButton();
+ void updateLockButtonIcon();
+
SymbolLayerItem *currentLayerItem();
/**
@@ -257,6 +259,8 @@ class GUI_EXPORT QgsSymbolSelectorWidget: public QgsPanelWidget, private Ui::Qgs
QgsStyle *mStyle = nullptr;
QgsSymbol *mSymbol = nullptr;
QMenu *mAdvancedMenu = nullptr;
+ QAction *mLockColorAction = nullptr;
+ QAction *mLockSelectionColorAction = nullptr;
QPointer< QgsVectorLayer > mVectorLayer;
QStandardItemModel *mSymbolLayersModel = nullptr;
diff --git a/src/ui/qgssymbolselectordialogbase.ui b/src/ui/qgssymbolselectordialogbase.ui
index 9ccf28d04f9..ae355446448 100644
--- a/src/ui/qgssymbolselectordialogbase.ui
+++ b/src/ui/qgssymbolselectordialogbase.ui
@@ -75,7 +75,7 @@
4
-
-
+
50
@@ -85,10 +85,13 @@
Add symbol layer
+
+ false
+
-
-
+
50
@@ -98,10 +101,13 @@
Remove symbol layer
+
+ false
+
-
-
+
50
@@ -114,6 +120,9 @@
+
+ false
+
-
@@ -121,15 +130,15 @@
Qt::Vertical
+
+ QSizePolicy::Preferred
+
10
50
-
- QSizePolicy::Preferred
-
@@ -140,7 +149,7 @@
4
-
-
+
50
@@ -150,10 +159,13 @@
Move up
+
+ false
+
-
-
+
50
@@ -163,10 +175,13 @@
Move down
+
+ false
+
-
-
+
50
@@ -179,6 +194,9 @@
true
+
+ false
+
-
@@ -186,15 +204,15 @@
Qt::Vertical
+
+ QSizePolicy::Preferred
+
10
50
-
- QSizePolicy::Preferred
-
@@ -254,8 +272,8 @@
0
0
- 332
- 413
+ 338
+ 442