17
17
#include " qgisapp.h"
18
18
#include " qgsapplication.h"
19
19
20
+ #include " qgslayertreemodel.h"
21
+ #include " qgslayertreenode.h"
22
+ #include " qgslayertreeutils.h"
23
+
20
24
#include < QDomDocument>
21
25
#include < QFileDialog>
22
26
#include < QFileInfo>
25
29
26
30
QgsProjectLayerGroupDialog::QgsProjectLayerGroupDialog ( QWidget * parent, const QString& projectFile, Qt::WindowFlags f ): QDialog( parent, f ),
27
31
mShowEmbeddedContent( false )
32
+ , mRootGroup( new QgsLayerTreeGroup )
28
33
{
29
34
setupUi ( this );
30
35
@@ -48,49 +53,45 @@ QgsProjectLayerGroupDialog::~QgsProjectLayerGroupDialog()
48
53
{
49
54
QSettings settings;
50
55
settings.setValue ( " /Windows/EmbedLayer/geometry" , saveGeometry () );
56
+
57
+ delete mRootGroup ;
51
58
}
52
59
53
60
QStringList QgsProjectLayerGroupDialog::selectedGroups () const
54
61
{
55
62
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 () )
59
65
{
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 ();
64
69
}
65
70
return groups;
66
71
}
67
72
68
73
QStringList QgsProjectLayerGroupDialog::selectedLayerIds () const
69
74
{
70
75
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 () )
74
78
{
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 ();
79
82
}
80
83
return layerIds;
81
84
}
82
85
83
86
QStringList QgsProjectLayerGroupDialog::selectedLayerNames () const
84
87
{
85
88
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 () )
89
91
{
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 ();
94
95
}
95
96
return layerNames;
96
97
}
@@ -144,8 +145,6 @@ void QgsProjectLayerGroupDialog::changeProjectFile()
144
145
return ;
145
146
}
146
147
147
- mTreeWidget ->clear ();
148
-
149
148
// parse project file and fill tree
150
149
if ( !projectFile.open ( QIODevice::ReadOnly ) )
151
150
{
@@ -158,115 +157,64 @@ void QgsProjectLayerGroupDialog::changeProjectFile()
158
157
return ;
159
158
}
160
159
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 () )
163
164
{
164
- return ;
165
+ mRootGroup -> readChildrenFromXML ( layerTreeElem ) ;
165
166
}
166
-
167
- QDomNodeList legendChildren = legendElem.childNodes ();
168
- QDomElement currentChildElem;
169
-
170
- for ( int i = 0 ; i < legendChildren.size (); ++i )
167
+ else
171
168
{
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" ) );
181
170
}
182
171
183
- mProjectPath = mProjectFileLineEdit -> text ();
184
- }
172
+ if ( ! mShowEmbeddedContent )
173
+ removeEmbeddedNodes ( mRootGroup );
185
174
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 );
195
177
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 ()));
208
179
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 ();
221
181
}
222
182
223
- void QgsProjectLayerGroupDialog::addLegendLayerToTreeWidget ( const QDomElement& layerElem, QTreeWidgetItem* parent )
224
- {
225
- if ( !mShowEmbeddedContent && layerElem.attribute ( " embedded" ) == " 1" )
226
- {
227
- return ;
228
- }
229
183
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 () )
236
188
{
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 ) );
238
193
}
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 );
242
196
}
243
197
244
- void QgsProjectLayerGroupDialog::on_mTreeWidget_itemSelectionChanged ()
198
+
199
+ void QgsProjectLayerGroupDialog::onTreeViewSelectionChanged ()
245
200
{
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 () )
250
202
{
251
- // deselect children recursively
252
- unselectChildren ( *itemIt );
203
+ unselectChildren ( index );
253
204
}
254
- mTreeWidget ->blockSignals ( false );
255
205
}
256
206
257
- void QgsProjectLayerGroupDialog::unselectChildren ( QTreeWidgetItem* item )
207
+
208
+ void QgsProjectLayerGroupDialog::unselectChildren ( const QModelIndex& index )
258
209
{
259
- if ( !item )
210
+ int childCount = mTreeView ->model ()->rowCount ( index );
211
+ for ( int i = 0 ; i < childCount; ++i )
260
212
{
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 );
263
216
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 );
270
218
}
271
219
}
272
220
@@ -280,5 +228,3 @@ void QgsProjectLayerGroupDialog::on_mButtonBox_accepted()
280
228
}
281
229
accept ();
282
230
}
283
-
284
-
0 commit comments