Skip to content

Commit 2972768

Browse files
committed
Use QgsLayerTreeView in QgsProjectLayerGroupDialog
This also replaces routines for parsing of the project file
1 parent a6158d5 commit 2972768

10 files changed

+101
-133
lines changed

src/app/qgisapp.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2180,6 +2180,7 @@ void QgisApp::initLayerTreeView()
21802180
mLayerTreeDock->setAllowedAreas( Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea );
21812181

21822182
QgsLayerTreeModel* model = new QgsLayerTreeModel( QgsProject::instance()->layerTreeRoot(), this );
2183+
model->setFlag(QgsLayerTreeModel::AllowVisibilityManagement);
21832184

21842185
mLayerTreeView = new QgsLayerTreeView( this );
21852186
mLayerTreeView->setModel( model );

src/app/qgsprojectlayergroupdialog.cpp

+57-111
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
#include "qgisapp.h"
1818
#include "qgsapplication.h"
1919

20+
#include "qgslayertreemodel.h"
21+
#include "qgslayertreenode.h"
22+
#include "qgslayertreeutils.h"
23+
2024
#include <QDomDocument>
2125
#include <QFileDialog>
2226
#include <QFileInfo>
@@ -25,6 +29,7 @@
2529

2630
QgsProjectLayerGroupDialog::QgsProjectLayerGroupDialog( QWidget * parent, const QString& projectFile, Qt::WindowFlags f ): QDialog( parent, f ),
2731
mShowEmbeddedContent( false )
32+
, mRootGroup( new QgsLayerTreeGroup )
2833
{
2934
setupUi( this );
3035

@@ -48,49 +53,45 @@ QgsProjectLayerGroupDialog::~QgsProjectLayerGroupDialog()
4853
{
4954
QSettings settings;
5055
settings.setValue( "/Windows/EmbedLayer/geometry", saveGeometry() );
56+
57+
delete mRootGroup;
5158
}
5259

5360
QStringList QgsProjectLayerGroupDialog::selectedGroups() const
5461
{
5562
QStringList groups;
56-
QList<QTreeWidgetItem*> items = mTreeWidget->selectedItems();
57-
QList<QTreeWidgetItem*>::iterator itemIt = items.begin();
58-
for ( ; itemIt != items.end(); ++itemIt )
63+
QgsLayerTreeModel* model = mTreeView->layerTreeModel();
64+
foreach( QModelIndex index, mTreeView->selectionModel()->selectedIndexes() )
5965
{
60-
if (( *itemIt )->data( 0, Qt::UserRole ).toString() == "group" )
61-
{
62-
groups.push_back(( *itemIt )->text( 0 ) );
63-
}
66+
QgsLayerTreeNode* node = model->index2node( index );
67+
if ( node->nodeType() == QgsLayerTreeNode::NodeGroup )
68+
groups << static_cast<QgsLayerTreeGroup*>( node )->name();
6469
}
6570
return groups;
6671
}
6772

6873
QStringList QgsProjectLayerGroupDialog::selectedLayerIds() const
6974
{
7075
QStringList layerIds;
71-
QList<QTreeWidgetItem*> items = mTreeWidget->selectedItems();
72-
QList<QTreeWidgetItem*>::iterator itemIt = items.begin();
73-
for ( ; itemIt != items.end(); ++itemIt )
76+
QgsLayerTreeModel* model = mTreeView->layerTreeModel();
77+
foreach( QModelIndex index, mTreeView->selectionModel()->selectedIndexes() )
7478
{
75-
if (( *itemIt )->data( 0, Qt::UserRole ).toString() == "layer" )
76-
{
77-
layerIds.push_back(( *itemIt )->data( 0, Qt::UserRole + 1 ).toString() );
78-
}
79+
QgsLayerTreeNode* node = model->index2node( index );
80+
if ( node->nodeType() == QgsLayerTreeNode::NodeLayer )
81+
layerIds << static_cast<QgsLayerTreeLayer*>( node )->layerId();
7982
}
8083
return layerIds;
8184
}
8285

8386
QStringList QgsProjectLayerGroupDialog::selectedLayerNames() const
8487
{
8588
QStringList layerNames;
86-
QList<QTreeWidgetItem*> items = mTreeWidget->selectedItems();
87-
QList<QTreeWidgetItem*>::iterator itemIt = items.begin();
88-
for ( ; itemIt != items.end(); ++itemIt )
89+
QgsLayerTreeModel* model = mTreeView->layerTreeModel();
90+
foreach( QModelIndex index, mTreeView->selectionModel()->selectedIndexes() )
8991
{
90-
if (( *itemIt )->data( 0, Qt::UserRole ).toString() == "layer" )
91-
{
92-
layerNames.push_back(( *itemIt )->text( 0 ) );
93-
}
92+
QgsLayerTreeNode* node = model->index2node( index );
93+
if ( node->nodeType() == QgsLayerTreeNode::NodeLayer )
94+
layerNames << static_cast<QgsLayerTreeLayer*>( node )->layerName();
9495
}
9596
return layerNames;
9697
}
@@ -144,8 +145,6 @@ void QgsProjectLayerGroupDialog::changeProjectFile()
144145
return;
145146
}
146147

147-
mTreeWidget->clear();
148-
149148
//parse project file and fill tree
150149
if ( !projectFile.open( QIODevice::ReadOnly ) )
151150
{
@@ -158,115 +157,64 @@ void QgsProjectLayerGroupDialog::changeProjectFile()
158157
return;
159158
}
160159

161-
QDomElement legendElem = projectDom.documentElement().firstChildElement( "legend" );
162-
if ( legendElem.isNull() )
160+
mRootGroup->removeAllChildren();
161+
162+
QDomElement layerTreeElem = projectDom.documentElement().firstChildElement( "layer-tree-group" );
163+
if ( !layerTreeElem.isNull() )
163164
{
164-
return;
165+
mRootGroup->readChildrenFromXML( layerTreeElem );
165166
}
166-
167-
QDomNodeList legendChildren = legendElem.childNodes();
168-
QDomElement currentChildElem;
169-
170-
for ( int i = 0; i < legendChildren.size(); ++i )
167+
else
171168
{
172-
currentChildElem = legendChildren.at( i ).toElement();
173-
if ( currentChildElem.tagName() == "legendlayer" )
174-
{
175-
addLegendLayerToTreeWidget( currentChildElem );
176-
}
177-
else if ( currentChildElem.tagName() == "legendgroup" )
178-
{
179-
addLegendGroupToTreeWidget( currentChildElem );
180-
}
169+
QgsLayerTreeUtils::readOldLegend( mRootGroup, projectDom.documentElement().firstChildElement( "legend" ) );
181170
}
182171

183-
mProjectPath = mProjectFileLineEdit->text();
184-
}
172+
if ( !mShowEmbeddedContent )
173+
removeEmbeddedNodes( mRootGroup );
185174

186-
void QgsProjectLayerGroupDialog::addLegendGroupToTreeWidget( const QDomElement& groupElem, QTreeWidgetItem* parent )
187-
{
188-
QDomNodeList groupChildren = groupElem.childNodes();
189-
QDomElement currentChildElem;
190-
191-
if ( !mShowEmbeddedContent && groupElem.attribute( "embedded" ) == "1" )
192-
{
193-
return;
194-
}
175+
QgsLayerTreeModel* model = new QgsLayerTreeModel( mRootGroup, this );
176+
mTreeView->setModel( model );
195177

196-
QTreeWidgetItem* groupItem = 0;
197-
if ( !parent )
198-
{
199-
groupItem = new QTreeWidgetItem( mTreeWidget );
200-
}
201-
else
202-
{
203-
groupItem = new QTreeWidgetItem( parent );
204-
}
205-
groupItem->setIcon( 0, QgsApplication::getThemeIcon( "mActionFolder.png" ) );
206-
groupItem->setText( 0, groupElem.attribute( "name" ) );
207-
groupItem->setData( 0, Qt::UserRole, "group" );
178+
QObject::connect( mTreeView->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(onTreeViewSelectionChanged()));
208179

209-
for ( int i = 0; i < groupChildren.size(); ++i )
210-
{
211-
currentChildElem = groupChildren.at( i ).toElement();
212-
if ( currentChildElem.tagName() == "legendlayer" )
213-
{
214-
addLegendLayerToTreeWidget( currentChildElem, groupItem );
215-
}
216-
else if ( currentChildElem.tagName() == "legendgroup" )
217-
{
218-
addLegendGroupToTreeWidget( currentChildElem, groupItem );
219-
}
220-
}
180+
mProjectPath = mProjectFileLineEdit->text();
221181
}
222182

223-
void QgsProjectLayerGroupDialog::addLegendLayerToTreeWidget( const QDomElement& layerElem, QTreeWidgetItem* parent )
224-
{
225-
if ( !mShowEmbeddedContent && layerElem.attribute( "embedded" ) == "1" )
226-
{
227-
return;
228-
}
229183

230-
QTreeWidgetItem* item = 0;
231-
if ( parent )
232-
{
233-
item = new QTreeWidgetItem( parent );
234-
}
235-
else
184+
void QgsProjectLayerGroupDialog::removeEmbeddedNodes( QgsLayerTreeGroup* node )
185+
{
186+
QList<QgsLayerTreeNode*> childrenToRemove;
187+
foreach ( QgsLayerTreeNode* child, node->children() )
236188
{
237-
item = new QTreeWidgetItem( mTreeWidget );
189+
if ( child->customProperty("embedded").toBool() )
190+
childrenToRemove << child;
191+
else if ( child->nodeType() == QgsLayerTreeNode::NodeGroup )
192+
removeEmbeddedNodes( static_cast<QgsLayerTreeGroup*>( child ) );
238193
}
239-
item->setText( 0, layerElem.attribute( "name" ) );
240-
item->setData( 0, Qt::UserRole, "layer" );
241-
item->setData( 0, Qt::UserRole + 1, layerElem.firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" ) );
194+
foreach ( QgsLayerTreeNode* childToRemove, childrenToRemove )
195+
node->removeChildNode( childToRemove );
242196
}
243197

244-
void QgsProjectLayerGroupDialog::on_mTreeWidget_itemSelectionChanged()
198+
199+
void QgsProjectLayerGroupDialog::onTreeViewSelectionChanged()
245200
{
246-
mTreeWidget->blockSignals( true );
247-
QList<QTreeWidgetItem*> items = mTreeWidget->selectedItems();
248-
QList<QTreeWidgetItem*>::iterator itemIt = items.begin();
249-
for ( ; itemIt != items.end(); ++itemIt )
201+
foreach( QModelIndex index, mTreeView->selectionModel()->selectedIndexes() )
250202
{
251-
//deselect children recursively
252-
unselectChildren( *itemIt );
203+
unselectChildren( index );
253204
}
254-
mTreeWidget->blockSignals( false );
255205
}
256206

257-
void QgsProjectLayerGroupDialog::unselectChildren( QTreeWidgetItem* item )
207+
208+
void QgsProjectLayerGroupDialog::unselectChildren( const QModelIndex& index )
258209
{
259-
if ( !item )
210+
int childCount = mTreeView->model()->rowCount( index );
211+
for ( int i = 0; i < childCount; ++i )
260212
{
261-
return;
262-
}
213+
QModelIndex childIndex = mTreeView->model()->index( i, 0, index );
214+
if ( mTreeView->selectionModel()->isSelected( childIndex ) )
215+
mTreeView->selectionModel()->select( childIndex, QItemSelectionModel::Deselect );
263216

264-
QTreeWidgetItem* currentChild = 0;
265-
for ( int i = 0; i < item->childCount(); ++i )
266-
{
267-
currentChild = item->child( i );
268-
currentChild->setSelected( false );
269-
unselectChildren( currentChild );
217+
unselectChildren( childIndex );
270218
}
271219
}
272220

@@ -280,5 +228,3 @@ void QgsProjectLayerGroupDialog::on_mButtonBox_accepted()
280228
}
281229
accept();
282230
}
283-
284-

src/app/qgsprojectlayergroupdialog.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
class QDomElement;
2222

23+
class QgsLayerTreeGroup;
24+
2325
/**A dialog to select layers and groups from a qgs project*/
2426
class APP_EXPORT QgsProjectLayerGroupDialog: public QDialog, private Ui::QgsProjectLayerGroupDialogBase
2527
{
@@ -37,16 +39,17 @@ class APP_EXPORT QgsProjectLayerGroupDialog: public QDialog, private Ui::QgsProj
3739
private slots:
3840
void on_mBrowseFileToolButton_clicked();
3941
void on_mProjectFileLineEdit_editingFinished();
40-
void on_mTreeWidget_itemSelectionChanged();
42+
void onTreeViewSelectionChanged();
4143
void on_mButtonBox_accepted();
4244

4345
private:
4446
void changeProjectFile();
45-
void addLegendGroupToTreeWidget( const QDomElement& groupElem, QTreeWidgetItem* parent = 0 );
46-
void addLegendLayerToTreeWidget( const QDomElement& layerElem, QTreeWidgetItem* parent = 0 );
47-
void unselectChildren( QTreeWidgetItem* item );
47+
void removeEmbeddedNodes( QgsLayerTreeGroup* node );
48+
void unselectChildren( const QModelIndex& index );
4849
QString mProjectPath;
4950
bool mShowEmbeddedContent;
51+
52+
QgsLayerTreeGroup* mRootGroup;
5053
};
5154

5255
#endif //QGSPROJECTLAYERGROUPDIALOG_H

src/core/layertree/qgslayertreenode.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,11 @@ void QgsLayerTreeGroup::removeChildren(int from, int count)
189189
updateVisibilityFromChildren();
190190
}
191191

192+
void QgsLayerTreeGroup::removeAllChildren()
193+
{
194+
removeChildren(0, mChildren.count());
195+
}
196+
192197
QgsLayerTreeLayer *QgsLayerTreeGroup::findLayer(const QString& layerId)
193198
{
194199
foreach (QgsLayerTreeNode* child, mChildren)

src/core/layertree/qgslayertreenode.h

+2
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
147147

148148
void removeChildren(int from, int count);
149149

150+
void removeAllChildren();
151+
150152
QgsLayerTreeLayer* findLayer(const QString& layerId);
151153

152154
static QgsLayerTreeGroup* readXML(QDomElement& element);

src/core/qgsproject.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,7 @@ void QgsProject::clear()
425425
mEmbeddedLayers.clear();
426426
mRelationManager->clear();
427427

428-
mRootGroup->removeChildren(0, mRootGroup->children().count());
428+
mRootGroup->removeAllChildren();
429429

430430
// reset some default project properties
431431
// XXX THESE SHOULD BE MOVED TO STATUSBAR RELATED SOURCE

src/gui/layertree/qgslayertreemodel.cpp

+7-1
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,9 @@ QVariant QgsLayerTreeModel::data(const QModelIndex &index, int role) const
190190
}
191191
else if ( role == Qt::CheckStateRole )
192192
{
193+
if (!testFlag(AllowVisibilityManagement))
194+
return QVariant();
195+
193196
if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
194197
{
195198
QgsLayerTreeLayer* nodeLayer = static_cast<QgsLayerTreeLayer*>(node);
@@ -215,7 +218,7 @@ Qt::ItemFlags QgsLayerTreeModel::flags(const QModelIndex& index) const
215218

216219
Qt::ItemFlags f = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsDragEnabled;
217220
QgsLayerTreeNode* node = index2node(index);
218-
if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
221+
if (testFlag(AllowVisibilityManagement) && node->nodeType() == QgsLayerTreeNode::NodeLayer)
219222
f |= Qt::ItemIsUserCheckable;
220223
else if (node->nodeType() == QgsLayerTreeNode::NodeGroup)
221224
f |= Qt::ItemIsDropEnabled | Qt::ItemIsUserCheckable;
@@ -230,6 +233,9 @@ bool QgsLayerTreeModel::setData(const QModelIndex& index, const QVariant& value,
230233

231234
if (role == Qt::CheckStateRole)
232235
{
236+
if (!testFlag(AllowVisibilityManagement))
237+
return false;
238+
233239
if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
234240
{
235241
QgsLayerTreeLayer* layer = static_cast<QgsLayerTreeLayer*>(node);

src/gui/layertree/qgslayertreemodel.h

+2
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
5555
{
5656
AllowTreeManagement,
5757
ShowSymbology,
58+
AllowVisibilityManagement,
5859
ShowFeatureCounts, // TODO: this is per-layer
5960
};
6061
Q_DECLARE_FLAGS(Flags, Flag)
6162

6263
void setFlags(Flags f) { mFlags = f; }
64+
void setFlag(Flag f, bool on = true) { if (on) mFlags |= f; else mFlags &= ~f; }
6365
Flags flags() const { return mFlags; }
6466
bool testFlag(Flag f) const { return mFlags.testFlag(f); }
6567

src/gui/layertree/qgslayertreeview.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ QgsLayerTreeView::QgsLayerTreeView(QWidget *parent)
2020

2121
connect(this, SIGNAL(collapsed(QModelIndex)), this, SLOT(updateExpandedStateToNode(QModelIndex)));
2222
connect(this, SIGNAL(expanded(QModelIndex)), this, SLOT(updateExpandedStateToNode(QModelIndex)));
23-
connect(this, SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onCurrentChanged(QModelIndex)));
2423
}
2524

2625
void QgsLayerTreeView::setModel(QAbstractItemModel* model)
@@ -32,6 +31,8 @@ void QgsLayerTreeView::setModel(QAbstractItemModel* model)
3231

3332
QTreeView::setModel(model);
3433

34+
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onCurrentChanged(QModelIndex)));
35+
3536
updateExpandedStateFromNode(layerTreeModel()->rootGroup());
3637
}
3738

0 commit comments

Comments
 (0)