Skip to content

Commit 317a509

Browse files
committed
Support multi layers in QLR files
1 parent 1b49a47 commit 317a509

File tree

4 files changed

+54
-46
lines changed

4 files changed

+54
-46
lines changed

python/core/qgsmaplayer.sip

+3-3
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,12 @@ class QgsMapLayer : QObject
209209

210210
Layer definitions can be used to load a layer and styling all from a single file.
211211
*/
212-
QDomDocument asLayerDefinition( );
212+
static QDomDocument asLayerDefinition( QList<QgsMapLayer*> layers );
213213

214214
/** Creates a new layer from a layer defininition document
215215
*/
216-
static QgsMapLayer* fromLayerDefinition( QDomDocument& document );
217-
static QgsMapLayer* fromLayerDefinitionFile( const QString qlrfile );
216+
static QList<QgsMapLayer*> fromLayerDefinition( QDomDocument& document );
217+
static QList<QgsMapLayer*> fromLayerDefinitionFile( const QString qlrfile );
218218

219219
/** Set a custom property for layer. Properties are stored in a map and saved in project file.
220220
* @note Added in v1.4 */

src/app/qgisapp.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -2462,9 +2462,8 @@ void QgisApp::addLayerDefinition()
24622462
if ( path.isEmpty() )
24632463
return;
24642464

2465-
QgsMapLayer* layer = QgsMapLayer::fromLayerDefinitionFile( path );
2466-
if ( layer && layer->isValid() )
2467-
QgsMapLayerRegistry::instance()->addMapLayer( layer );
2465+
QList<QgsMapLayer*> layers = QgsMapLayer::fromLayerDefinitionFile( path );
2466+
QgsMapLayerRegistry::instance()->addMapLayers( layers );
24682467
}
24692468

24702469
/**
@@ -4596,16 +4595,17 @@ void QgisApp::saveAsFile()
45964595

45974596
void QgisApp::saveAsLayerDefinition()
45984597
{
4599-
QgsMapLayer* layer = activeLayer();
4600-
if ( !layer )
4598+
QList<QgsMapLayer*> layers = mMapLegend->selectedLayers();
4599+
4600+
if ( layers.isEmpty() )
46014601
return;
46024602

46034603
QString path = QFileDialog::getSaveFileName( this, "Save as Layer Definition File", QDir::home().path(), "*.qlr" );
46044604
QgsDebugMsg( path );
46054605
if ( path.isEmpty() )
46064606
return;
46074607

4608-
QDomDocument doc = layer->asLayerDefinition();
4608+
QDomDocument doc = QgsMapLayer::asLayerDefinition( layers );
46094609
QFile file( path );
46104610
if ( file.open( QFile::WriteOnly | QFile::Truncate ) )
46114611
{

src/core/qgsmaplayer.cpp

+41-33
Original file line numberDiff line numberDiff line change
@@ -596,61 +596,69 @@ bool QgsMapLayer::writeLayerXML( QDomElement& layerElement, QDomDocument& docume
596596

597597
} // bool QgsMapLayer::writeXML
598598

599-
QDomDocument QgsMapLayer::asLayerDefinition()
599+
QDomDocument QgsMapLayer::asLayerDefinition( QList<QgsMapLayer *> layers )
600600
{
601601
QDomDocument doc( "qgis-layer-definition" );
602-
QDomElement maplayer = doc.createElement( "maplayer" );
603-
this->writeLayerXML( maplayer, doc );
604-
maplayer.removeChild( maplayer.firstChildElement( "id" ) );
605-
doc.appendChild( maplayer );
602+
QDomElement layerselm = doc.createElement( "maplayers" );
603+
foreach( QgsMapLayer* layer, layers)
604+
{
605+
QDomElement layerelm = doc.createElement( "maplayer" );
606+
layer->writeLayerXML( layerelm, doc );
607+
layerelm.removeChild( layerelm.firstChildElement( "id" ) );
608+
layerselm.appendChild( layerelm );
609+
}
610+
doc.appendChild( layerselm );
606611
return doc;
607612
}
608613

609-
QgsMapLayer* QgsMapLayer::fromLayerDefinition( QDomDocument& document )
614+
QList<QgsMapLayer*> QgsMapLayer::fromLayerDefinition( QDomDocument& document )
610615
{
611-
QDomNode layernode = document.elementsByTagName( "maplayer" ).at( 0 );
612-
QDomElement layerElem = layernode.toElement();
613-
614-
QString type = layerElem.attribute( "type" );
615-
QgsDebugMsg( type );
616-
QgsMapLayer *layer = NULL;
617-
618-
if ( type == "vector" )
616+
QList<QgsMapLayer*> layers;
617+
QDomNodeList layernodes = document.elementsByTagName( "maplayer" );
618+
for ( int i = 0; i < layernodes.size(); ++i )
619619
{
620-
layer = new QgsVectorLayer;
621-
}
622-
else if ( type == "raster" )
623-
{
624-
layer = new QgsRasterLayer;
625-
}
626-
else if ( type == "plugin" )
627-
{
628-
QString typeName = layerElem.attribute( "name" );
629-
layer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
630-
}
620+
QDomNode layernode = layernodes.at(i);
621+
QDomElement layerElem = layernode.toElement();
631622

632-
bool ok = layer->readLayerXML( layerElem );
633-
if ( ok )
634-
return layer;
623+
QString type = layerElem.attribute( "type" );
624+
QgsDebugMsg( type );
625+
QgsMapLayer *layer = NULL;
635626

636-
delete layer;
637-
return 0;
627+
if ( type == "vector" )
628+
{
629+
layer = new QgsVectorLayer;
630+
}
631+
else if ( type == "raster" )
632+
{
633+
layer = new QgsRasterLayer;
634+
}
635+
else if ( type == "plugin" )
636+
{
637+
QString typeName = layerElem.attribute( "name" );
638+
layer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
639+
}
640+
641+
bool ok = layer->readLayerXML( layerElem );
642+
if ( ok )
643+
layers << layer;
644+
}
645+
return layers;
638646
}
639647

640-
QgsMapLayer* QgsMapLayer::fromLayerDefinitionFile( const QString qlrfile )
648+
QList<QgsMapLayer *> QgsMapLayer::fromLayerDefinitionFile( const QString qlrfile )
641649
{
642650
QFile file( qlrfile );
643651
if ( !file.open( QIODevice::ReadOnly ) )
644652
{
645653
QgsDebugMsg( "Can't open file" );
646-
return 0;
654+
return QList<QgsMapLayer*>();
647655
}
648656

649657
QDomDocument doc;
650658
if ( !doc.setContent( &file ) )
651659
{
652660
QgsDebugMsg( "Can't set content" );
653-
return 0;
661+
return QList<QgsMapLayer*>();
654662
}
655663

656664
return QgsMapLayer::fromLayerDefinition( doc );

src/core/qgsmaplayer.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,17 @@ class CORE_EXPORT QgsMapLayer : public QObject
218218
*/
219219
bool writeLayerXML( QDomElement& layerElement, QDomDocument& document );
220220

221-
/** Returns the layer as a layer definition document
221+
/** Returns the given layer as a layer definition document
222222
Layer definitions store the data source as well as styling and custom properties.
223223
224224
Layer definitions can be used to load a layer and styling all from a single file.
225225
*/
226-
QDomDocument asLayerDefinition( );
226+
static QDomDocument asLayerDefinition( QList<QgsMapLayer*> layers );
227227

228228
/** Creates a new layer from a layer defininition document
229229
*/
230-
static QgsMapLayer* fromLayerDefinition( QDomDocument& document );
231-
static QgsMapLayer* fromLayerDefinitionFile( const QString qlrfile );
230+
static QList<QgsMapLayer*> fromLayerDefinition( QDomDocument& document );
231+
static QList<QgsMapLayer*> fromLayerDefinitionFile( const QString qlrfile );
232232

233233
/** Set a custom property for layer. Properties are stored in a map and saved in project file.
234234
* @note Added in v1.4 */

0 commit comments

Comments
 (0)