From af9ca5aa054bd7a0352f023054aa51a8712f3405 Mon Sep 17 00:00:00 2001 From: Wang Zichong Date: Mon, 11 Nov 2024 21:01:32 +0800 Subject: [PATCH] refactor: adjust relationship between AppGroupModel and AMAppItemModel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整 AppGroupModel 与 AMAppItemModel 的关系,其它部分暂未调整。 后续待调整内容: 1. 暴漏的 appsModel 转为一个组合模型,同时包含这两个模型的数据 2. 处理应用组的初始化、位置信息更新等行为,确保每个应用总是有分组信息 --- applets/dde-apps/amappitem.cpp | 2 +- applets/dde-apps/amappitemmodel.cpp | 3 -- applets/dde-apps/appgroup.cpp | 28 +++++----- applets/dde-apps/appgroup.h | 8 +-- applets/dde-apps/appgroupmanager.cpp | 52 ++++++++++++------- applets/dde-apps/appgroupmanager.h | 9 ++-- applets/dde-apps/appitem.cpp | 35 +++++-------- applets/dde-apps/appitem.h | 5 +- applets/dde-apps/appitemmodel.cpp | 3 +- applets/dde-apps/appitemmodel.h | 8 ++- applets/dde-apps/appsapplet.cpp | 4 +- applets/dde-apps/appsapplet.h | 3 +- .../server/notificationsetting.cpp | 2 +- 13 files changed, 89 insertions(+), 73 deletions(-) diff --git a/applets/dde-apps/amappitem.cpp b/applets/dde-apps/amappitem.cpp index 1ea653939..401b11f81 100644 --- a/applets/dde-apps/amappitem.cpp +++ b/applets/dde-apps/amappitem.cpp @@ -19,7 +19,7 @@ static const QString DEFAULT_KEY = "default"; static QString locale = QLocale::system().name(); AMAppItem::AMAppItem(const QDBusObjectPath &path, QObject *parent) - : AppItem(DUtil::unescapeFromObjectPath(path.path().split('/').last())) + : AppItem(DUtil::unescapeFromObjectPath(path.path().split('/').last()), AppItemModel::AppItemType) , Application(AM_DBUS_SERVICE, path.path(), QDBusConnection::sessionBus(), parent) { } diff --git a/applets/dde-apps/amappitemmodel.cpp b/applets/dde-apps/amappitemmodel.cpp index 4651b6fb3..8d14ec53a 100644 --- a/applets/dde-apps/amappitemmodel.cpp +++ b/applets/dde-apps/amappitemmodel.cpp @@ -57,9 +57,6 @@ AMAppItemModel::AMAppItemModel(QObject *parent) auto path = app.key(); if (!path.path().isEmpty()) { auto c = new AMAppItem(path, app.value()); - if (auto group = AppGroupManager::instance()->getAppGroupInfo(c->appId()); group != std::make_tuple(-1, -1, -1)) { - c->setGroup({std::get<0>(group), std::get<1>(group), std::get<2>(group)}); - } appendRow(c); } } diff --git a/applets/dde-apps/appgroup.cpp b/applets/dde-apps/appgroup.cpp index d11bab9f5..da0c60368 100644 --- a/applets/dde-apps/appgroup.cpp +++ b/applets/dde-apps/appgroup.cpp @@ -4,6 +4,7 @@ #include "appgroup.h" #include "appgroupmanager.h" +#include "appitemmodel.h" #include #include @@ -11,23 +12,18 @@ Q_LOGGING_CATEGORY(appGroupLog, "org.deepin.ds.dde-apps.appgroup") namespace apps { -AppGroup::AppGroup(const QString &name, const QList &appIDs) - : QStandardItem() +AppGroup::AppGroup(const QString &groupId, const QString &name, const QList &appIDs) + : AppItem(groupId, AppItemModel::FolderItemType) { - setName(name); + if (groupId == QStringLiteral("internal/folder/0")) { + setItemsPerPage(4 * 8); + } else { + setItemsPerPage(3 * 4); + } + setAppName(name); setAppItems(appIDs); } -QString AppGroup::name() const -{ - return data(AppGroupManager::GroupNameRole).toString(); -} - -void AppGroup::setName(const QString &name) -{ - return setData(name, AppGroupManager::GroupNameRole); -} - QList AppGroup::appItems() const { QList res; @@ -51,5 +47,11 @@ void AppGroup::setAppItems(const QList &items) }); return setData(data, AppGroupManager::GroupAppItemsRole); } + +void AppGroup::setItemsPerPage(int number) +{ + return setData(number, AppGroupManager::GroupItemsPerPageRole); +} + } diff --git a/applets/dde-apps/appgroup.h b/applets/dde-apps/appgroup.h index 2c0e531ff..84506eaec 100644 --- a/applets/dde-apps/appgroup.h +++ b/applets/dde-apps/appgroup.h @@ -4,18 +4,20 @@ #pragma once -#include +#include "appitem.h" namespace apps { -class AppGroup : public QStandardItem +class AppGroup : public AppItem { public: - explicit AppGroup(const QString &name, const QList &appItemIDs); + explicit AppGroup(const QString &groupId, const QString &name, const QList &appItemIDs); QString name() const; void setName(const QString &name); QList appItems() const; void setAppItems(const QList &items); + + void setItemsPerPage(int number); }; } diff --git a/applets/dde-apps/appgroupmanager.cpp b/applets/dde-apps/appgroupmanager.cpp index bca04b3e5..c3144aea6 100644 --- a/applets/dde-apps/appgroupmanager.cpp +++ b/applets/dde-apps/appgroupmanager.cpp @@ -4,35 +4,27 @@ #include "appgroupmanager.h" #include "appgroup.h" +#include "amappitemmodel.h" #include namespace apps { -static constexpr uint GROUP_MAX_ITEMS_PER_PAGE = 3 * 4; -AppGroupManager* AppGroupManager::instance() -{ - static AppGroupManager* _instance = nullptr; - if (_instance == nullptr) { - _instance = new AppGroupManager; - } - - return _instance; -} -AppGroupManager::AppGroupManager(QObject *parent) +AppGroupManager::AppGroupManager(AMAppItemModel * referenceModel, QObject *parent) : QStandardItemModel(parent) + , m_referenceModel(referenceModel) , m_config(Dtk::Core::DConfig::create("org.deepin.dde.shell", "org.deepin.ds.dde-apps", "", this)) , m_dumpTimer(new QTimer(this)) { m_dumpTimer->setSingleShot(true); m_dumpTimer->setInterval(1000); + + loadAppGroupInfo(); + connect(m_dumpTimer, &QTimer::timeout, this, [this](){ dumpAppGroupInfo(); }); - connect(this, &AppGroupManager::dataChanged, this, &AppGroupManager::dumpAppGroupInfo); - - loadAppGroupInfo(); } QVariant AppGroupManager::data(const QModelIndex &index, int role) const @@ -84,13 +76,14 @@ void AppGroupManager::setAppGroupInfo(const QString &appId, std::tuple>(); + int groupItemsPerPage = groupIndex.data(GroupItemsPerPageRole).toInt(); for (int i = pagePos; i < appItems.length() - 1; i++) { appItems[i].insert(itemPos, appId); m_map.insert(appId, std::make_tuple(groupPos, pagePos)); // 本页最后一位元素插入到下页 - if (appItems[i].length() > GROUP_MAX_ITEMS_PER_PAGE) { + if (appItems[i].length() > groupItemsPerPage) { auto item = appItems[i].takeLast(); appItems[i + 1].insert(0, item); @@ -98,7 +91,7 @@ void AppGroupManager::setAppGroupInfo(const QString &appId, std::tuple 1 && appItems.last().length() > GROUP_MAX_ITEMS_PER_PAGE) { + if (appItems.length() > 1 && appItems.last().length() > groupItemsPerPage) { auto item = appItems.last().takeLast(); appItems.append({item}); } @@ -124,6 +117,7 @@ void AppGroupManager::loadAppGroupInfo() auto groups = m_config->value("Groups").toList(); for (int i = 0; i < groups.length(); i++) { auto group = groups[i].toMap(); + auto folderId = group.value("folderId", "").toString(); auto name = group.value("name", "").toString(); auto pages = group.value("appItems", QVariantList()).toList(); QList items; @@ -135,7 +129,11 @@ void AppGroupManager::loadAppGroupInfo() m_map.insert(item, std::make_tuple(i, j)); }); } - auto p = new AppGroup(name, items); + + if (folderId.isEmpty()) { + folderId = assignGroupId(); + } + auto p = new AppGroup(folderId, name, items); appendRow(p); } } @@ -146,11 +144,29 @@ void AppGroupManager::dumpAppGroupInfo() for (int i = 0; i < rowCount(); i++) { auto data = index(i, 0); QVariantMap valueMap; - valueMap.insert("name", data.data(GroupNameRole)); + valueMap.insert("name", data.data(AppItemModel::NameRole)); + valueMap.insert("folderId", data.data(AppItemModel::DesktopIdRole)); valueMap.insert("appItems", data.data(GroupAppItemsRole)); list << valueMap; } m_config->setValue("Groups", list); } + +QString AppGroupManager::assignGroupId() const +{ + QStringList knownGroupIds; + for (int i = 0; i < rowCount(); i++) { + auto group = index(i, 0); + knownGroupIds.append(group.data(AppItemModel::DesktopIdRole).toString()); + } + + int idNumber = 0; + while (knownGroupIds.contains(QString("internal/group/%1").arg(idNumber))) { + idNumber++; + } + + return QString("internal/group/%1").arg(idNumber); +} + } diff --git a/applets/dde-apps/appgroupmanager.h b/applets/dde-apps/appgroupmanager.h index 95a0fc098..d75c82f57 100644 --- a/applets/dde-apps/appgroupmanager.h +++ b/applets/dde-apps/appgroupmanager.h @@ -13,6 +13,7 @@ #include namespace apps { +class AMAppItemModel; class AppGroup; /*! \brief AppGroupManager is a interface to manager all groups. * @@ -25,12 +26,11 @@ class AppGroupManager : public QStandardItemModel public: enum Roles { GroupIdRole = Qt::UserRole + 1, - GroupNameRole, + GroupItemsPerPageRole, GroupAppItemsRole, ExtendRole = 0x1000, }; - - static AppGroupManager* instance(); + explicit AppGroupManager(AMAppItemModel * referenceModel, QObject* parent = nullptr); QVariant data(const QModelIndex &index, int role = GroupIdRole) const override; @@ -38,11 +38,12 @@ class AppGroupManager : public QStandardItemModel void setAppGroupInfo(const QString &appId, std::tuple groupInfo); private: - AppGroupManager(QObject* parent = nullptr); void loadAppGroupInfo(); void dumpAppGroupInfo(); + QString assignGroupId() const; private: + AMAppItemModel * m_referenceModel; QHash> m_map; QTimer* m_dumpTimer; Dtk::Core::DConfig *m_config; diff --git a/applets/dde-apps/appitem.cpp b/applets/dde-apps/appitem.cpp index 1961fe668..2b6c91056 100644 --- a/applets/dde-apps/appitem.cpp +++ b/applets/dde-apps/appitem.cpp @@ -11,14 +11,10 @@ #include namespace apps { -AppItem::AppItem(const QString &appid) +AppItem::AppItem(const QString &appid, AppItemModel::AppTypes appType) { setAppId(appid); - - int groupPos, pagePos, itemPos; - std::tie(groupPos, pagePos, itemPos) = AppGroupManager::instance()->getAppGroupInfo(appId()); - QVariantList data = {groupPos, pagePos, itemPos}; - setData(data, AppItemModel::GroupRole); + setAppType(appType); auto launchedTimes = AppsLaunchTimesHelper::instance()->getLaunchedTimesFor(appId()); setData(launchedTimes, AppItemModel::LaunchedTimesRole); @@ -43,6 +39,16 @@ void AppItem::setAppId(const QString &appid) return setData(appid, AppItemModel::DesktopIdRole); } +AppItemModel::AppTypes AppItem::appType() const +{ + return data(AppItemModel::AppTypeRole).value(); +} + +void AppItem::setAppType(AppItemModel::AppTypes appType) +{ + return setData(appType, AppItemModel::AppTypeRole); +} + QString AppItem::appName() const { return data(AppItemModel::NameRole).toString(); @@ -134,23 +140,6 @@ void AppItem::setLaunchedTimes(const quint64 ×) return setData(times, AppItemModel::LaunchedTimesRole); } -QList AppItem::group() const -{ - return data(AppItemModel::GroupRole).value>(); -} - -void AppItem::setGroup(const QList &group) -{ - if (group.size() != 3) - return; - auto groupPos = group[0]; - auto pagePos = group[1]; - auto itemPos = group[2]; - AppGroupManager::instance()->setAppGroupInfo(appId(), std::make_tuple(groupPos, pagePos, itemPos)); - QVariantList data = {groupPos, pagePos, itemPos}; - return setData(data, AppItemModel::GroupRole); -} - bool AppItem::docked() const { return data(AppItemModel::DockedRole).toBool(); diff --git a/applets/dde-apps/appitem.h b/applets/dde-apps/appitem.h index fcc572c65..ac6821a70 100644 --- a/applets/dde-apps/appitem.h +++ b/applets/dde-apps/appitem.h @@ -11,7 +11,7 @@ namespace apps { class AppItem : public QStandardItem { public: - AppItem(const QString &appid); + AppItem(const QString &appid, AppItemModel::AppTypes appType); // action virtual void launch(const QString &action = {}, const QStringList &fields = {}, const QVariantMap &options = {}); @@ -20,6 +20,9 @@ class AppItem : public QStandardItem QString appId() const; void setAppId(const QString &appid); + AppItemModel::AppTypes appType() const; + void setAppType(AppItemModel::AppTypes appType); + QString appName() const; void setAppName(const QString &name); diff --git a/applets/dde-apps/appitemmodel.cpp b/applets/dde-apps/appitemmodel.cpp index 309cc5e6b..05fdd0205 100644 --- a/applets/dde-apps/appitemmodel.cpp +++ b/applets/dde-apps/appitemmodel.cpp @@ -9,7 +9,6 @@ namespace apps { AppItemModel::AppItemModel(QObject *parent) : QStandardItemModel(parent) { - AppGroupManager::instance(); } QHash AppItemModel::roleNames() const @@ -27,6 +26,6 @@ QHash AppItemModel::roleNames() const {AppItemModel::DockedRole, QByteArrayLiteral("docked")}, {AppItemModel::OnDesktopRole, QByteArrayLiteral("onDesktop")}, {AppItemModel::AutoStartRole, QByteArrayLiteral("autoStart")}, - {AppItemModel::GroupRole, QByteArrayLiteral("group")}}; + {AppItemModel::AppTypeRole, QByteArrayLiteral("appType")}}; } } diff --git a/applets/dde-apps/appitemmodel.h b/applets/dde-apps/appitemmodel.h index 6e3360c1d..badd404bc 100644 --- a/applets/dde-apps/appitemmodel.h +++ b/applets/dde-apps/appitemmodel.h @@ -25,10 +25,16 @@ class AppItemModel : public QStandardItemModel DockedRole, OnDesktopRole, AutoStartRole, - GroupRole, + AppTypeRole, }; Q_ENUM(Roles) + enum AppTypes { + AppItemType, + FolderItemType, + }; + Q_ENUM(AppTypes) + // This is different from the menu-spec Main Categories list. enum DDECategories { Internet, // 网络模式 diff --git a/applets/dde-apps/appsapplet.cpp b/applets/dde-apps/appsapplet.cpp index 42e173371..15cf9d397 100644 --- a/applets/dde-apps/appsapplet.cpp +++ b/applets/dde-apps/appsapplet.cpp @@ -14,8 +14,8 @@ namespace apps { AppsApplet::AppsApplet(QObject *parent) : DApplet(parent) - , m_groupModel(AppGroupManager::instance()) , m_appModel(new AMAppItemModel(this)) + , m_groupModel(new AppGroupManager(m_appModel, this)) { } @@ -31,7 +31,7 @@ bool AppsApplet::load() QAbstractItemModel *AppsApplet::groupModel() const { - return AppGroupManager::instance(); + return m_groupModel; } QAbstractItemModel *AppsApplet::appModel() const diff --git a/applets/dde-apps/appsapplet.h b/applets/dde-apps/appsapplet.h index 829e552f1..99a611172 100644 --- a/applets/dde-apps/appsapplet.h +++ b/applets/dde-apps/appsapplet.h @@ -12,6 +12,7 @@ DS_USE_NAMESPACE namespace apps { +class AMAppItemModel; class AppItem; class AppsApplet : public DApplet { @@ -29,7 +30,7 @@ class AppsApplet : public DApplet QAbstractItemModel *groupModel() const; private: + AMAppItemModel *m_appModel; QAbstractItemModel *m_groupModel; - QAbstractItemModel *m_appModel; }; } diff --git a/panels/notification/server/notificationsetting.cpp b/panels/notification/server/notificationsetting.cpp index 444296676..58c668e29 100644 --- a/panels/notification/server/notificationsetting.cpp +++ b/panels/notification/server/notificationsetting.cpp @@ -31,7 +31,7 @@ enum Roles { DockedRole, OnDesktopRole, AutoStartRole, - GroupRole, + AppTypeRole, }; }