diff --git a/applets/taskmanager/package/contents/ui/MouseHandler.qml b/applets/taskmanager/package/contents/ui/MouseHandler.qml --- a/applets/taskmanager/package/contents/ui/MouseHandler.qml +++ b/applets/taskmanager/package/contents/ui/MouseHandler.qml @@ -27,12 +27,14 @@ import "../code/tools.js" as TaskTools Item { - signal urlDropped(url url) + signal urlsDropped(var urls) property Item target property Item ignoredItem property bool moved: false + property alias hoveredItem: dropHandler.hoveredItem + Timer { id: ignoreItemTimer @@ -118,7 +120,7 @@ } if (event.mimeData.hasUrls) { - parent.urlDropped(event.mimeData.url); + parent.urlsDropped(event.mimeData.urls); } } diff --git a/applets/taskmanager/package/contents/ui/main.qml b/applets/taskmanager/package/contents/ui/main.qml --- a/applets/taskmanager/package/contents/ui/main.qml +++ b/applets/taskmanager/package/contents/ui/main.qml @@ -242,6 +242,31 @@ anchors.fill: parent target: taskList + + onUrlsDropped: { + // If all dropped URLs point to application desktop files, we'll add a launcher for each of them. + var createLaunchers = urls.every(function (item) { + return backend.isApplication(item) + }); + + if (createLaunchers) { + urls.forEach(function (item) { + addLauncher(item); + }); + return; + } + + if (!hoveredItem) { + return; + } + + // DeclarativeMimeData urls is a QJsonArray but requestOpenUrls expects a proper QList. + var urlsList = backend.jsonArrayToUrlList(urls); + + // Otherwise we'll just start a new instance of the application with the URLs as argument, + // as you probably don't expect some of your files to open in the app and others to spawn launchers. + tasksModel.requestOpenUrls(hoveredItem.modelIndex(), urlsList); + } } ToolTipDelegate { @@ -318,7 +343,6 @@ tasks.requestLayout.connect(iconGeometryTimer.restart); tasks.windowsHovered.connect(backend.windowsHovered); tasks.presentWindows.connect(backend.presentWindows); - mouseHandler.urlDropped.connect(backend.urlDropped); dragHelper.dropped.connect(resetDragSource); } } diff --git a/applets/taskmanager/plugin/backend.h b/applets/taskmanager/plugin/backend.h --- a/applets/taskmanager/plugin/backend.h +++ b/applets/taskmanager/plugin/backend.h @@ -29,6 +29,7 @@ class QActionGroup; class QQuickItem; class QQuickWindow; +class QJsonArray; namespace KActivities { class Consumer; @@ -74,10 +75,13 @@ Q_INVOKABLE bool canPresentWindows() const; + Q_INVOKABLE bool isApplication(const QUrl &url) const; + + Q_INVOKABLE QList jsonArrayToUrlList(const QJsonArray &array) const; + public Q_SLOTS: void presentWindows(const QVariant &winIds); void windowsHovered(const QVariant &winIds, bool hovered); - void urlDropped(const QUrl &url) const; Q_SIGNALS: void taskManagerItemChanged() const; diff --git a/applets/taskmanager/plugin/backend.cpp b/applets/taskmanager/plugin/backend.cpp --- a/applets/taskmanager/plugin/backend.cpp +++ b/applets/taskmanager/plugin/backend.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -340,6 +341,34 @@ KWindowEffects::presentWindows(m_taskManagerItem->window()->winId(), winIds); } +bool Backend::isApplication(const QUrl &url) const +{ + if (!url.isValid() || !url.isLocalFile()) { + return false; + } + + const QString &localPath = url.toLocalFile(); + + if (!KDesktopFile::isDesktopFile(localPath)) { + return false; + } + + KDesktopFile desktopFile(localPath); + return desktopFile.hasApplicationType(); +} + +QList Backend::jsonArrayToUrlList(const QJsonArray &array) const +{ + QList urls; + urls.reserve(array.count()); + + for (auto it = array.constBegin(), end = array.constEnd(); it != end; ++it) { + urls << QUrl(it->toString()); + } + + return urls; +} + void Backend::windowsHovered(const QVariant &_winIds, bool hovered) { m_windowsToHighlight.clear(); @@ -360,19 +389,6 @@ updateWindowHighlight(); } -void Backend::urlDropped(const QUrl &url) const -{ - if (!url.isValid() || !url.isLocalFile()) { - return; - } - - KDesktopFile desktopFile(url.toLocalFile()); - - if (desktopFile.hasApplicationType()) { - emit addLauncher(url); - } -} - void Backend::updateWindowHighlight() { if (!m_highlightWindows) {