Skip to content

Commit b84327d

Browse files
committedNov 16, 2011
Merge remote-tracking branch 'upstream/master'
2 parents f0d6cea + 275585c commit b84327d

File tree

3 files changed

+113
-101
lines changed

3 files changed

+113
-101
lines changed
 

‎python/CMakeLists.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
ADD_SUBDIRECTORY(plugins)
22

3-
43
SET (PYTHON_OUTPUT_DIRECTORY ${QGIS_OUTPUT_DIRECTORY}/python)
54
SET (QGIS_PYTHON_OUTPUT_DIRECTORY ${PYTHON_OUTPUT_DIRECTORY}/qgis)
65

@@ -99,6 +98,12 @@ SET (QGIS_PYTHON_DIR ${PYTHON_SITE_PACKAGES_DIR}/qgis)
9998

10099
ADD_CUSTOM_TARGET(compile_python_files ALL)
101100

101+
ADD_CUSTOM_COMMAND(TARGET compile_python_files
102+
POST_BUILD
103+
COMMAND ${CMAKE_COMMAND} -E make_directory ${QGIS_PYTHON_OUTPUT_DIRECTORY}
104+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
105+
)
106+
102107
FOREACH(file __init__.py utils.py console.py)
103108
ADD_CUSTOM_COMMAND(TARGET compile_python_files
104109
POST_BUILD

‎src/mapserver/qgsprojectparser.cpp

Lines changed: 104 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,14 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
173173
QgsDebugMsg( QString( "Project path: %1" ).arg( project ) );
174174
QString embeddedGroupName = currentChildElem.attribute( "name" );
175175
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
176+
QList<QDomElement> embededGroupElements = p->mLegendGroupElements;
176177
if ( p )
177178
{
178179
QStringList pIdDisabled = p->identifyDisabledLayers();
179180

180181
QDomElement embeddedGroupElem;
181-
QList<QDomElement>::const_iterator pLegendIt = mLegendGroupElements.constBegin();
182-
for ( ; pLegendIt != mLegendGroupElements.constEnd(); ++pLegendIt )
182+
QList<QDomElement>::const_iterator pLegendIt = embededGroupElements.constBegin();
183+
for ( ; pLegendIt != embededGroupElements.constEnd(); ++pLegendIt )
183184
{
184185
if ( pLegendIt->attribute( "name" ) == embeddedGroupName )
185186
{
@@ -189,8 +190,9 @@ void QgsProjectParser::addLayers( QDomDocument &doc,
189190
}
190191

191192
QMap<QString, QgsMapLayer *> pLayerMap;
192-
QList<QDomElement>::const_iterator pLayerIt = mProjectLayerElements.constBegin();
193-
for ( ; pLayerIt != mProjectLayerElements.constEnd(); ++pLayerIt )
193+
QList<QDomElement> embededProjectLayerElements = p->mProjectLayerElements;
194+
QList<QDomElement>::const_iterator pLayerIt = embededProjectLayerElements.constBegin();
195+
for ( ; pLayerIt != embededProjectLayerElements.constEnd(); ++pLayerIt )
194196
{
195197
pLayerMap.insert( layerId( *pLayerIt ), p->createLayerFromElement( *pLayerIt ) );
196198
}
@@ -327,17 +329,10 @@ void QgsProjectParser::combineExtentAndCrsOfGroupChildren( QDomElement& groupEle
327329
QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool useCache ) const
328330
{
329331
Q_UNUSED( styleName );
330-
Q_UNUSED( useCache );
331332
QList<QgsMapLayer*> layerList;
332333

333-
//Check if layer name refers to the top level group for the project.
334-
if ( lName == projectTitle() )
334+
if ( !mXMLDoc )
335335
{
336-
QList<QDomElement>::const_iterator layerElemIt = mProjectLayerElements.constBegin();
337-
for ( ; layerElemIt != mProjectLayerElements.constEnd(); ++layerElemIt )
338-
{
339-
layerList.push_back( createLayerFromElement( *layerElemIt, useCache ) );
340-
}
341336
return layerList;
342337
}
343338

@@ -353,118 +348,126 @@ QList<QgsMapLayer*> QgsProjectParser::mapLayerFromStyle( const QString& lName, c
353348
}
354349
}
355350

356-
//maybe the layer is a goup. Check if lName is contained in the group list
357-
QList<QDomElement>::const_iterator groupIt = mLegendGroupElements.constBegin();
358-
for ( ; groupIt != mLegendGroupElements.constEnd(); ++groupIt )
351+
//group or project name
352+
QDomElement groupElement;
353+
if ( lName == projectTitle() )
359354
{
360-
if ( groupIt->attribute( "name" ) == lName )
355+
groupElement = mXMLDoc->documentElement().firstChildElement( "legend" );
356+
}
357+
else
358+
{
359+
QList<QDomElement>::const_iterator groupIt = mLegendGroupElements.constBegin();
360+
for ( ; groupIt != mLegendGroupElements.constEnd(); ++groupIt )
361361
{
362-
if ( groupIt->attribute( "embedded" ) == "1" ) //requested group is embedded from another project
362+
if ( groupIt->attribute( "name" ) == lName )
363363
{
364-
QString project = convertToAbsolutePath( groupIt->attribute( "project" ) );
365-
QgsDebugMsg( QString( "Project path: %1" ).arg( project ) );
366-
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
367-
if ( p )
368-
{
369-
QList<QDomElement>::const_iterator pGroupIt = mLegendGroupElements.constBegin();
370-
QDomElement embeddedGroupElem;
364+
groupElement = *groupIt;
365+
break;
366+
}
367+
}
368+
}
371369

372-
for ( ; pGroupIt != mLegendGroupElements.constEnd(); ++pGroupIt )
373-
{
374-
if ( pGroupIt->attribute( "name" ) == lName )
375-
{
376-
embeddedGroupElem = *pGroupIt;
377-
break;
378-
}
379-
}
370+
if ( !groupElement.isNull() )
371+
{
372+
//embedded group has no children in this project file
373+
if ( groupElement.attribute( "embedded" ) == "1" )
374+
{
375+
addLayersFromGroup( groupElement, layerList, useCache );
376+
return layerList;
377+
}
380378

381-
if ( !embeddedGroupElem.isNull() )
382-
{
383-
//add all the layers under the group
384-
QDomNodeList pLayerNodes = embeddedGroupElem.elementsByTagName( "legendlayer" );
385-
for ( int i = 0; i < pLayerNodes.size(); ++i )
386-
{
387-
QString pLayerId = pLayerNodes.at( i ).toElement().firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" );
388-
QgsMapLayer* pLayer = p->createLayerFromElement( mProjectLayerElementsById[pLayerId], useCache );
389-
if ( pLayer )
390-
{
391-
layerList.push_back( pLayer );
392-
}
393-
}
394-
}
395-
}
379+
//group element found, iterate children and call addLayersFromGroup / addLayerFromLegendLayer for each
380+
QDomNodeList childList = groupElement.childNodes();
381+
for ( uint i = 0; i < childList.length(); ++i )
382+
{
383+
QDomElement childElem = childList.at( i ).toElement();
384+
if ( childElem.tagName() == "legendgroup" )
385+
{
386+
addLayersFromGroup( childElem, layerList, useCache );
396387
}
397-
else //normal (not embedded) group
388+
else if ( childElem.tagName() == "legendlayer" )
398389
{
399-
QDomNodeList layerFileList = groupIt->elementsByTagName( "legendlayerfile" );
400-
for ( int i = 0; i < layerFileList.size(); ++i )
401-
{
402-
QHash< QString, QDomElement >::const_iterator layerEntry = mProjectLayerElementsById.find( layerFileList.at( i ).toElement().attribute( "layerid" ) );
403-
if ( layerEntry != mProjectLayerElementsById.constEnd() )
404-
{
405-
layerList.push_back( createLayerFromElement( layerEntry.value(), useCache ) );
406-
}
407-
}
390+
addLayerFromLegendLayer( childElem, layerList, useCache );
408391
}
409-
return layerList;
410392
}
393+
return layerList;
411394
}
412395

413-
//maybe the layer is embedded from another project
414-
QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById.constBegin();
415-
for ( ; layerIt != mProjectLayerElementsById.constEnd(); ++layerIt )
396+
//still not found. Check if it is a single embedded layer (embedded layers are not contained in mProjectLayerElementsByName)
397+
QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" );
398+
QDomNodeList legendLayerList = legendElement.elementsByTagName( "legendlayer" );
399+
for ( int i = 0; i < legendLayerList.size(); ++i )
416400
{
417-
if ( layerIt.value().attribute( "embedded" ) == "1" )
401+
QDomElement legendLayerElem = legendLayerList.at( i ).toElement();
402+
if ( legendLayerElem.attribute( "name" ) == lName )
418403
{
419-
QString id = layerIt.value().attribute( "id" );
420-
QString project = layerIt.value().attribute( "project" );
421-
QgsDebugMsg( QString( "Project path: %1" ).arg( project ) );
404+
addLayerFromLegendLayer( legendLayerElem, layerList, useCache );
405+
}
406+
}
422407

423-
//get config parser from cache
424-
QgsProjectParser* otherParser = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
425-
if ( otherParser )
408+
return layerList;
409+
}
410+
411+
void QgsProjectParser::addLayersFromGroup( const QDomElement& legendGroupElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
412+
{
413+
if ( legendGroupElem.attribute( "embedded" ) == "1" ) //embedded group
414+
{
415+
//get project parser
416+
//get group elements from project parser, find the group
417+
//iterate over layers and add them (embedding in embedded groups does not work)
418+
QString groupName = legendGroupElem.attribute( "name" );
419+
QString project = legendGroupElem.attribute( "project" );
420+
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
421+
if ( !p )
422+
{
423+
return;
424+
}
425+
426+
QList<QDomElement> pLegendGroupElems = p->mLegendGroupElements;
427+
QList<QDomElement>::const_iterator pGroupIt = pLegendGroupElems.constBegin();
428+
for ( ; pGroupIt != pLegendGroupElems.constEnd(); ++pGroupIt )
429+
{
430+
if ( pGroupIt->attribute( "name" ) == groupName )
426431
{
427-
//get element by id
428-
QHash< QString, QDomElement >::const_iterator otherLayerIt = otherParser->mProjectLayerElementsById.find( id );
429-
if ( otherLayerIt != otherParser->mProjectLayerElementsById.constEnd() )
430-
{
431-
if ( otherLayerIt.value().firstChildElement( "layername" ).text() == lName )
432-
{
433-
layerList.push_back( otherParser->createLayerFromElement( otherLayerIt.value(), useCache ) );
434-
return layerList;
435-
}
436-
}
432+
p->addLayersFromGroup( *pGroupIt, layerList, useCache );
433+
return;
437434
}
438435
}
439436
}
440-
441-
//layer still not found. Check if it is a single layer contained in a embedded layer group
442-
groupIt = mLegendGroupElements.constBegin();
443-
for ( ; groupIt != mLegendGroupElements.constEnd(); ++groupIt )
437+
else //normal group
444438
{
445-
if ( groupIt->attribute( "embedded" ) == "1" )
439+
QDomNodeList groupElemChildren = legendGroupElem.childNodes();
440+
for ( int i = 0; i < groupElemChildren.size(); ++i )
446441
{
447-
QString project = convertToAbsolutePath( groupIt->attribute( "project" ) );
448-
QgsDebugMsg( QString( "Project path: %1" ).arg( project ) );
449-
QgsProjectParser* p = dynamic_cast<QgsProjectParser*>( QgsConfigCache::instance()->searchConfiguration( project ) );
450-
if ( p )
442+
QDomElement elem = groupElemChildren.at( i ).toElement();
443+
if ( elem.tagName() == "legendgroup" )
451444
{
452-
QHash< QString, QDomElement >::const_iterator pLayerIt = mProjectLayerElementsByName.find( lName );
453-
if ( pLayerIt != mProjectLayerElementsByName.constEnd() )
454-
{
455-
QgsMapLayer* layer = p->createLayerFromElement( pLayerIt.value() );
456-
if ( layer )
457-
{
458-
layerList.push_back( layer );
459-
return layerList;
460-
}
461-
}
445+
addLayersFromGroup( elem, layerList, useCache );
446+
}
447+
else if ( elem.tagName() == "legendlayer" )
448+
{
449+
addLayerFromLegendLayer( elem, layerList, useCache );
462450
}
463451
}
464452
}
453+
}
465454

466-
//layer not found, return empty list
467-
return layerList;
455+
void QgsProjectParser::addLayerFromLegendLayer( const QDomElement& legendLayerElem, QList<QgsMapLayer*>& layerList, bool useCache ) const
456+
{
457+
//get layer id
458+
//search dom element for <maplayer> element
459+
//call createLayerFromElement()
460+
461+
QString id = legendLayerElem.firstChild().firstChild().toElement().attribute( "layerid" );
462+
QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById.find( id );
463+
if ( layerIt != mProjectLayerElementsById.constEnd() )
464+
{
465+
QgsMapLayer* layer = createLayerFromElement( layerIt.value(), useCache );
466+
if ( layer )
467+
{
468+
layerList.append( layer );
469+
}
470+
}
468471
}
469472

470473
int QgsProjectParser::layersAndStyles( QStringList& layers, QStringList& styles ) const
@@ -872,7 +875,8 @@ QString QgsProjectParser::layerId( const QDomElement& layerElem ) const
872875
QDomElement idElem = layerElem.firstChildElement( "id" );
873876
if ( idElem.isNull() )
874877
{
875-
return QString();
878+
//embedded layer have id attribute instead of id child element
879+
return layerElem.attribute( "id" );
876880
}
877881
return idElem.text();
878882
}

‎src/mapserver/qgsprojectparser.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,9 @@ class QgsProjectParser: public QgsConfigParser
124124
/**Creates a maplayer object from <maplayer> element. The layer cash owns the maplayer, so don't delete it
125125
@return the maplayer or 0 in case of error*/
126126
QgsMapLayer* createLayerFromElement( const QDomElement& elem, bool useCache = true ) const;
127+
/**Adds layers from a legend group to list (could be embedded or a normal group)*/
128+
void addLayersFromGroup( const QDomElement& legendGroupElem, QList<QgsMapLayer*>& layerList, bool useCache = true ) const;
129+
void addLayerFromLegendLayer( const QDomElement& legendLayerElem, QList<QgsMapLayer*>& layerList, bool useCache = true ) const;
127130
/**Returns the text of the <id> element for a layer element
128131
@return id or a null string in case of error*/
129132
QString layerId( const QDomElement& layerElem ) const;

0 commit comments

Comments
 (0)
Please sign in to comment.