Skip to content

Commit d694b60

Browse files
authored
feat(iv): Implement files drag and drop into an iv window (#4774)
Drag and drop of files. Tested on my own Mac and it seem to work just fine. Fixes #4771 --------- Signed-off-by: Aleksandr Motsjonov <soswow@gmail.com>
1 parent cc794f2 commit d694b60

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

src/iv/imageviewer.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,13 @@ ImageViewer::ImageViewer(bool use_ocio, const std::string& image_color_space,
152152

153153
setWindowTitle(tr("Image Viewer"));
154154
resize(m_default_width, m_default_height);
155+
156+
setAcceptDrops(true);
157+
// Disable drag and drop on child widgets
158+
for (QWidget* child : findChildren<QWidget*>()) {
159+
child->setAcceptDrops(false);
160+
}
161+
155162
// setSizePolicy (QSizePolicy::Ignored, QSizePolicy::Ignored);
156163

157164
setAttribute(Qt::WA_DeleteOnClose);
@@ -173,6 +180,30 @@ ImageViewer::closeEvent(QCloseEvent*)
173180
writeSettings();
174181
}
175182

183+
void
184+
ImageViewer::dragEnterEvent(QDragEnterEvent* event)
185+
{
186+
if (event->mimeData()->hasUrls())
187+
event->acceptProposedAction();
188+
}
189+
190+
void
191+
ImageViewer::dropEvent(QDropEvent* event)
192+
{
193+
const QMimeData* mimeData = event->mimeData();
194+
if (mimeData->hasUrls()) {
195+
size_t old_size = m_images.size();
196+
for (const QUrl& url : mimeData->urls()) {
197+
QString filePath = url.toLocalFile();
198+
add_image(filePath.toStdString());
199+
}
200+
// Switch to the first newly added image
201+
if (m_images.size() > old_size) {
202+
current_image(old_size);
203+
}
204+
}
205+
}
206+
176207

177208

178209
void

src/iv/imageviewer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <QCheckBox>
2626
#include <QDialog>
2727
#include <QMainWindow>
28+
#include <QMimeData>
2829

2930
#if OIIO_QT_MAJOR < 6
3031
# include <QGLWidget>
@@ -338,6 +339,8 @@ private slots:
338339
void keyPressEvent(QKeyEvent* event) override;
339340
void resizeEvent(QResizeEvent* event) override;
340341
void closeEvent(QCloseEvent* event) override;
342+
void dragEnterEvent(QDragEnterEvent* event) override;
343+
void dropEvent(QDropEvent* event) override;
341344

342345
QTimer* slideTimer; ///< Timer to use for slide show mode
343346
long slideDuration_ms; ///< Slide show mode duration (in ms)

0 commit comments

Comments
 (0)