Skip to content

Commit f2f65d1

Browse files
committed
PG:Implement handledrop for the postgres provider
1 parent d212ca7 commit f2f65d1

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/providers/postgres/qgspostgresdataitems.cpp

+66
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
#include "qgslogger.h"
77
#include "qgsdatasourceuri.h"
88

9+
#include <QMessageBox>
10+
911
// ---------------------------------------------------------------------------
1012
QgsPGConnectionItem::QgsPGConnectionItem( QgsDataItem* parent, QString name, QString path )
1113
: QgsDataCollectionItem( parent, name, path )
@@ -157,6 +159,70 @@ void QgsPGConnectionItem::deleteConnection()
157159
mParent->refresh();
158160
}
159161

162+
bool QgsPGConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction )
163+
{
164+
if ( !QgsMimeDataUtils::isUriList( data ) )
165+
return false;
166+
167+
// TODO: probably should show a GUI with settings etc
168+
QgsDataSourceURI uri = QgsPostgresConn::connUri( mName );
169+
170+
qApp->setOverrideCursor( Qt::WaitCursor );
171+
172+
QStringList importResults;
173+
bool hasError = false;
174+
QgsMimeDataUtils::UriList lst = QgsMimeDataUtils::decodeUriList( data );
175+
foreach( const QgsMimeDataUtils::Uri& u, lst )
176+
{
177+
if ( u.layerType != "vector" )
178+
{
179+
importResults.append( tr( "%1: Not a vector layer!" ).arg( u.name ) );
180+
hasError = true; // only vectors can be imported
181+
continue;
182+
}
183+
184+
// open the source layer
185+
QgsVectorLayer* srcLayer = new QgsVectorLayer( u.uri, u.name, u.providerKey );
186+
187+
if ( srcLayer->isValid() )
188+
{
189+
uri.setDataSource( QString(), u.name, "qgs_geometry" );
190+
QgsDebugMsg( "URI " + uri.uri() );
191+
QgsVectorLayerImport::ImportError err;
192+
QString importError;
193+
err = QgsVectorLayerImport::importLayer( srcLayer, uri.uri(), "postgres", &srcLayer->crs(), false, &importError );
194+
if ( err == QgsVectorLayerImport::NoError )
195+
importResults.append( tr( "%1: OK!" ).arg( u.name ) );
196+
else
197+
{
198+
importResults.append( QString( "%1: %2" ).arg( u.name ).arg( importError ) );
199+
hasError = true;
200+
}
201+
}
202+
else
203+
{
204+
importResults.append( tr( "%1: OK!" ).arg( u.name ) );
205+
hasError = true;
206+
}
207+
208+
delete srcLayer;
209+
}
210+
211+
qApp->restoreOverrideCursor();
212+
213+
if ( hasError )
214+
{
215+
QMessageBox::warning( 0, tr( "Import to PostGIS database" ), tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ) );
216+
}
217+
else
218+
{
219+
QMessageBox::information( 0, tr( "Import to PostGIS database" ), tr( "Import was successful." ) );
220+
}
221+
222+
refresh();
223+
224+
return true;
225+
}
160226

161227
// ---------------------------------------------------------------------------
162228
QgsPGLayerItem::QgsPGLayerItem( QgsDataItem* parent, QString name, QString path, QgsLayerItem::LayerType layerType, QgsPostgresLayerProperty layerProperty )

src/providers/postgres/qgspostgresdataitems.h

+5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
#include "qgspostgresconn.h"
77
#include "qgspgsourceselect.h"
8+
#include "qgsmimedatautils.h"
9+
#include "qgsvectorlayerimport.h"
810

911
class QgsPGRootItem;
1012
class QgsPGConnectionItem;
@@ -40,6 +42,9 @@ class QgsPGConnectionItem : public QgsDataCollectionItem
4042
virtual bool equal( const QgsDataItem *other );
4143
virtual QList<QAction*> actions();
4244

45+
virtual bool acceptDrop() { return true; }
46+
virtual bool handleDrop( const QMimeData * data, Qt::DropAction action );
47+
4348
QgsPostgresConn *connection() const { return mConn; }
4449

4550
signals:

0 commit comments

Comments
 (0)