Skip to content
Open
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
3 changes: 1 addition & 2 deletions applets/dde-apps/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
# SPDX-FileCopyrightText: 2024 - 2026 UnionTech Software Technology Co., Ltd.
#
# SPDX-License-Identifier: GPL-3.0-or-later

Expand Down Expand Up @@ -59,7 +59,6 @@ add_library(dde-apps SHARED ${DBUS_INTERFACES}

target_link_libraries(dde-apps PRIVATE
dde-shell-frame
Qt${QT_VERSION_MAJOR}::Concurrent
yaml-cpp
)

Expand Down
122 changes: 88 additions & 34 deletions applets/dde-apps/amappitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace apps
{
// AM static string
static const QString AM_DBUS_SERVICE = "org.desktopspec.ApplicationManager1";
static const QString AM_APPLICATION_INTERFACE = "org.desktopspec.ApplicationManager1.Application";
static const QString DBUS_PROPERTIES_INTERFACE = "org.freedesktop.DBus.Properties";
static const QString DESKTOP_ENTRY_ICON_KEY = "Desktop Entry";
static const QString DEFAULT_KEY = "default";
static QString locale = QLocale::system().name();
Expand All @@ -22,6 +24,13 @@ AMAppItem::AMAppItem(const QDBusObjectPath &path, QObject *parent)
: Application(AM_DBUS_SERVICE, path.path(), QDBusConnection::sessionBus(), parent)
, AppItem(DUtil::unescapeFromObjectPath(path.path().split('/').last()), AppItemModel::AppItemType)
{
QDBusConnection::sessionBus().connect(AM_DBUS_SERVICE,
path.path(),
DBUS_PROPERTIES_INTERFACE,
QStringLiteral("PropertiesChanged"),
QStringLiteral("sa{sv}as"),
this,
SLOT(onPropertyChanged(const QDBusMessage &)));
}

AMAppItem::AMAppItem(const QDBusObjectPath &path, const ObjectInterfaceMap &source, QObject *parent)
Expand All @@ -34,6 +43,8 @@ AMAppItem::AMAppItem(const QDBusObjectPath &path, const ObjectInterfaceMap &sour
auto name = getLocaleOrDefaultValue(qdbus_cast<QStringMap>(appInfo.value(u8"Name")), locale, DEFAULT_KEY);
auto genericName = getLocaleOrDefaultValue(qdbus_cast<QStringMap>(appInfo.value(u8"GenericName")), locale, DEFAULT_KEY);
auto xDeepinVendor = appInfo.value(u8"X_Deepin_Vendor").toString();
AppItem::setGenericName(genericName);
AppItem::setVendor(xDeepinVendor);

if (QStringLiteral("deepin") == xDeepinVendor && !genericName.isEmpty()) {
AppItem::setAppName(genericName);
Expand Down Expand Up @@ -63,7 +74,7 @@ AMAppItem::AMAppItem(const QDBusObjectPath &path, const ObjectInterfaceMap &sour
auto autoStart = appInfo.value(u8"AutoStart").toBool();
AppItem::setAutoStart(autoStart);

auto isOnDesktop = appInfo.value(u8"OnDesktop").toBool();
auto isOnDesktop = appInfo.value(u8"isOnDesktop").toBool();
AppItem::setOnDesktop(isOnDesktop);

PropMap actionName;
Expand Down Expand Up @@ -127,42 +138,87 @@ QString AMAppItem::getLocaleOrDefaultValue(const QStringMap &value, const QStrin

void AMAppItem::onPropertyChanged(const QDBusMessage &msg)
{
QList<QVariant> arguments = msg.arguments();
if (3 != arguments.count())
const QList<QVariant> arguments = msg.arguments();
if (arguments.count() != 3)
return;

QString interfaceName = msg.arguments().at(0).toString();
if (interfaceName != QStringLiteral("org.desktopspec.ApplicationManager1.Application"))
if (arguments.at(0).toString() != AM_APPLICATION_INTERFACE)
return;

// AM send changed signal together
auto name = getLocaleOrDefaultValue(Application::name(), locale, DEFAULT_KEY);
auto genericName = getLocaleOrDefaultValue(Application::genericName(), locale, DEFAULT_KEY);
auto xDeepinVendor = Application::x_Deepin_Vendor();
if (QStringLiteral("deepin") == xDeepinVendor && !genericName.isEmpty()) {
AppItem::setAppName(genericName);
} else {
AppItem::setAppName(name);
QVariantMap changedProperties = qdbus_cast<QVariantMap>(arguments.at(1));

const auto value = [&changedProperties](QLatin1StringView name) {
return changedProperties.value(name);
};
const auto contains = [&changedProperties](QLatin1StringView name) {
return changedProperties.contains(name);
};

if (contains(QLatin1String("Name")) || contains(QLatin1String("GenericName"))
|| contains(QLatin1String("X_Deepin_Vendor"))) {
const QString name = getLocaleOrDefaultValue(
contains(QLatin1String("Name"))
? qdbus_cast<QStringMap>(value(QLatin1String("Name")))
: Application::name(),
locale,
DEFAULT_KEY);
const QString genericName = getLocaleOrDefaultValue(
contains(QLatin1String("GenericName"))
? qdbus_cast<QStringMap>(value(QLatin1String("GenericName")))
: Application::genericName(),
locale,
DEFAULT_KEY);
const QString vendor = contains(QLatin1String("X_Deepin_Vendor"))
? value(QLatin1String("X_Deepin_Vendor")).toString()
: Application::x_Deepin_Vendor();
AppItem::setGenericName(genericName);
AppItem::setVendor(vendor);
AppItem::setAppName(vendor == QLatin1String("deepin") && !genericName.isEmpty() ? genericName : name);
}

auto iconName = Application::icons().value(DESKTOP_ENTRY_ICON_KEY);
AppItem::setAppIconName(iconName);

AppItem::setNoDisPlay(Application::noDisplay());
AppItem::setDDECategories(AppItemModel::DDECategories(CategoryUtils::parseBestMatchedCategory(Application::categories())));
AppItem::setLastLaunchedTime(Application::lastLaunchedTime());
AppItem::setInstalledTime(Application::installedTime());
AppItem::setStartupWMclass(Application::startupWMClass());
AppItem::setAutoStart(Application::autoStart());
AppItem::setOnDesktop(Application::isOnDesktop());
AppItem::setXLingLong(Application::x_linglong());
AppItem::setId(Application::iD());
AppItem::setXCreatedBy(Application::x_CreatedBy());
AppItem::setExecs(Application::execs());

auto actions = Application::actions();
auto actionName = Application::actionName();
updateActions(actions, actionName);
if (contains(QLatin1String("Icons"))) {
const auto icons = qdbus_cast<QStringMap>(value(QLatin1String("Icons")));
AppItem::setAppIconName(icons.value(DESKTOP_ENTRY_ICON_KEY));
}
if (contains(QLatin1String("NoDisplay")))
AppItem::setNoDisPlay(value(QLatin1String("NoDisplay")).toBool());
if (contains(QLatin1String("Categories"))) {
const auto categories = value(QLatin1String("Categories")).toStringList();
AppItem::setDDECategories(AppItemModel::DDECategories(CategoryUtils::parseBestMatchedCategory(categories)));
AppItem::setCategories(categories);
}
if (contains(QLatin1String("LastLaunchedTime")))
AppItem::setLastLaunchedTime(value(QLatin1String("LastLaunchedTime")).toULongLong());
if (contains(QLatin1String("LaunchedTimes")))
AppItem::setData(value(QLatin1String("LaunchedTimes")).toULongLong(), AppItemModel::LaunchedTimesRole);
if (contains(QLatin1String("InstalledTime")))
AppItem::setInstalledTime(value(QLatin1String("InstalledTime")).toULongLong());
if (contains(QLatin1String("StartupWMClass")))
AppItem::setStartupWMclass(value(QLatin1String("StartupWMClass")).toString());
if (contains(QLatin1String("AutoStart")))
AppItem::setAutoStart(value(QLatin1String("AutoStart")).toBool());
if (contains(QLatin1String("isOnDesktop")))
AppItem::setOnDesktop(value(QLatin1String("isOnDesktop")).toBool());
if (contains(QLatin1String("X_linglong")))
AppItem::setXLingLong(value(QLatin1String("X_linglong")).toBool());
if (contains(QLatin1String("ID")))
AppItem::setId(value(QLatin1String("ID")).toString());
if (contains(QLatin1String("X_CreatedBy")))
AppItem::setXCreatedBy(value(QLatin1String("X_CreatedBy")).toString());
if (contains(QLatin1String("Execs")))
AppItem::setExecs(qdbus_cast<QStringMap>(value(QLatin1String("Execs"))));
if (contains(QLatin1String("DesktopSourcePath")))
AppItem::setDesktopSourcePath(value(QLatin1String("DesktopSourcePath")).toString());

if (contains(QLatin1String("Actions")) || contains(QLatin1String("ActionName"))) {
const QStringList actions = contains(QLatin1String("Actions"))
? value(QLatin1String("Actions")).toStringList()
: Application::actions();
const PropMap actionNames = contains(QLatin1String("ActionName"))
? qdbus_cast<PropMap>(value(QLatin1String("ActionName")))
: Application::actionName();
updateActions(actions, actionNames);
}
}

void AMAppItem::updateActions(const QStringList &actions, const PropMap &actionName)
Expand All @@ -175,8 +231,6 @@ void AMAppItem::updateActions(const QStringList &actions, const PropMap &actionN
actionObject.insert(QStringLiteral("name"), getLocaleOrDefaultValue(localeNames, locale, DEFAULT_KEY));
actionsArray.append(actionObject);
}
if (actions.size() > 0) {
AppItem::setActions(QJsonDocument(actionsArray).toJson());
}
AppItem::setActions(actions.isEmpty() ? QString() : QJsonDocument(actionsArray).toJson());
}
}
32 changes: 17 additions & 15 deletions applets/dde-apps/amappitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
#include "amappitemmodel.h"
#include "amappitem.h"
#include "appitemmodel.h"
#include "objectmanager1interface.h"

Check warning on line 8 in applets/dde-apps/amappitemmodel.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "objectmanager1interface.h" not found.

#include <DUtil>

Check warning on line 10 in applets/dde-apps/amappitemmodel.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

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

Q_LOGGING_CATEGORY(appsLog, "org.deepin.dde.shell.dde-apps.amappitemmodel")

Expand Down Expand Up @@ -50,25 +48,29 @@
removeRow(res.first().row());
});

// load static desktop info from am asynchronously
auto reply = m_manager->GetManagedObjects();
auto *watcher = new QDBusPendingCallWatcher(reply, this);
auto watcher = new QDBusPendingCallWatcher(m_manager->GetManagedObjects(), this);
connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, watcher]() {
watcher->deleteLater();
QDBusPendingReply<ObjectMap> reply = *watcher;
watcher->deleteLater();
if (reply.isError()) {
qCWarning(appsLog()) << "Failed to get managed objects:" << reply.error().message();
qCWarning(appsLog) << "Failed to load applications from ApplicationManager:" << reply.error();
return;
}
auto apps = reply.value();
for (auto app = apps.cbegin(); app != apps.cend(); app++) {
auto path = app.key();
if (!path.path().isEmpty()) {
auto c = new AMAppItem(path, app.value());
appendRow(c);
}

const auto apps = reply.value();
for (auto app = apps.cbegin(); app != apps.cend(); ++app) {
const auto path = app.key();
if (path.path().isEmpty())
continue;

const auto desktopId = DUtil::unescapeFromObjectPath(path.path().split('/').last());
if (!match(index(0, 0), AppItemModel::DesktopIdRole, desktopId, 1, Qt::MatchExactly).isEmpty())
continue;
appendRow(new AMAppItem(path, app.value()));
}
setProperty("ready", true);

m_ready = true;
Q_EMIT readyChanged(true);
qCDebug(appsLog) << "AMAppItemModel is now ready with apps counts:" << rowCount();
});
}
Expand Down
22 changes: 21 additions & 1 deletion applets/dde-apps/appitem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,4 +230,24 @@
{
setData(desktopSourcePath, AppItemModel::DesktopSourcePathRole);
}
}

QString AppItem::vendor() const

Check warning on line 234 in applets/dde-apps/appitem.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'vendor' is never used.
{
return data(AppItemModel::VendorRole).toString();
}

void AppItem::setVendor(const QString &vendor)

Check warning on line 239 in applets/dde-apps/appitem.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'setVendor' is never used.
{
setData(vendor, AppItemModel::VendorRole);
}

QString AppItem::genericName() const

Check warning on line 244 in applets/dde-apps/appitem.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'genericName' is never used.
{
return data(AppItemModel::GenericNameRole).toString();
}

void AppItem::setGenericName(const QString &genericName)

Check warning on line 249 in applets/dde-apps/appitem.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

The function 'setGenericName' is never used.
{
setData(genericName, AppItemModel::GenericNameRole);
}
}
6 changes: 6 additions & 0 deletions applets/dde-apps/appitem.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,11 @@ class AppItem : public QStandardItem

QString desktopSourcePath() const;
void setDesktopSourcePath(const QString &desktopSourcePath);

QString vendor() const;
void setVendor(const QString &vendor);

QString genericName() const;
void setGenericName(const QString &genericName);
};
}
4 changes: 3 additions & 1 deletion applets/dde-apps/appitemmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ QHash<int, QByteArray> AppItemModel::roleNames() const
{AppItemModel::IdRole, QByteArrayLiteral("id")},
{AppItemModel::XCreatedByRole, QByteArrayLiteral("xCreatedBy")},
{AppItemModel::ExecsRole, QByteArrayLiteral("execs")},
{AppItemModel::DesktopSourcePathRole, QByteArrayLiteral("desktopSourcePath")}};
{AppItemModel::DesktopSourcePathRole, QByteArrayLiteral("desktopSourcePath")},
{AppItemModel::VendorRole, QByteArrayLiteral("vendor")},
{AppItemModel::GenericNameRole, QByteArrayLiteral("genericName")}};
}
}
4 changes: 4 additions & 0 deletions applets/dde-apps/appitemmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
namespace apps {
class AppItemModel : public QStandardItemModel
{
Q_OBJECT

public:
enum Roles {
DesktopIdRole = AppGroupManager::ExtendRole,
Expand All @@ -32,6 +34,8 @@ class AppItemModel : public QStandardItemModel
ExecsRole,
CategoriesRole,
DesktopSourcePathRole,
VendorRole,
GenericNameRole,
};
Q_ENUM(Roles)

Expand Down
25 changes: 12 additions & 13 deletions applets/dde-apps/appsapplet.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2024 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#include "appsapplet.h"
#include "amappitemmodel.h"
#include "appgroupmanager.h"
#include "appitemmodel.h"
#include "pluginfactory.h"

Check warning on line 9 in applets/dde-apps/appsapplet.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "pluginfactory.h" not found.

#include <DUtil>
#include <QtConcurrent>
#include <QMetaEnum>

Check warning on line 11 in applets/dde-apps/appsapplet.cpp

View workflow job for this annotation

GitHub Actions / cppcheck

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

namespace apps
{
Expand All @@ -20,16 +20,6 @@
connect(m_appModel, &AMAppItemModel::readyChanged, this, &AppsApplet::appModelReadyChanged);
}

AppsApplet::~AppsApplet()
{

}

bool AppsApplet::load()
{
return true;
}

QAbstractItemModel *AppsApplet::groupModel() const
{
return m_groupModel;
Expand All @@ -45,6 +35,15 @@
return m_appModel->ready();
}

QVariantMap AppsApplet::ddeCategories() const
{
QVariantMap categories;
const QMetaEnum metaEnum = QMetaEnum::fromType<AppItemModel::DDECategories>();
for (int i = 0; i < metaEnum.keyCount(); ++i)
categories.insert(QString::fromLatin1(metaEnum.key(i)), metaEnum.value(i));
return categories;
}

D_APPLET_CLASS(AppsApplet)
}

Expand Down
12 changes: 5 additions & 7 deletions applets/dde-apps/appsapplet.h
Original file line number Diff line number Diff line change
@@ -1,42 +1,40 @@
// SPDX-FileCopyrightText: 2024 UnionTech Software Technology Co., Ltd.
// SPDX-FileCopyrightText: 2024 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later

#pragma once

#include "applet.h"

Check warning on line 7 in applets/dde-apps/appsapplet.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "applet.h" not found.
#include "dsglobal.h"

Check warning on line 8 in applets/dde-apps/appsapplet.h

View workflow job for this annotation

GitHub Actions / cppcheck

Include file: "dsglobal.h" not found.

#include <QAbstractListModel>
#include <QAbstractItemModel>
#include <QVariantMap>

DS_USE_NAMESPACE

namespace apps {
class AMAppItemModel;
class AppItem;
class AppsApplet : public DApplet
{
Q_OBJECT
Q_PROPERTY(QAbstractItemModel *appModel READ appModel CONSTANT FINAL)
Q_PROPERTY(bool appModelReady READ appModelReady NOTIFY appModelReadyChanged FINAL)
Q_PROPERTY(QAbstractItemModel *appGroupModel READ groupModel CONSTANT FINAL)
Q_PROPERTY(QVariantMap ddeCategories READ ddeCategories CONSTANT FINAL)

public:
explicit AppsApplet(QObject *parent = nullptr);
~AppsApplet();

bool load() override;

QAbstractItemModel *appModel() const;
QAbstractItemModel *groupModel() const;

bool appModelReady() const;
QVariantMap ddeCategories() const;

signals:
void appModelReadyChanged(bool ready);

private:
bool m_appModelReady;
AMAppItemModel *m_appModel;
QAbstractItemModel *m_groupModel;
};
Expand Down
Loading