2020#include " qgslayertreeutils.h"
2121#include " qgslayertreemodel.h"
2222#include " qgsvectorlayer.h"
23+ #include " qgsrasterlayer.h"
2324#include " qgisapp.h"
2425#include " qgsbrowsermodel.h"
2526#include " qgsbrowsertreeview.h"
@@ -40,14 +41,21 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
4041 if ( !QgsLayerTree::isLayer ( node ) )
4142 return ;
4243
43- QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer ( node )->layer () );
44- if ( !vlayer )
44+ // Only raster/vector for now are supported
45+ QgsMapLayer *layer = nullptr ;
46+ if ( qobject_cast<QgsVectorLayer *>( QgsLayerTree::toLayer ( node )->layer () ) ||
47+ qobject_cast<QgsRasterLayer *>( QgsLayerTree::toLayer ( node )->layer () ) )
48+ {
49+ layer = qobject_cast<QgsMapLayer *>( QgsLayerTree::toLayer ( node )->layer () );
50+ }
51+ if ( !layer )
4552 return ;
4653
47- // TODO: raster layers
48-
4954 // Get provider type
50- QString providerType ( vlayer->providerType () );
55+ QString providerType ( layer->providerType () );
56+ QgsMapLayer::LayerType layerType ( layer->type () );
57+
58+ // Builds the dialog to select a new data source
5159 QgsBrowserModel browserModel;
5260 browserModel.initialize ();
5361 QDialog dlg;
@@ -69,8 +77,8 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
6977 {
7078 if ( index.isValid () )
7179 {
72- const QgsDataItem *item ( browserModel.dataItem ( index ) );
73- if ( item-> mimeUri (). layerType == QStringLiteral ( " vector " ) && item->mimeUri (). providerKey == providerType )
80+ const QgsLayerItem *item = qobject_cast<QgsLayerItem *> ( browserModel.dataItem ( index ) );
81+ if ( item && item-> mapLayerType () == layerType && item->providerKey () == providerType )
7482 {
7583 return true ;
7684 }
@@ -86,12 +94,11 @@ void QgsLayerTreeViewBadLayerIndicatorProvider::onIndicatorClicked( const QModel
8694 dlg.setLayout ( &lay );
8795 if ( dlg.exec () == QDialog::Accepted )
8896 {
89- // Get selected item(s)
9097 QModelIndex index = browserWidget->currentIndex ();
9198 if ( isItemCompatible ( index ) )
9299 {
93100 const QgsDataItem *item ( browserModel.dataItem ( index ) );
94- vlayer ->setDataSource ( item->mimeUri ().uri , vlayer ->name (), item->mimeUri ().providerKey , QgsDataProvider::ProviderOptions () );
101+ layer ->setDataSource ( item->mimeUri ().uri , layer ->name (), item->mimeUri ().providerKey , QgsDataProvider::ProviderOptions () );
95102 }
96103 }
97104 QgsSettings ().setValue ( QStringLiteral ( " /Windows/selectDataSourceDialog/geometry" ), dlg.saveGeometry (), QgsSettings::Section::App );
@@ -106,8 +113,7 @@ QString QgsLayerTreeViewBadLayerIndicatorProvider::iconName( QgsMapLayer *layer
106113QString QgsLayerTreeViewBadLayerIndicatorProvider::tooltipText ( QgsMapLayer *layer )
107114{
108115 Q_UNUSED ( layer );
109- // TODO, click here to set a new data source.
110- return tr ( " <b>Bad layer!</b><br>Layer data source could not be found." );
116+ return tr ( " <b>Bad layer!</b><br>Layer data source could not be found. Click to set a new data source" );
111117}
112118
113119bool QgsLayerTreeViewBadLayerIndicatorProvider::acceptLayer ( QgsMapLayer *layer )
0 commit comments