Skip to content

Commit

Permalink
[georeferencer] Support drag and dropping raster files onto the dialog
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Nov 29, 2020
1 parent 4d26e10 commit 3c06a3e
Show file tree
Hide file tree
Showing 2 changed files with 115 additions and 16 deletions.
127 changes: 112 additions & 15 deletions src/app/georeferencer/qgsgeorefmainwindow.cpp
Expand Up @@ -85,6 +85,7 @@ QgsGeoreferencerMainWindow::QgsGeoreferencerMainWindow( QWidget *parent, Qt::Win
{
setupUi( this );
QgsGui::instance()->enableAutoGeometryRestore( this );
setAcceptDrops( true );

QWidget *centralWidget = this->centralWidget();
mCentralLayout = new QGridLayout( centralWidget );
Expand Down Expand Up @@ -212,7 +213,7 @@ void QgsGeoreferencerMainWindow::reset()

// -------------------------- private slots -------------------------------- //
// File slots
void QgsGeoreferencerMainWindow::openRaster()
void QgsGeoreferencerMainWindow::openRaster( const QString &fileName )
{
// clearLog();
switch ( checkNeedGCPSave() )
Expand All @@ -231,21 +232,30 @@ void QgsGeoreferencerMainWindow::openRaster()
}

QgsSettings s;
QString dir = s.value( QStringLiteral( "/Plugin-GeoReferencer/rasterdirectory" ) ).toString();
if ( dir.isEmpty() )
dir = '.';
if ( fileName.isEmpty() )
{
QString dir = s.value( QStringLiteral( "/Plugin-GeoReferencer/rasterdirectory" ) ).toString();
if ( dir.isEmpty() )
dir = '.';

QString otherFiles = tr( "All other files (*)" );
QString lastUsedFilter = s.value( QStringLiteral( "/Plugin-GeoReferencer/lastusedfilter" ), otherFiles ).toString();
QString otherFiles = tr( "All other files (*)" );
QString lastUsedFilter = s.value( QStringLiteral( "/Plugin-GeoReferencer/lastusedfilter" ), otherFiles ).toString();

QString filters = QgsProviderRegistry::instance()->fileRasterFilters();
filters.prepend( otherFiles + ";;" );
filters.chop( otherFiles.size() + 2 );
mRasterFileName = QFileDialog::getOpenFileName( this, tr( "Open Raster" ), dir, filters, &lastUsedFilter, QFileDialog::HideNameFilterDetails );
mModifiedRasterFileName.clear();
QString filters = QgsProviderRegistry::instance()->fileRasterFilters();
filters.prepend( otherFiles + ";;" );
filters.chop( otherFiles.size() + 2 );
mRasterFileName = QFileDialog::getOpenFileName( this, tr( "Open Raster" ), dir, filters, &lastUsedFilter, QFileDialog::HideNameFilterDetails );

if ( mRasterFileName.isEmpty() )
return;
if ( mRasterFileName.isEmpty() )
return;

s.setValue( QStringLiteral( "/Plugin-GeoReferencer/lastusedfilter" ), lastUsedFilter );
}
else
{
mRasterFileName = fileName;
}
mModifiedRasterFileName.clear();

QString errMsg;
if ( !QgsRasterLayer::isValidRasterFileName( mRasterFileName, errMsg ) )
Expand All @@ -261,7 +271,6 @@ void QgsGeoreferencerMainWindow::openRaster()

QFileInfo fileInfo( mRasterFileName );
s.setValue( QStringLiteral( "/Plugin-GeoReferencer/rasterdirectory" ), fileInfo.path() );
s.setValue( QStringLiteral( "/Plugin-GeoReferencer/lastusedfilter" ), lastUsedFilter );

mGeorefTransform.selectTransformParametrisation( mTransformParam );
mGeorefTransform.setRasterChangeCoords( mRasterFileName );
Expand Down Expand Up @@ -296,6 +305,94 @@ void QgsGeoreferencerMainWindow::openRaster()
mWorldFileName = guessWorldFileName( mRasterFileName );
}

void QgsGeoreferencerMainWindow::dropEvent( QDropEvent *event )
{
// dragging app is locked for the duration of dropEvent. This causes explorer windows to hang
// while large projects/layers are loaded. So instead we return from dropEvent as quickly as possible
// and do the actual handling of the drop after a very short timeout
QTimer *timer = new QTimer( this );
timer->setSingleShot( true );
timer->setInterval( 50 );

// get the file list
QList<QUrl>::iterator i;
QList<QUrl>urls = event->mimeData()->urls();
QString file;
for ( i = urls.begin(); i != urls.end(); ++i )
{
QString fileName = i->toLocalFile();
#ifdef Q_OS_MAC
// Mac OS X 10.10, under Qt4.8 ,changes dropped URL format
// https://bugreports.qt.io/browse/QTBUG-40449
// [pzion 20150805] Work around
if ( fileName.startsWith( "/.file/id=" ) )
{
QgsDebugMsg( QStringLiteral( "Mac dropped URL with /.file/id= (converting)" ) );
CFStringRef relCFStringRef =
CFStringCreateWithCString(
kCFAllocatorDefault,
fileName.toUtf8().constData(),
kCFStringEncodingUTF8
);
CFURLRef relCFURL =
CFURLCreateWithFileSystemPath(
kCFAllocatorDefault,
relCFStringRef,
kCFURLPOSIXPathStyle,
false // isDirectory
);
CFErrorRef error = 0;
CFURLRef absCFURL =
CFURLCreateFilePathURL(
kCFAllocatorDefault,
relCFURL,
&error
);
if ( !error )
{
static const CFIndex maxAbsPathCStrBufLen = 4096;
char absPathCStr[maxAbsPathCStrBufLen];
if ( CFURLGetFileSystemRepresentation(
absCFURL,
true, // resolveAgainstBase
reinterpret_cast<UInt8 *>( &absPathCStr[0] ),
maxAbsPathCStrBufLen ) )
{
fileName = QString( absPathCStr );
}
}
CFRelease( absCFURL );
CFRelease( relCFURL );
CFRelease( relCFStringRef );
}
#endif
// seems that some drag and drop operations include an empty url
// so we test for length to make sure we have something
if ( !fileName.isEmpty() )
{
file = fileName;
break;
}
}

connect( timer, &QTimer::timeout, this, [this, timer, file]
{
openRaster( file );
timer->deleteLater();
} );

event->acceptProposedAction();
timer->start();
}

void QgsGeoreferencerMainWindow::dragEnterEvent( QDragEnterEvent *event )
{
if ( event->mimeData()->hasUrls() )
{
event->acceptProposedAction();
}
}

void QgsGeoreferencerMainWindow::doGeoreference()
{
if ( georeference() )
Expand Down Expand Up @@ -848,7 +945,7 @@ void QgsGeoreferencerMainWindow::createActions()
connect( mActionReset, &QAction::triggered, this, &QgsGeoreferencerMainWindow::reset );

mActionOpenRaster->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionAddRasterLayer.svg" ) ) );
connect( mActionOpenRaster, &QAction::triggered, this, &QgsGeoreferencerMainWindow::openRaster );
connect( mActionOpenRaster, &QAction::triggered, this, [ = ] { openRaster(); } );

mActionStartGeoref->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionStart.svg" ) ) );
connect( mActionStartGeoref, &QAction::triggered, this, &QgsGeoreferencerMainWindow::doGeoreference );
Expand Down
4 changes: 3 additions & 1 deletion src/app/georeferencer/qgsgeorefmainwindow.h
Expand Up @@ -60,11 +60,13 @@ class QgsGeoreferencerMainWindow : public QMainWindow, private Ui::QgsGeorefPlug

protected:
void closeEvent( QCloseEvent * ) override;
void dropEvent( QDropEvent *event ) override;
void dragEnterEvent( QDragEnterEvent *event ) override;

private slots:
// file
void reset();
void openRaster();
void openRaster( const QString &fileName = QString() );
void doGeoreference();
void generateGDALScript();
bool getTransformSettings();
Expand Down

0 comments on commit 3c06a3e

Please sign in to comment.