Skip to content

Commit 2857f58

Browse files
committedFeb 8, 2019
File widget should also accept drops from browser
1 parent d741c73 commit 2857f58

File tree

2 files changed

+52
-21
lines changed

2 files changed

+52
-21
lines changed
 

‎src/gui/qgsfilewidget.cpp

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include "qgsproject.h"
3131
#include "qgsapplication.h"
3232
#include "qgsfileutils.h"
33+
#include "qgsmimedatautils.h"
3334

3435
QgsFileWidget::QgsFileWidget( QWidget *parent )
3536
: QWidget( parent )
@@ -429,39 +430,54 @@ void QgsFileDropEdit::setFilters( const QString &filters )
429430

430431
QString QgsFileDropEdit::acceptableFilePath( QDropEvent *event ) const
431432
{
433+
QStringList rawPaths;
432434
QStringList paths;
433435
if ( event->mimeData()->hasUrls() )
434436
{
435-
Q_FOREACH ( const QUrl &url, event->mimeData()->urls() )
437+
const QList< QUrl > urls = event->mimeData()->urls();
438+
rawPaths.reserve( urls.count() );
439+
for ( const QUrl &url : urls )
436440
{
437-
QFileInfo file( url.toLocalFile() );
438-
switch ( mStorageMode )
441+
rawPaths.append( url.toLocalFile() );
442+
}
443+
}
444+
445+
QgsMimeDataUtils::UriList lst = QgsMimeDataUtils::decodeUriList( event->mimeData() );
446+
for ( const QgsMimeDataUtils::Uri &u : lst )
447+
{
448+
rawPaths.append( u.uri );
449+
}
450+
451+
for ( const QString &path : qgis::as_const( rawPaths ) )
452+
{
453+
QFileInfo file( path );
454+
switch ( mStorageMode )
455+
{
456+
case QgsFileWidget::GetFile:
457+
case QgsFileWidget::GetMultipleFiles:
458+
case QgsFileWidget::SaveFile:
439459
{
440-
case QgsFileWidget::GetFile:
441-
case QgsFileWidget::GetMultipleFiles:
442-
case QgsFileWidget::SaveFile:
443-
{
444-
if ( file.isFile() && ( mAcceptableExtensions.isEmpty() || mAcceptableExtensions.contains( file.suffix(), Qt::CaseInsensitive ) ) )
445-
paths.append( file.filePath() );
460+
if ( file.isFile() && ( mAcceptableExtensions.isEmpty() || mAcceptableExtensions.contains( file.suffix(), Qt::CaseInsensitive ) ) )
461+
paths.append( file.filePath() );
446462

447-
break;
448-
}
463+
break;
464+
}
449465

450-
case QgsFileWidget::GetDirectory:
466+
case QgsFileWidget::GetDirectory:
467+
{
468+
if ( file.isDir() )
469+
paths.append( file.filePath() );
470+
else if ( file.isFile() )
451471
{
452-
if ( file.isDir() )
453-
paths.append( file.filePath() );
454-
else if ( file.isFile() )
455-
{
456-
// folder mode, but a file dropped. So get folder name from file
457-
paths.append( file.absolutePath() );
458-
}
459-
460-
break;
472+
// folder mode, but a file dropped. So get folder name from file
473+
paths.append( file.absolutePath() );
461474
}
475+
476+
break;
462477
}
463478
}
464479
}
480+
465481
if ( paths.size() > 1 )
466482
{
467483
return QStringLiteral( "\"%1\"" ).arg( paths.join( QStringLiteral( "\" \"" ) ) );

‎tests/src/gui/testqgsfilewidget.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "qgstest.h"
1818

1919
#include "qgsfilewidget.h"
20+
#include "qgsmimedatautils.h"
2021
#include <memory>
2122

2223
class TestQgsFileWidget: public QObject
@@ -103,6 +104,20 @@ void TestQgsFileWidget::testDroppedFiles()
103104
qobject_cast< QgsFileDropEdit * >( w->lineEdit() )->dropEvent( event.get() );
104105
QCOMPARE( w->lineEdit()->text(), TEST_DATA_DIR + QStringLiteral( "/bug5598.shp" ) );
105106

107+
// also should support files dragged from browser
108+
mime->setUrls( QList<QUrl>() );
109+
QgsMimeDataUtils::Uri uri;
110+
uri.uri = TEST_DATA_DIR + QStringLiteral( "/mesh/quad_and_triangle.2dm" );
111+
QgsMimeDataUtils::UriList uriList;
112+
uriList << uri;
113+
mime.reset( QgsMimeDataUtils::encodeUriList( uriList ) );
114+
event.reset( new QDropEvent( QPointF( 1, 1 ), Qt::CopyAction, mime.get(), Qt::LeftButton, Qt::NoModifier ) );
115+
qobject_cast< QgsFileDropEdit * >( w->lineEdit() )->dropEvent( event.get() );
116+
QCOMPARE( w->lineEdit()->text(), TEST_DATA_DIR + QStringLiteral( "/mesh/quad_and_triangle.2dm" ) );
117+
118+
mime.reset( new QMimeData() );
119+
mime->setUrls( QList<QUrl>() << QUrl::fromLocalFile( TEST_DATA_DIR + QStringLiteral( "/bug5598.shp" ) ) );
120+
event.reset( new QDropEvent( QPointF( 1, 1 ), Qt::CopyAction, mime.get(), Qt::LeftButton, Qt::NoModifier ) );
106121
// with file filter
107122
w->setFilter( QStringLiteral( "Data (*.shp)" ) );
108123
w->setFilePath( QString() );

0 commit comments

Comments
 (0)
Please sign in to comment.