mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-18 00:06:00 -04:00
Merge pull request #55598 from nyalldawson/fix_remove_geom
Ensure layer renderer is removed when changing data source from a spatial to a non-spatial type
This commit is contained in:
commit
7a1937536a
@ -2033,10 +2033,10 @@ void QgsVectorLayer::setDataSourcePrivate( const QString &dataSource, const QStr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// if the default style failed to load or was disabled use some very basic defaults
|
// if the default style failed to load or was disabled use some very basic defaults
|
||||||
if ( !defaultLoadedFlag && isSpatial() )
|
if ( !defaultLoadedFlag )
|
||||||
{
|
{
|
||||||
// add single symbol renderer
|
// add single symbol renderer for spatial layers
|
||||||
setRenderer( QgsFeatureRenderer::defaultRenderer( geometryType() ) );
|
setRenderer( isSpatial() ? QgsFeatureRenderer::defaultRenderer( geometryType() ) : nullptr );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( !mSetLegendFromStyle )
|
if ( !mSetLegendFromStyle )
|
||||||
@ -4179,7 +4179,10 @@ void QgsVectorLayer::setRenderer( QgsFeatureRenderer *r )
|
|||||||
// we must allow setting a renderer if our geometry type is unknown
|
// we must allow setting a renderer if our geometry type is unknown
|
||||||
// as this allows the renderer to be correctly set even for layers
|
// as this allows the renderer to be correctly set even for layers
|
||||||
// with broken sources
|
// with broken sources
|
||||||
if ( !isSpatial() && mWkbType != Qgis::WkbType::Unknown )
|
// (note that we allow REMOVING the renderer for non-spatial layers,
|
||||||
|
// e.g. to permit removing the renderer when the layer changes from
|
||||||
|
// a spatial layer to a non-spatial one)
|
||||||
|
if ( r && !isSpatial() && mWkbType != Qgis::WkbType::Unknown )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if ( r != mRenderer )
|
if ( r != mRenderer )
|
||||||
|
@ -374,6 +374,19 @@ class TestQgsVectorLayer(QgisTestCase, FeatureSourceTestCase):
|
|||||||
self.assertNotEqual(layer.renderer(), r)
|
self.assertNotEqual(layer.renderer(), r)
|
||||||
self.assertEqual(layer.renderer().symbol().type(), QgsSymbol.Fill)
|
self.assertEqual(layer.renderer().symbol().type(), QgsSymbol.Fill)
|
||||||
|
|
||||||
|
# reset layer to a non-spatial layer
|
||||||
|
lines_path = os.path.join(unitTestDataPath(), 'nonspatial.dbf')
|
||||||
|
layer.setDataSource(lines_path, 'new name2', 'ogr', options)
|
||||||
|
|
||||||
|
self.assertTrue(layer.isValid())
|
||||||
|
self.assertEqual(layer.name(), 'new name2')
|
||||||
|
self.assertEqual(layer.wkbType(), QgsWkbTypes.NoGeometry)
|
||||||
|
self.assertFalse(layer.crs().isValid())
|
||||||
|
self.assertIn('nonspatial.dbf', layer.dataProvider().dataSourceUri())
|
||||||
|
self.assertEqual(len(spy), 3)
|
||||||
|
# should have REMOVED renderer
|
||||||
|
self.assertIsNone(layer.renderer())
|
||||||
|
|
||||||
def testSetDataSourceInvalidToValid(self):
|
def testSetDataSourceInvalidToValid(self):
|
||||||
"""
|
"""
|
||||||
Test that changing an invalid layer path to valid maintains the renderer
|
Test that changing an invalid layer path to valid maintains the renderer
|
||||||
|
Loading…
x
Reference in New Issue
Block a user