From a84980d2cde1f62e574446729d48dd0b29804933 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Thu, 28 Sep 2017 15:14:58 +0200 Subject: democompositor: Add a mandatory "Id" to the app specification Add a manodatory appId, expose it to QML, add a simple find by id method and update the testcases. Change-Id: I4f80a97e5f31e972694dd61eff0166f9de2f5d51 Reviewed-by: Paul Olav Tvete --- wayland/democompositor/apps/README | 1 + wayland/democompositor/apps/appentry.cpp | 2 +- wayland/democompositor/apps/appentry.h | 2 ++ wayland/democompositor/apps/applistmodel.cpp | 13 +++++++++++++ wayland/democompositor/apps/applistmodel.h | 3 +++ wayland/democompositor/apps/appparser.cpp | 3 ++- wayland/democompositor/resources/apps/clock.app | 1 + wayland/democompositor/resources/apps/maps.app | 1 + wayland/democompositor/resources/apps/rss.app | 1 + wayland/democompositor/resources/apps/stocqt.app | 1 + wayland/democompositor/tests/apps/tst_appparser.cpp | 9 +++++---- 11 files changed, 31 insertions(+), 6 deletions(-) (limited to 'wayland') diff --git a/wayland/democompositor/apps/README b/wayland/democompositor/apps/README index b804917..2f6fd77 100644 --- a/wayland/democompositor/apps/README +++ b/wayland/democompositor/apps/README @@ -16,6 +16,7 @@ Version The version of the specification addressed. Currently version 1 Yes Number Icon The icon to use for display Yes String Name A user displayable name Yes String +Id Reverse-DNS as unique application Id Yes String Exec Application to execute to launch Yes String Path The directory to search for the app No String X-* Extensions to the specification No Any diff --git a/wayland/democompositor/apps/appentry.cpp b/wayland/democompositor/apps/appentry.cpp index cdb9ba8..ce94cad 100644 --- a/wayland/democompositor/apps/appentry.cpp +++ b/wayland/democompositor/apps/appentry.cpp @@ -53,5 +53,5 @@ AppEntry AppEntry::empty() { QString empty; - return AppEntry{empty, empty, empty, empty, empty, QVariantMap()}; + return AppEntry{empty, empty, empty, empty, empty, empty, QVariantMap()}; } diff --git a/wayland/democompositor/apps/appentry.h b/wayland/democompositor/apps/appentry.h index 4514331..4cdd581 100644 --- a/wayland/democompositor/apps/appentry.h +++ b/wayland/democompositor/apps/appentry.h @@ -62,6 +62,7 @@ class AppEntry { Q_GADGET Q_PROPERTY(QString iconName MEMBER iconName CONSTANT) Q_PROPERTY(QString appName MEMBER appName CONSTANT) + Q_PROPERTY(QString appId MEMBER appId CONSTANT) Q_PROPERTY(QString executableName MEMBER executableName CONSTANT) Q_PROPERTY(QString executablePath MEMBER executablePath CONSTANT) Q_PROPERTY(QVariantMap extensions MEMBER extensions CONSTANT) @@ -69,6 +70,7 @@ public: QString iconName; QString appName; + QString appId; QString executableName; QString executablePath; QString sourceFileName; diff --git a/wayland/democompositor/apps/applistmodel.cpp b/wayland/democompositor/apps/applistmodel.cpp index b0774f7..dfcc378 100644 --- a/wayland/democompositor/apps/applistmodel.cpp +++ b/wayland/democompositor/apps/applistmodel.cpp @@ -61,6 +61,7 @@ static QHash modelRoles() roles[AppListModel::App] = "appEntry"; roles[AppListModel::IconName] = "iconName"; roles[AppListModel::ApplicationName] = "applicationName"; + roles[AppListModel::ApplicationId] = "applicationId"; roles[AppListModel::ExeuctableName] = "executableName"; roles[AppListModel::ExecutablePath] = "executablePath"; roles[AppListModel::SourceFileName] = "sourceFileName"; @@ -90,6 +91,8 @@ QVariant AppListModel::data(const QModelIndex& index, int role) const return entry.iconName; case ApplicationName: return entry.appName; + case ApplicationId: + return entry.appId; case ExeuctableName: return entry.executableName; case ExecutablePath: @@ -206,3 +209,13 @@ QVector AppListModel::removeEntries(const QVector& fileNames) return removedEntries; } + +QVariant AppListModel::findApplicationId(const QString& appId) const +{ + for (const auto& entry : m_rows) { + if (entry.appId == appId) + return QVariant::fromValue(entry); + } + + return QVariant(); +} diff --git a/wayland/democompositor/apps/applistmodel.h b/wayland/democompositor/apps/applistmodel.h index 4662e8f..f2e61cc 100644 --- a/wayland/democompositor/apps/applistmodel.h +++ b/wayland/democompositor/apps/applistmodel.h @@ -67,6 +67,7 @@ public: App = Qt::UserRole, IconName, ApplicationName, + ApplicationId, ExeuctableName, ExecutablePath, SourceFileName, @@ -76,6 +77,8 @@ public: QVariant data(const QModelIndex& index, int role) const Q_DECL_OVERRIDE; QHash roleNames() const Q_DECL_OVERRIDE; + Q_INVOKABLE QVariant findApplicationId(const QString& appId) const; + Q_SIGNALS: void appRemoved(const AppEntry& appEntry); diff --git a/wayland/democompositor/apps/appparser.cpp b/wayland/democompositor/apps/appparser.cpp index 38cc0b2..528cb8f 100644 --- a/wayland/democompositor/apps/appparser.cpp +++ b/wayland/democompositor/apps/appparser.cpp @@ -139,13 +139,14 @@ AppEntry AppParser::parseData(const QByteArray& content, const QString& fileName QString iconName = readString(root, QStringLiteral("Icon"), ok); QString appName = readString(root, QStringLiteral("Name"), ok); + QString appId = readString(root, QStringLiteral("Id"), ok); QString executableName = readString(root, QStringLiteral("Exec"), ok); QString executablePath = readStringOptional(root, QStringLiteral("Path"), ok); QVariantMap extensions = readExtensions(root, QStringLiteral("X-")); if (!*ok) return AppEntry::empty(); - return AppEntry{iconName, appName, executableName, executablePath, fileName, extensions}; + return AppEntry{iconName, appName, appId, executableName, executablePath, fileName, extensions}; } AppEntry AppParser::parseFile(const QString& fileName, bool *ok) diff --git a/wayland/democompositor/resources/apps/clock.app b/wayland/democompositor/resources/apps/clock.app index f28d9b7..6ddf0d2 100644 --- a/wayland/democompositor/resources/apps/clock.app +++ b/wayland/democompositor/resources/apps/clock.app @@ -3,6 +3,7 @@ "Version": 1, "Icon": "qrc:/images/Icon_Clocks.png", "Name": "Clocks", + "Id": "io.qt.clocks", "Exec": "clocks", "Path": "./", "X-Fullscreen": true, diff --git a/wayland/democompositor/resources/apps/maps.app b/wayland/democompositor/resources/apps/maps.app index e88899a..0192e4b 100644 --- a/wayland/democompositor/resources/apps/maps.app +++ b/wayland/democompositor/resources/apps/maps.app @@ -3,6 +3,7 @@ "Version": 1, "Icon": "qrc:/images/Icon_Maps.png", "Name": "Maps", + "Id": "io.qt.maps", "Exec": "qml_location_mapviewer", "Path": "./" } diff --git a/wayland/democompositor/resources/apps/rss.app b/wayland/democompositor/resources/apps/rss.app index 13ffbca..d631cda 100644 --- a/wayland/democompositor/resources/apps/rss.app +++ b/wayland/democompositor/resources/apps/rss.app @@ -3,6 +3,7 @@ "Version": 1, "Icon": "qrc:/images/Icon_RSS.png", "Name": "RSS News", + "Id": "io.qt.rssnews", "Exec": "rssnews", "Path": "./" } diff --git a/wayland/democompositor/resources/apps/stocqt.app b/wayland/democompositor/resources/apps/stocqt.app index 9317359..692f9ce 100644 --- a/wayland/democompositor/resources/apps/stocqt.app +++ b/wayland/democompositor/resources/apps/stocqt.app @@ -3,6 +3,7 @@ "Version": 1, "Icon": "qrc:/images/Icon_StocQt.png", "Name": "StoQt", + "Id": "io.qt.stoqt", "Exec": "stocqt", "Path": "./" } diff --git a/wayland/democompositor/tests/apps/tst_appparser.cpp b/wayland/democompositor/tests/apps/tst_appparser.cpp index a71c123..38a459c 100644 --- a/wayland/democompositor/tests/apps/tst_appparser.cpp +++ b/wayland/democompositor/tests/apps/tst_appparser.cpp @@ -71,15 +71,16 @@ void tst_AppParser::testValidVersion1_data() QTest::addColumn("input"); QTest::addColumn("icon"); QTest::addColumn("name"); + QTest::addColumn("id"); QTest::addColumn("exec"); QTest::addColumn("path"); QTest::addRow("clock") - << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Exec\":\"clocks\"}") - << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("clocks") << QString(); + << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Id\":\"io.qt.clocks\",\"Exec\":\"clocks\"}") + << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("io.qt.clocks") << QStringLiteral("clocks") << QString(); QTest::addRow("path") - << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Exec\":\"clocks\",\"Path\":\"P\"}") - << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("clocks") << QStringLiteral("P"); + << QByteArray("{\"Type\":\"Application\", \"Version\":1, \"Icon\":\"icon\", \"Name\":\"Clocks\",\"Id\":\"io.qt.clocks\",\"Exec\":\"clocks\",\"Path\":\"P\"}") + << QStringLiteral("icon") << QStringLiteral("Clocks") << QStringLiteral("io.qt.clocks") << QStringLiteral("clocks") << QStringLiteral("P"); } void tst_AppParser::testValidVersion1() -- cgit v1.2.3