From 07dc5c49876c22c4e00a62d8c5d4bcf5b6100acd Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Tue, 14 Apr 2020 12:53:57 +0200 Subject: [PATCH] [Notifications] Report roleNames in the relevant places QML needs it on the model it uses (Notifications) where they used to be but GammaRay seems to be taking them from the source (NotificationsModel). This has both models (and jobs model) return the roleNames() and moves them to Utils so they're shared. Differential Revision: https://phabricator.kde.org/D28657 --- libnotificationmanager/jobsmodel.cpp | 6 ++++ libnotificationmanager/jobsmodel.h | 1 + libnotificationmanager/notifications.cpp | 23 +------------- libnotificationmanager/notificationsmodel.cpp | 6 ++++ libnotificationmanager/notificationsmodel.h | 1 + libnotificationmanager/utils.cpp | 31 +++++++++++++++++++ libnotificationmanager/utils_p.h | 2 ++ 7 files changed, 48 insertions(+), 22 deletions(-) diff --git a/libnotificationmanager/jobsmodel.cpp b/libnotificationmanager/jobsmodel.cpp index 6e5e9275f..1b4bb905e 100644 --- a/libnotificationmanager/jobsmodel.cpp +++ b/libnotificationmanager/jobsmodel.cpp @@ -22,6 +22,7 @@ #include "jobsmodel_p.h" #include "notifications.h" +#include "utils_p.h" #include #include @@ -176,6 +177,11 @@ int JobsModel::rowCount(const QModelIndex &parent) const return d->m_jobViews.count(); } +QHash JobsModel::roleNames() const +{ + return Utils::roleNames(); +} + void JobsModel::close(const QModelIndex &idx) { if (checkIndex(idx)) { diff --git a/libnotificationmanager/jobsmodel.h b/libnotificationmanager/jobsmodel.h index 45de9be57..b2c1ba865 100644 --- a/libnotificationmanager/jobsmodel.h +++ b/libnotificationmanager/jobsmodel.h @@ -57,6 +57,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QHash roleNames() const override; /** * @brief Close a job diff --git a/libnotificationmanager/notifications.cpp b/libnotificationmanager/notifications.cpp index 61ab46785..409dcd6bc 100644 --- a/libnotificationmanager/notifications.cpp +++ b/libnotificationmanager/notifications.cpp @@ -843,26 +843,5 @@ int Notifications::rowCount(const QModelIndex &parent) const QHash Notifications::roleNames() const { - static QHash s_roles; - - if (s_roles.isEmpty()) { - s_roles = QSortFilterProxyModel::roleNames(); - - // This generates role names from the Roles enum in the form of: FooRole -> foo - const QMetaEnum e = staticMetaObject.enumerator(staticMetaObject.indexOfEnumerator("Roles")); - - for (int i = 0; i < e.keyCount(); ++i) { - const int value = e.value(i); - - QByteArray key(e.key(i)); - key[0] = key[0] + 32; // lower case first letter - key.chop(4); // strip "Role" suffix - - s_roles.insert(value, key); - } - - s_roles.insert(IdRole, QByteArrayLiteral("notificationId")); // id is QML-reserved - } - - return s_roles; + return Utils::roleNames(); } diff --git a/libnotificationmanager/notificationsmodel.cpp b/libnotificationmanager/notificationsmodel.cpp index 2a475641e..4d0be088e 100644 --- a/libnotificationmanager/notificationsmodel.cpp +++ b/libnotificationmanager/notificationsmodel.cpp @@ -23,6 +23,7 @@ #include "debug.h" #include "server.h" +#include "utils_p.h" #include "notifications.h" @@ -350,6 +351,11 @@ int NotificationsModel::rowCount(const QModelIndex &parent) const return d->notifications.count(); } +QHash NotificationsModel::roleNames() const +{ + return Utils::roleNames(); +} + void NotificationsModel::expire(uint notificationId) { if (d->rowOfNotification(notificationId) > -1) { diff --git a/libnotificationmanager/notificationsmodel.h b/libnotificationmanager/notificationsmodel.h index edef90ae2..2b2f33fc3 100644 --- a/libnotificationmanager/notificationsmodel.h +++ b/libnotificationmanager/notificationsmodel.h @@ -45,6 +45,7 @@ public: QVariant data(const QModelIndex &index, int role) const override; bool setData(const QModelIndex &index, const QVariant &value, int role) override; int rowCount(const QModelIndex &parent = QModelIndex()) const override; + QHash roleNames() const override; void expire(uint notificationId); void close(uint notificationId); diff --git a/libnotificationmanager/utils.cpp b/libnotificationmanager/utils.cpp index 0c43a94b9..91368e875 100644 --- a/libnotificationmanager/utils.cpp +++ b/libnotificationmanager/utils.cpp @@ -20,12 +20,15 @@ #include "utils_p.h" +#include "notifications.h" + #include #include #include #include #include #include +#include #include #include @@ -34,6 +37,34 @@ using namespace NotificationManager; +QHash Utils::roleNames() +{ + static QHash s_roles; + + if (s_roles.isEmpty()) { + // This generates role names from the Roles enum in the form of: FooRole -> foo + const QMetaEnum e = QMetaEnum::fromType(); + + // Qt built-in roles we use + s_roles.insert(Qt::DisplayRole, QByteArrayLiteral("display")); + s_roles.insert(Qt::DecorationRole, QByteArrayLiteral("decoration")); + + for (int i = 0; i < e.keyCount(); ++i) { + const int value = e.value(i); + + QByteArray key(e.key(i)); + key[0] = key[0] + 32; // lower case first letter + key.chop(4); // strip "Role" suffix + + s_roles.insert(value, key); + } + + s_roles.insert(Notifications::IdRole, QByteArrayLiteral("notificationId")); // id is QML-reserved + } + + return s_roles; +} + QString Utils::processNameFromPid(uint pid) { auto processInfo = KProcessList::processInfo(pid); diff --git a/libnotificationmanager/utils_p.h b/libnotificationmanager/utils_p.h index 232148ecb..67e873d3b 100644 --- a/libnotificationmanager/utils_p.h +++ b/libnotificationmanager/utils_p.h @@ -32,6 +32,8 @@ namespace NotificationManager namespace Utils { +QHash roleNames(); + QString processNameFromPid(uint pid); QString desktopEntryFromPid(uint pid);