diff --git a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml index 472d903..45eeddb 100644 --- a/api/dbus/org.desktopspec.ApplicationManager1.Application.xml +++ b/api/dbus/org.desktopspec.ApplicationManager1.Application.xml @@ -5,6 +5,8 @@ name="org.freedesktop.DBus.Description" value="This interface is designed to provide a dbus interface of desktop file. Missing fields will be added later." /> + + value(DesktopFileEntryKey, "Actions"); - if (!actions) { - return {}; - } - - bool ok{false}; - const auto &str = actions->toString(ok); - if (!ok) { - qWarning() << "Actions convert to String failed."; - return {}; - } - - auto actionList = str.split(";", Qt::SkipEmptyParts); + auto actionList = val.toString().split(";", Qt::SkipEmptyParts); return actionList; } +QStringList ApplicationService::categories() const noexcept +{ + auto val = findEntryValue(DesktopFileEntryKey, "Categories", EntryValueType::String); + + if (val.isNull()) { + return {}; + } + + return val.toString().split(';', Qt::SkipEmptyParts); +} + PropMap ApplicationService::actionName() const noexcept { PropMap ret; @@ -477,3 +477,47 @@ LaunchTask ApplicationService::unescapeExec(const QString &str, const QStringLis return task; } + +QVariant ApplicationService::findEntryValue(const QString &group, + const QString &valueKey, + EntryValueType type, + const QLocale &locale) const noexcept +{ + QVariant ret; + auto tmp = m_entry->value(group, valueKey); + if (!tmp.has_value()) { + return ret; + } + + auto val = std::move(tmp).value(); + bool ok{false}; + + switch (type) { + case EntryValueType::String: { + auto valStr = val.toString(ok); + if (ok) { + ret = QVariant::fromValue(valStr); + } + } break; + case EntryValueType::LocaleString: { + auto valStr = val.toLocaleString(locale, ok); + if (ok) { + ret = QVariant::fromValue(valStr); + } + } break; + case EntryValueType::Boolean: { + auto valBool = val.toBoolean(ok); + if (ok) { + ret = QVariant::fromValue(valBool); + } + } break; + case EntryValueType::IconString: { + auto valStr = val.toIconString(ok); + if (ok) { + ret = QVariant::fromValue(valStr); + } + } break; + } + + return ret; +} diff --git a/src/dbus/applicationservice.h b/src/dbus/applicationservice.h index 0b24212..3ce4a06 100644 --- a/src/dbus/applicationservice.h +++ b/src/dbus/applicationservice.h @@ -32,6 +32,9 @@ public: ApplicationService &operator=(const ApplicationService &) = delete; ApplicationService &operator=(ApplicationService &&) = delete; + Q_PROPERTY(QStringList Categories READ categories) + [[nodiscard]] QStringList categories() const noexcept; + Q_PROPERTY(QStringList Actions READ actions) [[nodiscard]] QStringList actions() const noexcept; @@ -96,6 +99,10 @@ private: QMap> m_Instances; static QString userNameLookup(uid_t uid); [[nodiscard]] LaunchTask unescapeExec(const QString &str, const QStringList &fields); + [[nodiscard]] QVariant findEntryValue(const QString &group, + const QString &valueKey, + EntryValueType type, + const QLocale &locale = getUserLocale()) const noexcept; }; #endif diff --git a/src/desktopentry.h b/src/desktopentry.h index 52b9e31..b7ca1d3 100644 --- a/src/desktopentry.h +++ b/src/desktopentry.h @@ -29,6 +29,8 @@ enum class DesktopErrorCode { enum class EntryContext { Unknown, EntryOuter, Entry, Done }; +enum class EntryValueType { String, LocaleString, Boolean, IconString }; + struct DesktopFileGuard; struct DesktopFile