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:
Nyall Dawson 2016-06-27 14:03:36 +10:00
parent df579a57e1
commit c3c5c43190
10 changed files with 98 additions and 11 deletions

View File

@ -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

View File

@ -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 )

View File

@ -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();
}
}

View File

@ -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 );
}
}

View File

@ -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 );

View File

@ -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;

View File

@ -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

View File

@ -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;

View File

@ -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 */

View File

@ -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 )