Skip to content

Commit 23dc1c8

Browse files
committedFeb 19, 2018
Use first feature in layer to generate symbol preview icon in widget
Uses the first feature found in a layer in order to create a better preview for the symbol in the symbol selector dialog. This allows data defined settings to be evaluated correctly (at least, for the first feature) and avoids missing previews due to missing attribute values when data defined settings are present. Fixes #17061
1 parent 7701ea6 commit 23dc1c8

File tree

2 files changed

+28
-1
lines changed

2 files changed

+28
-1
lines changed
 

‎src/gui/symbology/qgssymbolselectordialog.cpp

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "qgslogger.h"
3232
#include "qgsapplication.h"
3333
#include "qgssettings.h"
34+
#include "qgsfeatureiterator.h"
35+
#include "qgsvectorlayer.h"
3436

3537
#include <QColorDialog>
3638
#include <QPainter>
@@ -247,6 +249,19 @@ QgsSymbolSelectorWidget::QgsSymbolSelectorWidget( QgsSymbol *symbol, QgsStyle *s
247249
layersTree->setModel( model );
248250
layersTree->setHeaderHidden( true );
249251

252+
//get first feature from layer for previews
253+
if ( mVectorLayer )
254+
{
255+
QgsFeatureIterator it = mVectorLayer->getFeatures( QgsFeatureRequest().setLimit( 1 ) );
256+
it.nextFeature( mPreviewFeature );
257+
mPreviewExpressionContext.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( mVectorLayer ) );
258+
mPreviewExpressionContext.setFeature( mPreviewFeature );
259+
}
260+
else
261+
{
262+
mPreviewExpressionContext.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( nullptr ) );
263+
}
264+
250265
QItemSelectionModel *selModel = layersTree->selectionModel();
251266
connect( selModel, &QItemSelectionModel::currentChanged, this, &QgsSymbolSelectorWidget::layerChanged );
252267

@@ -285,6 +300,15 @@ void QgsSymbolSelectorWidget::setContext( const QgsSymbolWidgetContext &context
285300
{
286301
mContext = context;
287302

303+
if ( mContext.expressionContext() )
304+
{
305+
mPreviewExpressionContext = *mContext.expressionContext();
306+
if ( mVectorLayer )
307+
mPreviewExpressionContext.appendScope( QgsExpressionContextUtils::layerScope( mVectorLayer ) );
308+
309+
mPreviewExpressionContext.setFeature( mPreviewFeature );
310+
}
311+
288312
QWidget *widget = stackedWidget->currentWidget();
289313
QgsLayerPropertiesWidget *layerProp = dynamic_cast< QgsLayerPropertiesWidget * >( widget );
290314
QgsSymbolsListWidget *listWidget = dynamic_cast< QgsSymbolsListWidget * >( widget );
@@ -362,7 +386,7 @@ void QgsSymbolSelectorWidget::updateUi()
362386

363387
void QgsSymbolSelectorWidget::updatePreview()
364388
{
365-
QImage preview = mSymbol->bigSymbolPreviewImage( mContext.expressionContext() );
389+
QImage preview = mSymbol->bigSymbolPreviewImage( &mPreviewExpressionContext );
366390
lblPreview->setPixmap( QPixmap::fromImage( preview ) );
367391
// Hope this is a appropriate place
368392
emit symbolModified();

‎src/gui/symbology/qgssymbolselectordialog.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,9 @@ class GUI_EXPORT QgsSymbolSelectorWidget: public QgsPanelWidget, private Ui::Qgs
250250
private:
251251
std::unique_ptr<DataDefinedRestorer> mDataDefineRestorer;
252252
QgsSymbolWidgetContext mContext;
253+
QgsFeature mPreviewFeature;
254+
QgsExpressionContext mPreviewExpressionContext;
255+
253256
};
254257

255258
/**

0 commit comments

Comments
 (0)
Please sign in to comment.