mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-15 00:04:00 -04:00
Avoid style dock flashing when editing layers
Also prevent a lot of duplicate style dock updates, and fix the style dock losing connection to layer style changes
This commit is contained in:
parent
df579a57e1
commit
c3c5c43190
@ -618,6 +618,11 @@ class QgsMapLayer : QObject
|
||||
/** Time stamp of data source in the moment when data/metadata were loaded by provider */
|
||||
virtual QDateTime timestamp() const;
|
||||
|
||||
/** Triggers an emission of the styleChanged() signal.
|
||||
* @note added in QGIS 2.16
|
||||
*/
|
||||
void emitStyleChanged();
|
||||
|
||||
signals:
|
||||
|
||||
//! @deprecated in 2.4 - not emitted anymore
|
||||
@ -649,9 +654,19 @@ class QgsMapLayer : QObject
|
||||
/** Signal emitted when the blend mode is changed, through QgsMapLayer::setBlendMode() */
|
||||
void blendModeChanged( QPainter::CompositionMode blendMode );
|
||||
|
||||
/** Signal emitted when renderer is changed */
|
||||
/** Signal emitted when renderer is changed.
|
||||
* @see styleChanged()
|
||||
*/
|
||||
void rendererChanged();
|
||||
|
||||
/** Signal emitted whenever a change affects the layer's style. Ie this may be triggered
|
||||
* by renderer changes, label style changes, or other style changes such as blend
|
||||
* mode or layer opacity changes.
|
||||
* @note added in QGIS 2.16
|
||||
* @see rendererChanged()
|
||||
*/
|
||||
void styleChanged();
|
||||
|
||||
/**
|
||||
* Signal emitted when legend of the layer has changed
|
||||
* @note added in 2.6
|
||||
|
@ -11345,10 +11345,14 @@ void QgisApp::showLayerProperties( QgsMapLayer *ml )
|
||||
vlp->addPropertiesPageFactory( factory );
|
||||
}
|
||||
|
||||
mMapStyleWidget->blockUpdates( true );
|
||||
if ( vlp->exec() )
|
||||
{
|
||||
activateDeactivateLayerRelatedActions( ml );
|
||||
mMapStyleWidget->updateCurrentWidgetLayer();
|
||||
}
|
||||
mMapStyleWidget->blockUpdates( false );
|
||||
|
||||
delete vlp; // delete since dialog cannot be reused without updating code
|
||||
}
|
||||
else if ( ml->type() == QgsMapLayer::PluginLayer )
|
||||
|
@ -511,7 +511,7 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
|
||||
return;
|
||||
|
||||
QString layerId = action->property( "layerId" ).toString();
|
||||
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
|
||||
QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
|
||||
if ( !layer )
|
||||
return;
|
||||
|
||||
@ -545,6 +545,7 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
|
||||
}
|
||||
|
||||
layer->triggerRepaint();
|
||||
layer->emitStyleChanged();
|
||||
mView->refreshLayerSymbology( layer->id() );
|
||||
}
|
||||
|
||||
@ -573,6 +574,10 @@ void QgsAppLayerTreeViewMenuProvider::editSymbolLegendNodeSymbol()
|
||||
if ( dlg.exec() )
|
||||
{
|
||||
node->setSymbol( symbol.take() );
|
||||
if ( vlayer )
|
||||
{
|
||||
vlayer->emitStyleChanged();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -596,4 +601,8 @@ void QgsAppLayerTreeViewMenuProvider::setSymbolLegendNodeColor( const QColor &co
|
||||
QgsSymbolV2* newSymbol = originalSymbol->clone();
|
||||
newSymbol->setColor( color );
|
||||
node->setSymbol( newSymbol );
|
||||
if ( QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) ) )
|
||||
{
|
||||
layer->emitStyleChanged();
|
||||
}
|
||||
}
|
||||
|
@ -95,13 +95,37 @@ void QgsLayerStylingWidget::setPageFactories( QList<QgsLayerStylingPanelFactory
|
||||
mPageFactories.append( mStyleManagerFactory );
|
||||
}
|
||||
|
||||
void QgsLayerStylingWidget::blockUpdates( bool blocked )
|
||||
{
|
||||
if ( !mCurrentLayer )
|
||||
return;
|
||||
|
||||
if ( blocked )
|
||||
{
|
||||
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
}
|
||||
}
|
||||
|
||||
void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
|
||||
{
|
||||
if ( layer == mCurrentLayer )
|
||||
return;
|
||||
|
||||
if ( mCurrentLayer )
|
||||
{
|
||||
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
}
|
||||
|
||||
if ( !layer || !layer->isSpatial() )
|
||||
{
|
||||
mLayerCombo->setLayer( nullptr );
|
||||
mStackedWidget->setCurrentIndex( mNotSupportedPage );
|
||||
mLastStyleXml.clear();
|
||||
mCurrentLayer = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -112,9 +136,10 @@ void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
|
||||
}
|
||||
|
||||
mCurrentLayer = layer;
|
||||
connect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
|
||||
int lastPage = mOptionsListWidget->currentIndex().row();
|
||||
mOptionsListWidget->blockSignals( true );
|
||||
mOptionsListWidget->clear();
|
||||
mUserPages.clear();
|
||||
if ( layer->type() == QgsMapLayer::VectorLayer )
|
||||
@ -140,6 +165,7 @@ void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
|
||||
}
|
||||
}
|
||||
mOptionsListWidget->addItem( new QListWidgetItem( QgsApplication::getThemeIcon( "mActionHistory.svg" ), "" ) );
|
||||
mOptionsListWidget->blockSignals( false );
|
||||
|
||||
if ( sameLayerType )
|
||||
{
|
||||
@ -164,7 +190,7 @@ void QgsLayerStylingWidget::apply()
|
||||
if ( !mCurrentLayer )
|
||||
return;
|
||||
|
||||
disconnect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
|
||||
QString undoName = "Style Change";
|
||||
|
||||
@ -213,7 +239,7 @@ void QgsLayerStylingWidget::apply()
|
||||
mMapCanvas->clearCache();
|
||||
mMapCanvas->refresh();
|
||||
}
|
||||
disconnect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
|
||||
}
|
||||
|
||||
void QgsLayerStylingWidget::autoApply()
|
||||
@ -374,8 +400,7 @@ void QgsLayerStylingWidget::layerAboutToBeRemoved( QgsMapLayer* layer )
|
||||
if ( layer == mCurrentLayer )
|
||||
{
|
||||
mAutoApplyTimer->stop();
|
||||
mStackedWidget->setCurrentIndex( mNotSupportedPage );
|
||||
mCurrentLayer = nullptr;
|
||||
setLayer( nullptr );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -72,6 +72,13 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
|
||||
|
||||
void setPageFactories( QList<QgsLayerStylingPanelFactory*> factories );
|
||||
|
||||
/** Sets whether updates of the styling widget are blocked. This can be called to prevent
|
||||
* the widget being refreshed multiple times when a batch of layer style changes are
|
||||
* about to be applied
|
||||
* @param blocked set to true to block updates, or false to re-allow updates
|
||||
*/
|
||||
void blockUpdates( bool blocked );
|
||||
|
||||
signals:
|
||||
void styleChanged( QgsMapLayer* layer );
|
||||
|
||||
@ -81,9 +88,10 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
|
||||
void autoApply();
|
||||
void undo();
|
||||
void redo();
|
||||
void updateCurrentWidgetLayer();
|
||||
|
||||
private slots:
|
||||
void updateCurrentWidgetLayer();
|
||||
|
||||
void layerAboutToBeRemoved( QgsMapLayer* layer );
|
||||
void liveApplyToggled( bool value );
|
||||
|
||||
|
@ -147,6 +147,7 @@ void QgsMapLayer::setBlendMode( QPainter::CompositionMode blendMode )
|
||||
{
|
||||
mBlendMode = blendMode;
|
||||
emit blendModeChanged( blendMode );
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
/** Read blend mode for layer */
|
||||
@ -1707,6 +1708,11 @@ QString QgsMapLayer::metadata()
|
||||
return QString();
|
||||
}
|
||||
|
||||
void QgsMapLayer::emitStyleChanged()
|
||||
{
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
void QgsMapLayer::setExtent( const QgsRectangle &r )
|
||||
{
|
||||
mExtent = r;
|
||||
|
@ -638,6 +638,11 @@ class CORE_EXPORT QgsMapLayer : public QObject
|
||||
/** Time stamp of data source in the moment when data/metadata were loaded by provider */
|
||||
virtual QDateTime timestamp() const { return QDateTime() ; }
|
||||
|
||||
/** Triggers an emission of the styleChanged() signal.
|
||||
* @note added in QGIS 2.16
|
||||
*/
|
||||
void emitStyleChanged();
|
||||
|
||||
signals:
|
||||
|
||||
//! @deprecated in 2.4 - not emitted anymore
|
||||
@ -669,9 +674,19 @@ class CORE_EXPORT QgsMapLayer : public QObject
|
||||
/** Signal emitted when the blend mode is changed, through QgsMapLayer::setBlendMode() */
|
||||
void blendModeChanged( QPainter::CompositionMode blendMode );
|
||||
|
||||
/** Signal emitted when renderer is changed */
|
||||
/** Signal emitted when renderer is changed.
|
||||
* @see styleChanged()
|
||||
*/
|
||||
void rendererChanged();
|
||||
|
||||
/** Signal emitted whenever a change affects the layer's style. Ie this may be triggered
|
||||
* by renderer changes, label style changes, or other style changes such as blend
|
||||
* mode or layer opacity changes.
|
||||
* @note added in QGIS 2.16
|
||||
* @see rendererChanged()
|
||||
*/
|
||||
void styleChanged();
|
||||
|
||||
/**
|
||||
* Signal emitted when legend of the layer has changed
|
||||
* @note added in 2.6
|
||||
|
@ -1244,10 +1244,9 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
|
||||
layer->setCustomProperty( "labeling/zIndex", zIndex );
|
||||
|
||||
writeDataDefinedPropertyMap( layer, nullptr, dataDefinedProperties );
|
||||
layer->emitStyleChanged();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void QgsPalLayerSettings::readXml( QDomElement& elem )
|
||||
{
|
||||
enabled = true;
|
||||
|
@ -659,6 +659,7 @@ void QgsVectorLayer::setDiagramRenderer( QgsDiagramRendererV2* r )
|
||||
delete mDiagramRenderer;
|
||||
mDiagramRenderer = r;
|
||||
emit rendererChanged();
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
QGis::GeometryType QgsVectorLayer::geometryType() const
|
||||
@ -2964,6 +2965,7 @@ void QgsVectorLayer::setRendererV2( QgsFeatureRendererV2 *r )
|
||||
mSymbolFeatureCountMap.clear();
|
||||
|
||||
emit rendererChanged();
|
||||
emit styleChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@ -3469,6 +3471,7 @@ void QgsVectorLayer::setFeatureBlendMode( QPainter::CompositionMode featureBlend
|
||||
{
|
||||
mFeatureBlendMode = featureBlendMode;
|
||||
emit featureBlendModeChanged( featureBlendMode );
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
/** Read blend mode for layer */
|
||||
@ -3482,6 +3485,7 @@ void QgsVectorLayer::setLayerTransparency( int layerTransparency )
|
||||
{
|
||||
mLayerTransparency = layerTransparency;
|
||||
emit layerTransparencyChanged( layerTransparency );
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
/** Read transparency for layer */
|
||||
|
@ -936,6 +936,7 @@ void QgsRasterLayer::setContrastEnhancement( QgsContrastEnhancement::ContrastEnh
|
||||
qDeleteAll( myEnhancements );
|
||||
|
||||
emit repaintRequested();
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
void QgsRasterLayer::setDefaultContrastEnhancement()
|
||||
@ -1076,6 +1077,7 @@ void QgsRasterLayer::setRenderer( QgsRasterRenderer* theRenderer )
|
||||
if ( !theRenderer ) { return; }
|
||||
mPipe.set( theRenderer );
|
||||
emit rendererChanged();
|
||||
emit styleChanged();
|
||||
}
|
||||
|
||||
void QgsRasterLayer::showProgress( int theValue )
|
||||
|
Loading…
x
Reference in New Issue
Block a user