Skip to content

Commit 097881f

Browse files
committed
Add support for embedded legend groups
1 parent 57aca16 commit 097881f

File tree

5 files changed

+82
-11
lines changed

5 files changed

+82
-11
lines changed

src/app/legend/qgslegend.cpp

+71
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,77 @@ Qt::CheckState QgsLegend::layerCheckState( QgsMapLayer * layer )
611611
return ll ? ll->checkState( 0 ) : Qt::Unchecked;
612612
}
613613

614+
void QgsLegend::addEmbeddedGroup( const QString& groupName, const QString& projectFilePath, QgsLegendItem* parent )
615+
{
616+
mEmbeddedGroups.insert( groupName, projectFilePath );
617+
618+
//open project file, get layer ids in group, add the layers
619+
QFile projectFile( projectFilePath );
620+
if( !projectFile.open( QIODevice::ReadOnly ) )
621+
{
622+
return;
623+
}
624+
625+
QDomDocument projectDocument;
626+
if( !projectDocument.setContent( &projectFile ) )
627+
{
628+
return;
629+
}
630+
631+
QDomElement legendElem = projectDocument.documentElement().firstChildElement("legend");
632+
if( legendElem.isNull() )
633+
{
634+
return;
635+
}
636+
637+
QList<QDomNode> brokenNodes;
638+
QList< QPair< QgsVectorLayer*, QDomElement > > vectorLayerList;
639+
QSettings settings;
640+
641+
QDomNodeList legendGroupList = legendElem.elementsByTagName("legendgroup");
642+
for( int i = 0; i < legendGroupList.size(); ++i )
643+
{
644+
QDomElement legendElem = legendGroupList.at(i).toElement();
645+
if( legendElem.attribute("name") == groupName )
646+
{
647+
QgsLegendGroup* group = 0;
648+
if( parent )
649+
{
650+
group = new QgsLegendGroup( parent, groupName );
651+
}
652+
else
653+
{
654+
group = new QgsLegendGroup( this, groupName );
655+
}
656+
657+
QFont groupFont;
658+
groupFont.setItalic( true );
659+
group->setFont( 0, groupFont );
660+
setCurrentItem( group );
661+
662+
QDomNodeList groupChildren = legendElem.childNodes();
663+
for( int j = 0; j < groupChildren.size(); ++j )
664+
{
665+
QDomElement childElem = groupChildren.at( j ).toElement();
666+
QString tagName = childElem.tagName();
667+
if( tagName == "legendlayer" )
668+
{
669+
QString layerId = childElem.firstChildElement("filegroup").firstChildElement("legendlayerfile").attribute("layerid");
670+
QgsProject::instance()->createEmbeddedLayer( layerId, projectFilePath, brokenNodes, vectorLayerList );
671+
if( currentItem() )
672+
{
673+
insertItem( currentItem(), group );
674+
}
675+
}
676+
else if( tagName == "legendgroup" )
677+
{
678+
addEmbeddedGroup( childElem.attribute("name"), projectFilePath, group );
679+
}
680+
}
681+
}
682+
}
683+
}
684+
614685
int QgsLegend::getItemPos( QTreeWidgetItem* item )
615686
{
616687
int counter = 1;

src/app/legend/qgslegend.h

+5
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ class QgsLegend : public QTreeWidget
193193
/**Returns a layers check state*/
194194
Qt::CheckState layerCheckState( QgsMapLayer * layer );
195195

196+
void addEmbeddedGroup( const QString& groupName, const QString& projectFilePath, QgsLegendItem* parent = 0 );
197+
196198
public slots:
197199

198200
/*!Adds a new layer group with the maplayer to the canvas*/
@@ -367,6 +369,9 @@ class QgsLegend : public QTreeWidget
367369
// The action when the mouse is released
368370
enum { BEFORE, INSERT, AFTER } mDropAction;
369371

372+
// Groups defined in other project files
373+
QHash< QString, QString > mEmbeddedGroups;
374+
370375
/** Hide the line that indicates insertion position */
371376
void hideLine();
372377

src/app/qgisapp.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -5054,12 +5054,16 @@ void QgisApp::embedLayers()
50545054
//dialog to select groups/layers from other project files
50555055

50565056
//hardcoded for debugging
5057-
QString filepath="/home/marco/geodaten/projekte/composertest.qgs";
5057+
/*QString filepath="/home/marco/geodaten/projekte/composertest.qgs";
50585058
QString id="komb113320110531113659299";
50595059
50605060
QList<QDomNode> brokenNodes;
50615061
QList< QPair< QgsVectorLayer*, QDomElement > > vectorLayerList;
5062-
QgsProject::instance()->createEmbeddedLayer( id, filepath, brokenNodes, vectorLayerList );
5062+
QgsProject::instance()->createEmbeddedLayer( id, filepath, brokenNodes, vectorLayerList );*/
5063+
5064+
QString filepath="/home/marco/geodaten/projekte/rasters.qgs";
5065+
QString groupname="Karten";
5066+
mMapLegend->addEmbeddedGroup( groupname, filepath );
50635067
}
50645068

50655069
void QgisApp::setExtent( QgsRectangle theRect )

src/core/qgsproject.cpp

-5
Original file line numberDiff line numberDiff line change
@@ -1610,11 +1610,6 @@ void QgsProject::setBadLayerHandler( QgsProjectBadLayerHandler* handler )
16101610
mBadLayerHandler = handler;
16111611
}
16121612

1613-
void QgsProject::addEmbeddedLayer( const QString& layerId, const QString& projectFilePath )
1614-
{
1615-
mEmbeddedLayers.insert( layerId, projectFilePath );
1616-
}
1617-
16181613
QString QgsProject::layerIsEmbedded( const QString& id ) const
16191614
{
16201615
QHash< QString, QString >::const_iterator it = mEmbeddedLayers.find( id );

src/core/qgsproject.h

-4
Original file line numberDiff line numberDiff line change
@@ -276,10 +276,6 @@ class CORE_EXPORT QgsProject : public QObject
276276
@note added in 1.4 */
277277
void setBadLayerHandler( QgsProjectBadLayerHandler* handler );
278278

279-
/**Adds layer to list of embedded layers
280-
@note: added in version 1.8*/
281-
void addEmbeddedLayer( const QString& layerId, const QString& projectFilePath );
282-
283279
/**Returns project file path if layer is embedded from other project file. Returns empty string if layer is not embedded*/
284280
QString layerIsEmbedded( const QString& id ) const;
285281

0 commit comments

Comments
 (0)