diff --git a/app/mainwindow.cpp b/app/mainwindow.cpp --- a/app/mainwindow.cpp +++ b/app/mainwindow.cpp @@ -322,6 +322,10 @@ q, SLOT(goToPrevious())); connect(mViewMainPage, SIGNAL(nextImageRequested()), q, SLOT(goToNext())); + connect(mViewMainPage, &ViewMainPage::openUrlRequested, + q, &MainWindow::openUrl); + connect(mViewMainPage, &ViewMainPage::openDirUrlRequested, + q, &MainWindow::openDirUrl); setupThumbnailBar(mViewMainPage->thumbnailBar()); } diff --git a/app/viewmainpage.h b/app/viewmainpage.h --- a/app/viewmainpage.h +++ b/app/viewmainpage.h @@ -124,6 +124,10 @@ void nextImageRequested(); + void openUrlRequested(const QUrl&); + + void openDirUrlRequested(const QUrl&); + void toggleFullScreenRequested(); void goToBrowseModeRequested(); diff --git a/app/viewmainpage.cpp b/app/viewmainpage.cpp --- a/app/viewmainpage.cpp +++ b/app/viewmainpage.cpp @@ -239,6 +239,8 @@ QObject::connect(view, &DocumentView::completed, q, &ViewMainPage::completed); QObject::connect(view, &DocumentView::previousImageRequested, q, &ViewMainPage::previousImageRequested); QObject::connect(view, &DocumentView::nextImageRequested, q, &ViewMainPage::nextImageRequested); + QObject::connect(view, &DocumentView::openUrlRequested, q, &ViewMainPage::openUrlRequested); + QObject::connect(view, &DocumentView::openDirUrlRequested, q, &ViewMainPage::openDirUrlRequested); QObject::connect(view, &DocumentView::captionUpdateRequested, q, &ViewMainPage::captionUpdateRequested); QObject::connect(view, &DocumentView::toggleFullScreenRequested, q, &ViewMainPage::toggleFullScreenRequested); QObject::connect(view, &DocumentView::focused, q, &ViewMainPage::slotViewFocused); diff --git a/lib/documentview/documentview.h b/lib/documentview/documentview.h --- a/lib/documentview/documentview.h +++ b/lib/documentview/documentview.h @@ -163,6 +163,10 @@ void nextImageRequested(); + void openUrlRequested(const QUrl&); + + void openDirUrlRequested(const QUrl&); + void captionUpdateRequested(const QString&); void toggleFullScreenRequested(); @@ -201,6 +205,8 @@ void wheelEvent(QGraphicsSceneWheelEvent* event) Q_DECL_OVERRIDE; void contextMenuEvent(QGraphicsSceneContextMenuEvent* event) Q_DECL_OVERRIDE; bool sceneEventFilter(QGraphicsItem*, QEvent*) Q_DECL_OVERRIDE; + void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override; + void dropEvent(QGraphicsSceneDragDropEvent* event) override; private Q_SLOTS: void finishOpenUrl(); diff --git a/lib/documentview/documentview.cpp b/lib/documentview/documentview.cpp --- a/lib/documentview/documentview.cpp +++ b/lib/documentview/documentview.cpp @@ -38,6 +38,7 @@ #include #include #include +#include // KDE #include @@ -60,6 +61,7 @@ #include #include #include +#include namespace Gwenview { @@ -365,6 +367,8 @@ d->setupHud(); d->setCurrentAdapter(new EmptyAdapter); + + setAcceptDrops(true); } DocumentView::~DocumentView() @@ -827,4 +831,22 @@ d->mOpacityEffect->setOpacity(opacity); } +void DocumentView::dragEnterEvent(QGraphicsSceneDragDropEvent* event) +{ + QGraphicsWidget::dragEnterEvent(event); + event->setAccepted(event->mimeData()->hasUrls()); +} + +void DocumentView::dropEvent(QGraphicsSceneDragDropEvent* event) +{ + QGraphicsWidget::dropEvent(event); + // Since we're capturing drops in View mode, we only support one url + const QUrl url = event->mimeData()->urls().first(); + if (UrlUtils::urlIsDirectory(url)) { + emit openDirUrlRequested(url); + } else { + emit openUrlRequested(url); + } +} + } // namespace