Skip to content

Commit

Permalink
Merge pull request #32666 from pblottiere/fix_emblayer_qgz
Browse files Browse the repository at this point in the history
Read qgz project when embedding layers/groups. Fixes #28280
  • Loading branch information
pblottiere committed Nov 20, 2019
2 parents 0e110cf + 0aea46b commit e8b38c3
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 3 deletions.
10 changes: 9 additions & 1 deletion src/core/qgslayerdefinition.cpp
Expand Up @@ -442,8 +442,16 @@ QgsLayerDefinition::DependencySorter::DependencySorter( const QString &fileName
: mHasCycle( false )
, mHasMissingDependency( false )
{
QString qgsProjectFile = fileName;
QgsProjectArchive archive;
if ( fileName.endsWith( QLatin1String( ".qgz" ), Qt::CaseInsensitive ) )
{
archive.unzip( fileName );
qgsProjectFile = archive.projectFile();
}

QDomDocument doc;
QFile pFile( fileName );
QFile pFile( qgsProjectFile );
( void )pFile.open( QIODevice::ReadOnly );
( void )doc.setContent( &pFile );
init( doc );
Expand Down
20 changes: 18 additions & 2 deletions src/core/qgsproject.cpp
Expand Up @@ -2475,13 +2475,21 @@ bool QgsProject::createEmbeddedLayer( const QString &layerId, const QString &pro
static QDateTime sPrevProjectFileTimestamp;
static QDomDocument sProjectDocument;

QString qgsProjectFile = projectFilePath;
QgsProjectArchive archive;
if ( projectFilePath.endsWith( QLatin1String( ".qgz" ), Qt::CaseInsensitive ) )
{
archive.unzip( projectFilePath );
qgsProjectFile = archive.projectFile();
}

QDateTime projectFileTimestamp = QFileInfo( projectFilePath ).lastModified();

if ( projectFilePath != sPrevProjectFilePath || projectFileTimestamp != sPrevProjectFileTimestamp )
{
sPrevProjectFilePath.clear();

QFile projectFile( projectFilePath );
QFile projectFile( qgsProjectFile );
if ( !projectFile.open( QIODevice::ReadOnly ) )
{
return false;
Expand Down Expand Up @@ -2555,8 +2563,16 @@ bool QgsProject::createEmbeddedLayer( const QString &layerId, const QString &pro

QgsLayerTreeGroup *QgsProject::createEmbeddedGroup( const QString &groupName, const QString &projectFilePath, const QStringList &invisibleLayers, QgsProject::ReadFlags flags )
{
QString qgsProjectFile = projectFilePath;
QgsProjectArchive archive;
if ( projectFilePath.endsWith( QLatin1String( ".qgz" ), Qt::CaseInsensitive ) )
{
archive.unzip( projectFilePath );
qgsProjectFile = archive.projectFile();
}

// open project file, get layer ids in group, add the layers
QFile projectFile( projectFilePath );
QFile projectFile( qgsProjectFile );
if ( !projectFile.open( QIODevice::ReadOnly ) )
{
return nullptr;
Expand Down
19 changes: 19 additions & 0 deletions tests/src/core/testqgsproject.cpp
Expand Up @@ -46,6 +46,7 @@ class TestQgsProject : public QObject
void testLocalUrlFiles();
void testReadFlags();
void testSetGetCrs();
void testEmbeddedLayerGroupFromQgz();
};

void TestQgsProject::init()
Expand Down Expand Up @@ -466,6 +467,24 @@ void TestQgsProject::testReadFlags()
QCOMPARE( p3.layoutManager()->layouts().count(), 0 );
}

void TestQgsProject::testEmbeddedLayerGroupFromQgz()
{
QString path = QString( TEST_DATA_DIR ) + QStringLiteral( "/embedded_groups/project1.qgz" );
QList<QDomNode> brokenNodes;

QgsProject p0;
p0.read( path );
QgsMapLayer *points = p0.mapLayersByName( "points" )[0];
QgsMapLayer *polys = p0.mapLayersByName( "polys" )[0];

QgsProject p1;
p1.createEmbeddedLayer( points->id(), p0.fileName(), brokenNodes );
p1.createEmbeddedGroup( "group1", p0.fileName(), QStringList() );

QCOMPARE( p1.layerIsEmbedded( points->id() ), path );
QCOMPARE( p1.layerIsEmbedded( polys->id() ), path );
}

void TestQgsProject::testSetGetCrs()
{
QgsProject p;
Expand Down
7 changes: 7 additions & 0 deletions tests/src/python/test_qgslayerdefinition.py
Expand Up @@ -10,6 +10,7 @@
__date__ = '07/01/2016'
__copyright__ = 'Copyright 2016, The QGIS Project'

import os
import qgis # NOQA

from qgis.core import (QgsProject,
Expand Down Expand Up @@ -52,6 +53,12 @@ def testDependency(self):
self.assertEqual(nodeIds[0], "layerA")
self.assertEqual(nodeIds[1], "layerB")

def testDependencyQgz(self):
path = os.path.join(TEST_DATA_DIR, "embedded_groups", "project1.qgz")
dep = QgsLayerDefinition.DependencySorter(path)
ids = dep.sortedLayerIds()
self.assertEqual(len(ids), 3)

def testMissingDependency(self):
inDoc = """
<maplayers>
Expand Down
Binary file added tests/testdata/embedded_groups/project1.qgz
Binary file not shown.

0 comments on commit e8b38c3

Please sign in to comment.