diff --git a/python/core/auto_generated/qgsmaplayer.sip.in b/python/core/auto_generated/qgsmaplayer.sip.in index 9cbf06a7762..de1bc4967c2 100644 --- a/python/core/auto_generated/qgsmaplayer.sip.in +++ b/python/core/auto_generated/qgsmaplayer.sip.in @@ -1561,6 +1561,22 @@ It may also contain embedded expressions. this method was only available for vector layers since QGIS 3.0 .. versionadded:: 3.30 +%End + + void setMapTipsEnabled( bool enabled ); +%Docstring +Enable or disable map tips for this layer + +:param enabled: Whether map tips are enabled for this layer + +.. versionadded:: 3.32 +%End + + bool mapTipsEnabled() const; +%Docstring +Returns true if map tips are enabled for this layer + +.. versionadded:: 3.32 %End public slots: @@ -1912,6 +1928,15 @@ Emitted when the map tip template changes this method was only available for vector layers since QGIS 3.0 .. versionadded:: 3.30 +%End + + void mapTipsEnabledChanged(); +%Docstring +Emitted when map tips are enabled or disabled for the layer. + +.. seealso:: :py:func:`setMapTipsEnabled` + +.. versionadded:: 3.32 %End protected: diff --git a/src/core/qgsmaplayer.cpp b/src/core/qgsmaplayer.cpp index 8cac4922fd3..1c6c8b184dc 100644 --- a/src/core/qgsmaplayer.cpp +++ b/src/core/qgsmaplayer.cpp @@ -912,6 +912,24 @@ void QgsMapLayer::setMapTipTemplate( const QString &mapTip ) emit mapTipTemplateChanged(); } +void QgsMapLayer::setMapTipsEnabled( bool enabled ) +{ + QGIS_PROTECT_QOBJECT_THREAD_ACCESS + + if ( mMapTipsEnabled == enabled ) + return; + + mMapTipsEnabled = enabled; + emit mapTipsEnabledChanged(); +} + +bool QgsMapLayer::mapTipsEnabled() const +{ + QGIS_PROTECT_QOBJECT_THREAD_ACCESS + + return mMapTipsEnabled; +} + bool QgsMapLayer::isValid() const { // because QgsVirtualLayerProvider is not anywhere NEAR thread safe: @@ -2479,7 +2497,7 @@ bool QgsMapLayer::hasMapTips() const { QGIS_PROTECT_QOBJECT_THREAD_ACCESS - return !mMapTipTemplate.isEmpty(); + return mapTipsEnabled() && !mMapTipTemplate.isEmpty(); } void QgsMapLayer::setProviderType( const QString &providerType ) diff --git a/src/core/qgsmaplayer.h b/src/core/qgsmaplayer.h index b16cc92940c..e91d697b26c 100644 --- a/src/core/qgsmaplayer.h +++ b/src/core/qgsmaplayer.h @@ -81,6 +81,7 @@ class CORE_EXPORT QgsMapLayer : public QObject Q_PROPERTY( bool isValid READ isValid NOTIFY isValidChanged ) Q_PROPERTY( double opacity READ opacity WRITE setOpacity NOTIFY opacityChanged ) Q_PROPERTY( QString mapTipTemplate READ mapTipTemplate WRITE setMapTipTemplate NOTIFY mapTipTemplateChanged ) + Q_PROPERTY( bool mapTipsEnabled READ mapTipsEnabled WRITE setMapTipsEnabled NOTIFY mapTipsEnabledChanged ) #ifdef SIP_RUN SIP_CONVERT_TO_SUBCLASS_CODE @@ -1571,6 +1572,20 @@ class CORE_EXPORT QgsMapLayer : public QObject */ void setMapTipTemplate( const QString &mapTipTemplate ); + /** + * Enable or disable map tips for this layer + * + * \param enabled Whether map tips are enabled for this layer + * \since QGIS 3.32 + */ + void setMapTipsEnabled( bool enabled ); + + /** + * Returns true if map tips are enabled for this layer + * \since QGIS 3.32 + */ + bool mapTipsEnabled() const; + public slots: /** @@ -1863,6 +1878,14 @@ class CORE_EXPORT QgsMapLayer : public QObject */ void mapTipTemplateChanged(); + /** + * Emitted when map tips are enabled or disabled for the layer. + * + * \see setMapTipsEnabled() + * \since QGIS 3.32 + */ + void mapTipsEnabledChanged(); + private slots: void onNotified( const QString &message ); @@ -2186,6 +2209,9 @@ class CORE_EXPORT QgsMapLayer : public QObject //! Maptip template QString mMapTipTemplate; + //! Flag indicating whether map tips are enabled for this layer or not + bool mMapTipsEnabled = true; + friend class QgsVectorLayer; friend class TestQgsMapLayer; }; diff --git a/src/core/raster/qgsrasterlayer.cpp b/src/core/raster/qgsrasterlayer.cpp index 150d4f1308f..af195ec14ff 100644 --- a/src/core/raster/qgsrasterlayer.cpp +++ b/src/core/raster/qgsrasterlayer.cpp @@ -173,6 +173,7 @@ QgsRasterLayer *QgsRasterLayer::clone() const layer->mElevationProperties = mElevationProperties->clone(); layer->mElevationProperties->setParent( layer ); layer->setMapTipTemplate( mapTipTemplate() ); + layer->setMapTipsEnabled( mapTipsEnabled() ); // do not clone data provider which is the first element in pipe for ( int i = 1; i < mPipe->size(); i++ ) @@ -2262,7 +2263,11 @@ bool QgsRasterLayer::readSymbology( const QDomNode &layer_node, QString &errorMe mPipe->dataDefinedProperties().readXml( elemDataDefinedProperties, QgsRasterPipe::propertyDefinitions() ); if ( categories.testFlag( MapTips ) ) - setMapTipTemplate( layer_node.namedItem( QStringLiteral( "mapTip" ) ).toElement().text() ); + { + QDomElement mapTipElem = layer_node.namedItem( QStringLiteral( "mapTip" ) ).toElement(); + setMapTipTemplate( mapTipElem.text() ); + setMapTipsEnabled( mapTipElem.attribute( QStringLiteral( "enabled" ), QStringLiteral( "1" ) ).toInt() == 1 ); + } readCustomProperties( layer_node ); @@ -2474,6 +2479,7 @@ bool QgsRasterLayer::writeSymbology( QDomNode &layer_node, QDomDocument &documen if ( categories.testFlag( MapTips ) ) { QDomElement mapTipElem = document.createElement( QStringLiteral( "mapTip" ) ); + mapTipElem.setAttribute( QStringLiteral( "enabled" ), mapTipsEnabled() ); QDomText mapTipText = document.createTextNode( mapTipTemplate() ); mapTipElem.appendChild( mapTipText ); layer_node.toElement().appendChild( mapTipElem ); diff --git a/src/core/vector/qgsvectorlayer.cpp b/src/core/vector/qgsvectorlayer.cpp index 9959775988a..561f37247d8 100644 --- a/src/core/vector/qgsvectorlayer.cpp +++ b/src/core/vector/qgsvectorlayer.cpp @@ -310,6 +310,7 @@ QgsVectorLayer *QgsVectorLayer::clone() const layer->setProviderEncoding( mDataProvider->encoding() ); layer->setDisplayExpression( displayExpression() ); layer->setMapTipTemplate( mapTipTemplate() ); + layer->setMapTipsEnabled( mapTipsEnabled() ); layer->setReadOnly( isReadOnly() ); layer->selectByIds( selectedFeatureIds() ); layer->setAttributeTableConfig( attributeTableConfig() ); @@ -2313,7 +2314,11 @@ bool QgsVectorLayer::readSymbology( const QDomNode &layerNode, QString &errorMes readStyle( layerNode, errorMessage, context, categories ); if ( categories.testFlag( MapTips ) ) - mMapTipTemplate = layerNode.namedItem( QStringLiteral( "mapTip" ) ).toElement().text(); + { + QDomElement mapTipElem = layerNode.namedItem( QStringLiteral( "mapTip" ) ).toElement(); + setMapTipTemplate( mapTipElem.text() ); + setMapTipsEnabled( mapTipElem.attribute( QStringLiteral( "enabled" ), QStringLiteral( "1" ) ).toInt() == 1 ); + } if ( categories.testFlag( LayerConfiguration ) ) mDisplayExpression = layerNode.namedItem( QStringLiteral( "previewExpression" ) ).toElement().text(); @@ -2994,6 +2999,7 @@ bool QgsVectorLayer::writeSymbology( QDomNode &node, QDomDocument &doc, QString if ( categories.testFlag( MapTips ) ) { QDomElement mapTipElem = doc.createElement( QStringLiteral( "mapTip" ) ); + mapTipElem.setAttribute( QStringLiteral( "enabled" ), mapTipsEnabled() ); QDomText mapTipText = doc.createTextNode( mMapTipTemplate ); mapTipElem.appendChild( mapTipText ); node.toElement().appendChild( mapTipElem ); @@ -3952,7 +3958,7 @@ bool QgsVectorLayer::hasMapTips() const QGIS_PROTECT_QOBJECT_THREAD_ACCESS // display expressions are used as a fallback when no explicit map tip template is set - return !mapTipTemplate().isEmpty() || !displayExpression().isEmpty(); + return mapTipsEnabled() && ( !mapTipTemplate().isEmpty() || !displayExpression().isEmpty() ); } bool QgsVectorLayer::isEditable() const diff --git a/src/gui/qgsmaptip.cpp b/src/gui/qgsmaptip.cpp index 738fc28398c..5cc1f6b3e25 100644 --- a/src/gui/qgsmaptip.cpp +++ b/src/gui/qgsmaptip.cpp @@ -280,7 +280,7 @@ void QgsMapTip::clear( QgsMapCanvas *, int msDelay ) QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPointXY &mapPosition, QgsMapCanvas *mapCanvas ) { QgsVectorLayer *vlayer = qobject_cast( layer ); - if ( !vlayer || !vlayer->isSpatial() ) + if ( !vlayer || !vlayer->isSpatial() || !vlayer->mapTipsEnabled() ) { return QString(); } @@ -389,7 +389,7 @@ QString QgsMapTip::fetchFeature( QgsMapLayer *layer, QgsPointXY &mapPosition, Qg QString QgsMapTip::fetchRaster( QgsMapLayer *layer, QgsPointXY &mapPosition, QgsMapCanvas *mapCanvas ) { QgsRasterLayer *rlayer = qobject_cast( layer ); - if ( !rlayer ) + if ( !rlayer || !rlayer->mapTipsEnabled() ) { return QString(); } diff --git a/src/gui/raster/qgsrasterlayerproperties.cpp b/src/gui/raster/qgsrasterlayerproperties.cpp index 4480df15272..b30faa81075 100644 --- a/src/gui/raster/qgsrasterlayerproperties.cpp +++ b/src/gui/raster/qgsrasterlayerproperties.cpp @@ -234,6 +234,9 @@ QgsRasterLayerProperties::QgsRasterLayerProperties( QgsMapLayer *lyr, QgsMapCanv return; } + connect( mEnableMapTips, &QAbstractButton::toggled, mHtmlMapTipGroupBox, &QWidget::setEnabled ); + mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() ); + updateRasterAttributeTableOptionsPage(); connect( mRasterLayer, &QgsRasterLayer::rendererChanged, this, &QgsRasterLayerProperties::updateRasterAttributeTableOptionsPage ); @@ -867,6 +870,7 @@ void QgsRasterLayerProperties::sync() mLayerLegendUrlLineEdit->setText( mRasterLayer->legendUrl() ); mLayerLegendUrlFormatComboBox->setCurrentIndex( mLayerLegendUrlFormatComboBox->findText( mRasterLayer->legendUrlFormat() ) ); + mEnableMapTips->setChecked( mRasterLayer->mapTipsEnabled() ); mMapTipWidget->setText( mRasterLayer->mapTipTemplate() ); //WMS print layer @@ -1126,6 +1130,7 @@ void QgsRasterLayerProperties::apply() mRasterLayer->pipe()->setDataDefinedProperties( mPropertyCollection ); + mRasterLayer->setMapTipsEnabled( mEnableMapTips->isChecked() ); mRasterLayer->setMapTipTemplate( mMapTipWidget->text() ); // Force a redraw of the legend diff --git a/src/gui/vector/qgsvectorlayerproperties.cpp b/src/gui/vector/qgsvectorlayerproperties.cpp index c180e12b83d..55c9245df76 100644 --- a/src/gui/vector/qgsvectorlayerproperties.cpp +++ b/src/gui/vector/qgsvectorlayerproperties.cpp @@ -175,6 +175,9 @@ QgsVectorLayerProperties::QgsVectorLayerProperties( if ( !mLayer ) return; + connect( mEnableMapTips, &QAbstractButton::toggled, mHtmlMapTipGroupBox, &QWidget::setEnabled ); + mEnableMapTips->setChecked( mLayer->mapTipsEnabled() ); + QVBoxLayout *layout = nullptr; if ( mLayer->isSpatial() ) @@ -557,8 +560,9 @@ void QgsVectorLayerProperties::syncToLayer() txtSubsetSQL->setCaretLineVisible( false ); setPbnQueryBuilderEnabled(); - mMapTipWidget->setText( mLayer->mapTipTemplate() ); mDisplayExpressionWidget->setField( mLayer->displayExpression() ); + mEnableMapTips->setChecked( mLayer->mapTipsEnabled() ); + mMapTipWidget->setText( mLayer->mapTipTemplate() ); // set up the scale based layer visibility stuff.... mScaleRangeWidget->setScaleRange( mLayer->minimumScale(), mLayer->maximumScale() ); @@ -718,6 +722,7 @@ void QgsVectorLayerProperties::apply() } mLayer->setDisplayExpression( mDisplayExpressionWidget->asExpression() ); + mLayer->setMapTipsEnabled( mEnableMapTips->isChecked() ); mLayer->setMapTipTemplate( mMapTipWidget->text() ); mLayer->actions()->clearActions(); diff --git a/src/ui/qgsrasterlayerpropertiesbase.ui b/src/ui/qgsrasterlayerpropertiesbase.ui index 1047fad12f0..272e1f33e32 100644 --- a/src/ui/qgsrasterlayerpropertiesbase.ui +++ b/src/ui/qgsrasterlayerpropertiesbase.ui @@ -1477,7 +1477,20 @@ p, li { white-space: pre-wrap; } 0 - + + + Indicates whether map tips are displayed for this layer or not + + + Enable map tips + + + true + + + + + 0 diff --git a/src/ui/qgsvectorlayerpropertiesbase.ui b/src/ui/qgsvectorlayerpropertiesbase.ui index a9966f9c01d..620a3043442 100644 --- a/src/ui/qgsvectorlayerpropertiesbase.ui +++ b/src/ui/qgsvectorlayerpropertiesbase.ui @@ -1449,7 +1449,20 @@ - + + + Indicates whether map tips are displayed for this layer or not + + + Enable map tips + + + true + + + + + 0