File widget should also accept drops from browser

This commit is contained in:
Nyall Dawson 2019-02-08 17:39:29 +10:00
parent d741c73d9b
commit 2857f585ae
2 changed files with 53 additions and 22 deletions

View File

@ -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( "\" \"" ) ) );

View File

@ -17,6 +17,7 @@
#include "qgstest.h"
#include "qgsfilewidget.h"
#include "qgsmimedatautils.h"
#include <memory>
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<QUrl>() );
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>() << 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() );