Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions panels/dock/taskmanager/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,14 @@ add_library(dock-taskmanager SHARED ${DBUS_INTERFACES}
desktopfileamparser.cpp
desktopfileamparser.h
desktopfileparserfactory.h
dockcombinemodel.cpp
dockcombinemodel.h
dockitemmodel.cpp
dockitemmodel.h
dockglobalelementmodel.cpp
dockglobalelementmodel.h
dockgroupmodel.cpp
dockgroupmodel.h
taskmanager.cpp
taskmanager.h
treelandwindow.cpp
Expand Down
83 changes: 83 additions & 0 deletions panels/dock/taskmanager/abstracttaskmanagerinterface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include <QAbstractProxyModel>

Check warning on line 7 in panels/dock/taskmanager/abstracttaskmanagerinterface.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QAbstractProxyModel> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <QModelIndex>

Check warning on line 8 in panels/dock/taskmanager/abstracttaskmanagerinterface.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <QModelIndex> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <algorithm>

Check warning on line 9 in panels/dock/taskmanager/abstracttaskmanagerinterface.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <algorithm> not found. Please note: Cppcheck does not need standard library headers to get proper results.
#include <utility>

Check warning on line 10 in panels/dock/taskmanager/abstracttaskmanagerinterface.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: <utility> not found. Please note: Cppcheck does not need standard library headers to get proper results.

namespace dock
{
class AbstractTaskManagerInterface
{
protected:
template<typename Func, typename... Args>
void callInterfaceMethod(const QModelIndex &index, Func func, Args &&...args) const
{
if (nullptr == m_model) {
return;
}
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(m_model->sourceModel());
if (interface != nullptr) {
(interface->*func)(m_model->mapToSource(index), std::forward<Args>(args)...);
}
}

template<typename Func, typename... Args>
void callInterfaceMethod(const QModelIndexList &indexes, Func func, Args &&...args) const
{
if (nullptr == m_model) {
return;
}
QModelIndexList sourceModelIndexes;
std::transform(indexes.begin(), indexes.end(), std::back_inserter(sourceModelIndexes), [this](const auto &index) {
return m_model->mapToSource(index);
});
auto interface = dynamic_cast<AbstractTaskManagerInterface *>(m_model->sourceModel());
if (interface != nullptr) {
(interface->*func)(sourceModelIndexes, std::forward<Args>(args)...);
}
}

public:
AbstractTaskManagerInterface(QAbstractProxyModel *model)
: m_model(model){};

virtual void requestActivate(const QModelIndex &index) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestActivate);
}
virtual void requestNewInstance(const QModelIndex &index, const QString &action) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestNewInstance, action);
}
virtual void requestOpenUrls(const QModelIndex &index, const QList<QUrl> &urls) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestOpenUrls, urls);
}
virtual void requestClose(const QModelIndex &index, bool force = false) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestClose, force);
}
virtual void requestUpdateWindowGeometry(const QModelIndex &index, const QRect &geometry, QObject *delegate = nullptr) const
{
callInterfaceMethod(index, &AbstractTaskManagerInterface::requestUpdateWindowGeometry, geometry, delegate);
}

virtual void
requestPreview(const QModelIndexList &indexes, QObject *relativePositionItem, int32_t previewXoffset, int32_t previewYoffset, uint32_t direction) const
{
callInterfaceMethod(indexes, &AbstractTaskManagerInterface::requestPreview, relativePositionItem, previewXoffset, previewYoffset, direction);
}
virtual void requestWindowsView(const QModelIndexList &indexes) const
{
callInterfaceMethod(indexes, &AbstractTaskManagerInterface::requestWindowsView);
}

protected:
QAbstractProxyModel *m_model;
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,16 @@
"description": "The default apps which is docked when dock is started.",
"permissions": "readwrite",
"visibility": "private"
},
"dockedElements": {
"value": ["desktop/dde-file-manager", "desktop/deepin-app-storedesktop", "desktop/org.deepin.browser", "desktop/deepin-mail", "desktop/deepin-terminal", "desktop/dde-calendar", "desktop/deepin-music", "desktop/deepin-editor", "desktop/deepin-calculator", "desktop/org.deepin.dde.control-center", "desktop/dde-trash"],
"serial": 0,
"flags": [],
"name": "dockedElements",
"name[zh_CN]": "任务栏驻留项目",
"description": "The items which is docked when dock is started.",
"permissions": "readwrite",
"visibility": "private"
}
}
}
72 changes: 72 additions & 0 deletions panels/dock/taskmanager/dockcombinemodel.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
// SPDX-FileCopyrightText: 2025 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "dockcombinemodel.h"
#include "abstracttaskmanagerinterface.h"
#include "globals.h"
#include "rolecombinemodel.h"
#include "taskmanager.h"

namespace dock
{
DockCombineModel::DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent)
: RoleCombineModel(major, minor, majorRoles, func, parent)
, AbstractTaskManagerInterface(this)
{
// due to role has changed by RoleGroupModel, so we redirect role to TaskManager::Roles.
m_roleMaps = {{TaskManager::ActiveRole, RoleCombineModel::roleNames().key(MODEL_ACTIVE)},
{TaskManager::AttentionRole, RoleCombineModel::roleNames().key(MODEL_ATTENTION)},
{TaskManager::DesktopIdRole, RoleCombineModel::roleNames().key(MODEL_DESKTOPID)},
{TaskManager::IconNameRole, RoleCombineModel::roleNames().key(MODEL_ICONNAME)},
{TaskManager::IdentityRole, RoleCombineModel::roleNames().key(MODEL_IDENTIFY)},
{TaskManager::ActionsRole, RoleCombineModel::roleNames().key(MODEL_ACTIONS)},
{TaskManager::NameRole, RoleCombineModel::roleNames().key(MODEL_NAME)},
{TaskManager::WinIdRole, RoleCombineModel::roleNames().key(MODEL_WINID)},
{TaskManager::WinTitleRole, RoleCombineModel::roleNames().key(MODEL_TITLE)}};
}

QHash<int, QByteArray> DockCombineModel::roleNames() const
{
return {{TaskManager::ActiveRole, MODEL_ACTIVE},
{TaskManager::AttentionRole, MODEL_ATTENTION},
{TaskManager::DesktopIdRole, MODEL_DESKTOPID},
{TaskManager::IconNameRole, MODEL_ICONNAME},
{TaskManager::IdentityRole, MODEL_IDENTIFY},
{TaskManager::ActionsRole, MODEL_ACTIONS},
{TaskManager::NameRole, MODEL_NAME},
{TaskManager::WinIdRole, MODEL_WINID},
{TaskManager::WinTitleRole, MODEL_TITLE}};
}

QVariant DockCombineModel::data(const QModelIndex &index, int role) const
{
switch (role) {
case TaskManager::DesktopIdRole: {
auto res = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::DesktopIdRole)).toString();
if (res.isEmpty()) {
auto data = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IdentityRole)).toStringList();
res = data.value(0, "");
}
return res;
}
case TaskManager::IconNameRole: {
auto icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::IconNameRole)).toString();
if (icon.isEmpty()) {
icon = RoleCombineModel::data(index, m_roleMaps.value(TaskManager::WinIconRole)).toString();
}
return icon;
}
default: {
auto newRole = m_roleMaps.value(role, -1);
if (newRole == -1) {
return QVariant();
}

return RoleCombineModel::data(index, newRole);
}
}

return QVariant();
}
}
24 changes: 24 additions & 0 deletions panels/dock/taskmanager/dockcombinemodel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include "abstracttaskmanagerinterface.h"
#include "rolecombinemodel.h"

namespace dock
{
class DockCombineModel : public RoleCombineModel, public AbstractTaskManagerInterface
{
Q_OBJECT

public:
DockCombineModel(QAbstractItemModel *major, QAbstractItemModel *minor, int majorRoles, CombineFunc func, QObject *parent = nullptr);
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;

private:
QHash<int, int> m_roleMaps;
};
}
Loading