Skip to content

Commit

Permalink
Merge pull request #54812 from nyalldawson/crash_georef_props
Browse files Browse the repository at this point in the history
Fix crash when opening layer properties for raster layer with broken data source
  • Loading branch information
elpaso committed Oct 4, 2023
2 parents 0c69978 + 0250065 commit 8ea5d33
Show file tree
Hide file tree
Showing 6 changed files with 283 additions and 28 deletions.
3 changes: 2 additions & 1 deletion src/app/annotations/qgsannotationlayerproperties.h
Expand Up @@ -21,6 +21,7 @@
#include "ui_qgsannotationlayerpropertiesbase.h"

#include "qgsannotationlayer.h"
#include "qgis_app.h"

class QgsMapLayer;
class QgsMapCanvas;
Expand All @@ -30,7 +31,7 @@ class QgsMetadataWidget;
class QgsMapLayerConfigWidgetFactory;
class QgsMapLayerConfigWidget;

class QgsAnnotationLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsAnnotationLayerPropertiesBase
class APP_EXPORT QgsAnnotationLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsAnnotationLayerPropertiesBase
{
Q_OBJECT
public:
Expand Down
3 changes: 2 additions & 1 deletion src/app/pointcloud/qgspointcloudlayerproperties.h
Expand Up @@ -22,6 +22,7 @@

#include <QAbstractTableModel>

#include "qgis_app.h"
#include "qgspointcloudlayer.h"

class QgsMapLayer;
Expand Down Expand Up @@ -87,7 +88,7 @@ class QgsPointCloudClassificationStatisticsModel : public QAbstractTableModel
QList<int> mClassifications;
};

class QgsPointCloudLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsPointCloudLayerPropertiesBase
class APP_EXPORT QgsPointCloudLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsPointCloudLayerPropertiesBase
{
Q_OBJECT
public:
Expand Down
3 changes: 2 additions & 1 deletion src/app/tiledscene/qgstiledscenelayerproperties.h
Expand Up @@ -18,12 +18,13 @@

#include "qgslayerpropertiesdialog.h"
#include "ui_qgstiledscenelayerpropertiesbase.h"
#include "qgis_app.h"

class QgsTiledSceneLayer;
class QgsMessageBar;
class QgsMetadataWidget;

class QgsTiledSceneLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsTiledSceneLayerPropertiesBase
class APP_EXPORT QgsTiledSceneLayerProperties : public QgsLayerPropertiesDialog, private Ui::QgsTiledSceneLayerPropertiesBase
{
Q_OBJECT
public:
Expand Down
61 changes: 36 additions & 25 deletions src/gui/raster/qgsrastertransparencywidget.cpp
Expand Up @@ -128,23 +128,22 @@ void QgsRasterTransparencyWidget::syncToLayer()

cboxTransparencyBand->setShowNotSetOption( true, tr( "None" ) );
cboxTransparencyBand->setLayer( mRasterLayer );
}

if ( mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) )
{
lblSrcNoDataValue->setText( QgsRasterBlock::printValue( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) ) );
}
else
{
lblSrcNoDataValue->setText( tr( "not defined" ) );
}
if ( provider->sourceHasNoDataValue( 1 ) )
{
lblSrcNoDataValue->setText( QgsRasterBlock::printValue( provider->sourceNoDataValue( 1 ) ) );
}
else
{
lblSrcNoDataValue->setText( tr( "not defined" ) );
}

mSrcNoDataValueCheckBox->setChecked( mRasterLayer->dataProvider()->useSourceNoDataValue( 1 ) );
mSrcNoDataValueCheckBox->setChecked( provider->useSourceNoDataValue( 1 ) );

const bool enableSrcNoData = mRasterLayer->dataProvider()->sourceHasNoDataValue( 1 ) && !std::isnan( mRasterLayer->dataProvider()->sourceNoDataValue( 1 ) );
const bool enableSrcNoData = provider->sourceHasNoDataValue( 1 ) && !std::isnan( provider->sourceNoDataValue( 1 ) );

mSrcNoDataValueCheckBox->setEnabled( enableSrcNoData );
lblSrcNoDataValue->setEnabled( enableSrcNoData );
mSrcNoDataValueCheckBox->setEnabled( enableSrcNoData );
lblSrcNoDataValue->setEnabled( enableSrcNoData );
}

if ( renderer )
{
Expand All @@ -158,12 +157,19 @@ void QgsRasterTransparencyWidget::syncToLayer()
cboxTransparencyBand->setBand( renderer->alphaBand() );
}

const QgsRasterRangeList noDataRangeList = mRasterLayer->dataProvider()->userNoDataValues( 1 );
QgsDebugMsgLevel( QStringLiteral( "noDataRangeList.size = %1" ).arg( noDataRangeList.size() ), 2 );
if ( !noDataRangeList.isEmpty() )
if ( provider )
{
const double v = QgsRasterBlock::printValue( noDataRangeList.value( 0 ).min() ).toDouble();
leNoDataValue->setText( QLocale().toString( v ) );
const QgsRasterRangeList noDataRangeList = provider->userNoDataValues( 1 );
QgsDebugMsgLevel( QStringLiteral( "noDataRangeList.size = %1" ).arg( noDataRangeList.size() ), 2 );
if ( !noDataRangeList.isEmpty() )
{
const double v = QgsRasterBlock::printValue( noDataRangeList.value( 0 ).min() ).toDouble();
leNoDataValue->setText( QLocale().toString( v ) );
}
else
{
leNoDataValue->setText( QString() );
}
}
else
{
Expand Down Expand Up @@ -456,10 +462,13 @@ void QgsRasterTransparencyWidget::apply()
myNoDataRangeList << myNoDataRange;
}
}
for ( int bandNo = 1; bandNo <= mRasterLayer->dataProvider()->bandCount(); bandNo++ )
if ( QgsRasterDataProvider *provider = mRasterLayer->dataProvider() )
{
mRasterLayer->dataProvider()->setUserNoDataValue( bandNo, myNoDataRangeList );
mRasterLayer->dataProvider()->setUseSourceNoDataValue( bandNo, mSrcNoDataValueCheckBox->isChecked() );
for ( int bandNo = 1; bandNo <= provider->bandCount(); bandNo++ )
{
provider->setUserNoDataValue( bandNo, myNoDataRangeList );
provider->setUseSourceNoDataValue( bandNo, mSrcNoDataValueCheckBox->isChecked() );
}
}

//transparency settings
Expand Down Expand Up @@ -558,7 +567,7 @@ void QgsRasterTransparencyWidget::pixelSelected( const QgsPointXY &canvasPoint )
}

//Get the pixel values and add a new entry to the transparency table
if ( mMapCanvas && mPixelSelectorTool )
if ( mMapCanvas && mPixelSelectorTool && mRasterLayer->dataProvider() )
{
mMapCanvas->unsetMapTool( mPixelSelectorTool );

Expand Down Expand Up @@ -703,10 +712,12 @@ void QgsRasterTransparencyWidget::setTransparencyCell( int row, int column, doub
{
QgsDebugMsgLevel( QStringLiteral( "value = %1" ).arg( value, 0, 'g', 17 ), 2 );
QgsRasterDataProvider *provider = mRasterLayer->dataProvider();
if ( !provider ) return;
if ( !provider )
return;

QgsRasterRenderer *renderer = mRasterLayer->renderer();
if ( !renderer ) return;
if ( !renderer )
return;
const int nBands = renderer->usesBands().size();

QLineEdit *lineEdit = new QLineEdit();
Expand Down
1 change: 1 addition & 0 deletions tests/src/app/CMakeLists.txt
Expand Up @@ -19,6 +19,7 @@ set(TESTS
testqgsdecorationscalebar.cpp
testqgsdwgimportdialog.cpp
testqgsfieldcalculator.cpp
testqgslayerpropertiesdialogs.cpp
testqgsmapcanvasdockwidget.cpp
testqgsmaptooladdpart.cpp
testqgsmaptooleditannotation.cpp
Expand Down

0 comments on commit 8ea5d33

Please sign in to comment.