From 10d81dd7436d575868c40815fe2c7db2bb0bb2a4 Mon Sep 17 00:00:00 2001 From: marco Date: Thu, 6 Oct 2011 11:28:50 +0200 Subject: [PATCH 1/8] Insert date value in attribute editor --- src/gui/qgsattributeeditor.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/gui/qgsattributeeditor.cpp b/src/gui/qgsattributeeditor.cpp index 48459c70b9f..782aa13a4e2 100644 --- a/src/gui/qgsattributeeditor.cpp +++ b/src/gui/qgsattributeeditor.cpp @@ -762,9 +762,15 @@ bool QgsAttributeEditor::setValue( QWidget *editor, QgsVectorLayer *vl, int idx, case QgsVectorLayer::FileName: case QgsVectorLayer::Calendar: { - QLineEdit *le = editor->findChild(); - if ( le == NULL ) + QLineEdit* le = qobject_cast( editor ); + if( !le ) + { + le = editor->findChild(); + } + if ( !le ) + { return false; + } le->setText( value.toString() ); } break; From 30a676678ac664163c7ac509ebbb8a5be1a24cbc Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 13 Oct 2011 21:09:03 -0300 Subject: [PATCH 2/8] Refresh item also when it had no children (they could be added in meanwhile) --- src/app/qgsbrowserdockwidget.cpp | 2 +- src/browser/qgsbrowser.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/qgsbrowserdockwidget.cpp b/src/app/qgsbrowserdockwidget.cpp index 1c8a127d89c..311528fca49 100644 --- a/src/app/qgsbrowserdockwidget.cpp +++ b/src/app/qgsbrowserdockwidget.cpp @@ -269,7 +269,7 @@ void QgsBrowserDockWidget::refreshModel( const QModelIndex& index ) for ( int i = 0 ; i < mModel->rowCount( index ); i++ ) { QModelIndex idx = mModel->index( i, 0, index ); - if ( mBrowserView->isExpanded( idx ) ) + if ( mBrowserView->isExpanded( idx ) || !mModel->hasChildren( idx ) ) { refreshModel( idx ); } diff --git a/src/browser/qgsbrowser.cpp b/src/browser/qgsbrowser.cpp index 26a7584de37..c16181ac6dc 100644 --- a/src/browser/qgsbrowser.cpp +++ b/src/browser/qgsbrowser.cpp @@ -531,7 +531,7 @@ void QgsBrowser::refresh( const QModelIndex& index ) for ( int i = 0 ; i < mModel->rowCount( index ); i++ ) { QModelIndex idx = mModel->index( i, 0, index ); - if ( treeView->isExpanded( idx ) ) + if ( treeView->isExpanded( idx ) || !mModel->hasChildren( idx ) ) { refresh( idx ); } From e045d34661079025d5fedd5d0b3e1cdc9f998162 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 13 Oct 2011 21:17:05 -0300 Subject: [PATCH 3/8] Move WMS data items to separate file --- src/providers/wms/CMakeLists.txt | 2 + src/providers/wms/qgswmsdataitems.cpp | 192 ++++++++++++++++++++++++++ src/providers/wms/qgswmsdataitems.h | 52 +++++++ src/providers/wms/qgswmsprovider.cpp | 185 ------------------------- src/providers/wms/qgswmsprovider.h | 45 ------ 5 files changed, 246 insertions(+), 230 deletions(-) create mode 100644 src/providers/wms/qgswmsdataitems.cpp create mode 100644 src/providers/wms/qgswmsdataitems.h diff --git a/src/providers/wms/CMakeLists.txt b/src/providers/wms/CMakeLists.txt index d0d14fb4fe9..b0d6cf849a4 100644 --- a/src/providers/wms/CMakeLists.txt +++ b/src/providers/wms/CMakeLists.txt @@ -3,11 +3,13 @@ SET (WMS_SRCS qgswmsprovider.cpp qgswmssourceselect.cpp qgswmsconnection.cpp + qgswmsdataitems.cpp ) SET (WMS_MOC_HDRS qgswmsprovider.h qgswmssourceselect.h qgswmsconnection.h + qgswmsdataitems.h ) QT4_WRAP_CPP (WMS_MOC_SRCS ${WMS_MOC_HDRS}) diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp new file mode 100644 index 00000000000..a792a64e91c --- /dev/null +++ b/src/providers/wms/qgswmsdataitems.cpp @@ -0,0 +1,192 @@ +#include "qgswmsdataitems.h" + +#include "qgslogger.h" + +#include "qgswmsconnection.h" +#include "qgswmssourceselect.h" + +// --------------------------------------------------------------------------- +QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ) + : QgsDataCollectionItem( parent, name, path ) +{ +} + +QgsWMSConnectionItem::~QgsWMSConnectionItem() +{ +} + +QVector QgsWMSConnectionItem::createChildren() +{ + QgsDebugMsg( "Entered" ); + QVector children; + QgsWMSConnection connection( mName ); + QgsWmsProvider *wmsProvider = connection.provider( ); + if ( !wmsProvider ) + return children; + + QString mConnInfo = connection.connectionInfo(); + QgsDebugMsg( "mConnInfo = " + mConnInfo ); + + // Attention: supportedLayers() gives tree leafes, not top level + if ( !wmsProvider->supportedLayers( mLayerProperties ) ) + return children; + + QgsWmsCapabilitiesProperty mCapabilitiesProperty = wmsProvider->capabilitiesProperty(); + QgsWmsCapabilityProperty capabilityProperty = mCapabilitiesProperty.capability; + + // Top level layer is present max once + // + // - default maxOccurs=1 + QgsWmsLayerProperty topLayerProperty = capabilityProperty.layer; + foreach( QgsWmsLayerProperty layerProperty, topLayerProperty.layer ) + { + // Attention, the name may be empty + QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title ); + QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name; + + QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty ); + + children.append( layer ); + } + return children; +} + +bool QgsWMSConnectionItem::equal( const QgsDataItem *other ) +{ + if ( type() != other->type() ) + { + return false; + } + const QgsWMSConnectionItem *o = dynamic_cast( other ); + return ( mPath == o->mPath && mName == o->mName && mConnInfo == o->mConnInfo ); +} +// --------------------------------------------------------------------------- +QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperty ) + : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" ), + mCapabilitiesProperty( capabilitiesProperty ), + mConnInfo( connInfo ), + mLayerProperty( layerProperty ) + //mProviderKey ("wms"), + //mLayerType ( QgsLayerItem::Raster ) +{ + mUri = createUri(); + // Populate everything, it costs nothing, all info about layers is collected + foreach( QgsWmsLayerProperty layerProperty, mLayerProperty.layer ) + { + // Attention, the name may be empty + QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title ); + QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name; + QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty ); + mChildren.append( layer ); + } + + if ( mChildren.size() == 0 ) + { + mIcon = QIcon( getThemePixmap( "mIconWmsLayer.png" ) ); + } + mPopulated = true; +} + +QgsWMSLayerItem::~QgsWMSLayerItem() +{ +} + +QString QgsWMSLayerItem::createUri() +{ + QString uri; + if ( mLayerProperty.name.isEmpty() ) + return uri; // layer collection + + QString rasterLayerPath = mConnInfo; + QString baseName = mLayerProperty.name; + + // Number of styles must match number of layers + QStringList layers; + layers << mLayerProperty.name; + QStringList styles; + if ( mLayerProperty.style.size() > 0 ) + { + styles.append( mLayerProperty.style[0].name ); + } + else + { + styles << ""; // TODO: use loadDefaultStyleFlag + } + + QString format; + // get first supporte by qt and server + QVector formats = QgsWmsProvider::supportedFormats(); + foreach( QgsWmsSupportedFormat f, formats ) + { + if ( mCapabilitiesProperty.capability.request.getMap.format.indexOf( f.format ) >= 0 ) + { + format = f.format; + break; + } + } + QString crs; + // get first known if possible + QgsCoordinateReferenceSystem testCrs; + foreach( QString c, mLayerProperty.crs ) + { + testCrs.createFromOgcWmsCrs( c ); + if ( testCrs.isValid() ) + { + crs = c; + break; + } + } + if ( crs.isEmpty() && mLayerProperty.crs.size() > 0 ) + { + crs = mLayerProperty.crs[0]; + } + uri = rasterLayerPath + "|layers=" + layers.join( "," ) + "|styles=" + styles.join( "," ) + "|format=" + format + "|crs=" + crs; + + return uri; +} + +// --------------------------------------------------------------------------- +QgsWMSRootItem::QgsWMSRootItem( QgsDataItem* parent, QString name, QString path ) + : QgsDataCollectionItem( parent, name, path ) +{ + mIcon = QIcon( getThemePixmap( "mIconWms.png" ) ); + + populate(); +} + +QgsWMSRootItem::~QgsWMSRootItem() +{ +} + +QVectorQgsWMSRootItem::createChildren() +{ + QVector connections; + + foreach( QString connName, QgsWMSConnection::connectionList() ) + { + QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName ); + connections.append( conn ); + } + return connections; +} + +QWidget * QgsWMSRootItem::paramWidget() +{ + QgsWMSSourceSelect *select = new QgsWMSSourceSelect( 0, 0, true, true ); + connect( select, SIGNAL( connectionsChanged() ), this, SLOT( connectionsChanged() ) ); + return select; +} +void QgsWMSRootItem::connectionsChanged() +{ + refresh(); +} + +// --------------------------------------------------------------------------- + +QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) +{ + Q_UNUSED( thePath ); + + return new QgsWMSRootItem( parentItem, "WMS", "wms:" ); +} + diff --git a/src/providers/wms/qgswmsdataitems.h b/src/providers/wms/qgswmsdataitems.h new file mode 100644 index 00000000000..5eadf37b46c --- /dev/null +++ b/src/providers/wms/qgswmsdataitems.h @@ -0,0 +1,52 @@ +#ifndef QGSWMSDATAITEMS_H +#define QGSWMSDATAITEMS_H + +#include "qgswmsprovider.h" + +class QgsWMSConnectionItem : public QgsDataCollectionItem +{ + public: + QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ); + ~QgsWMSConnectionItem(); + + QVector createChildren(); + virtual bool equal( const QgsDataItem *other ); + + QgsWmsCapabilitiesProperty mCapabilitiesProperty; + QString mConnInfo; + QVector mLayerProperties; +}; + +// WMS Layers may be nested, so that they may be both QgsDataCollectionItem and QgsLayerItem +// We have to use QgsDataCollectionItem and support layer methods if necessary +class QgsWMSLayerItem : public QgsLayerItem +{ + Q_OBJECT + public: + QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, + QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperties ); + ~QgsWMSLayerItem(); + + QString createUri(); + + QgsWmsCapabilitiesProperty mCapabilitiesProperty; + QString mConnInfo; + QgsWmsLayerProperty mLayerProperty; +}; + +class QgsWMSRootItem : public QgsDataCollectionItem +{ + Q_OBJECT + public: + QgsWMSRootItem( QgsDataItem* parent, QString name, QString path ); + ~QgsWMSRootItem(); + + QVector createChildren(); + + virtual QWidget * paramWidget(); + + public slots: + void connectionsChanged(); +}; + +#endif // QGSWMSDATAITEMS_H diff --git a/src/providers/wms/qgswmsprovider.cpp b/src/providers/wms/qgswmsprovider.cpp index e5d41ec872f..a6544b2fb9d 100644 --- a/src/providers/wms/qgswmsprovider.cpp +++ b/src/providers/wms/qgswmsprovider.cpp @@ -3165,188 +3165,3 @@ QGISEXTERN int dataCapabilities() { return QgsDataProvider::Net; } -// --------------------------------------------------------------------------- -QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ) - : QgsDataCollectionItem( parent, name, path ) -{ -} - -QgsWMSConnectionItem::~QgsWMSConnectionItem() -{ -} - -QVector QgsWMSConnectionItem::createChildren() -{ - QgsDebugMsg( "Entered" ); - QVector children; - QgsWMSConnection connection( mName ); - QgsWmsProvider *wmsProvider = connection.provider( ); - if ( !wmsProvider ) - return children; - - QString mConnInfo = connection.connectionInfo(); - QgsDebugMsg( "mConnInfo = " + mConnInfo ); - - // Attention: supportedLayers() gives tree leafes, not top level - if ( !wmsProvider->supportedLayers( mLayerProperties ) ) - return children; - - QgsWmsCapabilitiesProperty mCapabilitiesProperty = wmsProvider->capabilitiesProperty(); - QgsWmsCapabilityProperty capabilityProperty = mCapabilitiesProperty.capability; - - // Top level layer is present max once - // - // - default maxOccurs=1 - QgsWmsLayerProperty topLayerProperty = capabilityProperty.layer; - foreach( QgsWmsLayerProperty layerProperty, topLayerProperty.layer ) - { - // Attention, the name may be empty - QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title ); - QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name; - - QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty ); - - children.append( layer ); - } - return children; -} - -bool QgsWMSConnectionItem::equal( const QgsDataItem *other ) -{ - if ( type() != other->type() ) - { - return false; - } - const QgsWMSConnectionItem *o = dynamic_cast( other ); - return ( mPath == o->mPath && mName == o->mName && mConnInfo == o->mConnInfo ); -} -// --------------------------------------------------------------------------- -QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperty ) - : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" ), - mCapabilitiesProperty( capabilitiesProperty ), - mConnInfo( connInfo ), - mLayerProperty( layerProperty ) - //mProviderKey ("wms"), - //mLayerType ( QgsLayerItem::Raster ) -{ - mUri = createUri(); - // Populate everything, it costs nothing, all info about layers is collected - foreach( QgsWmsLayerProperty layerProperty, mLayerProperty.layer ) - { - // Attention, the name may be empty - QgsDebugMsg( QString::number( layerProperty.orderId ) + " " + layerProperty.name + " " + layerProperty.title ); - QString pathName = layerProperty.name.isEmpty() ? QString::number( layerProperty.orderId ) : layerProperty.name; - QgsWMSLayerItem * layer = new QgsWMSLayerItem( this, layerProperty.title, mPath + "/" + pathName, mCapabilitiesProperty, mConnInfo, layerProperty ); - mChildren.append( layer ); - } - - if ( mChildren.size() == 0 ) - { - mIcon = QIcon( getThemePixmap( "mIconWmsLayer.png" ) ); - } - mPopulated = true; -} - -QgsWMSLayerItem::~QgsWMSLayerItem() -{ -} - -QString QgsWMSLayerItem::createUri() -{ - QString uri; - if ( mLayerProperty.name.isEmpty() ) - return uri; // layer collection - - QString rasterLayerPath = mConnInfo; - QString baseName = mLayerProperty.name; - - // Number of styles must match number of layers - QStringList layers; - layers << mLayerProperty.name; - QStringList styles; - if ( mLayerProperty.style.size() > 0 ) - { - styles.append( mLayerProperty.style[0].name ); - } - else - { - styles << ""; // TODO: use loadDefaultStyleFlag - } - - QString format; - // get first supporte by qt and server - QVector formats = QgsWmsProvider::supportedFormats(); - foreach( QgsWmsSupportedFormat f, formats ) - { - if ( mCapabilitiesProperty.capability.request.getMap.format.indexOf( f.format ) >= 0 ) - { - format = f.format; - break; - } - } - QString crs; - // get first known if possible - QgsCoordinateReferenceSystem testCrs; - foreach( QString c, mLayerProperty.crs ) - { - testCrs.createFromOgcWmsCrs( c ); - if ( testCrs.isValid() ) - { - crs = c; - break; - } - } - if ( crs.isEmpty() && mLayerProperty.crs.size() > 0 ) - { - crs = mLayerProperty.crs[0]; - } - uri = rasterLayerPath + "|layers=" + layers.join( "," ) + "|styles=" + styles.join( "," ) + "|format=" + format + "|crs=" + crs; - - return uri; -} - -// --------------------------------------------------------------------------- -QgsWMSRootItem::QgsWMSRootItem( QgsDataItem* parent, QString name, QString path ) - : QgsDataCollectionItem( parent, name, path ) -{ - mIcon = QIcon( getThemePixmap( "mIconWms.png" ) ); - - populate(); -} - -QgsWMSRootItem::~QgsWMSRootItem() -{ -} - -QVectorQgsWMSRootItem::createChildren() -{ - QVector connections; - - foreach( QString connName, QgsWMSConnection::connectionList() ) - { - QgsDataItem * conn = new QgsWMSConnectionItem( this, connName, mPath + "/" + connName ); - connections.append( conn ); - } - return connections; -} - -QWidget * QgsWMSRootItem::paramWidget() -{ - QgsWMSSourceSelect *select = new QgsWMSSourceSelect( 0, 0, true, true ); - connect( select, SIGNAL( connectionsChanged() ), this, SLOT( connectionsChanged() ) ); - return select; -} -void QgsWMSRootItem::connectionsChanged() -{ - refresh(); -} - -// --------------------------------------------------------------------------- - -QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) -{ - Q_UNUSED( thePath ); - - return new QgsWMSRootItem( parentItem, "WMS", "wms:" ); -} - diff --git a/src/providers/wms/qgswmsprovider.h b/src/providers/wms/qgswmsprovider.h index 325e01fd4aa..e3ce9ea6bb1 100644 --- a/src/providers/wms/qgswmsprovider.h +++ b/src/providers/wms/qgswmsprovider.h @@ -968,51 +968,6 @@ class QgsWmsProvider : public QgsRasterDataProvider QStringList mSupportedGetFeatureFormats; }; -class QgsWMSConnectionItem : public QgsDataCollectionItem -{ - public: - QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ); - ~QgsWMSConnectionItem(); - - QVector createChildren(); - virtual bool equal( const QgsDataItem *other ); - - QgsWmsCapabilitiesProperty mCapabilitiesProperty; - QString mConnInfo; - QVector mLayerProperties; -}; - -// WMS Layers may be nested, so that they may be both QgsDataCollectionItem and QgsLayerItem -// We have to use QgsDataCollectionItem and support layer methods if necessary -class QgsWMSLayerItem : public QgsLayerItem -{ - Q_OBJECT - public: - QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, - QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperties ); - ~QgsWMSLayerItem(); - - QString createUri(); - - QgsWmsCapabilitiesProperty mCapabilitiesProperty; - QString mConnInfo; - QgsWmsLayerProperty mLayerProperty; -}; - -class QgsWMSRootItem : public QgsDataCollectionItem -{ - Q_OBJECT - public: - QgsWMSRootItem( QgsDataItem* parent, QString name, QString path ); - ~QgsWMSRootItem(); - - QVector createChildren(); - - virtual QWidget * paramWidget(); - - public slots: - void connectionsChanged(); -}; #endif From befb5f6506b70e7e272702dfa67cd33c70970916 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 13 Oct 2011 21:28:37 -0300 Subject: [PATCH 4/8] WMS: add/edit/delete connection from data items --- src/providers/wms/qgswmsdataitems.cpp | 61 +++++++++++++++++++++++++++ src/providers/wms/qgswmsdataitems.h | 11 +++++ 2 files changed, 72 insertions(+) diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp index a792a64e91c..22930361592 100644 --- a/src/providers/wms/qgswmsdataitems.cpp +++ b/src/providers/wms/qgswmsdataitems.cpp @@ -5,6 +5,8 @@ #include "qgswmsconnection.h" #include "qgswmssourceselect.h" +#include "qgsnewhttpconnection.h" + // --------------------------------------------------------------------------- QgsWMSConnectionItem::QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ) : QgsDataCollectionItem( parent, name, path ) @@ -60,7 +62,43 @@ bool QgsWMSConnectionItem::equal( const QgsDataItem *other ) const QgsWMSConnectionItem *o = dynamic_cast( other ); return ( mPath == o->mPath && mName == o->mName && mConnInfo == o->mConnInfo ); } + +QList QgsWMSConnectionItem::actions() +{ + QList lst; + + QAction* actionEdit = new QAction( tr( "Edit..." ), this ); + connect( actionEdit, SIGNAL( triggered() ), this, SLOT( editConnection() ) ); + lst.append( actionEdit ); + + QAction* actionDelete = new QAction( tr( "Delete" ), this ); + connect( actionDelete, SIGNAL( triggered() ), this, SLOT( deleteConnection() ) ); + lst.append( actionDelete ); + + return lst; +} + +void QgsWMSConnectionItem::editConnection() +{ + QgsNewHttpConnection nc( 0, "/Qgis/connections-wms/", mName ); + + if ( nc.exec() ) + { + // the parent should be updated + mParent->refresh(); + } +} + +void QgsWMSConnectionItem::deleteConnection() +{ + QgsWMSConnection::deleteConnection( mName ); + // the parent should be updated + mParent->refresh(); +} + + // --------------------------------------------------------------------------- + QgsWMSLayerItem::QgsWMSLayerItem( QgsDataItem* parent, QString name, QString path, QgsWmsCapabilitiesProperty capabilitiesProperty, QString connInfo, QgsWmsLayerProperty layerProperty ) : QgsLayerItem( parent, name, path, QString(), QgsLayerItem::Raster, "wms" ), mCapabilitiesProperty( capabilitiesProperty ), @@ -170,6 +208,18 @@ QVectorQgsWMSRootItem::createChildren() return connections; } +QList QgsWMSRootItem::actions() +{ + QList lst; + + QAction* actionNew = new QAction( tr( "New..." ), this ); + connect( actionNew, SIGNAL( triggered() ), this, SLOT( newConnection() ) ); + lst.append( actionNew ); + + return lst; +} + + QWidget * QgsWMSRootItem::paramWidget() { QgsWMSSourceSelect *select = new QgsWMSSourceSelect( 0, 0, true, true ); @@ -181,6 +231,17 @@ void QgsWMSRootItem::connectionsChanged() refresh(); } +void QgsWMSRootItem::newConnection() +{ + QgsNewHttpConnection nc( 0 ); + + if ( nc.exec() ) + { + refresh(); + } +} + + // --------------------------------------------------------------------------- QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) diff --git a/src/providers/wms/qgswmsdataitems.h b/src/providers/wms/qgswmsdataitems.h index 5eadf37b46c..5c06c70e86e 100644 --- a/src/providers/wms/qgswmsdataitems.h +++ b/src/providers/wms/qgswmsdataitems.h @@ -5,6 +5,7 @@ class QgsWMSConnectionItem : public QgsDataCollectionItem { + Q_OBJECT public: QgsWMSConnectionItem( QgsDataItem* parent, QString name, QString path ); ~QgsWMSConnectionItem(); @@ -12,9 +13,15 @@ class QgsWMSConnectionItem : public QgsDataCollectionItem QVector createChildren(); virtual bool equal( const QgsDataItem *other ); + virtual QList actions(); + QgsWmsCapabilitiesProperty mCapabilitiesProperty; QString mConnInfo; QVector mLayerProperties; + + public slots: + void editConnection(); + void deleteConnection(); }; // WMS Layers may be nested, so that they may be both QgsDataCollectionItem and QgsLayerItem @@ -43,10 +50,14 @@ class QgsWMSRootItem : public QgsDataCollectionItem QVector createChildren(); + virtual QList actions(); + virtual QWidget * paramWidget(); public slots: void connectionsChanged(); + + void newConnection(); }; #endif // QGSWMSDATAITEMS_H From fb6d5512a48dc31c84bab095ad57b065d9c4bc70 Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Thu, 13 Oct 2011 21:58:35 -0300 Subject: [PATCH 5/8] Add error item to facilitate error handling --- src/core/qgsdataitem.cpp | 13 +++++++++++++ src/core/qgsdataitem.h | 19 +++++++++++++++++++ .../postgres/qgspostgresdataitems.cpp | 3 +++ src/providers/wfs/qgswfsdataitems.cpp | 2 +- src/providers/wms/qgswmsdataitems.cpp | 3 +++ 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/core/qgsdataitem.cpp b/src/core/qgsdataitem.cpp index e6d29b3e1b2..510e3420424 100644 --- a/src/core/qgsdataitem.cpp +++ b/src/core/qgsdataitem.cpp @@ -565,3 +565,16 @@ void QgsDirectoryParamWidget::showHideColumn() } settings.setValue( "/dataitem/directoryHiddenColumns", lst ); } + + +QgsErrorItem::QgsErrorItem( QgsDataItem* parent, QString error, QString path ) + : QgsDataItem( QgsDataItem::Error, parent, error, path ) +{ + mIcon = QIcon( getThemePixmap( "/mIconDelete.png" ) ); + + mPopulated = true; // no more children +} + +QgsErrorItem::~QgsErrorItem() +{ +} diff --git a/src/core/qgsdataitem.h b/src/core/qgsdataitem.h index b9bfd65b9ef..700b1a9fe08 100644 --- a/src/core/qgsdataitem.h +++ b/src/core/qgsdataitem.h @@ -46,6 +46,7 @@ class CORE_EXPORT QgsDataItem : public QObject Collection, Directory, Layer, + Error, }; QgsDataItem( QgsDataItem::Type type, QgsDataItem* parent, QString name, QString path ); @@ -225,6 +226,24 @@ class CORE_EXPORT QgsDirectoryItem : public QgsDataCollectionItem static QVector mLibraries; }; +/** + Data item that can be used to report problems (e.g. network error) + */ +class CORE_EXPORT QgsErrorItem : public QgsDataItem +{ + Q_OBJECT + public: + + QgsErrorItem( QgsDataItem* parent, QString error, QString path ); + ~QgsErrorItem(); + + //QVector createChildren(); + //virtual bool equal( const QgsDataItem *other ); +}; + + +// --------- + class QgsDirectoryParamWidget : public QTreeWidget { Q_OBJECT diff --git a/src/providers/postgres/qgspostgresdataitems.cpp b/src/providers/postgres/qgspostgresdataitems.cpp index bb7823714ef..790599b45b5 100644 --- a/src/providers/postgres/qgspostgresdataitems.cpp +++ b/src/providers/postgres/qgspostgresdataitems.cpp @@ -29,7 +29,10 @@ QVector QgsPGConnectionItem::createChildren() QgsDebugMsg( "mConnInfo = " + mConnInfo ); if ( !pgProvider->supportedLayers( mLayerProperties, true, false, false ) ) + { + children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) ); return children; + } QMap > schemasMap; foreach( QgsPostgresLayerProperty layerProperty, mLayerProperties ) diff --git a/src/providers/wfs/qgswfsdataitems.cpp b/src/providers/wfs/qgswfsdataitems.cpp index 4202b7cab93..44a181e7d60 100644 --- a/src/providers/wfs/qgswfsdataitems.cpp +++ b/src/providers/wfs/qgswfsdataitems.cpp @@ -57,7 +57,7 @@ QVector QgsWFSConnectionItem::createChildren() } else { - // TODO: return an "error" item + layers.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) ); } mConn->deleteLater(); diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp index 22930361592..4eb75f58d8d 100644 --- a/src/providers/wms/qgswmsdataitems.cpp +++ b/src/providers/wms/qgswmsdataitems.cpp @@ -31,7 +31,10 @@ QVector QgsWMSConnectionItem::createChildren() // Attention: supportedLayers() gives tree leafes, not top level if ( !wmsProvider->supportedLayers( mLayerProperties ) ) + { + children.append( new QgsErrorItem( this, tr( "Failed to retrieve layers" ), mPath + "/error" ) ); return children; + } QgsWmsCapabilitiesProperty mCapabilitiesProperty = wmsProvider->capabilitiesProperty(); QgsWmsCapabilityProperty capabilityProperty = mCapabilitiesProperty.capability; From b3bebf3a9f6bd92b64220fcfefcaaedee90e30d3 Mon Sep 17 00:00:00 2001 From: marco Date: Sat, 15 Oct 2011 18:04:12 +0200 Subject: [PATCH 6/8] WMS server: avoid reading layer symbology if the request does not come from SLD --- src/mapserver/qgsconfigparser.cpp | 19 ++++++++++ src/mapserver/qgsconfigparser.h | 17 ++++++++- src/mapserver/qgsprojectparser.cpp | 59 +++++++++++++++++------------- src/mapserver/qgsprojectparser.h | 4 +- src/mapserver/qgssldparser.cpp | 27 ++------------ src/mapserver/qgssldparser.h | 16 +------- 6 files changed, 75 insertions(+), 67 deletions(-) diff --git a/src/mapserver/qgsconfigparser.cpp b/src/mapserver/qgsconfigparser.cpp index f27b58b2a9b..83e7bd13b9f 100644 --- a/src/mapserver/qgsconfigparser.cpp +++ b/src/mapserver/qgsconfigparser.cpp @@ -42,6 +42,25 @@ QgsConfigParser::~QgsConfigParser() { delete it.value(); } + + //remove the temporary files + for ( QList::const_iterator it = mFilesToRemove.constBegin(); it != mFilesToRemove.constEnd(); ++it ) + { + delete *it; + } + + //and also those the temporary file paths + for ( QList::const_iterator it = mFilePathsToRemove.constBegin(); it != mFilePathsToRemove.constEnd(); ++it ) + { + QFile::remove( *it ); + } + + //delete the layers in the list + QList::iterator layer_it = mLayersToRemove.begin(); + for ( ; layer_it != mLayersToRemove.end(); ++layer_it ) + { + delete *layer_it; + } } void QgsConfigParser::setDefaultLegendSettings() diff --git a/src/mapserver/qgsconfigparser.h b/src/mapserver/qgsconfigparser.h index 0513296f360..e6588d1bf6a 100644 --- a/src/mapserver/qgsconfigparser.h +++ b/src/mapserver/qgsconfigparser.h @@ -23,6 +23,7 @@ #include #include #include +#include class QgsComposition; class QgsComposerLabel; @@ -41,8 +42,9 @@ class QgsConfigParser virtual void layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const = 0; /**Returns one or possibly several maplayers for a given layer name and style. If there are several layers, the layers should be drawn in inverse list order. - If no layers/style are found, an empty list is returned*/ - virtual QList mapLayerFromStyle( const QString& layerName, const QString& styleName, bool allowCaching = true ) const = 0; + If no layers/style are found, an empty list is returned + @param allowCache true if layer can be read from / written to cache*/ + virtual QList mapLayerFromStyle( const QString& layerName, const QString& styleName, bool useCache = true ) const = 0; /**Returns number of layers in configuration*/ virtual int numberOfLayers() const = 0; @@ -124,6 +126,17 @@ class QgsConfigParser /**List of GML datasets passed outside SLD (e.g. in a SOAP request). Key of the map is the layer name*/ QMap mExternalGMLDatasets; + //todo: leave this to the layer cash? + /**Stores pointers to layers that have to be removed in the destructor of QgsSLDParser*/ + mutable QList mLayersToRemove; + + /**Stores the temporary file objects. The class takes ownership of the objects and deletes them in the destructor*/ + mutable QList mFilesToRemove; + + /**Stores paths of files that need to be removed after each request (necessary because of contours shapefiles that \ + cannot be handles with QTemporaryFile*/ + mutable QList mFilePathsToRemove; + /**Layer font for GetLegendGraphics*/ QFont mLegendLayerFont; /**Item font for GetLegendGraphics*/ diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index d20dd53ad96..f9b05a3f307 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -299,25 +299,12 @@ void QgsProjectParser::combineExtentAndCrsOfGroupChildren( QDomElement& groupEle appendLayerBoundingBoxes( groupElem, doc, combinedBBox, groupCRS ); } -QList QgsProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool allowCaching ) const +QList QgsProjectParser::mapLayerFromStyle( const QString& lName, const QString& styleName, bool useCache ) const { Q_UNUSED( styleName ); - Q_UNUSED( allowCaching ); + Q_UNUSED( useCache ); QList layerList; - //first assume lName refers to a leaf layer - QMap< QString, QDomElement > layerElemMap = projectLayerElementsByName(); - QMap< QString, QDomElement >::const_iterator layerElemIt = layerElemMap.find( lName ); - if ( layerElemIt != layerElemMap.constEnd() ) - { - QgsMapLayer* layer = createLayerFromElement( layerElemIt.value() ); - if ( layer ) - { - layerList.push_back( layer ); - return layerList; - } - } - //Check if layer name refers to the top level group for the project. if ( lName == projectTitle() ) { @@ -325,11 +312,24 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c QList::const_iterator layerElemIt = layerElemList.constBegin(); for ( ; layerElemIt != layerElemList.constEnd(); ++layerElemIt ) { - layerList.push_back( createLayerFromElement( *layerElemIt ) ); + layerList.push_back( createLayerFromElement( *layerElemIt, useCache ) ); } return layerList; } + //does lName refer to a leaf layer + QMap< QString, QDomElement > layerElemMap = projectLayerElementsByName(); + QMap< QString, QDomElement >::const_iterator layerElemIt = layerElemMap.find( lName ); + if ( layerElemIt != layerElemMap.constEnd() ) + { + QgsMapLayer* layer = createLayerFromElement( layerElemIt.value(), useCache ); + if ( layer ) + { + layerList.push_back( layer ); + return layerList; + } + } + //maybe the layer is a goup. Check if lName is contained in the group list QMap< QString, QDomElement > idLayerMap = projectLayerElementsById(); @@ -367,7 +367,7 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c for ( int i = 0; i < pLayerNodes.size(); ++i ) { QString pLayerId = pLayerNodes.at( i ).toElement().firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" ); - QgsMapLayer* pLayer = p->createLayerFromElement( pLayerElems[pLayerId] ); + QgsMapLayer* pLayer = p->createLayerFromElement( pLayerElems[pLayerId], useCache ); if ( pLayer ) { layerList.push_back( pLayer ); @@ -384,7 +384,7 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c QMap< QString, QDomElement >::const_iterator layerEntry = idLayerMap.find( layerFileList.at( i ).toElement().attribute( "layerid" ) ); if ( layerEntry != idLayerMap.constEnd() ) { - layerList.push_back( createLayerFromElement( layerEntry.value() ) ); + layerList.push_back( createLayerFromElement( layerEntry.value(), useCache ) ); } } } @@ -413,7 +413,7 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c { if ( otherLayerIt.value().firstChildElement( "layername" ).text() == lName ) { - layerList.push_back( otherParser->createLayerFromElement( otherLayerIt.value() ) ); + layerList.push_back( otherParser->createLayerFromElement( otherLayerIt.value(), useCache ) ); return layerList; } } @@ -832,7 +832,7 @@ QMap< QString, QDomElement > QgsProjectParser::projectLayerElementsByName() cons return layerMap; } -QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem ) const +QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem, bool useCache ) const { if ( elem.isNull() || !mXMLDoc ) { @@ -855,12 +855,14 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem ) } QString id = layerId( elem ); - QgsMapLayer* layer = QgsMSLayerCache::instance()->searchLayer( absoluteUri, id ); + QgsMapLayer* layer = 0; + if ( useCache ) + { + layer = QgsMSLayerCache::instance()->searchLayer( absoluteUri, id ); + } + if ( layer ) { - //reading symbology every time is necessary because it could have been changed by a user SLD based request - QString error; - layer->readSymbology( elem, error ); return layer; } @@ -896,7 +898,14 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem ) { layer->readXML( const_cast( elem ) ); //should be changed to const in QgsMapLayer layer->setLayerName( layerName( elem ) ); - QgsMSLayerCache::instance()->insertLayer( absoluteUri, id, layer ); + if ( useCache ) + { + QgsMSLayerCache::instance()->insertLayer( absoluteUri, id, layer ); + } + else + { + mLayersToRemove.push_back( layer ); + } } return layer; } diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index 35cc3e98429..cfb9df4319f 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -41,7 +41,7 @@ class QgsProjectParser: public QgsConfigParser int numberOfLayers() const; /**Returns one or possibly several maplayers for a given layer name and style. If no layers/style are found, an empty list is returned*/ - virtual QList mapLayerFromStyle( const QString& lName, const QString& styleName, bool allowCaching = true ) const; + virtual QList mapLayerFromStyle( const QString& lName, const QString& styleName, bool useCache = true ) const; /**Fills a layer and a style list. The two list have the same number of entries and the style and the layer at a position belong together (similar to the HTTP parameters 'Layers' and 'Styles'. Returns 0 in case of success*/ virtual int layersAndStyles( QStringList& layers, QStringList& styles ) const; @@ -118,7 +118,7 @@ class QgsProjectParser: public QgsConfigParser QMap< QString, QDomElement > projectLayerElementsByName() const; /**Creates a maplayer object from element. The layer cash owns the maplayer, so don't delete it @return the maplayer or 0 in case of error*/ - QgsMapLayer* createLayerFromElement( const QDomElement& elem ) const; + QgsMapLayer* createLayerFromElement( const QDomElement& elem, bool useCache = true ) const; /**Returns the text of the element for a layer element @return id or a null string in case of error*/ QString layerId( const QDomElement& layerElem ) const; diff --git a/src/mapserver/qgssldparser.cpp b/src/mapserver/qgssldparser.cpp index 38f4855301c..ee738547414 100644 --- a/src/mapserver/qgssldparser.cpp +++ b/src/mapserver/qgssldparser.cpp @@ -121,25 +121,6 @@ QgsSLDParser::QgsSLDParser(): mXMLDoc( 0 ) QgsSLDParser::~QgsSLDParser() { - //remove the temporary files - for ( QList::const_iterator it = mFilesToRemove.constBegin(); it != mFilesToRemove.constEnd(); ++it ) - { - delete *it; - } - - //and also those the temporary file paths - for ( QList::const_iterator it = mFilePathsToRemove.constBegin(); it != mFilePathsToRemove.constEnd(); ++it ) - { - QFile::remove( *it ); - } - - //delete the layers in the list - QList::iterator layer_it = mLayersToRemove.begin(); - for ( ; layer_it != mLayersToRemove.end(); ++layer_it ) - { - delete *layer_it; - } - delete mXMLDoc; } @@ -275,7 +256,7 @@ void QgsSLDParser::layersAndStylesCapabilities( QDomElement& parentElement, QDom } } -QList QgsSLDParser::mapLayerFromStyle( const QString& layerName, const QString& styleName, bool allowCaching ) const +QList QgsSLDParser::mapLayerFromStyle( const QString& layerName, const QString& styleName, bool useCache ) const { QList fallbackLayerList; QList resultList; @@ -287,7 +268,7 @@ QList QgsSLDParser::mapLayerFromStyle( const QString& layerName, c QDomElement userStyleElement = findUserStyleElement( namedLayerElemList[i], styleName ); if ( !userStyleElement.isNull() ) { - fallbackLayerList = mFallbackParser->mapLayerFromStyle( layerName, "", allowCaching ); + fallbackLayerList = mFallbackParser->mapLayerFromStyle( layerName, "", false ); if ( fallbackLayerList.size() > 0 ) { QgsVectorLayer* v = dynamic_cast( fallbackLayerList.at( 0 ) ); @@ -335,7 +316,7 @@ QList QgsSLDParser::mapLayerFromStyle( const QString& layerName, c //maybe named layer and named style is defined in the fallback SLD? if ( mFallbackParser ) { - resultList = mFallbackParser->mapLayerFromStyle( layerName, styleName, allowCaching ); + resultList = mFallbackParser->mapLayerFromStyle( layerName, styleName, useCache ); } QList::iterator it = resultList.begin(); @@ -349,7 +330,7 @@ QList QgsSLDParser::mapLayerFromStyle( const QString& layerName, c QDomElement userStyleElement = findUserStyleElement( userLayerElement, styleName ); - QgsMapLayer* theMapLayer = mapLayerFromUserLayer( userLayerElement, layerName, allowCaching ); + QgsMapLayer* theMapLayer = mapLayerFromUserLayer( userLayerElement, layerName, useCache ); if ( !theMapLayer ) { return resultList; diff --git a/src/mapserver/qgssldparser.h b/src/mapserver/qgssldparser.h index 6047c49578a..826caa27a30 100644 --- a/src/mapserver/qgssldparser.h +++ b/src/mapserver/qgssldparser.h @@ -34,7 +34,6 @@ class QgsRenderer; #include #include #include -#include #ifdef DIAGRAMSERVER #include "qgsdiagramcategory.h" @@ -61,7 +60,7 @@ class QgsSLDParser: public QgsConfigParser int numberOfLayers() const; /**Returns one or possibly several maplayers for a given layer name and style. If no layers/style are found, an empty list is returned*/ - QList mapLayerFromStyle( const QString& layerName, const QString& styleName, bool allowCaching = true ) const; + QList mapLayerFromStyle( const QString& layerName, const QString& styleName, bool useCache = true ) const; /**Fills a layer and a style list. The two list have the same number of entries and the style and the layer at a position belong together (similar to the HTTP parameters 'Layers' and 'Styles'. Returns 0 in case of success*/ int layersAndStyles( QStringList& layers, QStringList& styles ) const; @@ -144,25 +143,12 @@ class QgsSLDParser: public QgsConfigParser double scaleFactorFromScaleTag( const QDomElement& scaleElem ) const; #endif //DIAGRAMSERVER - - /**SLD as dom document*/ QDomDocument* mXMLDoc; /**Map containing the WMS parameters of the request*/ std::map mParameterMap; - //todo: leave this to the layer cash? - /**Stores pointers to layers that have to be removed in the destructor of QgsSLDParser*/ - mutable QList mLayersToRemove; - - - /**Stores the temporary file objects. The class takes ownership of the objects and deletes them in the destructor*/ - mutable QList mFilesToRemove; - /**Stores paths of files that need to be removed after each request (necessary because of contours shapefiles that \ - cannot be handles with QTemporaryFile*/ - mutable QList mFilePathsToRemove; - QString mSLDNamespace; }; From 3d9a0ae909a4efc68d88e307e2116d51e8483dd1 Mon Sep 17 00:00:00 2001 From: marco Date: Sat, 15 Oct 2011 23:36:28 +0200 Subject: [PATCH 7/8] Some xml optimisation for WMS server --- src/mapserver/qgsprojectparser.cpp | 191 +++++++++-------------------- src/mapserver/qgsprojectparser.h | 17 +-- 2 files changed, 69 insertions(+), 139 deletions(-) diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index f9b05a3f307..99e67a05c45 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -44,6 +44,31 @@ QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc, const QString& filePat mOutputUnits = QgsMapRenderer::Millimeters; setLegendParametersFromProject(); setSelectionColor(); + + //accelerate search for layers and groups + if ( mXMLDoc ) + { + QDomNodeList layerNodeList = mXMLDoc->elementsByTagName( "maplayer" ); + QDomElement currentElement; + int nNodes = layerNodeList.size(); + for ( int i = 0; i < nNodes; ++i ) + { + currentElement = layerNodeList.at( i ).toElement(); + mProjectLayerElements.push_back( currentElement ); + mProjectLayerElementsByName.insert( layerName( currentElement ), currentElement ); + mProjectLayerElementsById.insert( layerId( currentElement ), currentElement ); + } + + QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" ); + if ( !legendElement.isNull() ) + { + QDomNodeList groupNodeList = legendElement.elementsByTagName( "legendgroup" ); + for ( int i = 0; i < groupNodeList.size(); ++i ) + { + mLegendGroupElements.push_back( groupNodeList.at( i ).toElement() ); + } + } + } } QgsProjectParser::~QgsProjectParser() @@ -53,25 +78,22 @@ QgsProjectParser::~QgsProjectParser() int QgsProjectParser::numberOfLayers() const { - QList layerElems = projectLayerElements(); - return layerElems.size(); + return mProjectLayerElements.size(); } void QgsProjectParser::layersAndStylesCapabilities( QDomElement& parentElement, QDomDocument& doc ) const { - QList layerElems = projectLayerElements(); - QStringList nonIdentifiableLayers = identifyDisabledLayers(); - if ( layerElems.size() < 1 ) + if ( mProjectLayerElements.size() < 1 ) { return; } QMap layerMap; - QList::const_iterator layerIt = layerElems.constBegin(); - for ( ; layerIt != layerElems.constEnd(); ++layerIt ) + QList::const_iterator layerIt = mProjectLayerElements.constBegin(); + for ( ; layerIt != mProjectLayerElements.constEnd(); ++layerIt ) { QgsMapLayer *layer = createLayerFromElement( *layerIt ); if ( layer ) @@ -151,9 +173,8 @@ void QgsProjectParser::addLayers( QDomDocument &doc, QStringList pIdDisabled = p->identifyDisabledLayers(); QDomElement embeddedGroupElem; - QList pLegendElems = p->legendGroupElements(); - QList::const_iterator pLegendIt = pLegendElems.constBegin(); - for ( ; pLegendIt != pLegendElems.constEnd(); ++pLegendIt ) + QList::const_iterator pLegendIt = mLegendGroupElements.constBegin(); + for ( ; pLegendIt != mLegendGroupElements.constEnd(); ++pLegendIt ) { if ( pLegendIt->attribute( "name" ) == embeddedGroupName ) { @@ -162,10 +183,9 @@ void QgsProjectParser::addLayers( QDomDocument &doc, } } - QList pLayerElems = p->projectLayerElements(); QMap pLayerMap; - QList::const_iterator pLayerIt = pLayerElems.constBegin(); - for ( ; pLayerIt != pLayerElems.constEnd(); ++pLayerIt ) + QList::const_iterator pLayerIt = mProjectLayerElements.constBegin(); + for ( ; pLayerIt != mProjectLayerElements.constEnd(); ++pLayerIt ) { pLayerMap.insert( layerId( *pLayerIt ), p->createLayerFromElement( *pLayerIt ) ); } @@ -308,9 +328,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c //Check if layer name refers to the top level group for the project. if ( lName == projectTitle() ) { - QList layerElemList = projectLayerElements(); - QList::const_iterator layerElemIt = layerElemList.constBegin(); - for ( ; layerElemIt != layerElemList.constEnd(); ++layerElemIt ) + QList::const_iterator layerElemIt = mProjectLayerElements.constBegin(); + for ( ; layerElemIt != mProjectLayerElements.constEnd(); ++layerElemIt ) { layerList.push_back( createLayerFromElement( *layerElemIt, useCache ) ); } @@ -318,9 +337,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c } //does lName refer to a leaf layer - QMap< QString, QDomElement > layerElemMap = projectLayerElementsByName(); - QMap< QString, QDomElement >::const_iterator layerElemIt = layerElemMap.find( lName ); - if ( layerElemIt != layerElemMap.constEnd() ) + QHash< QString, QDomElement >::const_iterator layerElemIt = mProjectLayerElementsByName.find( lName ); + if ( layerElemIt != mProjectLayerElementsByName.constEnd() ) { QgsMapLayer* layer = createLayerFromElement( layerElemIt.value(), useCache ); if ( layer ) @@ -331,11 +349,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c } //maybe the layer is a goup. Check if lName is contained in the group list - QMap< QString, QDomElement > idLayerMap = projectLayerElementsById(); - - QList legendGroups = legendGroupElements(); - QList::const_iterator groupIt = legendGroups.constBegin(); - for ( ; groupIt != legendGroups.constEnd(); ++groupIt ) + QList::const_iterator groupIt = mLegendGroupElements.constBegin(); + for ( ; groupIt != mLegendGroupElements.constEnd(); ++groupIt ) { if ( groupIt->attribute( "name" ) == lName ) { @@ -346,11 +361,10 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c QgsProjectParser* p = dynamic_cast( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( p ) { - QList pGroupElems = p->legendGroupElements(); - QList::const_iterator pGroupIt = pGroupElems.constBegin(); + QList::const_iterator pGroupIt = mLegendGroupElements.constBegin(); QDomElement embeddedGroupElem; - for ( ; pGroupIt != pGroupElems.constEnd(); ++pGroupIt ) + for ( ; pGroupIt != mLegendGroupElements.constEnd(); ++pGroupIt ) { if ( pGroupIt->attribute( "name" ) == lName ) { @@ -362,12 +376,11 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c if ( !embeddedGroupElem.isNull() ) { //add all the layers under the group - QMap< QString, QDomElement > pLayerElems = p->projectLayerElementsById(); QDomNodeList pLayerNodes = embeddedGroupElem.elementsByTagName( "legendlayer" ); for ( int i = 0; i < pLayerNodes.size(); ++i ) { QString pLayerId = pLayerNodes.at( i ).toElement().firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" ); - QgsMapLayer* pLayer = p->createLayerFromElement( pLayerElems[pLayerId], useCache ); + QgsMapLayer* pLayer = p->createLayerFromElement( mProjectLayerElementsById[pLayerId], useCache ); if ( pLayer ) { layerList.push_back( pLayer ); @@ -381,8 +394,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c QDomNodeList layerFileList = groupIt->elementsByTagName( "legendlayerfile" ); for ( int i = 0; i < layerFileList.size(); ++i ) { - QMap< QString, QDomElement >::const_iterator layerEntry = idLayerMap.find( layerFileList.at( i ).toElement().attribute( "layerid" ) ); - if ( layerEntry != idLayerMap.constEnd() ) + QHash< QString, QDomElement >::const_iterator layerEntry = mProjectLayerElementsById.find( layerFileList.at( i ).toElement().attribute( "layerid" ) ); + if ( layerEntry != mProjectLayerElementsById.constEnd() ) { layerList.push_back( createLayerFromElement( layerEntry.value(), useCache ) ); } @@ -393,8 +406,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c } //maybe the layer is embedded from another project - QMap< QString, QDomElement >::const_iterator layerIt = idLayerMap.constBegin(); - for ( ; layerIt != idLayerMap.constEnd(); ++layerIt ) + QHash< QString, QDomElement >::const_iterator layerIt = mProjectLayerElementsById.constBegin(); + for ( ; layerIt != mProjectLayerElementsById.constEnd(); ++layerIt ) { if ( layerIt.value().attribute( "embedded" ) == "1" ) { @@ -407,9 +420,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c if ( otherParser ) { //get element by id - QMap< QString, QDomElement > otherLayerElems = otherParser->projectLayerElementsById(); - QMap< QString, QDomElement >::const_iterator otherLayerIt = otherLayerElems.find( id ); - if ( otherLayerIt != otherLayerElems.constEnd() ) + QHash< QString, QDomElement >::const_iterator otherLayerIt = otherParser->mProjectLayerElementsById.find( id ); + if ( otherLayerIt != otherParser->mProjectLayerElementsById.constEnd() ) { if ( otherLayerIt.value().firstChildElement( "layername" ).text() == lName ) { @@ -422,8 +434,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c } //layer still not found. Check if it is a single layer contained in a embedded layer group - groupIt = legendGroups.constBegin(); - for ( ; groupIt != legendGroups.constEnd(); ++groupIt ) + groupIt = mLegendGroupElements.constBegin(); + for ( ; groupIt != mLegendGroupElements.constEnd(); ++groupIt ) { if ( groupIt->attribute( "embedded" ) == "1" ) { @@ -432,9 +444,8 @@ QList QgsProjectParser::mapLayerFromStyle( const QString& lName, c QgsProjectParser* p = dynamic_cast( QgsConfigCache::instance()->searchConfiguration( project ) ); if ( p ) { - QMap< QString, QDomElement > pLayers = p->projectLayerElementsByName(); - QMap< QString, QDomElement >::const_iterator pLayerIt = pLayers.find( lName ); - if ( pLayerIt != pLayers.constEnd() ) + QHash< QString, QDomElement >::const_iterator pLayerIt = mProjectLayerElementsByName.find( lName ); + if ( pLayerIt != mProjectLayerElementsByName.constEnd() ) { QgsMapLayer* layer = p->createLayerFromElement( pLayerIt.value() ); if ( layer ) @@ -456,12 +467,11 @@ int QgsProjectParser::layersAndStyles( QStringList& layers, QStringList& styles layers.clear(); styles.clear(); - QList layerElemList = projectLayerElements(); - QList::const_iterator elemIt = layerElemList.constBegin(); + QList::const_iterator elemIt = mProjectLayerElements.constBegin(); QString currentLayerName; - for ( ; elemIt != layerElemList.constEnd(); ++elemIt ) + for ( ; elemIt != mProjectLayerElements.constEnd(); ++elemIt ) { currentLayerName = layerName( *elemIt ); if ( !currentLayerName.isNull() ) @@ -600,9 +610,8 @@ QMap< QString, QMap< int, QString > > QgsProjectParser::layerAliasInfo() const { QMap< QString, QMap< int, QString > > resultMap; - QList layerElems = projectLayerElements(); - QList::const_iterator layerIt = layerElems.constBegin(); - for ( ; layerIt != layerElems.constEnd(); ++layerIt ) + QList::const_iterator layerIt = mProjectLayerElements.constBegin(); + for ( ; layerIt != mProjectLayerElements.constEnd(); ++layerIt ) { QDomNodeList aNodeList = layerIt->elementsByTagName( "aliases" ); if ( aNodeList.size() > 0 ) @@ -624,9 +633,8 @@ QMap< QString, QMap< int, QString > > QgsProjectParser::layerAliasInfo() const QMap< QString, QSet > QgsProjectParser::hiddenAttributes() const { QMap< QString, QSet > resultMap; - QList layerElems = projectLayerElements(); - QList::const_iterator layerIt = layerElems.constBegin(); - for ( ; layerIt != layerElems.constEnd(); ++layerIt ) + QList::const_iterator layerIt = mProjectLayerElements.constBegin(); + for ( ; layerIt != mProjectLayerElements.constEnd(); ++layerIt ) { QDomNodeList editTypesList = layerIt->elementsByTagName( "edittypes" ); if ( editTypesList.size() > 0 ) @@ -754,84 +762,6 @@ QString QgsProjectParser::projectTitle() const return projectFileInfo.baseName(); } -QList QgsProjectParser::projectLayerElements() const -{ - QList layerElemList; - if ( !mXMLDoc ) - { - return layerElemList; - } - - QDomNodeList layerNodeList = mXMLDoc->elementsByTagName( "maplayer" ); - int nNodes = layerNodeList.size(); - for ( int i = 0; i < nNodes; ++i ) - { - layerElemList.push_back( layerNodeList.at( i ).toElement() ); - } - return layerElemList; -} - -QList QgsProjectParser::legendGroupElements() const -{ - QList groupList; - if ( !mXMLDoc ) - { - return groupList; - } - - QDomElement legendElement = mXMLDoc->documentElement().firstChildElement( "legend" ); - if ( legendElement.isNull() ) - { - return groupList; - } - - QDomNodeList groupNodeList = legendElement.elementsByTagName( "legendgroup" ); - for ( int i = 0; i < groupNodeList.size(); ++i ) - { - groupList.push_back( groupNodeList.at( i ).toElement() ); - } - - return groupList; -} - -QMap< QString, QDomElement > QgsProjectParser::projectLayerElementsById() const -{ - QMap< QString, QDomElement > layerMap; - if ( !mXMLDoc ) - { - return layerMap; - } - - QDomNodeList layerNodeList = mXMLDoc->elementsByTagName( "maplayer" ); - QDomElement currentElement; - int nNodes = layerNodeList.size(); - for ( int i = 0; i < nNodes; ++i ) - { - currentElement = layerNodeList.at( i ).toElement(); - layerMap.insert( layerId( currentElement ), currentElement ); - } - return layerMap; -} - -QMap< QString, QDomElement > QgsProjectParser::projectLayerElementsByName() const -{ - QMap< QString, QDomElement > layerMap; - if ( !mXMLDoc ) - { - return layerMap; - } - - QDomNodeList layerNodeList = mXMLDoc->elementsByTagName( "maplayer" ); - QDomElement currentElement; - int nNodes = layerNodeList.size(); - for ( int i = 0; i < nNodes; ++i ) - { - currentElement = layerNodeList.at( i ).toElement(); - layerMap.insert( layerName( currentElement ), currentElement ); - } - return layerMap; -} - QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem, bool useCache ) const { if ( elem.isNull() || !mXMLDoc ) @@ -885,9 +815,8 @@ QgsMapLayer* QgsProjectParser::createLayerFromElement( const QDomElement& elem, return 0; } - QMap< QString, QDomElement > layerMap = otherConfig->projectLayerElementsById(); - QMap< QString, QDomElement >::const_iterator layerIt = layerMap.find( elem.attribute( "id" ) ); - if ( layerIt == layerMap.constEnd() ) + QHash< QString, QDomElement >::const_iterator layerIt = otherConfig->mProjectLayerElementsById.find( elem.attribute( "id" ) ); + if ( layerIt == otherConfig->mProjectLayerElementsById.constEnd() ) { return 0; } diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index cfb9df4319f..e703a8a1244 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -108,14 +108,15 @@ class QgsProjectParser: public QgsConfigParser /**Absolute project file path (including file name)*/ QString mProjectPath; - /**Get all layers of the project (ordered same as in the project file)*/ - QList projectLayerElements() const; - /**Returns all legend group elements*/ - QList legendGroupElements() const; - /**Get all layers of the project, accessible by layer id*/ - QMap< QString, QDomElement > projectLayerElementsById() const; - /**Get all layers of the project, accessible by layer name*/ - QMap< QString, QDomElement > projectLayerElementsByName() const; + /**List of project layer (ordered same as in the project file)*/ + QList mProjectLayerElements; + /**List of all legend group elements*/ + QList mLegendGroupElements; + /**Project layer elements, accessible by layer id*/ + QHash< QString, QDomElement > mProjectLayerElementsById; + /**Project layer elements, accessible by layer name*/ + QHash< QString, QDomElement > mProjectLayerElementsByName; + /**Creates a maplayer object from element. The layer cash owns the maplayer, so don't delete it @return the maplayer or 0 in case of error*/ QgsMapLayer* createLayerFromElement( const QDomElement& elem, bool useCache = true ) const; From 3996d89aa1c6e9ea8e7c88feac320eaba42d8613 Mon Sep 17 00:00:00 2001 From: marco Date: Sat, 15 Oct 2011 23:39:02 +0200 Subject: [PATCH 8/8] Default constructor of QgsProjectParser is private --- src/mapserver/qgsprojectparser.cpp | 4 ++++ src/mapserver/qgsprojectparser.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/mapserver/qgsprojectparser.cpp b/src/mapserver/qgsprojectparser.cpp index 99e67a05c45..46a0a5d6b97 100644 --- a/src/mapserver/qgsprojectparser.cpp +++ b/src/mapserver/qgsprojectparser.cpp @@ -71,6 +71,10 @@ QgsProjectParser::QgsProjectParser( QDomDocument* xmlDoc, const QString& filePat } } +QgsProjectParser::QgsProjectParser(): mXMLDoc( 0 ) +{ +} + QgsProjectParser::~QgsProjectParser() { delete mXMLDoc; diff --git a/src/mapserver/qgsprojectparser.h b/src/mapserver/qgsprojectparser.h index e703a8a1244..4f0170a1cbc 100644 --- a/src/mapserver/qgsprojectparser.h +++ b/src/mapserver/qgsprojectparser.h @@ -102,6 +102,10 @@ class QgsProjectParser: public QgsConfigParser void serviceCapabilities( QDomElement& parentElement, QDomDocument& doc ) const; private: + + //forbidden + QgsProjectParser(); + /**Content of project file*/ QDomDocument* mXMLDoc;