Skip to content

Commit 39fcdb7

Browse files
committedJun 8, 2011
embedding of single layer
1 parent a579685 commit 39fcdb7

13 files changed

+260
-50
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,7 @@ void QgisApp::createActions()
779779
connect( mActionNewVectorLayer, SIGNAL( triggered() ), this, SLOT( newVectorLayer() ) );
780780
connect( mActionNewSpatialiteLayer, SIGNAL( triggered() ), this, SLOT( newSpatialiteLayer() ) );
781781
connect( mActionShowRasterCalculator, SIGNAL( triggered() ), this, SLOT( showRasterCalculator() ) );
782+
connect( mActionEmbedLayers, SIGNAL( triggered() ) , this, SLOT( embedLayers() ) );
782783
connect( mActionAddOgrLayer, SIGNAL( triggered() ), this, SLOT( addVectorLayer() ) );
783784
connect( mActionAddRasterLayer, SIGNAL( triggered() ), this, SLOT( addRasterLayer() ) );
784785
connect( mActionAddPgLayer, SIGNAL( triggered() ), this, SLOT( addDatabaseLayer() ) );
@@ -5048,6 +5049,16 @@ void QgisApp::addMapLayer( QgsMapLayer *theMapLayer )
50485049

50495050
}
50505051

5052+
void QgisApp::embedLayers()
5053+
{
5054+
//dialog to select groups/layers from other project files
5055+
5056+
//hardcoded for debugging
5057+
QString filepath="/home/marco/geodaten/projekte/composertest.qgs";
5058+
QString id="komb113320110516093016594";
5059+
QgsProject::instance()->createEmbeddedLayer( id, filepath );
5060+
}
5061+
50515062
void QgisApp::setExtent( QgsRectangle theRect )
50525063
{
50535064
mMapCanvas->setExtent( theRect );
@@ -6513,6 +6524,11 @@ void QgisApp::showLayerProperties( QgsMapLayer *ml )
65136524
if ( !ml )
65146525
return;
65156526

6527+
if( !QgsProject::instance()->layerIsEmbedded( ml->id() ).isEmpty() )
6528+
{
6529+
return; //don't show properties of embedded layers
6530+
}
6531+
65166532
if ( ml->type() == QgsMapLayer::RasterLayer )
65176533
{
65186534
QgsRasterLayerProperties *rlp = NULL; // See note above about reusing this
@@ -6525,6 +6541,7 @@ void QgisApp::showLayerProperties( QgsMapLayer *ml )
65256541
rlp = new QgsRasterLayerProperties( ml, mMapCanvas );
65266542
connect( rlp, SIGNAL( refreshLegend( QString, bool ) ), mMapLegend, SLOT( refreshLayerSymbology( QString, bool ) ) );
65276543
}
6544+
65286545
rlp->exec();
65296546
delete rlp; // delete since dialog cannot be reused without updating code
65306547
}

‎src/app/qgisapp.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
249249

250250
QAction *actionNewVectorLayer() { return mActionNewVectorLayer; }
251251
QAction *actionNewSpatialLiteLayer() { return mActionNewSpatialiteLayer; }
252+
QAction *actionEmbedLayers() { return mActionEmbedLayers; }
252253
QAction *actionAddOgrLayer() { return mActionAddOgrLayer; }
253254
QAction *actionAddRasterLayer() { return mActionAddRasterLayer; }
254255
QAction *actionAddPgLayer() { return mActionAddPgLayer; }
@@ -541,6 +542,7 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
541542
void fileNew( bool thePromptToSaveFlag );
542543
//! Calculate new rasters from existing ones
543544
void showRasterCalculator();
545+
void embedLayers();
544546

545547
//! Create a new empty vector layer
546548
void newVectorLayer();
@@ -763,6 +765,8 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
763765
//! Activates label property tool
764766
void changeLabelProperties();
765767

768+
769+
766770
signals:
767771
/** emitted when a key is pressed and we want non widget sublasses to be able
768772
to pick up on this (e.g. maplayer) */

‎src/core/qgsmaplayer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void QgsMapLayer::drawLabels( QgsRenderContext& rendererContext )
141141
// QgsDebugMsg("entered.");
142142
}
143143

144-
bool QgsMapLayer::readXML( QDomNode & layer_node )
144+
bool QgsMapLayer::readXML( const QDomNode& layer_node )
145145
{
146146
QgsCoordinateReferenceSystem savedCRS;
147147
CUSTOM_CRS_VALIDATION savedValidation;
@@ -269,7 +269,7 @@ bool QgsMapLayer::readXML( QDomNode & layer_node )
269269
} // void QgsMapLayer::readXML
270270

271271

272-
bool QgsMapLayer::readXml( QDomNode & layer_node )
272+
bool QgsMapLayer::readXml( const QDomNode& layer_node )
273273
{
274274
// NOP by default; children will over-ride with behavior specific to them
275275

‎src/core/qgsmaplayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
155155
156156
@returns true if successful
157157
*/
158-
bool readXML( QDomNode & layer_node );
158+
bool readXML( const QDomNode& layer_node );
159159

160160

161161
/** stores state in Dom node
@@ -378,7 +378,7 @@ class CORE_EXPORT QgsMapLayer : public QObject
378378
/** called by readXML(), used by children to read state specific to them from
379379
project files.
380380
*/
381-
virtual bool readXml( QDomNode & layer_node );
381+
virtual bool readXml( const QDomNode& layer_node );
382382

383383
/** called by writeXML(), used by children to write state specific to them to
384384
project files.

‎src/core/qgsproject.cpp

Lines changed: 198 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -682,54 +682,66 @@ QPair< bool, QList<QDomNode> > QgsProject::_getMapLayers( QDomDocument const &do
682682
QDomNode node = nl.item( i );
683683
QDomElement element = node.toElement();
684684

685-
QString type = element.attribute( "type" );
686-
687-
QgsDebugMsg( "Layer type is " + type );
688-
689-
QgsMapLayer *mapLayer = NULL;
690-
691-
if ( type == "vector" )
685+
if( element.attribute("embedded") == "1" )
692686
{
693-
mapLayer = new QgsVectorLayer;
687+
createEmbeddedLayer( element.attribute( "id" ), readPath( element.attribute( "project" ) ) );
688+
continue;
694689
}
695-
else if ( type == "raster" )
696-
{
697-
mapLayer = new QgsRasterLayer;
698-
}
699-
else if ( type == "plugin" )
690+
else
700691
{
701-
QString typeName = element.attribute( "name" );
702-
mapLayer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
703-
}
692+
#if 0
693+
QString type = element.attribute( "type" );
694+
QgsDebugMsg( "Layer type is " + type );
695+
QgsMapLayer *mapLayer = NULL;
696+
697+
if ( type == "vector" )
698+
{
699+
mapLayer = new QgsVectorLayer;
700+
}
701+
else if ( type == "raster" )
702+
{
703+
mapLayer = new QgsRasterLayer;
704+
}
705+
else if ( type == "plugin" )
706+
{
707+
QString typeName = element.attribute( "name" );
708+
mapLayer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
709+
}
704710

705-
Q_CHECK_PTR( mapLayer );
711+
Q_CHECK_PTR( mapLayer );
706712

707-
if ( !mapLayer )
708-
{
709-
QgsDebugMsg( "Unable to create layer" );
713+
if ( !mapLayer )
714+
{
715+
QgsDebugMsg( "Unable to create layer" );
710716

711-
return qMakePair( false, brokenNodes );
712-
}
717+
return qMakePair( false, brokenNodes );
718+
}
713719

714-
// have the layer restore state that is stored in Dom node
715-
if ( mapLayer->readXML( node ) && mapLayer->isValid() )
716-
{
717-
mapLayer = QgsMapLayerRegistry::instance()->addMapLayer( mapLayer );
718-
QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
719-
if ( vLayer && vLayer->vectorJoins().size() > 0 )
720+
// have the layer restore state that is stored in Dom node
721+
if ( mapLayer->readXML( node ) && mapLayer->isValid() )
720722
{
721-
vLayerList.push_back( qMakePair( vLayer, element ) );
723+
mapLayer = QgsMapLayerRegistry::instance()->addMapLayer( mapLayer );
724+
QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
725+
if ( vLayer && vLayer->vectorJoins().size() > 0 )
726+
{
727+
vLayerList.push_back( qMakePair( vLayer, element ) );
728+
}
722729
}
723-
}
724-
else
725-
{
726-
delete mapLayer;
730+
else
731+
{
732+
delete mapLayer;
727733

728-
QgsDebugMsg( "Unable to load " + type + " layer" );
734+
QgsDebugMsg( "Unable to load " + type + " layer" );
729735

730-
returnStatus = false; // flag that we had problems loading layers
736+
returnStatus = false; // flag that we had problems loading layers
731737

732-
brokenNodes.push_back( node );
738+
brokenNodes.push_back( node );
739+
}
740+
#endif //0
741+
if( !addLayer( element, brokenNodes, vLayerList ) )
742+
{
743+
returnStatus = false;
744+
}
733745
}
734746
emit layerLoaded( i + 1, nl.count() );
735747
}
@@ -754,6 +766,55 @@ QPair< bool, QList<QDomNode> > QgsProject::_getMapLayers( QDomDocument const &do
754766
} // _getMapLayers
755767

756768

769+
bool QgsProject::addLayer( const QDomElement& layerElem, QList<QDomNode>& brokenNodes, QList< QPair< QgsVectorLayer*, QDomElement > >& vectorLayerList )
770+
{
771+
QString type = layerElem.attribute( "type" );
772+
QgsDebugMsg( "Layer type is " + type );
773+
QgsMapLayer *mapLayer = NULL;
774+
775+
if ( type == "vector" )
776+
{
777+
mapLayer = new QgsVectorLayer;
778+
}
779+
else if ( type == "raster" )
780+
{
781+
mapLayer = new QgsRasterLayer;
782+
}
783+
else if ( type == "plugin" )
784+
{
785+
QString typeName = layerElem.attribute( "name" );
786+
mapLayer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
787+
}
788+
789+
Q_CHECK_PTR( mapLayer );
790+
791+
if ( !mapLayer )
792+
{
793+
QgsDebugMsg( "Unable to create layer" );
794+
795+
return false;
796+
}
797+
798+
// have the layer restore state that is stored in Dom node
799+
if ( mapLayer->readXML( layerElem ) && mapLayer->isValid() )
800+
{
801+
mapLayer = QgsMapLayerRegistry::instance()->addMapLayer( mapLayer );
802+
QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( mapLayer );
803+
if ( vLayer && vLayer->vectorJoins().size() > 0 )
804+
{
805+
vectorLayerList.push_back( qMakePair( vLayer, layerElem ) );
806+
}
807+
return true;
808+
}
809+
else
810+
{
811+
delete mapLayer;
812+
813+
QgsDebugMsg( "Unable to load " + type + " layer" );
814+
brokenNodes.push_back( layerElem );
815+
return false;
816+
}
817+
}
757818

758819

759820
/**
@@ -1022,7 +1083,19 @@ bool QgsProject::write()
10221083

10231084
if ( ml )
10241085
{
1025-
ml->writeXML( projectLayersNode, *doc );
1086+
QString externalProjectFile = layerIsEmbedded( ml->id() );
1087+
if( externalProjectFile.isEmpty() )
1088+
{
1089+
ml->writeXML( projectLayersNode, *doc );
1090+
}
1091+
else //layer defined in an external project file
1092+
{
1093+
QDomElement mapLayerElem = doc->createElement("maplayer");
1094+
mapLayerElem.setAttribute("embedded", 1 );
1095+
mapLayerElem.setAttribute("project", writePath( externalProjectFile ) );
1096+
mapLayerElem.setAttribute("id", ml->id() );
1097+
projectLayersNode.appendChild( mapLayerElem );
1098+
}
10261099
}
10271100
li++;
10281101
}
@@ -1529,6 +1602,94 @@ void QgsProject::setBadLayerHandler( QgsProjectBadLayerHandler* handler )
15291602
mBadLayerHandler = handler;
15301603
}
15311604

1605+
void QgsProject::addEmbeddedLayer( const QString& layerId, const QString& projectFilePath )
1606+
{
1607+
mEmbeddedLayers.insert( layerId, projectFilePath );
1608+
}
1609+
1610+
QString QgsProject::layerIsEmbedded( const QString& id ) const
1611+
{
1612+
QHash< QString, QString >::const_iterator it = mEmbeddedLayers.find( id );
1613+
if( it == mEmbeddedLayers.constEnd() )
1614+
{
1615+
return QString();
1616+
}
1617+
return it.value();
1618+
};
1619+
1620+
QgsMapLayer* QgsProject::createEmbeddedLayer( const QString& layerId, const QString& projectFilePath )
1621+
{
1622+
QFile projectFile( projectFilePath );
1623+
if( !projectFile.open( QIODevice::ReadOnly ) )
1624+
{
1625+
return 0;
1626+
}
1627+
1628+
QDomDocument projectDocument;
1629+
if( !projectDocument.setContent( &projectFile ) )
1630+
{
1631+
return 0;
1632+
}
1633+
1634+
QDomElement projectLayersElem = projectDocument.documentElement().firstChildElement("projectlayers");
1635+
if( projectLayersElem.isNull() )
1636+
{
1637+
return 0;
1638+
}
1639+
1640+
QDomNodeList mapLayerNodes = projectLayersElem.elementsByTagName("maplayer");
1641+
for( int i = 0; i < mapLayerNodes.size(); ++i )
1642+
{
1643+
//get layer id
1644+
QDomElement mapLayerElem = mapLayerNodes.at(i).toElement();
1645+
QString id = mapLayerElem.firstChildElement("id").text();
1646+
if( id == layerId )
1647+
{
1648+
#if 0
1649+
if( !addLayer( element, brokenNodes, vLayerList ) )
1650+
{
1651+
returnStatus = false;
1652+
}
1653+
#endif //0
1654+
QString type = mapLayerElem.attribute("type");
1655+
QgsMapLayer* layer = 0;
1656+
if( type == "vector" )
1657+
{
1658+
layer = new QgsVectorLayer();
1659+
}
1660+
else if( type == "raster" )
1661+
{
1662+
layer = new QgsRasterLayer();
1663+
}
1664+
else if( type == "plugin" )
1665+
{
1666+
QString typeName = mapLayerElem.attribute( "name" );
1667+
layer = QgsPluginLayerRegistry::instance()->createLayer( typeName );
1668+
}
1669+
else
1670+
{
1671+
return 0;
1672+
}
1673+
1674+
// have the layer restore state that is stored in Dom node
1675+
if ( layer->readXML( mapLayerElem ) )
1676+
{
1677+
QgsMapLayerRegistry::instance()->addMapLayer( layer );
1678+
QgsProject::instance()->addEmbeddedLayer( layerId, projectFilePath );
1679+
}
1680+
else
1681+
{
1682+
delete layer;
1683+
QgsDebugMsg( "unable to load " + type + " layer" );
1684+
return 0;
1685+
}
1686+
return layer;
1687+
}
1688+
}
1689+
1690+
return 0;
1691+
}
1692+
15321693
void QgsProjectBadLayerDefaultHandler::handleBadLayers( QList<QDomNode> /*layers*/, QDomDocument /*projectDom*/ )
15331694
{
15341695
// just ignore any bad layers

0 commit comments

Comments
 (0)