72 changes: 71 additions & 1 deletion src/providers/spatialite/qgsspatialitedataitems.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
#include "qgsspatialitesourceselect.h"

#include "qgslogger.h"
#include "qgsmimedatautils.h"
#include "qgsvectorlayerimport.h"

#include <QAction>
#include <QMessageBox>
Expand All @@ -13,7 +15,8 @@
QgsSLConnectionItem::QgsSLConnectionItem( QgsDataItem* parent, QString name, QString path )
: QgsDataCollectionItem( parent, name, path )
{
mToolTip = QgsSpatiaLiteConnection::connectionPath( name );
mDbPath = QgsSpatiaLiteConnection::connectionPath( name );
mToolTip = mDbPath;
}

QgsSLConnectionItem::~QgsSLConnectionItem()
Expand Down Expand Up @@ -117,6 +120,73 @@ void QgsSLConnectionItem::deleteConnection()
mParent->refresh();
}

bool QgsSLConnectionItem::handleDrop( const QMimeData * data, Qt::DropAction )
{
if ( !QgsMimeDataUtils::isUriList( data ) )
return false;

// TODO: probably should show a GUI with settings etc

QgsDataSourceURI destUri;
destUri.setDatabase( mDbPath );

qApp->setOverrideCursor( Qt::WaitCursor );

QStringList importResults;
bool hasError = false;
QgsMimeDataUtils::UriList lst = QgsMimeDataUtils::decodeUriList( data );
foreach( const QgsMimeDataUtils::Uri& u, lst )
{
if ( u.layerType != "vector" )
{
importResults.append( tr( "%1: Not a vector layer!" ).arg( u.name ) );
hasError = true; // only vectors can be imported
continue;
}

// open the source layer
QgsVectorLayer* srcLayer = new QgsVectorLayer( u.uri, u.name, u.providerKey );

if ( srcLayer->isValid() )
{
destUri.setDataSource( QString(), u.name, "geomm" );
QgsDebugMsg( "URI " + destUri.uri() );
QgsVectorLayerImport::ImportError err;
QString importError;
err = QgsVectorLayerImport::importLayer( srcLayer, destUri.uri(), "spatialite", &srcLayer->crs(), false, &importError );
if ( err == QgsVectorLayerImport::NoError )
importResults.append( tr( "%1: OK!" ).arg( u.name ) );
else
{
importResults.append( QString( "%1: %2" ).arg( u.name ).arg( importError ) );
hasError = true;
}
}
else
{
importResults.append( tr( "%1: OK!" ).arg( u.name ) );
hasError = true;
}

delete srcLayer;
}

qApp->restoreOverrideCursor();

if ( hasError )
{
QMessageBox::warning( 0, tr( "Import to SpatiaLite database" ), tr( "Failed to import some layers!\n\n" ) + importResults.join( "\n" ) );
}
else
{
QMessageBox::information( 0, tr( "Import to SpatiaLite database" ), tr( "Import was successful." ) );
}

refresh();

return true;
}


// ---------------------------------------------------------------------------

Expand Down
3 changes: 3 additions & 0 deletions src/providers/spatialite/qgsspatialitedataitems.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ class QgsSLConnectionItem : public QgsDataCollectionItem

virtual QList<QAction*> actions();

virtual bool acceptDrop() { return true; }
virtual bool handleDrop( const QMimeData * data, Qt::DropAction action );

public slots:
void editConnection();
void deleteConnection();
Expand Down