diff --git a/panels/dock/taskmanager/abstractitem.h b/panels/dock/taskmanager/abstractitem.h index 2809ddc87..f4baa208d 100644 --- a/panels/dock/taskmanager/abstractitem.h +++ b/panels/dock/taskmanager/abstractitem.h @@ -56,6 +56,7 @@ class AbstractItem : public QObject virtual void setDocked(bool docked) =0; virtual void handleClick(const QString& clickItem) = 0; + virtual void handleFileDrop(const QStringList & urls) = 0; // three type data virtual QVariant data() = 0; @@ -75,4 +76,4 @@ class AbstractItem : public QObject void dataChanged(); }; -} \ No newline at end of file +} diff --git a/panels/dock/taskmanager/appitem.cpp b/panels/dock/taskmanager/appitem.cpp index 715099d20..f52ef8641 100644 --- a/panels/dock/taskmanager/appitem.cpp +++ b/panels/dock/taskmanager/appitem.cpp @@ -201,6 +201,13 @@ void AppItem::handleClick(const QString& clickItem) } +void AppItem::handleFileDrop(const QStringList & urls) +{ + if (m_desktopfileParser && !m_desktopfileParser.isNull()) { + m_desktopfileParser->launchWithUrls(urls); + } +} + QVariant AppItem::data() { QStringList ret; diff --git a/panels/dock/taskmanager/appitem.h b/panels/dock/taskmanager/appitem.h index ff2de58d0..d91d3734e 100644 --- a/panels/dock/taskmanager/appitem.h +++ b/panels/dock/taskmanager/appitem.h @@ -42,6 +42,7 @@ class AppItem : public AbstractItem void setDocked(bool docked) override; void handleClick(const QString& clickItem) override; + void handleFileDrop(const QStringList & urls) override; QVariant data() override; diff --git a/panels/dock/taskmanager/desktopfileabstractparser.cpp b/panels/dock/taskmanager/desktopfileabstractparser.cpp index 074e0573c..278ef00e7 100644 --- a/panels/dock/taskmanager/desktopfileabstractparser.cpp +++ b/panels/dock/taskmanager/desktopfileabstractparser.cpp @@ -37,6 +37,10 @@ void DesktopfileAbstractParser::launchWithAction(const QString& action) } +void DesktopfileAbstractParser::launchWithUrls(const QStringList & urls) +{ +} + void DesktopfileAbstractParser::requestQuit() { diff --git a/panels/dock/taskmanager/desktopfileabstractparser.h b/panels/dock/taskmanager/desktopfileabstractparser.h index 773c59a15..df2ce5960 100644 --- a/panels/dock/taskmanager/desktopfileabstractparser.h +++ b/panels/dock/taskmanager/desktopfileabstractparser.h @@ -39,11 +39,12 @@ class DesktopfileAbstractParser : public QObject virtual QString genericName(); virtual QString desktopIcon(); virtual QString xDeepinVendor(); - + virtual std::pair isValied(); virtual void launch(); virtual void launchWithAction(const QString& action); + virtual void launchWithUrls(const QStringList & urls); virtual void requestQuit(); virtual QString type(); diff --git a/panels/dock/taskmanager/desktopfileamparser.cpp b/panels/dock/taskmanager/desktopfileamparser.cpp index 0dbe231ef..ed6f16ea0 100644 --- a/panels/dock/taskmanager/desktopfileamparser.cpp +++ b/panels/dock/taskmanager/desktopfileamparser.cpp @@ -39,7 +39,7 @@ DesktopFileAMParser::DesktopFileAMParser(QString id, QObject* parent) { if (!m_amIsAvaliable) m_amIsAvaliable = QDBusConnection::sessionBus(). interface()->isServiceRegistered(AM_DBUS_PATH); - + connect(&desktopobjectManager, &ObjectManager::InterfacesRemoved, this, [this] (const QDBusObjectPath& path, const QStringList& interfaces) { if (m_applicationInterface->path() == path.path()) { getAppItem()->setDocked(false); @@ -191,6 +191,11 @@ void DesktopFileAMParser::launchWithAction(const QString& action) return launchByAMTool(action); } +void DesktopFileAMParser::launchWithUrls(const QStringList & urls) +{ + m_applicationInterface->Launch(QString(), urls, QVariantMap()); +} + void DesktopFileAMParser::requestQuit() { diff --git a/panels/dock/taskmanager/desktopfileamparser.h b/panels/dock/taskmanager/desktopfileamparser.h index c6094fff7..50d6ff075 100644 --- a/panels/dock/taskmanager/desktopfileamparser.h +++ b/panels/dock/taskmanager/desktopfileamparser.h @@ -22,6 +22,7 @@ class DesktopFileAMParser : public DesktopfileAbstractParser virtual void launch() override; virtual void launchWithAction(const QString& action) override; + virtual void launchWithUrls(const QStringList & urls) override; virtual void requestQuit() override; virtual QString id() override; diff --git a/panels/dock/taskmanager/package/AppItem.qml b/panels/dock/taskmanager/package/AppItem.qml index e01237a83..0107d31d0 100644 --- a/panels/dock/taskmanager/package/AppItem.qml +++ b/panels/dock/taskmanager/package/AppItem.qml @@ -24,6 +24,7 @@ Item { required property int visualIndex signal clickItem(itemId: string, menuId: string) + signal dropFilesOnItem(itemId: string, files: list) signal dragFinished() Drag.active: mouseArea.drag.active @@ -245,7 +246,7 @@ Item { NumberAnimation { target: rect; property: "width"; from: originSize * (index + 1); to: originSize * (index + 2); duration: 1200 } ColorAnimation { target: rect; property: "color"; from: Qt.rgba(1, 1, 1, 0.4); to: Qt.rgba(1, 1, 1, 0.1); duration: 1200 } } - } + } // TODO Remove it because of consuming performance. // D.BoxShadow { @@ -384,6 +385,15 @@ Item { } } + DropArea { + anchors.fill: parent + keys: ["dfm_app_type_for_drag"] + + onDropped: function (drop){ + root.dropFilesOnItem(root.itemId, drop.urls) + } + } + onWindowsChanged: { updateWindowIconGeometryTimer.start() } diff --git a/panels/dock/taskmanager/package/TaskManager.qml b/panels/dock/taskmanager/package/TaskManager.qml index 21680d71d..4978d08ed 100644 --- a/panels/dock/taskmanager/package/TaskManager.qml +++ b/panels/dock/taskmanager/package/TaskManager.qml @@ -104,6 +104,7 @@ ContainmentItem { ListView.delayRemove: Drag.active Component.onCompleted: { clickItem.connect(taskmanager.Applet.clickItem) + dropFilesOnItem.connect(taskmanager.Applet.dropFilesOnItem) } onDragFinished: function() { launcherDndDropArea.resetDndState() diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index ebb882f8a..f52aee6b2 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -180,6 +180,14 @@ void TaskManager::clickItem(const QString& itemId, const QString& menuId) item->handleClick(menuId); } +void TaskManager::dropFilesOnItem(const QString& itemId, const QStringList& urls) +{ + auto item = ItemModel::instance()->getItemById(itemId); + if(!item) return; + + item->handleFileDrop(urls); +} + void TaskManager::showItemPreview(const QString &itemId, QObject* relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) { auto item = ItemModel::instance()->getItemById(itemId).get(); diff --git a/panels/dock/taskmanager/taskmanager.h b/panels/dock/taskmanager/taskmanager.h index 0fa211922..f9226379b 100644 --- a/panels/dock/taskmanager/taskmanager.h +++ b/panels/dock/taskmanager/taskmanager.h @@ -44,6 +44,7 @@ class TaskManager : public DS_NAMESPACE::DContainment Q_INVOKABLE bool RequestUndock(QString appID); Q_INVOKABLE void clickItem(const QString& itemid, const QString& menuId); + Q_INVOKABLE void dropFilesOnItem(const QString& itemId, const QStringList& urls); Q_INVOKABLE void showItemPreview(const QString& itemId, QObject* relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction); Q_INVOKABLE void hideItemPreview();