Skip to content

Commit 129d295

Browse files
committed
New dock in QGIS for layer tree view
1 parent de146fb commit 129d295

8 files changed

+55
-27
lines changed

src/app/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ INCLUDE_DIRECTORIES(
443443
../gui/raster
444444
../gui/editorwidgets
445445
../gui/editorwidgets/core
446+
../gui/layertree
446447
../plugins
447448
../python
448449
gps

src/app/qgisapp.cpp

+18
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@
134134
#include "qgsgpsinformationwidget.h"
135135
#include "qgsguivectorlayertools.h"
136136
#include "qgslabelinggui.h"
137+
#include "qgslayertreemodel.h"
138+
#include "qgslayertreeview.h"
137139
#include "qgslegend.h"
138140
#include "qgslayerorder.h"
139141
#include "qgslegendlayer.h"
@@ -538,6 +540,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, QWidget * parent,
538540
createStatusBar();
539541
createCanvasTools();
540542
mMapCanvas->freeze();
543+
initLayerTreeView();
541544
initLegend();
542545
createOverview();
543546
createMapTips();
@@ -2170,6 +2173,21 @@ QgsMessageBar* QgisApp::messageBar()
21702173
return mInfoBar;
21712174
}
21722175

2176+
void QgisApp::initLayerTreeView()
2177+
{
2178+
mLayerTreeDock = new QDockWidget( tr( "Layers NEW" ), this );
2179+
mLayerTreeDock->setObjectName( "LayersNEW" );
2180+
mLayerTreeDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
2181+
2182+
QgsLayerTreeModel* model = new QgsLayerTreeModel( QgsProject::instance()->layerTreeRoot(), this );
2183+
2184+
mLayerTreeView = new QgsLayerTreeView( this );
2185+
mLayerTreeView->setModel( model );
2186+
2187+
mLayerTreeDock->setWidget( mLayerTreeView );
2188+
addDockWidget( Qt::LeftDockWidgetArea, mLayerTreeDock );
2189+
}
2190+
21732191
void QgisApp::initLegend()
21742192
{
21752193
mMapLegend->setWhatsThis( tr( "Map legend that displays all the layers currently on the map canvas. Click on the check box to turn a layer on or off. Double click on a layer in the legend to customize its appearance and set other properties." ) );

src/app/qgisapp.h

+5-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class QgsComposerManager;
4646
class QgsContrastEnhancement;
4747
class QgsGeometry;
4848
class QgsFeature;
49-
49+
class QgsLayerTreeView;
5050
class QgsLegend;
5151
class QgsLayerOrder;
5252
class QgsMapCanvas;
@@ -1310,6 +1310,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
13101310
void createToolBars();
13111311
void createStatusBar();
13121312
void setupConnections();
1313+
void initLayerTreeView();
13131314
void initLegend();
13141315
void createOverview();
13151316
void createCanvasTools();
@@ -1353,6 +1354,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
13531354
QMenu *mToolbarMenu;
13541355

13551356
// docks ------------------------------------------
1357+
QDockWidget *mLayerTreeDock;
13561358
QDockWidget *mLegendDock;
13571359
QDockWidget *mLayerOrderDock;
13581360
QDockWidget *mOverviewDock;
@@ -1452,6 +1454,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
14521454
//! Map canvas
14531455
QgsMapCanvas *mMapCanvas;
14541456
//! Table of contents (legend) for the map
1457+
QgsLayerTreeView* mLayerTreeView;
1458+
//! Table of contents (legend) for the map
14551459
QgsLegend *mMapLegend;
14561460
//! Table of contents (legend) to order layers of the map
14571461
QgsLayerOrder *mMapLayerOrder;

src/core/layertree/qgslayertreenode.cpp

+14-9
Original file line numberDiff line numberDiff line change
@@ -223,15 +223,7 @@ QgsLayerTreeGroup* QgsLayerTreeGroup::readXML(QDomElement& element)
223223

224224
groupNode->readCommonXML(element);
225225

226-
QDomElement childElem = element.firstChildElement();
227-
while (!childElem.isNull())
228-
{
229-
QgsLayerTreeNode* newNode = QgsLayerTreeNode::readXML(childElem);
230-
if (newNode)
231-
groupNode->addChildNode(newNode);
232-
233-
childElem = childElem.nextSiblingElement();
234-
}
226+
groupNode->readChildrenFromXML(element);
235227

236228
return groupNode;
237229
}
@@ -252,6 +244,19 @@ void QgsLayerTreeGroup::writeXML(QDomElement& parentElement)
252244
parentElement.appendChild(elem);
253245
}
254246

247+
void QgsLayerTreeGroup::readChildrenFromXML(QDomElement& element)
248+
{
249+
QDomElement childElem = element.firstChildElement();
250+
while (!childElem.isNull())
251+
{
252+
QgsLayerTreeNode* newNode = QgsLayerTreeNode::readXML(childElem);
253+
if (newNode)
254+
addChildNode(newNode);
255+
256+
childElem = childElem.nextSiblingElement();
257+
}
258+
}
259+
255260
QString QgsLayerTreeGroup::dump() const
256261
{
257262
QString header = QString( "GROUP: %1 visible=%2 expanded=%3\n" ).arg( name() ).arg( mChecked ).arg( mExpanded );

src/core/layertree/qgslayertreenode.h

+2
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
152152
static QgsLayerTreeGroup* readXML(QDomElement& element);
153153
virtual void writeXML(QDomElement& parentElement);
154154

155+
void readChildrenFromXML(QDomElement& element);
156+
155157
virtual QString dump() const;
156158

157159
Qt::CheckState isVisible() const { return mChecked; }

src/core/layertree/qgslayertreeutils.cpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,12 @@
44

55
#include <QDomElement>
66

7-
QgsLayerTreeGroup* QgsLayerTreeUtils::readOldLegend(const QDomElement& legendElem)
7+
bool QgsLayerTreeUtils::readOldLegend(QgsLayerTreeGroup* root, const QDomElement& legendElem)
88
{
99
if (legendElem.isNull())
10-
return 0;
10+
return false;
1111

1212
QDomNodeList legendChildren = legendElem.childNodes();
13-
QgsLayerTreeGroup* root = new QgsLayerTreeGroup;
1413

1514
for ( int i = 0; i < legendChildren.size(); ++i )
1615
{
@@ -25,7 +24,7 @@ QgsLayerTreeGroup* QgsLayerTreeUtils::readOldLegend(const QDomElement& legendEle
2524
}
2625
}
2726

28-
return root;
27+
return true;
2928
}
3029

3130
QString QgsLayerTreeUtils::checkStateToXml(Qt::CheckState state)

src/core/layertree/qgslayertreeutils.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class CORE_EXPORT QgsLayerTreeUtils
1212
public:
1313

1414
// return a new instance - or null on error
15-
static QgsLayerTreeGroup* readOldLegend(const QDomElement& legendElem);
15+
static bool readOldLegend(QgsLayerTreeGroup* root, const QDomElement& legendElem);
1616

1717
static QString checkStateToXml(Qt::CheckState state);
1818
static Qt::CheckState checkStateFromXml(QString txt);

src/core/qgsproject.cpp

+11-12
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsexception.h"
2525
#include "qgslayertreenode.h"
2626
#include "qgslayertreeutils.h"
27+
#include "qgslayertreeregistrybridge.h"
2728
#include "qgslogger.h"
2829
#include "qgsmaplayerregistry.h"
2930
#include "qgspluginlayer.h"
@@ -334,10 +335,15 @@ QgsProject::QgsProject()
334335
: imp_( new QgsProject::Imp )
335336
, mBadLayerHandler( new QgsProjectBadLayerDefaultHandler() )
336337
, mRelationManager( new QgsRelationManager( this ) )
337-
, mRootGroup( 0 )
338+
, mRootGroup( new QgsLayerTreeGroup )
338339
{
339340
clear();
340341

342+
// bind the layer tree to the map layer registry.
343+
// whenever layers are added to or removed from the registry,
344+
// layer tree will be updated
345+
new QgsLayerTreeRegistryBridge(mRootGroup, this);
346+
341347
} // QgsProject ctor
342348

343349

@@ -419,8 +425,7 @@ void QgsProject::clear()
419425
mEmbeddedLayers.clear();
420426
mRelationManager->clear();
421427

422-
delete mRootGroup;
423-
mRootGroup = new QgsLayerTreeGroup;
428+
mRootGroup->removeChildren(0, mRootGroup->children().count());
424429

425430
// reset some default project properties
426431
// XXX THESE SHOULD BE MOVED TO STATUSBAR RELATED SOURCE
@@ -898,23 +903,17 @@ bool QgsProject::read()
898903

899904
// read the layer tree from project file
900905

901-
QgsLayerTreeGroup* newRoot = 0;
902906
QDomElement layerTreeElem = doc->documentElement().firstChildElement( "layer-tree-group" );
903907
if ( !layerTreeElem.isNull() )
904908
{
905-
newRoot = QgsLayerTreeGroup::readXML( layerTreeElem );
909+
mRootGroup->readChildrenFromXML( layerTreeElem );
906910
}
907911
else
908912
{
909-
newRoot = QgsLayerTreeUtils::readOldLegend( doc->documentElement().firstChildElement( "legend" ) );
913+
QgsLayerTreeUtils::readOldLegend( mRootGroup, doc->documentElement().firstChildElement( "legend" ) );
910914
}
911915

912-
if ( newRoot )
913-
{
914-
delete mRootGroup;
915-
mRootGroup = newRoot;
916-
QgsDebugMsg( "Loaded layer tree:\n " + mRootGroup->dump() );
917-
}
916+
QgsDebugMsg( "Loaded layer tree:\n " + mRootGroup->dump() );
918917

919918
// get the map layers
920919
QPair< bool, QList<QDomNode> > getMapLayersResults = _getMapLayers( *doc );

0 commit comments

Comments
 (0)