Skip to content

Commit 002384b

Browse files
committedJun 14, 2012
Generic QgsDataSourceURI, WMS provider adapted to QgsDataSourceURI, enabled WMS drag-and-drop from browser
1 parent b97b405 commit 002384b

27 files changed

+412
-479
lines changed
 

‎python/core/qgsrasterlayer.sip

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,10 @@ public:
3535
bool loadDefaultStyleFlag = true );
3636

3737
/** \brief [ data provider interface ] Constructor in provider mode */
38-
QgsRasterLayer( int dummy,
39-
const QString & baseName = QString(),
40-
const QString & path = QString(),
41-
const QString & providerLib = QString(),
42-
const QStringList & layers = QStringList(),
43-
const QStringList & styles = QStringList(),
44-
const QString & format = QString(),
45-
const QString & crs = QString());
46-
38+
QgsRasterLayer( const QString & uri,
39+
const QString & baseName,
40+
const QString & providerKey,
41+
bool loadDefaultStyleFlag = true );
4742

4843
/** \brief The destructor */
4944
~QgsRasterLayer();
@@ -195,11 +190,7 @@ public:
195190
QString redBandName();
196191

197192
/** [ data provider interface ] Set the data provider */
198-
void setDataProvider( const QString & provider,
199-
const QStringList & layers,
200-
const QStringList & styles,
201-
const QString & format,
202-
const QString & crs );
193+
void setDataProvider( const QString & provider );
203194

204195
/** \brief Mutator for drawing style */
205196
void setDrawingStyle( const DrawingStyle & theDrawingStyle );

‎python/gui/qgisinterface.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class QgisInterface : QObject
4646
//! Add a raster layer given a raster layer file name
4747
virtual QgsRasterLayer* addRasterLayer(QString rasterLayerPath, QString baseName = QString())=0;
4848
//! Add a WMS layer
49-
virtual QgsRasterLayer* addRasterLayer(const QString& url, const QString& layerName, const QString& providerKey, const QStringList& layers, const QStringList& styles, const QString& format, const QString& crs) = 0;
49+
virtual QgsRasterLayer* addRasterLayer(const QString& uri, const QString& baseName, const QString& providerKey) = 0;
5050

5151
//! Add a project
5252
virtual bool addProject(QString theProject)=0;

‎src/app/qgisapp.cpp

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -753,7 +753,7 @@ void QgisApp::dropEvent( QDropEvent *event )
753753
}
754754
else if ( u.layerType == "raster" )
755755
{
756-
addRasterLayer( u.uri, u.name, u.providerKey, QStringList(), QStringList(), QString(), QString() );
756+
addRasterLayer( u.uri, u.name, u.providerKey );
757757
}
758758
}
759759
}
@@ -2632,10 +2632,8 @@ void QgisApp::addWmsLayer()
26322632
QMessageBox::warning( this, tr( "WMS" ), tr( "Cannot get WMS select dialog from provider." ) );
26332633
return;
26342634
}
2635-
connect( wmss , SIGNAL( addRasterLayer( QString const &, QString const &, QString const &, QStringList const &, QStringList const &, QString const &,
2636-
QString const & ) ),
2637-
this , SLOT( addRasterLayer( QString const &, QString const &, QString const &, QStringList const &, QStringList const &, QString const &,
2638-
QString const & ) ) );
2635+
connect( wmss , SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ),
2636+
this , SLOT( addRasterLayer( QString const &, QString const &, QString const & ) ) );
26392637
wmss->exec();
26402638
delete wmss;
26412639
}
@@ -6813,22 +6811,17 @@ QgsRasterLayer* QgisApp::addRasterLayer( QString const & rasterFile, QString con
68136811

68146812
/** Add a raster layer directly without prompting user for location
68156813
The caller must provide information compatible with the provider plugin
6816-
using the rasterLayerPath and baseName. The provider can use these
6814+
using the uri and baseName. The provider can use these
68176815
parameters in any way necessary to initialize the layer. The baseName
68186816
parameter is used in the Map Legend so it should be formed in a meaningful
68196817
way.
68206818
68216819
\note Copied from the equivalent addVectorLayer function in this file
6822-
TODO Make it work for rasters specifically.
68236820
*/
68246821
QgsRasterLayer* QgisApp::addRasterLayer(
6825-
QString const &rasterLayerPath,
6822+
QString const &uri,
68266823
QString const &baseName,
6827-
QString const &providerKey,
6828-
QStringList const & layers,
6829-
QStringList const & styles,
6830-
QString const &format,
6831-
QString const &crs )
6824+
QString const &providerKey )
68326825
{
68336826
QgsDebugMsg( "about to get library for " + providerKey );
68346827

@@ -6839,42 +6832,20 @@ QgsRasterLayer* QgisApp::addRasterLayer(
68396832

68406833
mMapCanvas->freeze();
68416834

6842-
// Let render() do its own cursor management
6843-
// QApplication::setOverrideCursor(Qt::WaitCursor);
6844-
68456835
// create the layer
68466836
QgsRasterLayer *layer;
6847-
/* Eliminate the need to instantiate the layer based on provider type.
6848-
The caller is responsible for cobbling together the needed information to
6849-
open the layer
6850-
*/
6851-
QgsDebugMsg( "Creating new raster layer using " + rasterLayerPath
6852-
+ " with baseName of " + baseName
6853-
+ " and layer list of " + layers.join( ", " )
6854-
+ " and style list of " + styles.join( ", " )
6855-
+ " and format of " + format
6856-
+ " and providerKey of " + providerKey
6857-
+ " and CRS of " + crs );
6837+
QgsDebugMsg( "Creating new raster layer using " + uri
6838+
+ " with baseName of " + baseName );
68586839

6859-
// TODO: Remove the 0 when the raster layer becomes a full provider gateway.
6860-
layer = new QgsRasterLayer( 0, rasterLayerPath, baseName, providerKey, layers, styles, format, crs );
6840+
layer = new QgsRasterLayer( uri, baseName, providerKey );
68616841

68626842
QgsDebugMsg( "Constructed new layer." );
68636843

6864-
if ( layer && shouldAskUserForGDALSublayers( layer ) )
6865-
{
6866-
askUserForGDALSublayers( layer );
6867-
6868-
// The first layer loaded is not useful in that case. The user can select it in
6869-
// the list if he wants to load it.
6870-
delete layer;
6871-
}
6872-
else if ( layer && layer->isValid() )
6844+
if ( layer && layer->isValid() )
68736845
{
68746846
addRasterLayer( layer );
68756847

68766848
statusBar()->showMessage( mMapCanvas->extent().toString( 2 ) );
6877-
68786849
}
68796850
else
68806851
{
@@ -6889,10 +6860,6 @@ QgsRasterLayer* QgisApp::addRasterLayer(
68896860
mMapCanvas->refresh();
68906861

68916862
return layer;
6892-
6893-
// Let render() do its own cursor management
6894-
// QApplication::restoreOverrideCursor();
6895-
68966863
} // QgisApp::addRasterLayer
68976864

68986865

‎src/app/qgisapp.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -468,16 +468,9 @@ class QgisApp : public QMainWindow, private Ui::MainWindow
468468
virtual bool event( QEvent * event );
469469

470470
/** Open a raster layer using the Raster Data Provider.
471-
* Note this is included to support WMS layers only at this stage,
472-
* GDAL layer support via a Provider is not yet implemented.
471+
* \note added in 1.9
473472
*/
474-
QgsRasterLayer* addRasterLayer( QString const & rasterLayerPath,
475-
QString const & baseName,
476-
QString const & providerKey,
477-
QStringList const & layers,
478-
QStringList const & styles,
479-
QString const & format,
480-
QString const & crs );
473+
QgsRasterLayer* addRasterLayer( QString const & uri, QString const & baseName, QString const & providerKey );
481474

482475
void addWfsLayer( QString uri, QString typeName );
483476

‎src/app/qgisappinterface.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,9 @@ QgsRasterLayer* QgisAppInterface::addRasterLayer( QString rasterLayerPath, QStri
107107
return qgis->addRasterLayer( rasterLayerPath, baseName );
108108
}
109109

110-
QgsRasterLayer* QgisAppInterface::addRasterLayer( const QString& url, const QString& baseName, const QString& providerKey,
111-
const QStringList& layers, const QStringList& styles, const QString& format, const QString& crs )
110+
QgsRasterLayer* QgisAppInterface::addRasterLayer( const QString& url, const QString& baseName, const QString& providerKey )
112111
{
113-
return qgis->addRasterLayer( url, baseName, providerKey, layers, styles, format, crs );
112+
return qgis->addRasterLayer( url, baseName, providerKey );
114113
}
115114

116115
bool QgisAppInterface::addProject( QString theProjectName )

‎src/app/qgisappinterface.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ class QgisAppInterface : public QgisInterface
6464
//! Add a raster layer given its file name
6565
QgsRasterLayer* addRasterLayer( QString rasterLayerPath, QString baseName );
6666
//! Add a WMS layer
67-
QgsRasterLayer* addRasterLayer( const QString& url, const QString& baseName, const QString& providerKey,
68-
const QStringList& layers, const QStringList& styles, const QString& format, const QString& crs );
67+
QgsRasterLayer* addRasterLayer( const QString& url, const QString& baseName, const QString& providerKey );
6968

7069
//! Add a project
7170
bool addProject( QString theProjectName );

‎src/app/qgsbrowserdockwidget.cpp

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -307,33 +307,7 @@ void QgsBrowserDockWidget::addLayer( QgsLayerItem *layerItem )
307307
}
308308
if ( type == QgsMapLayer::RasterLayer )
309309
{
310-
// This should go to WMS provider
311-
QStringList URIParts = uri.split( "|" );
312-
QString rasterLayerPath = URIParts.at( 0 );
313-
QStringList layers;
314-
QStringList styles;
315-
QString format;
316-
QString crs;
317-
for ( int i = 1 ; i < URIParts.size(); i++ )
318-
{
319-
QString part = URIParts.at( i );
320-
int pos = part.indexOf( "=" );
321-
QString field = part.left( pos );
322-
QString value = part.mid( pos + 1 );
323-
324-
if ( field == "layers" )
325-
layers = value.split( "," );
326-
if ( field == "styles" )
327-
styles = value.split( "," );
328-
if ( field == "format" )
329-
format = value;
330-
if ( field == "crs" )
331-
crs = value;
332-
}
333-
QgsDebugMsg( "rasterLayerPath = " + rasterLayerPath );
334-
QgsDebugMsg( "layers = " + layers.join( " " ) );
335-
336-
QgisApp::instance()->addRasterLayer( rasterLayerPath, layerItem->layerName(), providerKey, layers, styles, format, crs );
310+
QgisApp::instance()->addRasterLayer( uri, layerItem->name(), providerKey );
337311
}
338312
}
339313

@@ -413,7 +387,7 @@ void QgsBrowserDockWidget::showProperties( )
413387
{
414388
QgsDebugMsg( "creating raster layer" );
415389
// should copy code from addLayer() to split uri ?
416-
QgsRasterLayer* layer = new QgsRasterLayer( 0, layerItem->uri(), layerItem->uri(), layerItem->providerKey() );
390+
QgsRasterLayer* layer = new QgsRasterLayer( layerItem->uri(), layerItem->uri(), layerItem->providerKey() );
417391
if ( layer != NULL )
418392
{
419393
layerCrs = layer->crs();

‎src/browser/qgsbrowser.cpp

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -207,33 +207,7 @@ bool QgsBrowser::layerClicked( QgsLayerItem *item )
207207
}
208208
if ( type == QgsMapLayer::RasterLayer )
209209
{
210-
// This should go to WMS provider
211-
QStringList URIParts = uri.split( "|" );
212-
QString rasterLayerPath = URIParts.at( 0 );
213-
QStringList layers;
214-
QStringList styles;
215-
QString format;
216-
QString crs;
217-
for ( int i = 1 ; i < URIParts.size(); i++ )
218-
{
219-
QString part = URIParts.at( i );
220-
int pos = part.indexOf( "=" );
221-
QString field = part.left( pos );
222-
QString value = part.mid( pos + 1 );
223-
224-
if ( field == "layers" )
225-
layers = value.split( "," );
226-
if ( field == "styles" )
227-
styles = value.split( "," );
228-
if ( field == "format" )
229-
format = value;
230-
if ( field == "crs" )
231-
crs = value;
232-
}
233-
QgsDebugMsg( "rasterLayerPath = " + rasterLayerPath );
234-
QgsDebugMsg( "layers = " + layers.join( " " ) );
235-
236-
mLayer = new QgsRasterLayer( 0, rasterLayerPath, "", providerKey, layers, styles, format, crs );
210+
mLayer = new QgsRasterLayer( uri, "", providerKey );
237211
}
238212
}
239213

‎src/core/qgsbrowsermodel.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,7 @@ Qt::ItemFlags QgsBrowserModel::flags( const QModelIndex & index ) const
127127
QgsDataItem* ptr = ( QgsDataItem* ) index.internalPointer();
128128
if ( ptr->type() == QgsDataItem::Layer )
129129
{
130-
QgsLayerItem *layer = ( QgsLayerItem* ) ptr;
131-
if ( layer->providerKey() != "wms" )
132-
{
133-
flags |= Qt::ItemIsDragEnabled;
134-
}
130+
flags |= Qt::ItemIsDragEnabled;
135131
}
136132
if ( ptr->acceptDrop() )
137133
flags |= Qt::ItemIsDropEnabled;
@@ -368,7 +364,6 @@ QMimeData * QgsBrowserModel::mimeData( const QModelIndexList &indexes ) const
368364
QgsDataItem* ptr = ( QgsDataItem* ) index.internalPointer();
369365
if ( ptr->type() != QgsDataItem::Layer ) continue;
370366
QgsLayerItem *layer = ( QgsLayerItem* ) ptr;
371-
if ( layer->providerKey() == "wms" ) continue;
372367
lst.append( QgsMimeDataUtils::Uri( layer ) );
373368
}
374369
}

‎src/core/qgsdatasourceuri.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
#include <QStringList>
2323
#include <QRegExp>
24+
#include <QUrl>
2425

2526
QgsDataSourceURI::QgsDataSourceURI()
2627
: mSSLmode( SSLprefer )
@@ -587,6 +588,36 @@ QString QgsDataSourceURI::uri() const
587588
return theUri;
588589
}
589590

591+
QByteArray QgsDataSourceURI::encodedUri() const
592+
{
593+
QUrl url;
594+
foreach( QString key, mParams.uniqueKeys() )
595+
{
596+
foreach( QString value, mParams.values( key ) )
597+
{
598+
url.addQueryItem( key, value );
599+
}
600+
}
601+
return url.encodedQuery();
602+
}
603+
604+
void QgsDataSourceURI::setEncodedUri( const QByteArray & uri )
605+
{
606+
mParams.clear();
607+
QUrl url;
608+
url.setEncodedQuery( uri );
609+
QPair<QString, QString> item;
610+
foreach( item, url.queryItems() )
611+
{
612+
mParams.insertMulti( item.first, item.second );
613+
}
614+
}
615+
616+
void QgsDataSourceURI::setEncodedUri( const QString & uri )
617+
{
618+
setEncodedUri( uri.toAscii() );
619+
}
620+
590621
QString QgsDataSourceURI::quotedTablename() const
591622
{
592623
if ( !mSchema.isEmpty() )
@@ -663,3 +694,32 @@ void QgsDataSourceURI::setSrid( QString srid )
663694
{
664695
mSrid = srid;
665696
}
697+
698+
void QgsDataSourceURI::setParam( const QString &key, const QString &value )
699+
{
700+
// may be multiple
701+
mParams.insertMulti( key, value );
702+
}
703+
704+
void QgsDataSourceURI::setParam( const QString &key, const QStringList &value )
705+
{
706+
foreach( QString val, value )
707+
{
708+
mParams.insertMulti( key, val );
709+
}
710+
}
711+
712+
QString QgsDataSourceURI::param( const QString &key ) const
713+
{
714+
return mParams.value( key );
715+
}
716+
717+
QStringList QgsDataSourceURI::params( const QString &key ) const
718+
{
719+
return mParams.values( key );
720+
}
721+
722+
bool QgsDataSourceURI::hasParam( const QString &key ) const
723+
{
724+
return mParams.contains( key );
725+
}

0 commit comments

Comments
 (0)
Please sign in to comment.