Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: modify AppChooser module #36

Merged
merged 1 commit into from
Sep 4, 2023
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 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
Loading