From 296d1fa51b6af339542467167e61158e5ce7be08 Mon Sep 17 00:00:00 2001 From: Wang Zichong Date: Tue, 4 Nov 2025 14:26:10 +0800 Subject: [PATCH] chore: backup plan to temporary switch back to legacy ItemModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 为 ItemModel 类添加了一些兼容目前接口行为的接口,以供临时切换任务栏 模型到 ItemModel 所需. 此 PR 中未进行实际的切换. Log: --- panels/dock/taskmanager/itemmodel.cpp | 113 ++++++++++++++++++++---- panels/dock/taskmanager/itemmodel.h | 17 ++-- panels/dock/taskmanager/taskmanager.cpp | 14 +-- 3 files changed, 111 insertions(+), 33 deletions(-) diff --git a/panels/dock/taskmanager/itemmodel.cpp b/panels/dock/taskmanager/itemmodel.cpp index 407ea929f..557332cbc 100644 --- a/panels/dock/taskmanager/itemmodel.cpp +++ b/panels/dock/taskmanager/itemmodel.cpp @@ -4,6 +4,9 @@ #include "itemmodel.h" #include "abstractitem.h" +#include "appitem.h" +#include "globals.h" +#include "taskmanager.h" #include "taskmanagersettings.h" #include @@ -32,17 +35,19 @@ ItemModel::ItemModel(QObject* parent) QHash ItemModel::roleNames() const { - return {{ItemModel::ItemIdRole, "itemId"}, - {ItemModel::NameRole, "name"}, - {ItemModel::IconNameRole, "iconName"}, - {ItemModel::ActiveRole, "active"}, - {ItemModel::AttentionRole, "attention"}, - {ItemModel::MenusRole, "menus"}, - {ItemModel::DockedRole, "docked"}, - {ItemModel::WindowsRole, "windows"}, - {ItemModel::DesktopFilesIconsRole, "desktopfileIcons"}, + // clang-format off + return {{ItemModel::ItemIdRole, MODEL_ITEMID}, + {TaskManager::NameRole, MODEL_NAME}, + {TaskManager::IconNameRole, MODEL_ICONNAME}, + {TaskManager::ActiveRole, MODEL_ACTIVE}, + {TaskManager::AttentionRole, MODEL_ATTENTION}, + {TaskManager::MenusRole, MODEL_MENUS}, + {TaskManager::DockedRole, MODEL_DOCKED}, + {TaskManager::WindowsRole, MODEL_WINDOWS}, + {TaskManager::WinIconRole, MODEL_WINICON}, {ItemModel::DockedDirRole, "dockedDir"} }; + // clang-format on } int ItemModel::rowCount(const QModelIndex &parent) const @@ -57,18 +62,20 @@ QVariant ItemModel::data(const QModelIndex &index, int role) const } auto item = m_items[index.row()]; + // clang-format off switch (role) { case ItemModel::ItemIdRole: return item->id(); - case ItemModel::NameRole: return item->name(); - case ItemModel::IconNameRole: return item->icon(); - case ItemModel::ActiveRole: return item->isActive(); - case ItemModel::AttentionRole: return item->isAttention(); - case ItemModel::MenusRole: return item->menus(); - case ItemModel::DockedRole: return item->isDocked(); - case ItemModel::WindowsRole: return item->data().toStringList(); - case ItemModel::DesktopFilesIconsRole: return item->data().toStringList(); + case TaskManager::NameRole: return item->name(); + case TaskManager::IconNameRole: return item->icon(); + case TaskManager::ActiveRole: return item->isActive(); + case TaskManager::AttentionRole: return item->isAttention(); + case TaskManager::MenusRole: return item->menus(); + case TaskManager::DockedRole: return item->isDocked(); + case TaskManager::WindowsRole: return item->data().toStringList(); + case TaskManager::WinIconRole: return item->data().toStringList(); case ItemModel::DockedDirRole: return item->data().toString(); } + // clang-format on return QVariant(); } @@ -89,6 +96,78 @@ QJsonArray ItemModel::dumpDockedItems() const return result; } +void ItemModel::requestActivate(const QModelIndex &index) const +{ + QString itemId = data(index).toString(); + + auto item = ItemModel::instance()->getItemById(itemId); + if (!item) { + return; + } + + item->handleClick(QString()); +} + +void ItemModel::requestNewInstance(const QModelIndex &index, const QString &action) const +{ + QString itemId = data(index).toString(); + + auto item = ItemModel::instance()->getItemById(itemId); + if (!item) { + return; + } + + item->handleClick(DOCK_ACTIN_LAUNCH); +} + +void ItemModel::requestClose(const QModelIndex &index, bool force) const +{ + QString itemId = data(index).toString(); + + auto item = ItemModel::instance()->getItemById(itemId); + if (!item) { + return; + } + + item->handleClick(force ? DOCK_ACTION_FORCEQUIT : DOCK_ACTION_CLOSEALL); +} + +void ItemModel::requestOpenUrls(const QModelIndex &index, const QList &urls) const +{ + QString itemId = data(index).toString(); + + auto item = ItemModel::instance()->getItemById(itemId); + if (!item) { + return; + } + + // convert urls to string list + QStringList urlsStr; + for (auto url : std::as_const(urls)) { + urlsStr.append(url.toString()); + } + + item->handleFileDrop(urlsStr); +} + +void ItemModel::requestWindowsView(const QModelIndexList &indexes) const +{ + // nothing here, dummy entry. +} + +void ItemModel::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const +{ + QString itemId = data(index).toString(); + + QPointer item = static_cast(ItemModel::instance()->getItemById(itemId).get()); + if (item.isNull()) + return; + + for (auto window : item->getAppendWindows()) { + window->setWindowIconGeometry(qobject_cast(delegate), geometry); + } +} + QPointer ItemModel::getItemById(const QString& id) const { auto it = std::find_if(m_items.begin(), m_items.end(),[id](QPointer item){ diff --git a/panels/dock/taskmanager/itemmodel.h b/panels/dock/taskmanager/itemmodel.h index f6a0f0d48..d32de683c 100644 --- a/panels/dock/taskmanager/itemmodel.h +++ b/panels/dock/taskmanager/itemmodel.h @@ -14,16 +14,8 @@ class ItemModel : public QAbstractListModel Q_OBJECT public: enum Roles { - ItemIdRole = Qt::UserRole + 1, - NameRole, - IconNameRole, - ActiveRole, - AttentionRole, - MenusRole, - DockedRole, + ItemIdRole = Qt::UserRole + 64, // data type - WindowsRole, - DesktopFilesIconsRole, DockedDirRole, }; Q_ENUM(Roles) @@ -38,6 +30,13 @@ class ItemModel : public QAbstractListModel void addItem(QPointer item); QJsonArray dumpDockedItems() const; + void requestActivate(const QModelIndex &index) const; + void requestNewInstance(const QModelIndex &index, const QString &action) const; + void requestClose(const QModelIndex &index, bool force = false) const; + void requestOpenUrls(const QModelIndex &index, const QList &urls) const; + void requestWindowsView(const QModelIndexList &indexes) const; + void requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const; + private Q_SLOTS: void onItemDestroyed(); void onItemChanged(); diff --git a/panels/dock/taskmanager/taskmanager.cpp b/panels/dock/taskmanager/taskmanager.cpp index 8b2e07778..464f0a560 100644 --- a/panels/dock/taskmanager/taskmanager.cpp +++ b/panels/dock/taskmanager/taskmanager.cpp @@ -216,27 +216,27 @@ HoverPreviewProxyModel *TaskManager::hoverPreviewModel() const void TaskManager::requestActivate(const QModelIndex &index) const { - m_itemModel->requestActivate(index); + dataModel()->requestActivate(index); } void TaskManager::requestOpenUrls(const QModelIndex &index, const QList &urls) const { - m_itemModel->requestOpenUrls(index, urls); + dataModel()->requestOpenUrls(index, urls); } void TaskManager::requestNewInstance(const QModelIndex &index, const QString &action) const { - m_itemModel->requestNewInstance(index, action); + dataModel()->requestNewInstance(index, action); } void TaskManager::requestClose(const QModelIndex &index, bool force) const { - m_itemModel->requestClose(index, force); + dataModel()->requestClose(index, force); } void TaskManager::requestUpdateWindowIconGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate) const { - m_itemModel->requestUpdateWindowIconGeometry(index, geometry, delegate); + dataModel()->requestUpdateWindowIconGeometry(index, geometry, delegate); } void TaskManager::requestPreview(const QModelIndex &index, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) @@ -261,7 +261,7 @@ void TaskManager::requestPreview(const QModelIndex &index, QObject *relativePosi void TaskManager::requestWindowsView(const QModelIndexList &indexes) const { - m_itemModel->requestWindowsView(indexes); + dataModel()->requestWindowsView(indexes); } void TaskManager::handleWindowAdded(QPointer window) @@ -316,7 +316,7 @@ void TaskManager::dropFilesOnItem(const QString& itemId, const QStringList& urls urlList.append(QUrl::fromLocalFile(url)); } - m_itemModel->requestOpenUrls(indexes.first(), urlList); + dataModel()->requestOpenUrls(indexes.first(), urlList); } void TaskManager::hideItemPreview()