From 75b70fcbe29801d25f8dc64e68a1265dc55c7042 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 15 Jun 2021 11:21:44 +0100 Subject: [PATCH] Drag Drop files from konsole to other softwares --- src/filterHotSpots/FileFilterHotspot.cpp | 30 +++++++++++++++++++++++- src/filterHotSpots/FileFilterHotspot.h | 3 +++ src/filterHotSpots/HotSpot.cpp | 10 ++++++++ src/filterHotSpots/HotSpot.h | 3 +++ src/terminalDisplay/TerminalDisplay.cpp | 5 ++++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/filterHotSpots/FileFilterHotspot.cpp b/src/filterHotSpots/FileFilterHotspot.cpp index 591db2bd..cbddf3c5 100644 --- a/src/filterHotSpots/FileFilterHotspot.cpp +++ b/src/filterHotSpots/FileFilterHotspot.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include @@ -28,6 +30,7 @@ #include #include + #include "konsoledebug.h" #include "KonsoleSettings.h" #include "profile/Profile.h" @@ -300,8 +303,33 @@ void FileFilterHotSpot::mouseLeaveEvent(TerminalDisplay *td, QMouseEvent *ev) stopThumbnailGeneration(); } -void Konsole::FileFilterHotSpot::keyPressEvent(Konsole::TerminalDisplay* td, QKeyEvent* ev) +void FileFilterHotSpot::keyPressEvent(Konsole::TerminalDisplay* td, QKeyEvent* ev) { HotSpot::keyPressEvent(td, ev); requestThumbnail(ev->modifiers(), QCursor::pos()); } + + +bool FileFilterHotSpot::hasDragOperation() const +{ + return true; +} + +void FileFilterHotSpot::startDrag() +{ + auto *drag = new QDrag(this); + auto *mimeData = new QMimeData(); + mimeData->setUrls({QUrl::fromLocalFile(_filePath)}); + + auto lowerFilePath = _filePath.toLower(); + if (lowerFilePath.endsWith(QStringLiteral("png")) + || lowerFilePath.endsWith(QStringLiteral("jpg")) + || lowerFilePath.endsWith(QStringLiteral("jpeg"))) { + mimeData->setImageData(QImage(_filePath)); + } + + drag->setMimeData(mimeData); + Qt::DropAction result = drag->exec(Qt::CopyAction); + qDebug() << "result" << result; +} + diff --git a/src/filterHotSpots/FileFilterHotspot.h b/src/filterHotSpots/FileFilterHotspot.h index 6e724d6b..218ee999 100644 --- a/src/filterHotSpots/FileFilterHotspot.h +++ b/src/filterHotSpots/FileFilterHotspot.h @@ -49,6 +49,9 @@ public: void requestThumbnail(Qt::KeyboardModifiers modifiers, const QPoint &pos); void thumbnailRequested(); + bool hasDragOperation() const override; + void startDrag() override; + static void stopThumbnailGeneration(); void mouseEnterEvent(TerminalDisplay *td, QMouseEvent *ev) override; diff --git a/src/filterHotSpots/HotSpot.cpp b/src/filterHotSpots/HotSpot.cpp index 706d1c4a..bb0d9e90 100644 --- a/src/filterHotSpots/HotSpot.cpp +++ b/src/filterHotSpots/HotSpot.cpp @@ -185,3 +185,13 @@ void HotSpot::debug() { qDebug() << type(); qDebug() << _startLine << _endLine << _startColumn << _endColumn; } + +bool Konsole::HotSpot::hasDragOperation() const +{ + return false; +} + +void Konsole::HotSpot::startDrag() +{ +} + diff --git a/src/filterHotSpots/HotSpot.h b/src/filterHotSpots/HotSpot.h index 2e27752c..922187ba 100644 --- a/src/filterHotSpots/HotSpot.h +++ b/src/filterHotSpots/HotSpot.h @@ -92,6 +92,9 @@ public: */ virtual QList actions(); + virtual bool hasDragOperation() const; + virtual void startDrag(); + /** * Setups a menu with actions for the hotspot. */ diff --git a/src/terminalDisplay/TerminalDisplay.cpp b/src/terminalDisplay/TerminalDisplay.cpp index 3f193ffa..1f7d4db4 100644 --- a/src/terminalDisplay/TerminalDisplay.cpp +++ b/src/terminalDisplay/TerminalDisplay.cpp @@ -1165,6 +1165,11 @@ void TerminalDisplay::mousePressEvent(QMouseEvent* ev) processFilters(); _filterChain->mouseMoveEvent(this, ev, charLine, charColumn); + auto hotSpotClick = _filterChain->hotSpotAt(charLine, charColumn); + if (hotSpotClick && hotSpotClick->hasDragOperation() && ev->modifiers() & Qt::Modifier::ALT) { + hotSpotClick->startDrag(); + return; + } if (ev->button() == Qt::LeftButton) { // request the software keyboard, if any