Skip to content

Commit 7306e9e

Browse files
author
jef
committed
wms update:
- show nested layers in a tree - enable sorting in the wms dialog (fixes #1387) - use Qt instead of STL templates git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@9899 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent d71d402 commit 7306e9e

File tree

4 files changed

+181
-115
lines changed

4 files changed

+181
-115
lines changed

src/app/qgsserversourceselect.cpp

+57-31
Original file line numberDiff line numberDiff line change
@@ -186,55 +186,87 @@ void QgsServerSourceSelect::on_btnHelp_clicked()
186186

187187
}
188188

189-
bool QgsServerSourceSelect::populateLayerList( QgsWmsProvider* wmsProvider )
189+
QgsNumericSortTreeWidgetItem *QgsServerSourceSelect::createItem(
190+
int id, const QStringList &names, QMap<int, QgsNumericSortTreeWidgetItem *> &items, int &layerAndStyleCount,
191+
const QMap<int,int> &layerParents, const QMap<int, QStringList> &layerParentNames )
192+
193+
{
194+
if( items.contains(id) )
195+
return items[id];
196+
197+
QgsNumericSortTreeWidgetItem *item;
198+
if( layerParents.contains( id ) )
199+
{
200+
int parent = layerParents[ id ];
201+
item = new QgsNumericSortTreeWidgetItem( createItem( parent, layerParentNames[ parent ], items, layerAndStyleCount, layerParents, layerParentNames ) );
202+
}
203+
else
204+
item = new QgsNumericSortTreeWidgetItem( lstLayers );
205+
206+
item->setText( 0, QString::number( ++layerAndStyleCount ) );
207+
item->setText( 1, names[0].simplified() );
208+
item->setText( 2, names[1].simplified() );
209+
item->setText( 3, names[2].simplified() );
210+
211+
items[ id ] = item;
212+
213+
return item;
214+
}
215+
216+
bool QgsServerSourceSelect::populateLayerList( QgsWmsProvider *wmsProvider )
190217
{
191-
std::vector<QgsWmsLayerProperty> layers;
218+
QVector<QgsWmsLayerProperty> layers;
192219

193220
if ( !wmsProvider->supportedLayers( layers ) )
194221
{
195222
return FALSE;
196223
}
197224

225+
QMap<int, QgsNumericSortTreeWidgetItem *> items;
226+
QMap<int, int> layerParents;
227+
QMap<int, QStringList> layerParentNames;
228+
wmsProvider->layerParents( layerParents, layerParentNames );
229+
198230
lstLayers->clear();
231+
lstLayers->setSortingEnabled( true );
199232

200-
int layerAndStyleCount = 0;
233+
int layerAndStyleCount = -1;
201234

202-
for ( std::vector<QgsWmsLayerProperty>::iterator layer = layers.begin();
235+
for ( QVector<QgsWmsLayerProperty>::iterator layer = layers.begin();
203236
layer != layers.end();
204237
layer++ )
205238
{
206-
// QgsDebugMsg(QString("got layer name %1 and title '%2'.").arg(layer->name).arg(layer->title));
239+
QgsNumericSortTreeWidgetItem *lItem = createItem(layer->orderId, QStringList() << layer->name << layer->title << layer->abstract, items, layerAndStyleCount, layerParents, layerParentNames );
207240

208-
layerAndStyleCount++;
209-
210-
QgsNumericSortTreeWidgetItem *lItem = new QgsNumericSortTreeWidgetItem( lstLayers );
211-
lItem->setText( 0, QString::number( layerAndStyleCount ) );
212-
lItem->setText( 1, layer->name.simplified() );
213-
lItem->setText( 2, layer->title.simplified() );
214-
lItem->setText( 3, layer->abstract.simplified() );
241+
lItem->setData( 0, Qt::UserRole, layer->name );
242+
lItem->setData( 0, Qt::UserRole+1, "" );
215243

216244
// Also insert the styles
217245
// Layer Styles
218-
for ( uint j = 0; j < layer->style.size(); j++ )
246+
for ( int j = 0; j < layer->style.size(); j++ )
219247
{
220248
QgsDebugMsg( QString( "got style name %1 and title '%2'." ).arg( layer->style[j].name ).arg( layer->style[j].title ) );
221249

222-
layerAndStyleCount++;
223-
224250
QgsNumericSortTreeWidgetItem *lItem2 = new QgsNumericSortTreeWidgetItem( lItem );
225-
lItem2->setText( 0, QString::number( layerAndStyleCount ) );
251+
lItem2->setText( 0, QString::number( ++layerAndStyleCount ) );
226252
lItem2->setText( 1, layer->style[j].name.simplified() );
227253
lItem2->setText( 2, layer->style[j].title.simplified() );
228254
lItem2->setText( 3, layer->style[j].abstract.simplified() );
229255

256+
lItem2->setData( 0, Qt::UserRole, layer->name );
257+
lItem2->setData( 0, Qt::UserRole+1, layer->style[j].name );
230258
}
231-
232259
}
233260

234261
// If we got some layers, let the user add them to the map
235262
if ( lstLayers->topLevelItemCount() > 0 )
236263
{
237264
btnAdd->setEnabled( TRUE );
265+
266+
if( lstLayers->topLevelItemCount()==1 )
267+
{
268+
lstLayers->expandItem( lstLayers->topLevelItem(0) );
269+
}
238270
}
239271
else
240272
{
@@ -361,7 +393,7 @@ void QgsServerSourceSelect::on_btnAdd_clicked()
361393
{
362394
if ( m_selectedLayers.empty() == TRUE )
363395
{
364-
QMessageBox::information( this, tr( "Select Layer" ), tr( "You must select at least one layer first." ) );
396+
QMessageBox::information( this, tr( "Select Layer" ), tr( "You must select at least one leaf layer first." ) );
365397
}
366398
else if ( mWmsProvider->supportedCrsForLayers( m_selectedLayers ).size() == 0 )
367399
{
@@ -426,28 +458,22 @@ void QgsServerSourceSelect::on_lstLayers_itemSelectionChanged()
426458
QStringList newSelectedLayers;
427459
QStringList newSelectedStylesForSelectedLayers;
428460

429-
std::map<QString, QString> newSelectedStyleIdForLayer;
461+
QMap<QString, QString> newSelectedStyleIdForLayer;
430462

431463
// Iterate through the layers
432464
QList<QTreeWidgetItem *> selected( lstLayers->selectedItems() );
433465
QList<QTreeWidgetItem *>::iterator it;
434466
for ( it = selected.begin(); it != selected.end(); ++it )
435467
{
436468
QTreeWidgetItem *item = *it;
437-
QString layerName;
438469

439-
if ( item->parent() != 0 )
440-
{
441-
layerName = item->parent()->text( 1 );
442-
newSelectedStylesForSelectedLayers += item->text( 1 );
443-
}
444-
else
445-
{
446-
layerName = item->text( 1 );
447-
newSelectedStylesForSelectedLayers += "";
448-
}
470+
QString layerName = item->data(0, Qt::UserRole).toString();
471+
if( layerName.isEmpty() )
472+
continue;
473+
474+
newSelectedLayers << layerName;
475+
newSelectedStylesForSelectedLayers << item->data( 0, Qt::UserRole+1 ).toString();
449476

450-
newSelectedLayers += layerName;
451477
newSelectedStyleIdForLayer[layerName] = item->text( 0 );
452478

453479
// Check if multiple styles have now been selected

src/app/qgsserversourceselect.h

+7-4
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,13 @@
2121
#include "ui_qgsserversourceselectbase.h"
2222
#include "qgisgui.h"
2323

24-
#include <vector>
25-
#include <map>
26-
#include <set>
24+
#include <QStringList>
2725

2826
class QgisApp;
2927
class QgsWmsProvider;
3028
class QButtonGroup;
29+
class QgsNumericSortTreeWidgetItem;
30+
3131
/*!
3232
* \brief Dialog to create connections and add layers from WMS, etc.
3333
*
@@ -140,6 +140,9 @@ class QgsServerSourceSelect : public QDialog, private Ui::QgsServerSourceSelectB
140140
//! Populate the image encoding button group - private for now.
141141
void populateImageEncodingGroup( QgsWmsProvider* wmsProvider );
142142

143+
//! create an item including possible parents
144+
QgsNumericSortTreeWidgetItem *createItem(int id, const QStringList &names, QMap<int, QgsNumericSortTreeWidgetItem *> &items, int &layerAndStyleCount, const QMap<int,int> &layerParents, const QMap<int, QStringList> &layerParentNames );
145+
143146
//! Returns a textual description for the EpsgCrsId number
144147
QString descriptionForEpsg( long epsg );
145148

@@ -165,7 +168,7 @@ class QgsServerSourceSelect : public QDialog, private Ui::QgsServerSourceSelectB
165168
QStringList m_selectedStylesForSelectedLayers;
166169
long m_Epsg;
167170

168-
std::map<QString, QString> m_selectedStyleIdForLayer;
171+
QMap<QString, QString> m_selectedStyleIdForLayer;
169172

170173
//! The mime type, the text to use in the button and a unique number
171174
QMap<QString, QPair<QString, int> > m_PotentialFormats;

0 commit comments

Comments
 (0)