diff --git a/src/appchooserdelegate.cpp b/src/appchooserdelegate.cpp index 4235817..c824039 100644 --- a/src/appchooserdelegate.cpp +++ b/src/appchooserdelegate.cpp @@ -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); -} +} \ No newline at end of file diff --git a/src/appchoosermodel.cpp b/src/appchoosermodel.cpp index 9352713..1b7f330 100644 --- a/src/appchoosermodel.cpp +++ b/src/appchoosermodel.cpp @@ -12,6 +12,9 @@ AppChooserModel::AppChooserModel(QObject *parent) :QAbstractListModel(parent) { + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); + qDBusRegisterMetaType(); QMetaObject::invokeMethod(this, &AppChooserModel::loadApplications, Qt::QueuedConnection); } @@ -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; } @@ -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; } @@ -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 reply = *call; + QDBusPendingReply 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(); + 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(); + 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(); @@ -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: @@ -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 argMap; + argument.beginMapEntry(); + argument >> arg >> argMap; + argument.endMapEntry(); + dict.insert(arg, argMap); + } + argument.endMap(); + return argument; +} + diff --git a/src/appchoosermodel.h b/src/appchoosermodel.h index 6353df4..de6bdb5 100644 --- a/src/appchoosermodel.h +++ b/src/appchoosermodel.h @@ -5,13 +5,26 @@ #ifndef APPCHOOSERMODEL_H #define APPCHOOSERMODEL_H #include +#include +#include +#include +#include +#include + +using ObjectInterfaceMap = QMap; +using ObjectMap = QMap; +using PropMap = QMap>; + +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; @@ -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();