Skip to content

Commit c940a06

Browse files
committed
Add basic drag and drop functionality
1 parent 7e67cbf commit c940a06

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

gcodeworkshop/include/gcodeworkshop.h

+9
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class QClipboard;
3838
class QCloseEvent;
3939
class QComboBox;
4040
class QDir;
41+
class QDragEnterEvent;
42+
class QDropEvent;
4143
class QEvent;
4244
class QFileSystemModel;
4345
class QFileSystemWatcher;
@@ -95,6 +97,13 @@ class GCodeWorkShop : public QMainWindow
9597
Document* activeDocument() const;
9698
QString currentPath() const;
9799
QString lastOpenedPath() const;
100+
/*
101+
* To implement the opening of dragged files, we override the event handlers.
102+
* see textedit.h and textedit.cpp
103+
* see https://doc.qt.io/qt-5/dnd.html#dropping
104+
*/
105+
void dragEnterEvent(QDragEnterEvent* event) override;
106+
void dropEvent(QDropEvent* event) override;
98107

99108
protected:
100109
Ui::GCodeWorkShop* ui;

gcodeworkshop/src/gcodereventfilter.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,14 @@
1919
*/
2020

2121
#include <QChar> // for QChar, operator==, operator!=
22+
#include <QDragEnterEvent> // for QDragEnterEvent
23+
#include <QDropEvent> // for QDropEvent
2224
#include <QEvent> // for QEvent, QEvent::KeyPress, QEvent::MouseButtonDblClick, QEvent::ToolTip
2325
#include <QHelpEvent> // for QHelpEvent
2426
#include <QKeyEvent> // for QKeyEvent
2527
#include <QLatin1Char> // for QLatin1Char
2628
#include <QLatin1String> // for QLatin1String
29+
#include <QMimeData> // for QMimeData
2730
#include <QMouseEvent> // for QMouseEvent
2831
#include <QPlainTextEdit> // for QPlainTextEdit
2932
#include <QRect> // for QRect
@@ -88,6 +91,16 @@ bool GCoderEventFilter::eventFilter(QObject* obj, QEvent* event)
8891
return keyEvent(ke);
8992
}
9093

94+
if (event->type() == QEvent::DragEnter) {
95+
QDragEnterEvent* dee = dynamic_cast<QDragEnterEvent*>(event);
96+
return dragEnterEvent(dee);
97+
}
98+
99+
if (event->type() == QEvent::Drop) {
100+
QDropEvent* de = dynamic_cast<QDropEvent*>(event);
101+
return dropEvent(de);
102+
}
103+
91104
return false;
92105
}
93106

@@ -251,3 +264,13 @@ bool GCoderEventFilter::keyEvent(QKeyEvent* event)
251264

252265
return false;
253266
}
267+
268+
bool GCoderEventFilter::dragEnterEvent(QDragEnterEvent* event)
269+
{
270+
return event->mimeData()->hasUrls();
271+
}
272+
273+
bool GCoderEventFilter::dropEvent(QDropEvent* event)
274+
{
275+
return event->mimeData()->hasUrls();
276+
}

gcodeworkshop/src/gcodereventfilter.h

+12
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include <QRegularExpression> // for QRegularExpression
2626
#include <QString> // for QString
2727

28+
class QDragEnterEvent;
29+
class QDropEvent;
2830
class QEvent;
2931
class QHelpEvent;
3032
class QKeyEvent;
@@ -61,6 +63,16 @@ class GCoderEventFilter : public QObject
6163
bool mouseButtonDblClickEvent(QMouseEvent* event);
6264
bool keyEvent(QKeyEvent* event);
6365

66+
/*
67+
* The QPlainTextEdit class already has a drag-n-drop mechanism, but in
68+
* the case of files, QPlainTextEdit inserts a text representation of url
69+
* into the edited document. So we add event handlers to filter such events
70+
* and handle those events in the main window.
71+
* see https://doc.qt.io/qt-5/dnd.html#dropping
72+
*/
73+
bool dragEnterEvent(QDragEnterEvent* event);
74+
bool dropEvent(QDropEvent* event);
75+
6476
protected:
6577
QPlainTextEdit* m_textEdit;
6678
QHash<QString, QString> m_tips;

gcodeworkshop/src/gcodeworkshop.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
#include <QDesktopServices> // for QDesktopServices
3737
#include <QDialog> // for QDialog, QDialog::Accepted
3838
#include <QDir> // for QDir, operator|, QDir::Files, QDir::Hidden, QDir::Name, QDir::NoSymLinks
39+
#include <QDragEnterEvent> // for QDragEnterEvent
40+
#include <QDropEvent> // for QDropEvent
3941
#include <QEvent> // for QEvent, QEvent::ToolTip
4042
#include <QFile> // for QFile
4143
#include <QFileDialog> // for QFileDialog, QFileDialog::DontConfirmOverwrite
@@ -60,6 +62,7 @@
6062
#include <QMenu> // for QMenu
6163
#include <QMenuBar> // for QMenuBar
6264
#include <QMessageBox> // for QMessageBox, operator|, QMessageBox::Save, QMessageBox::Discard, QMess...
65+
#include <QMimeData> // for QMimeData
6366
#include <QModelIndex> // for QModelIndex
6467
#include <QModelIndexList> // for QModelIndexList
6568
#include <QObject> // for SIGNAL, SLOT, qobject_cast, emit
@@ -158,6 +161,7 @@ GCodeWorkShop::GCodeWorkShop(Medium* medium)
158161

159162
ui = new Ui::GCodeWorkShop();
160163
ui->setupUi(this);
164+
setAcceptDrops(true);
161165

162166
findToolBar = nullptr;
163167
serialToolBar = nullptr;
@@ -288,6 +292,30 @@ void GCodeWorkShop::moveEvent(QMoveEvent* event)
288292
QMainWindow::moveEvent(event);
289293
}
290294

295+
void GCodeWorkShop::dragEnterEvent(QDragEnterEvent* event)
296+
{
297+
if (!event->mimeData()->hasUrls()) {
298+
QMainWindow::dragEnterEvent(event);
299+
return;
300+
}
301+
302+
event->acceptProposedAction();
303+
}
304+
305+
void GCodeWorkShop::dropEvent(QDropEvent* event)
306+
{
307+
if (!event->mimeData()->hasUrls()) {
308+
QMainWindow::dropEvent(event);
309+
return;
310+
}
311+
312+
for (QUrl url : event->mimeData()->urls()) {
313+
openFile(url.toString(QUrl::PreferLocalFile));
314+
}
315+
316+
event->acceptProposedAction();
317+
}
318+
291319
Addons::Actions* GCodeWorkShop::addonsActions()
292320
{
293321
return m_addonsActions;

0 commit comments

Comments
 (0)