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