Skip to content

Commit

Permalink
feat: modify AppChooser module
Browse files Browse the repository at this point in the history
modify AppChooser module to get data from refacted dde-application-manager

Log: modify interface invoke
  • Loading branch information
l631197874 committed Sep 4, 2023
1 parent 637f7cb commit 7b2e62d
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 21 deletions.
2 changes: 1 addition & 1 deletion src/appchooserdelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ void AppChooserDelegate::paint(QPainter *painter, const QStyleOptionViewItem &op
QSize AppChooserDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
return QSize(240, 40);
}
}
62 changes: 44 additions & 18 deletions src/appchoosermodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
AppChooserModel::AppChooserModel(QObject *parent)
:QAbstractListModel(parent)
{
qDBusRegisterMetaType<ObjectInterfaceMap>();
qDBusRegisterMetaType<ObjectMap>();
qDBusRegisterMetaType<PropMap>();
QMetaObject::invokeMethod(this, &AppChooserModel::loadApplications, Qt::QueuedConnection);
}

Expand All @@ -24,10 +27,10 @@ void AppChooserModel::click(const QModelIndex &index)
}
}

void AppChooserModel::click(const QString &desktop)
void AppChooserModel::click(const QString &appId)
{
for (auto data : m_datas) {
if (data.desktop == desktop) {
if (data.appId == appId) {
data.selected = true;
break;
}
Expand All @@ -39,7 +42,7 @@ QStringList AppChooserModel::choices()
QStringList list;
for (auto data : m_datas) {
if (data.selected)
list.append(data.desktop);
list.append(data.appId);
}
return list;
}
Expand All @@ -49,28 +52,36 @@ void AppChooserModel::loadApplications()
ItemInfo::registerMetaType();

#ifdef QT_DEBUG
QDBusPendingCall call = QDBusInterface("com.deepin.dde.daemon.Launcher", "/com/deepin/dde/daemon/Launcher", "com.deepin.dde.daemon.Launcher", QDBusConnection::sessionBus()).asyncCall(QString("GetAllItemInfos"));
QDBusPendingCall call = QDBusInterface("org.desktopspec.ApplicationManager1", "/org/desktopspec/ApplicationManager1", "org.desktopspec.DBus.ObjectManager", QDBusConnection::sessionBus()).asyncCall(QString("GetManagedObjects"));
#else
QDBusPendingCall call = QDBusInterface("org.deepin.dde.daemon.Launcher1", "/org/deepin/dde/daemon/Launcher1", "org.deepin.dde.daemon.Launcher1", QDBusConnection::sessionBus()).asyncCall(QString("GetAllItemInfos"));
QDBusPendingCall call = QDBusInterface("org.desktopspec.ApplicationManager1", "/org/desktopspec/ApplicationManager1", "org.desktopspec.DBus.ObjectManager", QDBusConnection::sessionBus()).asyncCall(QString("GetManagedObjects"));
#endif
QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this);
QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [this](QDBusPendingCallWatcher* call){
QDBusPendingReply<ItemInfoList> reply = *call;
QDBusPendingReply<ObjectMap> reply = *call;
if (!reply.isError()) {
m_datas.clear();
const auto itemList = reply.value();
for (auto item : itemList) {
QSettings settings(item.m_desktop, QSettings::IniFormat);
settings.beginGroup("Desktop Entry");
if (!settings.contains("MimeType"))
continue;

const ObjectMap objectMap = reply.value();
const auto language = getenv("LANGUAGE");
for (auto obj = objectMap.begin(); obj != objectMap.end(); obj++)
{
const ObjectInterfaceMap interfaceMap = obj.value();
const auto infoMap = interfaceMap.begin().value();
DesktopInfo info;
info.desktop = item.m_desktop;
info.name = item.m_name;
info.icon = item.m_iconKey;
info.appId = infoMap["ID"].toString();
const auto nameMap = infoMap["DisplayName"].value<QDBusArgument>();
PropMap propName;
nameMap >> propName;
if (propName["Name"].contains(language)) {
info.name = propName["Name"][language];
} else {
info.name = propName["Name"]["default"];
}
const auto iconMap = infoMap["IconName"].value<QDBusArgument>();
PropMap propIcon;
iconMap >> propIcon;
info.icon = propIcon["default"]["default"];
info.selected = false;

beginInsertRows(QModelIndex(), m_datas.size(), m_datas.size());
m_datas.append(info);
endInsertRows();
Expand All @@ -90,7 +101,7 @@ QVariant AppChooserModel::data(const QModelIndex &index, int role) const
const DesktopInfo &info = m_datas.at(index.row());
switch (role) {
case AppChooserModel::DataRole:
return info.desktop;
return info.appId;
case AppChooserModel::IconRole:
return info.icon;
case AppChooserModel::NameRole:
Expand All @@ -101,3 +112,18 @@ QVariant AppChooserModel::data(const QModelIndex &index, int role) const
return QVariant();
}
}

const QDBusArgument &operator>>(const QDBusArgument &argument, PropMap &dict) {
argument.beginMap();
while (!argument.atEnd()) {
QString arg;
QMap<QString, QString> argMap;
argument.beginMapEntry();
argument >> arg >> argMap;
argument.endMapEntry();
dict.insert(arg, argMap);
}
argument.endMap();
return argument;
}

17 changes: 15 additions & 2 deletions src/appchoosermodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,26 @@
#ifndef APPCHOOSERMODEL_H
#define APPCHOOSERMODEL_H
#include <QAbstractListModel>
#include <QString>
#include <QMap>
#include <QMetaType>
#include <QDBusMetaType>
#include <QDBusObjectPath>

using ObjectInterfaceMap = QMap<QString, QVariantMap>;
using ObjectMap = QMap<QDBusObjectPath, ObjectInterfaceMap>;
using PropMap = QMap<QString, QMap<QString, QString>>;

Q_DECLARE_METATYPE(ObjectMap)
Q_DECLARE_METATYPE(ObjectInterfaceMap)
Q_DECLARE_METATYPE(PropMap)

class AppChooserModel : public QAbstractListModel
{
Q_OBJECT
public:
struct DesktopInfo {
QString desktop;
QString appId;
QString name;
QString icon;
bool selected;
Expand All @@ -26,7 +39,7 @@ class AppChooserModel : public QAbstractListModel
explicit AppChooserModel(QObject *parent = nullptr);

void click(const QModelIndex &index);
void click(const QString &desktop);
void click(const QString &appId);

QStringList choices();

Expand Down

0 comments on commit 7b2e62d

Please sign in to comment.