Skip to content

Commit 1e4e45d

Browse files
committed
[bugfix] Workaround for bug 17087 deadlock
Add the layer to the project after iteration completed. This prevents the bug to freeze QGIS forever but it doesn't of course fix it.
1 parent 55a01dc commit 1e4e45d

File tree

1 file changed

+42
-39
lines changed

1 file changed

+42
-39
lines changed

src/core/qgsofflineediting.cpp

+42-39
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,6 @@ bool QgsOfflineEditing::convertToOfflineProject( const QString &offlineDataPath,
141141
{
142142
QString origLayerId = vl->id();
143143
QgsVectorLayer *newLayer = copyVectorLayer( vl, db, dbPath, onlySelected );
144-
145144
if ( newLayer )
146145
{
147146
layerIdMapping.insert( origLayerId, newLayer );
@@ -581,45 +580,7 @@ QgsVectorLayer *QgsOfflineEditing::copyVectorLayer( QgsVectorLayer *layer, sqlit
581580
layer->name() + " (offline)", QStringLiteral( "spatialite" ) );
582581
if ( newLayer->isValid() )
583582
{
584-
// mark as offline layer
585-
newLayer->setCustomProperty( CUSTOM_PROPERTY_IS_OFFLINE_EDITABLE, true );
586-
587-
// store original layer source
588-
newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_SOURCE, layer->source() );
589-
newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_PROVIDER, layer->providerType() );
590-
591-
// register this layer with the central layers registry
592-
QgsProject::instance()->addMapLayers(
593-
QList<QgsMapLayer *>() << newLayer );
594583

595-
// copy style
596-
copySymbology( layer, newLayer );
597-
598-
QgsLayerTreeGroup *layerTreeRoot = QgsProject::instance()->layerTreeRoot();
599-
// Find the parent group of the original layer
600-
QgsLayerTreeLayer *layerTreeLayer = layerTreeRoot->findLayer( layer->id() );
601-
if ( layerTreeLayer )
602-
{
603-
QgsLayerTreeGroup *parentTreeGroup = qobject_cast<QgsLayerTreeGroup *>( layerTreeLayer->parent() );
604-
if ( parentTreeGroup )
605-
{
606-
int index = parentTreeGroup->children().indexOf( layerTreeLayer );
607-
// Move the new layer from the root group to the new group
608-
QgsLayerTreeLayer *newLayerTreeLayer = layerTreeRoot->findLayer( newLayer->id() );
609-
if ( newLayerTreeLayer )
610-
{
611-
QgsLayerTreeNode *newLayerTreeLayerClone = newLayerTreeLayer->clone();
612-
QgsLayerTreeGroup *grp = qobject_cast<QgsLayerTreeGroup *>( newLayerTreeLayer->parent() );
613-
parentTreeGroup->insertChildNode( index, newLayerTreeLayerClone );
614-
if ( grp )
615-
grp->removeChildNode( newLayerTreeLayer );
616-
}
617-
}
618-
}
619-
620-
updateRelations( layer, newLayer );
621-
updateMapThemes( layer, newLayer );
622-
updateLayerOrder( layer, newLayer );
623584
// copy features
624585
newLayer->startEditing();
625586
QgsFeature f;
@@ -703,6 +664,48 @@ QgsVectorLayer *QgsOfflineEditing::copyVectorLayer( QgsVectorLayer *layer, sqlit
703664
{
704665
showWarning( newLayer->commitErrors().join( QStringLiteral( "\n" ) ) );
705666
}
667+
668+
// mark as offline layer
669+
newLayer->setCustomProperty( CUSTOM_PROPERTY_IS_OFFLINE_EDITABLE, true );
670+
671+
// store original layer source
672+
newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_SOURCE, layer->source() );
673+
newLayer->setCustomProperty( CUSTOM_PROPERTY_REMOTE_PROVIDER, layer->providerType() );
674+
675+
// register this layer with the central layers registry
676+
QgsProject::instance()->addMapLayers(
677+
QList<QgsMapLayer *>() << newLayer );
678+
679+
// copy style
680+
copySymbology( layer, newLayer );
681+
682+
QgsLayerTreeGroup *layerTreeRoot = QgsProject::instance()->layerTreeRoot();
683+
// Find the parent group of the original layer
684+
QgsLayerTreeLayer *layerTreeLayer = layerTreeRoot->findLayer( layer->id() );
685+
if ( layerTreeLayer )
686+
{
687+
QgsLayerTreeGroup *parentTreeGroup = qobject_cast<QgsLayerTreeGroup *>( layerTreeLayer->parent() );
688+
if ( parentTreeGroup )
689+
{
690+
int index = parentTreeGroup->children().indexOf( layerTreeLayer );
691+
// Move the new layer from the root group to the new group
692+
QgsLayerTreeLayer *newLayerTreeLayer = layerTreeRoot->findLayer( newLayer->id() );
693+
if ( newLayerTreeLayer )
694+
{
695+
QgsLayerTreeNode *newLayerTreeLayerClone = newLayerTreeLayer->clone();
696+
QgsLayerTreeGroup *grp = qobject_cast<QgsLayerTreeGroup *>( newLayerTreeLayer->parent() );
697+
parentTreeGroup->insertChildNode( index, newLayerTreeLayerClone );
698+
if ( grp )
699+
grp->removeChildNode( newLayerTreeLayer );
700+
}
701+
}
702+
}
703+
704+
updateRelations( layer, newLayer );
705+
updateMapThemes( layer, newLayer );
706+
updateLayerOrder( layer, newLayer );
707+
708+
706709
}
707710
return newLayer;
708711
}

0 commit comments

Comments
 (0)