Skip to content

Commit

Permalink
Various safety checks to avoid crashes
Browse files Browse the repository at this point in the history
Fix #35940
  • Loading branch information
m-kuhn authored and nyalldawson committed Apr 23, 2020
1 parent f13a200 commit 6a27a82
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 33 deletions.
2 changes: 1 addition & 1 deletion src/gui/symbology/qgscategorizedsymbolrendererwidget.cpp
Expand Up @@ -575,7 +575,7 @@ QgsCategorizedSymbolRendererWidget::QgsCategorizedSymbolRendererWidget( QgsVecto
advMenu->addAction( tr( "Match to Saved Symbols" ), this, SLOT( matchToSymbolsFromLibrary() ) );
advMenu->addAction( tr( "Match to Symbols from File…" ), this, SLOT( matchToSymbolsFromXml() ) );
advMenu->addAction( tr( "Symbol Levels…" ), this, SLOT( showSymbolLevels() ) );
if ( mCategorizedSymbol->type() == QgsSymbol::Marker )
if ( mCategorizedSymbol && mCategorizedSymbol->type() == QgsSymbol::Marker )
{
QAction *actionDdsLegend = advMenu->addAction( tr( "Data-defined Size Legend…" ) );
// only from Qt 5.6 there is convenience addAction() with new style connection
Expand Down
61 changes: 32 additions & 29 deletions src/gui/symbology/qgsgraduatedsymbolrendererwidget.cpp
Expand Up @@ -507,38 +507,41 @@ QgsGraduatedSymbolRendererWidget::QgsGraduatedSymbolRendererWidget( QgsVectorLay
viewGraduated->setStyle( new QgsGraduatedSymbolRendererViewStyle( viewGraduated ) );

mGraduatedSymbol.reset( QgsSymbol::defaultSymbol( mLayer->geometryType() ) );
btnChangeGraduatedSymbol->setSymbolType( mGraduatedSymbol->type() );
btnChangeGraduatedSymbol->setSymbol( mGraduatedSymbol->clone() );

methodComboBox->blockSignals( true );
methodComboBox->addItem( tr( "Color" ), ColorMode );
switch ( mGraduatedSymbol->type() )
if ( mGraduatedSymbol )
{
case QgsSymbol::Marker:
{
methodComboBox->addItem( tr( "Size" ), SizeMode );
minSizeSpinBox->setValue( 1 );
maxSizeSpinBox->setValue( 8 );
break;
}
case QgsSymbol::Line:
{
methodComboBox->addItem( tr( "Size" ), SizeMode );
minSizeSpinBox->setValue( .1 );
maxSizeSpinBox->setValue( 2 );
break;
}
case QgsSymbol::Fill:
btnChangeGraduatedSymbol->setSymbolType( mGraduatedSymbol->type() );
btnChangeGraduatedSymbol->setSymbol( mGraduatedSymbol->clone() );

methodComboBox->blockSignals( true );
methodComboBox->addItem( tr( "Color" ), ColorMode );
switch ( mGraduatedSymbol->type() )
{
//set button and label invisible to avoid display of a single item combobox
methodComboBox->hide();
labelMethod->hide();
break;
case QgsSymbol::Marker:
{
methodComboBox->addItem( tr( "Size" ), SizeMode );
minSizeSpinBox->setValue( 1 );
maxSizeSpinBox->setValue( 8 );
break;
}
case QgsSymbol::Line:
{
methodComboBox->addItem( tr( "Size" ), SizeMode );
minSizeSpinBox->setValue( .1 );
maxSizeSpinBox->setValue( 2 );
break;
}
case QgsSymbol::Fill:
{
//set button and label invisible to avoid display of a single item combobox
methodComboBox->hide();
labelMethod->hide();
break;
}
case QgsSymbol::Hybrid:
break;
}
case QgsSymbol::Hybrid:
break;
methodComboBox->blockSignals( false );
}
methodComboBox->blockSignals( false );

connect( mExpressionWidget, static_cast < void ( QgsFieldExpressionWidget::* )( const QString & ) >( &QgsFieldExpressionWidget::fieldChanged ), this, &QgsGraduatedSymbolRendererWidget::graduatedColumnChanged );
connect( viewGraduated, &QAbstractItemView::doubleClicked, this, &QgsGraduatedSymbolRendererWidget::rangesDoubleClicked );
Expand All @@ -565,7 +568,7 @@ QgsGraduatedSymbolRendererWidget::QgsGraduatedSymbolRendererWidget( QgsVectorLay
QMenu *advMenu = new QMenu( this );

advMenu->addAction( tr( "Symbol Levels…" ), this, SLOT( showSymbolLevels() ) );
if ( mGraduatedSymbol->type() == QgsSymbol::Marker )
if ( mGraduatedSymbol && mGraduatedSymbol->type() == QgsSymbol::Marker )
{
QAction *actionDdsLegend = advMenu->addAction( tr( "Data-defined Size Legend…" ) );
// only from Qt 5.6 there is convenience addAction() with new style connection
Expand Down
2 changes: 2 additions & 0 deletions src/gui/symbology/qgsheatmaprendererwidget.cpp
Expand Up @@ -80,6 +80,8 @@ QgsHeatmapRendererWidget::QgsHeatmapRendererWidget( QgsVectorLayer *layer, QgsSt
QLabel *label = new QLabel( tr( "The heatmap renderer only applies to point and multipoint layers. \n"
"'%1' is not a point layer and cannot be rendered as a heatmap." )
.arg( layer->name() ), this );
if ( !layout() )
setLayout( new QGridLayout() );
layout()->addWidget( label );
return;
}
Expand Down
8 changes: 5 additions & 3 deletions src/gui/symbology/qgssinglesymbolrendererwidget.cpp
Expand Up @@ -47,11 +47,13 @@ QgsSingleSymbolRendererWidget::QgsSingleSymbolRendererWidget( QgsVectorLayer *la
{
QgsSymbol *symbol = QgsSymbol::defaultSymbol( mLayer->geometryType() );

mRenderer = new QgsSingleSymbolRenderer( symbol );
if ( symbol )
mRenderer = new QgsSingleSymbolRenderer( symbol );
}

// load symbol from it
mSingleSymbol = mRenderer->symbol()->clone();
if ( mRenderer )
mSingleSymbol = mRenderer->symbol()->clone();

// setup ui
mSelector = new QgsSymbolSelectorWidget( mSingleSymbol, mStyle, mLayer, nullptr );
Expand All @@ -73,7 +75,7 @@ QgsSingleSymbolRendererWidget::QgsSingleSymbolRendererWidget( QgsVectorLayer *la

QAction *actionLevels = advMenu->addAction( tr( "Symbol Levels…" ) );
connect( actionLevels, &QAction::triggered, this, &QgsSingleSymbolRendererWidget::showSymbolLevels );
if ( mSingleSymbol->type() == QgsSymbol::Marker )
if ( mSingleSymbol && mSingleSymbol->type() == QgsSymbol::Marker )
{
QAction *actionDdsLegend = advMenu->addAction( tr( "Data-defined Size Legend…" ) );
// only from Qt 5.6 there is convenience addAction() with new style connection
Expand Down
6 changes: 6 additions & 0 deletions src/gui/symbology/qgssymbolselectordialog.cpp
Expand Up @@ -385,6 +385,9 @@ QgsSymbolWidgetContext QgsSymbolSelectorWidget::context() const

void QgsSymbolSelectorWidget::loadSymbol( QgsSymbol *symbol, SymbolLayerItem *parent )
{
if ( !symbol )
return;

if ( !parent )
{
mSymbol = symbol;
Expand Down Expand Up @@ -449,6 +452,9 @@ void QgsSymbolSelectorWidget::updateUi()

void QgsSymbolSelectorWidget::updatePreview()
{
if ( !mSymbol )
return;

std::unique_ptr< QgsSymbol > symbolClone( mSymbol->clone() );
QImage preview = symbolClone->bigSymbolPreviewImage( &mPreviewExpressionContext );
lblPreview->setPixmap( QPixmap::fromImage( preview ) );
Expand Down

0 comments on commit 6a27a82

Please sign in to comment.