Skip to content

Commit c3c5c43

Browse files
committed
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
1 parent df579a5 commit c3c5c43

10 files changed

+98
-11
lines changed

python/core/qgsmaplayer.sip

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,11 @@ class QgsMapLayer : QObject
618618
/** Time stamp of data source in the moment when data/metadata were loaded by provider */
619619
virtual QDateTime timestamp() const;
620620

621+
/** Triggers an emission of the styleChanged() signal.
622+
* @note added in QGIS 2.16
623+
*/
624+
void emitStyleChanged();
625+
621626
signals:
622627

623628
//! @deprecated in 2.4 - not emitted anymore
@@ -649,9 +654,19 @@ class QgsMapLayer : QObject
649654
/** Signal emitted when the blend mode is changed, through QgsMapLayer::setBlendMode() */
650655
void blendModeChanged( QPainter::CompositionMode blendMode );
651656

652-
/** Signal emitted when renderer is changed */
657+
/** Signal emitted when renderer is changed.
658+
* @see styleChanged()
659+
*/
653660
void rendererChanged();
654661

662+
/** Signal emitted whenever a change affects the layer's style. Ie this may be triggered
663+
* by renderer changes, label style changes, or other style changes such as blend
664+
* mode or layer opacity changes.
665+
* @note added in QGIS 2.16
666+
* @see rendererChanged()
667+
*/
668+
void styleChanged();
669+
655670
/**
656671
* Signal emitted when legend of the layer has changed
657672
* @note added in 2.6

src/app/qgisapp.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11345,10 +11345,14 @@ void QgisApp::showLayerProperties( QgsMapLayer *ml )
1134511345
vlp->addPropertiesPageFactory( factory );
1134611346
}
1134711347

11348+
mMapStyleWidget->blockUpdates( true );
1134811349
if ( vlp->exec() )
1134911350
{
1135011351
activateDeactivateLayerRelatedActions( ml );
11352+
mMapStyleWidget->updateCurrentWidgetLayer();
1135111353
}
11354+
mMapStyleWidget->blockUpdates( false );
11355+
1135211356
delete vlp; // delete since dialog cannot be reused without updating code
1135311357
}
1135411358
else if ( ml->type() == QgsMapLayer::PluginLayer )

src/app/qgsapplayertreeviewmenuprovider.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
511511
return;
512512

513513
QString layerId = action->property( "layerId" ).toString();
514-
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
514+
QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) );
515515
if ( !layer )
516516
return;
517517

@@ -545,6 +545,7 @@ void QgsAppLayerTreeViewMenuProvider::setVectorSymbolColor( const QColor& color
545545
}
546546

547547
layer->triggerRepaint();
548+
layer->emitStyleChanged();
548549
mView->refreshLayerSymbology( layer->id() );
549550
}
550551

@@ -573,6 +574,10 @@ void QgsAppLayerTreeViewMenuProvider::editSymbolLegendNodeSymbol()
573574
if ( dlg.exec() )
574575
{
575576
node->setSymbol( symbol.take() );
577+
if ( vlayer )
578+
{
579+
vlayer->emitStyleChanged();
580+
}
576581
}
577582
}
578583

@@ -596,4 +601,8 @@ void QgsAppLayerTreeViewMenuProvider::setSymbolLegendNodeColor( const QColor &co
596601
QgsSymbolV2* newSymbol = originalSymbol->clone();
597602
newSymbol->setColor( color );
598603
node->setSymbol( newSymbol );
604+
if ( QgsVectorLayer* layer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerId ) ) )
605+
{
606+
layer->emitStyleChanged();
607+
}
599608
}

src/app/qgslayerstylingwidget.cpp

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,37 @@ void QgsLayerStylingWidget::setPageFactories( QList<QgsLayerStylingPanelFactory
9595
mPageFactories.append( mStyleManagerFactory );
9696
}
9797

98+
void QgsLayerStylingWidget::blockUpdates( bool blocked )
99+
{
100+
if ( !mCurrentLayer )
101+
return;
102+
103+
if ( blocked )
104+
{
105+
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
106+
}
107+
else
108+
{
109+
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
110+
}
111+
}
112+
98113
void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
99114
{
115+
if ( layer == mCurrentLayer )
116+
return;
117+
118+
if ( mCurrentLayer )
119+
{
120+
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
121+
}
122+
100123
if ( !layer || !layer->isSpatial() )
101124
{
102125
mLayerCombo->setLayer( nullptr );
103126
mStackedWidget->setCurrentIndex( mNotSupportedPage );
104127
mLastStyleXml.clear();
128+
mCurrentLayer = nullptr;
105129
return;
106130
}
107131

@@ -112,9 +136,10 @@ void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
112136
}
113137

114138
mCurrentLayer = layer;
115-
connect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
139+
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
116140

117141
int lastPage = mOptionsListWidget->currentIndex().row();
142+
mOptionsListWidget->blockSignals( true );
118143
mOptionsListWidget->clear();
119144
mUserPages.clear();
120145
if ( layer->type() == QgsMapLayer::VectorLayer )
@@ -140,6 +165,7 @@ void QgsLayerStylingWidget::setLayer( QgsMapLayer *layer )
140165
}
141166
}
142167
mOptionsListWidget->addItem( new QListWidgetItem( QgsApplication::getThemeIcon( "mActionHistory.svg" ), "" ) );
168+
mOptionsListWidget->blockSignals( false );
143169

144170
if ( sameLayerType )
145171
{
@@ -164,7 +190,7 @@ void QgsLayerStylingWidget::apply()
164190
if ( !mCurrentLayer )
165191
return;
166192

167-
disconnect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
193+
disconnect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
168194

169195
QString undoName = "Style Change";
170196

@@ -213,7 +239,7 @@ void QgsLayerStylingWidget::apply()
213239
mMapCanvas->clearCache();
214240
mMapCanvas->refresh();
215241
}
216-
disconnect( mCurrentLayer, SIGNAL( repaintRequested() ), this, SLOT( updateCurrentWidgetLayer() ) );
242+
connect( mCurrentLayer, SIGNAL( styleChanged() ), this, SLOT( updateCurrentWidgetLayer() ) );
217243
}
218244

219245
void QgsLayerStylingWidget::autoApply()
@@ -374,8 +400,7 @@ void QgsLayerStylingWidget::layerAboutToBeRemoved( QgsMapLayer* layer )
374400
if ( layer == mCurrentLayer )
375401
{
376402
mAutoApplyTimer->stop();
377-
mStackedWidget->setCurrentIndex( mNotSupportedPage );
378-
mCurrentLayer = nullptr;
403+
setLayer( nullptr );
379404
}
380405
}
381406

src/app/qgslayerstylingwidget.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,13 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
7272

7373
void setPageFactories( QList<QgsLayerStylingPanelFactory*> factories );
7474

75+
/** Sets whether updates of the styling widget are blocked. This can be called to prevent
76+
* the widget being refreshed multiple times when a batch of layer style changes are
77+
* about to be applied
78+
* @param blocked set to true to block updates, or false to re-allow updates
79+
*/
80+
void blockUpdates( bool blocked );
81+
7582
signals:
7683
void styleChanged( QgsMapLayer* layer );
7784

@@ -81,9 +88,10 @@ class APP_EXPORT QgsLayerStylingWidget : public QWidget, private Ui::QgsLayerSty
8188
void autoApply();
8289
void undo();
8390
void redo();
91+
void updateCurrentWidgetLayer();
8492

8593
private slots:
86-
void updateCurrentWidgetLayer();
94+
8795
void layerAboutToBeRemoved( QgsMapLayer* layer );
8896
void liveApplyToggled( bool value );
8997

src/core/qgsmaplayer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ void QgsMapLayer::setBlendMode( QPainter::CompositionMode blendMode )
147147
{
148148
mBlendMode = blendMode;
149149
emit blendModeChanged( blendMode );
150+
emit styleChanged();
150151
}
151152

152153
/** Read blend mode for layer */
@@ -1707,6 +1708,11 @@ QString QgsMapLayer::metadata()
17071708
return QString();
17081709
}
17091710

1711+
void QgsMapLayer::emitStyleChanged()
1712+
{
1713+
emit styleChanged();
1714+
}
1715+
17101716
void QgsMapLayer::setExtent( const QgsRectangle &r )
17111717
{
17121718
mExtent = r;

src/core/qgsmaplayer.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,11 @@ class CORE_EXPORT QgsMapLayer : public QObject
638638
/** Time stamp of data source in the moment when data/metadata were loaded by provider */
639639
virtual QDateTime timestamp() const { return QDateTime() ; }
640640

641+
/** Triggers an emission of the styleChanged() signal.
642+
* @note added in QGIS 2.16
643+
*/
644+
void emitStyleChanged();
645+
641646
signals:
642647

643648
//! @deprecated in 2.4 - not emitted anymore
@@ -669,9 +674,19 @@ class CORE_EXPORT QgsMapLayer : public QObject
669674
/** Signal emitted when the blend mode is changed, through QgsMapLayer::setBlendMode() */
670675
void blendModeChanged( QPainter::CompositionMode blendMode );
671676

672-
/** Signal emitted when renderer is changed */
677+
/** Signal emitted when renderer is changed.
678+
* @see styleChanged()
679+
*/
673680
void rendererChanged();
674681

682+
/** Signal emitted whenever a change affects the layer's style. Ie this may be triggered
683+
* by renderer changes, label style changes, or other style changes such as blend
684+
* mode or layer opacity changes.
685+
* @note added in QGIS 2.16
686+
* @see rendererChanged()
687+
*/
688+
void styleChanged();
689+
675690
/**
676691
* Signal emitted when legend of the layer has changed
677692
* @note added in 2.6

src/core/qgspallabeling.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,10 +1244,9 @@ void QgsPalLayerSettings::writeToLayer( QgsVectorLayer* layer )
12441244
layer->setCustomProperty( "labeling/zIndex", zIndex );
12451245

12461246
writeDataDefinedPropertyMap( layer, nullptr, dataDefinedProperties );
1247+
layer->emitStyleChanged();
12471248
}
12481249

1249-
1250-
12511250
void QgsPalLayerSettings::readXml( QDomElement& elem )
12521251
{
12531252
enabled = true;

src/core/qgsvectorlayer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,7 @@ void QgsVectorLayer::setDiagramRenderer( QgsDiagramRendererV2* r )
659659
delete mDiagramRenderer;
660660
mDiagramRenderer = r;
661661
emit rendererChanged();
662+
emit styleChanged();
662663
}
663664

664665
QGis::GeometryType QgsVectorLayer::geometryType() const
@@ -2964,6 +2965,7 @@ void QgsVectorLayer::setRendererV2( QgsFeatureRendererV2 *r )
29642965
mSymbolFeatureCountMap.clear();
29652966

29662967
emit rendererChanged();
2968+
emit styleChanged();
29672969
}
29682970
}
29692971

@@ -3469,6 +3471,7 @@ void QgsVectorLayer::setFeatureBlendMode( QPainter::CompositionMode featureBlend
34693471
{
34703472
mFeatureBlendMode = featureBlendMode;
34713473
emit featureBlendModeChanged( featureBlendMode );
3474+
emit styleChanged();
34723475
}
34733476

34743477
/** Read blend mode for layer */
@@ -3482,6 +3485,7 @@ void QgsVectorLayer::setLayerTransparency( int layerTransparency )
34823485
{
34833486
mLayerTransparency = layerTransparency;
34843487
emit layerTransparencyChanged( layerTransparency );
3488+
emit styleChanged();
34853489
}
34863490

34873491
/** Read transparency for layer */

src/core/raster/qgsrasterlayer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,7 @@ void QgsRasterLayer::setContrastEnhancement( QgsContrastEnhancement::ContrastEnh
936936
qDeleteAll( myEnhancements );
937937

938938
emit repaintRequested();
939+
emit styleChanged();
939940
}
940941

941942
void QgsRasterLayer::setDefaultContrastEnhancement()
@@ -1076,6 +1077,7 @@ void QgsRasterLayer::setRenderer( QgsRasterRenderer* theRenderer )
10761077
if ( !theRenderer ) { return; }
10771078
mPipe.set( theRenderer );
10781079
emit rendererChanged();
1080+
emit styleChanged();
10791081
}
10801082

10811083
void QgsRasterLayer::showProgress( int theValue )

0 commit comments

Comments
 (0)