diff --git a/src/gui/qgsfilewidget.cpp b/src/gui/qgsfilewidget.cpp index 4edf34ce585..23e16e049dc 100644 --- a/src/gui/qgsfilewidget.cpp +++ b/src/gui/qgsfilewidget.cpp @@ -30,6 +30,7 @@ #include "qgsproject.h" #include "qgsapplication.h" #include "qgsfileutils.h" +#include "qgsmimedatautils.h" QgsFileWidget::QgsFileWidget( QWidget *parent ) : QWidget( parent ) @@ -429,39 +430,54 @@ void QgsFileDropEdit::setFilters( const QString &filters ) QString QgsFileDropEdit::acceptableFilePath( QDropEvent *event ) const { + QStringList rawPaths; QStringList paths; if ( event->mimeData()->hasUrls() ) { - Q_FOREACH ( const QUrl &url, event->mimeData()->urls() ) + const QList< QUrl > urls = event->mimeData()->urls(); + rawPaths.reserve( urls.count() ); + for ( const QUrl &url : urls ) { - QFileInfo file( url.toLocalFile() ); - switch ( mStorageMode ) + rawPaths.append( url.toLocalFile() ); + } + } + + QgsMimeDataUtils::UriList lst = QgsMimeDataUtils::decodeUriList( event->mimeData() ); + for ( const QgsMimeDataUtils::Uri &u : lst ) + { + rawPaths.append( u.uri ); + } + + for ( const QString &path : qgis::as_const( rawPaths ) ) + { + QFileInfo file( path ); + switch ( mStorageMode ) + { + case QgsFileWidget::GetFile: + case QgsFileWidget::GetMultipleFiles: + case QgsFileWidget::SaveFile: { - case QgsFileWidget::GetFile: - case QgsFileWidget::GetMultipleFiles: - case QgsFileWidget::SaveFile: - { - if ( file.isFile() && ( mAcceptableExtensions.isEmpty() || mAcceptableExtensions.contains( file.suffix(), Qt::CaseInsensitive ) ) ) - paths.append( file.filePath() ); + if ( file.isFile() && ( mAcceptableExtensions.isEmpty() || mAcceptableExtensions.contains( file.suffix(), Qt::CaseInsensitive ) ) ) + paths.append( file.filePath() ); - break; + break; + } + + case QgsFileWidget::GetDirectory: + { + if ( file.isDir() ) + paths.append( file.filePath() ); + else if ( file.isFile() ) + { + // folder mode, but a file dropped. So get folder name from file + paths.append( file.absolutePath() ); } - case QgsFileWidget::GetDirectory: - { - if ( file.isDir() ) - paths.append( file.filePath() ); - else if ( file.isFile() ) - { - // folder mode, but a file dropped. So get folder name from file - paths.append( file.absolutePath() ); - } - - break; - } + break; } } } + if ( paths.size() > 1 ) { return QStringLiteral( "\"%1\"" ).arg( paths.join( QStringLiteral( "\" \"" ) ) ); diff --git a/tests/src/gui/testqgsfilewidget.cpp b/tests/src/gui/testqgsfilewidget.cpp index fea223bf82d..12383164408 100644 --- a/tests/src/gui/testqgsfilewidget.cpp +++ b/tests/src/gui/testqgsfilewidget.cpp @@ -17,6 +17,7 @@ #include "qgstest.h" #include "qgsfilewidget.h" +#include "qgsmimedatautils.h" #include class TestQgsFileWidget: public QObject @@ -103,6 +104,20 @@ void TestQgsFileWidget::testDroppedFiles() qobject_cast< QgsFileDropEdit * >( w->lineEdit() )->dropEvent( event.get() ); QCOMPARE( w->lineEdit()->text(), TEST_DATA_DIR + QStringLiteral( "/bug5598.shp" ) ); + // also should support files dragged from browser + mime->setUrls( QList() ); + QgsMimeDataUtils::Uri uri; + uri.uri = TEST_DATA_DIR + QStringLiteral( "/mesh/quad_and_triangle.2dm" ); + QgsMimeDataUtils::UriList uriList; + uriList << uri; + mime.reset( QgsMimeDataUtils::encodeUriList( uriList ) ); + event.reset( new QDropEvent( QPointF( 1, 1 ), Qt::CopyAction, mime.get(), Qt::LeftButton, Qt::NoModifier ) ); + qobject_cast< QgsFileDropEdit * >( w->lineEdit() )->dropEvent( event.get() ); + QCOMPARE( w->lineEdit()->text(), TEST_DATA_DIR + QStringLiteral( "/mesh/quad_and_triangle.2dm" ) ); + + mime.reset( new QMimeData() ); + mime->setUrls( QList() << QUrl::fromLocalFile( TEST_DATA_DIR + QStringLiteral( "/bug5598.shp" ) ) ); + event.reset( new QDropEvent( QPointF( 1, 1 ), Qt::CopyAction, mime.get(), Qt::LeftButton, Qt::NoModifier ) ); // with file filter w->setFilter( QStringLiteral( "Data (*.shp)" ) ); w->setFilePath( QString() );