Skip to content

Commit

Permalink
feat: drop to dock task icon to launch with uri
Browse files Browse the repository at this point in the history
拖拽文件到图标上以打开新实例并将拖拽的文件作为参数.

注:仅实现了拖拽打开行为.并未进行拖拽到图标上则激活现有窗口的实现.

PMS: BUG-275395
Log:
  • Loading branch information
BLumia committed Feb 17, 2025
1 parent be4e8fe commit 91c590c
Show file tree
Hide file tree
Showing 11 changed files with 44 additions and 4 deletions.
3 changes: 2 additions & 1 deletion panels/dock/taskmanager/abstractitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -75,4 +76,4 @@ class AbstractItem : public QObject
void dataChanged();

};
}
}
7 changes: 7 additions & 0 deletions panels/dock/taskmanager/appitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/appitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
4 changes: 4 additions & 0 deletions panels/dock/taskmanager/desktopfileabstractparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ void DesktopfileAbstractParser::launchWithAction(const QString& action)

}

void DesktopfileAbstractParser::launchWithUrls(const QStringList & urls)
{
}

void DesktopfileAbstractParser::requestQuit()
{

Expand Down
3 changes: 2 additions & 1 deletion panels/dock/taskmanager/desktopfileabstractparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,11 +39,12 @@ class DesktopfileAbstractParser : public QObject
virtual QString genericName();
virtual QString desktopIcon();
virtual QString xDeepinVendor();

virtual std::pair<bool, QString> isValied();

virtual void launch();
virtual void launchWithAction(const QString& action);
virtual void launchWithUrls(const QStringList & urls);
virtual void requestQuit();
virtual QString type();

Expand Down
7 changes: 6 additions & 1 deletion panels/dock/taskmanager/desktopfileamparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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()
{

Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/desktopfileamparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 11 additions & 1 deletion panels/dock/taskmanager/package/AppItem.qml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ Item {
required property int visualIndex

signal clickItem(itemId: string, menuId: string)
signal dropFilesOnItem(itemId: string, files: list<string>)
signal dragFinished()

Drag.active: mouseArea.drag.active
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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()
}
Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/package/TaskManager.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
8 changes: 8 additions & 0 deletions panels/dock/taskmanager/taskmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
1 change: 1 addition & 0 deletions panels/dock/taskmanager/taskmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 91c590c

Please sign in to comment.