diff --git a/src/providers/wfs/qgswfsdataitems.cpp b/src/providers/wfs/qgswfsdataitems.cpp new file mode 100644 index 00000000000..0c9f7c4b491 --- /dev/null +++ b/src/providers/wfs/qgswfsdataitems.cpp @@ -0,0 +1,125 @@ +#include "qgswfsdataitems.h" + +#include "qgswfsprovider.h" +#include "qgswfsconnection.h" +#include "qgswfssourceselect.h" + +#include +#include + + +QgsWFSLayerItem::QgsWFSLayerItem( QgsDataItem* parent, QString connName, QString name, QString title ) + : QgsLayerItem( parent, title, parent->path() + "/" + name, QString(), QgsLayerItem::Vector, "WFS" ) +{ + mUri = QgsWFSConnection( connName ).uriGetFeature( name ); + mPopulated = true; +} + +QgsWFSLayerItem::~QgsWFSLayerItem() +{ +} + +//// + +QgsWFSConnectionItem::QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path ) + : QgsDataCollectionItem( parent, name, path ), mName( name ), mConn( NULL ) +{ +} + +QgsWFSConnectionItem::~QgsWFSConnectionItem() +{ +} + +QVector QgsWFSConnectionItem::createChildren() +{ + mGotCapabilities = false; + mConn = new QgsWFSConnection( mName, this ); + connect( mConn, SIGNAL( gotCapabilities() ), this, SLOT( gotCapabilities() ) ); + + mConn->requestCapabilities(); + + while ( !mGotCapabilities ) + { + QCoreApplication::processEvents( QEventLoop::ExcludeUserInputEvents ); + } + + QVector layers; + if ( mConn->errorCode() == QgsWFSConnection::NoError ) + { + QgsWFSConnection::GetCapabilities caps = mConn->capabilities(); + foreach( const QgsWFSConnection::FeatureType& featureType, caps.featureTypes ) + { + QgsWFSLayerItem* layer = new QgsWFSLayerItem( this, mName, featureType.name, featureType.title ); + layers.append( layer ); + } + } + else + { + // TODO: return an "error" item + } + + mConn->deleteLater(); + mConn = NULL; + + return layers; +} + +void QgsWFSConnectionItem::gotCapabilities() +{ + mGotCapabilities = true; +} + +////// + + +QgsWFSRootItem::QgsWFSRootItem( QgsDataItem* parent, QString name, QString path ) + : QgsDataCollectionItem( parent, name, path ) +{ + mIcon = QIcon( getThemePixmap( "mIconWms.png" ) ); + + populate(); +} + +QgsWFSRootItem::~QgsWFSRootItem() +{ +} + +QVector QgsWFSRootItem::createChildren() +{ + QVector connections; + QSettings settings; + + settings.beginGroup( "/Qgis/connections-wfs" ); + foreach( QString connName, settings.childGroups() ) + { + QgsDataItem * conn = new QgsWFSConnectionItem( this, connName, mPath + "/" + connName ); + connections.append( conn ); + } + return connections; +} + +QWidget * QgsWFSRootItem::paramWidget() +{ + QgsWFSSourceSelect *select = new QgsWFSSourceSelect( 0, 0 ); + connect( select, SIGNAL( connectionsChanged() ), this, SLOT( connectionsChanged() ) ); + return select; +} + +void QgsWFSRootItem::connectionsChanged() +{ + refresh(); +} + + +QGISEXTERN int dataCapabilities() +{ + return QgsDataProvider::Net; +} + +QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) +{ + Q_UNUSED( thePath ); + + return new QgsWFSRootItem( parentItem, "WFS", "wfs:" ); +} + diff --git a/src/providers/wfs/qgswfsdataitems.h b/src/providers/wfs/qgswfsdataitems.h new file mode 100644 index 00000000000..d49c974f8ea --- /dev/null +++ b/src/providers/wfs/qgswfsdataitems.h @@ -0,0 +1,53 @@ +#ifndef QGSWFSDATAITEMS_H +#define QGSWFSDATAITEMS_H + +#include "qgsdataitem.h" + +class QgsWFSRootItem : public QgsDataCollectionItem +{ + Q_OBJECT + public: + QgsWFSRootItem( QgsDataItem* parent, QString name, QString path ); + ~QgsWFSRootItem(); + + QVector createChildren(); + + virtual QWidget * paramWidget(); + + public slots: + void connectionsChanged(); +}; + +class QgsWFSConnection; + +class QgsWFSConnectionItem : public QgsDataCollectionItem +{ + Q_OBJECT + public: + QgsWFSConnectionItem( QgsDataItem* parent, QString name, QString path ); + ~QgsWFSConnectionItem(); + + QVector createChildren(); + //virtual bool equal( const QgsDataItem *other ); + + private slots: + void gotCapabilities(); + + private: + QString mName; + + QgsWFSConnection* mConn; + bool mGotCapabilities; +}; + + +class QgsWFSLayerItem : public QgsLayerItem +{ + public: + QgsWFSLayerItem( QgsDataItem* parent, QString connName, QString name, QString title ); + ~QgsWFSLayerItem(); + +}; + + +#endif // QGSWFSDATAITEMS_H diff --git a/src/providers/wfs/qgswfssourceselect.cpp b/src/providers/wfs/qgswfssourceselect.cpp index 7c47d6e582a..b32dbe3dbdf 100644 --- a/src/providers/wfs/qgswfssourceselect.cpp +++ b/src/providers/wfs/qgswfssourceselect.cpp @@ -201,6 +201,7 @@ void QgsWFSSourceSelect::addEntryToServerList() if ( nc.exec() ) { populateConnectionList(); + emit connectionsChanged(); } } @@ -212,6 +213,7 @@ void QgsWFSSourceSelect::modifyEntryOfServerList() if ( nc.exec() ) { populateConnectionList(); + emit connectionsChanged(); } } @@ -224,6 +226,7 @@ void QgsWFSSourceSelect::deleteEntryOfServerList() { QgsWFSConnection::deleteConnection( cmbConnections->currentText() ); cmbConnections->removeItem( cmbConnections->currentIndex() ); + emit connectionsChanged(); } } @@ -346,4 +349,5 @@ void QgsWFSSourceSelect::on_btnLoad_clicked() QgsManageConnectionsDialog dlg( this, QgsManageConnectionsDialog::Import, QgsManageConnectionsDialog::WFS, fileName ); dlg.exec(); populateConnectionList(); + emit connectionsChanged(); } diff --git a/src/providers/wfs/qgswfssourceselect.h b/src/providers/wfs/qgswfssourceselect.h index b5a1b1fda01..3f6bc851ba4 100644 --- a/src/providers/wfs/qgswfssourceselect.h +++ b/src/providers/wfs/qgswfssourceselect.h @@ -35,6 +35,7 @@ class QgsWFSSourceSelect: public QDialog, private Ui::QgsWFSSourceSelectBase signals: void addWfsLayer( QString uri, QString typeName ); + void connectionsChanged(); private: QgsWFSSourceSelect(); //default constructor is forbidden