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
2 changes: 1 addition & 1 deletion applets/dde-apps/amappitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
}
Expand Down
3 changes: 0 additions & 3 deletions applets/dde-apps/amappitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
28 changes: 15 additions & 13 deletions applets/dde-apps/appgroup.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,26 @@

#include "appgroup.h"
#include "appgroupmanager.h"
#include "appitemmodel.h"

#include <QLoggingCategory>
#include <algorithm>

Q_LOGGING_CATEGORY(appGroupLog, "org.deepin.ds.dde-apps.appgroup")

namespace apps {
AppGroup::AppGroup(const QString &name, const QList<QStringList> &appIDs)
: QStandardItem()
AppGroup::AppGroup(const QString &groupId, const QString &name, const QList<QStringList> &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<QStringList> AppGroup::appItems() const
{
QList<QStringList> res;
Expand All @@ -51,5 +47,11 @@ void AppGroup::setAppItems(const QList<QStringList> &items)
});
return setData(data, AppGroupManager::GroupAppItemsRole);
}

void AppGroup::setItemsPerPage(int number)
{
return setData(number, AppGroupManager::GroupItemsPerPageRole);
}

}

8 changes: 5 additions & 3 deletions applets/dde-apps/appgroup.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,20 @@

#pragma once

#include <QStandardItem>
#include "appitem.h"

namespace apps {
class AppGroup : public QStandardItem
class AppGroup : public AppItem
{
public:
explicit AppGroup(const QString &name, const QList<QStringList> &appItemIDs);
explicit AppGroup(const QString &groupId, const QString &name, const QList<QStringList> &appItemIDs);

QString name() const;
void setName(const QString &name);

QList<QStringList> appItems() const;
void setAppItems(const QList<QStringList> &items);

void setItemsPerPage(int number);
};
}
52 changes: 34 additions & 18 deletions applets/dde-apps/appgroupmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,35 +4,27 @@

#include "appgroupmanager.h"
#include "appgroup.h"
#include "amappitemmodel.h"

#include <QtConcurrent>

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
Expand Down Expand Up @@ -84,21 +76,22 @@ void AppGroupManager::setAppGroupInfo(const QString &appId, std::tuple<int, int,
}

auto appItems = groupIndex.data(GroupAppItemsRole).value<QList<QStringList>>();
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);
m_map.insert(item, std::make_tuple(groupPos, i + 1));
}
}

if (appItems.length() > 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});
}
Expand All @@ -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<QStringList> items;
Expand All @@ -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);
}
}
Expand All @@ -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);
}

}
9 changes: 5 additions & 4 deletions applets/dde-apps/appgroupmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <tuple>

namespace apps {
class AMAppItemModel;
class AppGroup;
/*! \brief AppGroupManager is a interface to manager all groups.
*
Expand All @@ -25,24 +26,24 @@ 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;

std::tuple<int, int, int> getAppGroupInfo(const QString &appId);
void setAppGroupInfo(const QString &appId, std::tuple<int, int, int> groupInfo);

private:
AppGroupManager(QObject* parent = nullptr);
void loadAppGroupInfo();
void dumpAppGroupInfo();
QString assignGroupId() const;

private:
AMAppItemModel * m_referenceModel;
QHash<QString, std::tuple<int, int>> m_map;
QTimer* m_dumpTimer;
Dtk::Core::DConfig *m_config;
Expand Down
35 changes: 12 additions & 23 deletions applets/dde-apps/appitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,10 @@
#include <tuple>

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);
Expand All @@ -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<AppItemModel::AppTypes>();
}

void AppItem::setAppType(AppItemModel::AppTypes appType)
{
return setData(appType, AppItemModel::AppTypeRole);
}

QString AppItem::appName() const
{
return data(AppItemModel::NameRole).toString();
Expand Down Expand Up @@ -134,23 +140,6 @@ void AppItem::setLaunchedTimes(const quint64 &times)
return setData(times, AppItemModel::LaunchedTimesRole);
}

QList<int> AppItem::group() const
{
return data(AppItemModel::GroupRole).value<QList<int>>();
}

void AppItem::setGroup(const QList<int> &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();
Expand Down
5 changes: 4 additions & 1 deletion applets/dde-apps/appitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {});
Expand All @@ -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);

Expand Down
3 changes: 1 addition & 2 deletions applets/dde-apps/appitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace apps {
AppItemModel::AppItemModel(QObject *parent)
: QStandardItemModel(parent)
{
AppGroupManager::instance();
}

QHash<int, QByteArray> AppItemModel::roleNames() const
Expand All @@ -27,6 +26,6 @@ QHash<int, QByteArray> AppItemModel::roleNames() const
{AppItemModel::DockedRole, QByteArrayLiteral("docked")},
{AppItemModel::OnDesktopRole, QByteArrayLiteral("onDesktop")},
{AppItemModel::AutoStartRole, QByteArrayLiteral("autoStart")},
{AppItemModel::GroupRole, QByteArrayLiteral("group")}};
{AppItemModel::AppTypeRole, QByteArrayLiteral("appType")}};
}
}
8 changes: 7 additions & 1 deletion applets/dde-apps/appitemmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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, // 网络模式
Expand Down
4 changes: 2 additions & 2 deletions applets/dde-apps/appsapplet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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))
{
}

Expand All @@ -31,7 +31,7 @@ bool AppsApplet::load()

QAbstractItemModel *AppsApplet::groupModel() const
{
return AppGroupManager::instance();
return m_groupModel;
}

QAbstractItemModel *AppsApplet::appModel() const
Expand Down
3 changes: 2 additions & 1 deletion applets/dde-apps/appsapplet.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
DS_USE_NAMESPACE

namespace apps {
class AMAppItemModel;
class AppItem;
class AppsApplet : public DApplet
{
Expand All @@ -29,7 +30,7 @@ class AppsApplet : public DApplet
QAbstractItemModel *groupModel() const;

private:
AMAppItemModel *m_appModel;
QAbstractItemModel *m_groupModel;
QAbstractItemModel *m_appModel;
};
}
Loading