diff --git a/applets/notifications/package/contents/ui/global/Globals.qml b/applets/notifications/package/contents/ui/global/Globals.qml --- a/applets/notifications/package/contents/ui/global/Globals.qml +++ b/applets/notifications/package/contents/ui/global/Globals.qml @@ -329,6 +329,7 @@ whitelistedNotifyRcNames: globals.inhibited ? notificationSettings.doNotDisturbPopupWhitelistedServices : [] showJobs: notificationSettings.jobsInNotifications sortMode: NotificationManager.Notifications.SortByTypeAndUrgency + sortOrder: Qt.AscendingOrder groupMode: NotificationManager.Notifications.GroupDisabled urgencies: { var urgencies = 0; diff --git a/libnotificationmanager/notifications.h b/libnotificationmanager/notifications.h --- a/libnotificationmanager/notifications.h +++ b/libnotificationmanager/notifications.h @@ -140,6 +140,20 @@ */ Q_PROPERTY(SortMode sortMode READ sortMode WRITE setSortMode NOTIFY sortModeChanged) + /** + * The sort order for notifications. + * + * This only affects the sort order by date. When @c sortMode is set to SortByTypeAndUrgency + * the order of notification groups (e.g. high - jobs - normal - low) is unaffected, and only + * notifications within the same group are either sorted ascending or descending by their + * creation/update date. + * + * Default is DescendingOrder, i.e. newest notifications come first. + * + * @since 5.19 + */ + Q_PROPERTY(Qt::SortOrder sortOrder READ sortOrder WRITE setSortOrder NOTIFY sortOrderChanged) + /** * The group mode for notifications. * @@ -368,6 +382,9 @@ SortMode sortMode() const; void setSortMode(SortMode sortMode); + Qt::SortOrder sortOrder() const; + void setSortOrder(Qt::SortOrder sortOrder); + GroupMode groupMode() const; void setGroupMode(GroupMode groupMode); @@ -516,6 +533,7 @@ void showJobsChanged(); void urgenciesChanged(); void sortModeChanged(); + void sortOrderChanged(); void groupModeChanged(); void groupLimitChanged(); void expandUnreadChanged(); diff --git a/libnotificationmanager/notifications.cpp b/libnotificationmanager/notifications.cpp --- a/libnotificationmanager/notifications.cpp +++ b/libnotificationmanager/notifications.cpp @@ -209,6 +209,7 @@ if (!sortModel) { sortModel = new NotificationSortProxyModel(q); connect(sortModel, &NotificationSortProxyModel::sortModeChanged, q, &Notifications::sortModeChanged); + connect(sortModel, &NotificationSortProxyModel::sortOrderChanged, q, &Notifications::sortOrderChanged); } if (!limiterModel) { @@ -572,6 +573,16 @@ d->sortModel->setSortMode(sortMode); } +Qt::SortOrder Notifications::sortOrder() const +{ + return d->sortModel->sortOrder(); +} + +void Notifications::setSortOrder(Qt::SortOrder sortOrder) +{ + d->sortModel->setSortOrder(sortOrder); +} + Notifications::GroupMode Notifications::groupMode() const { return d->groupMode; diff --git a/libnotificationmanager/notificationsortproxymodel.cpp b/libnotificationmanager/notificationsortproxymodel.cpp --- a/libnotificationmanager/notificationsortproxymodel.cpp +++ b/libnotificationmanager/notificationsortproxymodel.cpp @@ -50,6 +50,20 @@ } } +Qt::SortOrder NotificationSortProxyModel::sortOrder() const +{ + return m_sortOrder; +} + +void NotificationSortProxyModel::setSortOrder(Qt::SortOrder sortOrder) +{ + if (m_sortOrder != sortOrder) { + m_sortOrder = sortOrder; + invalidate(); + emit sortOrderChanged(); + } +} + int sortScore(const QModelIndex &idx) { const auto urgency = idx.data(Notifications::UrgencyRole).toInt(); @@ -109,8 +123,11 @@ timeRight = source_right.data(Notifications::CreatedRole).toDateTime(); } - // sorts descending by time (newest first) - return timeLeft > timeRight; + if (m_sortOrder == Qt::DescendingOrder) { + return timeLeft > timeRight; + } else { + return timeLeft < timeRight; + } } return scoreLeft > scoreRight; diff --git a/libnotificationmanager/notificationsortproxymodel_p.h b/libnotificationmanager/notificationsortproxymodel_p.h --- a/libnotificationmanager/notificationsortproxymodel_p.h +++ b/libnotificationmanager/notificationsortproxymodel_p.h @@ -39,14 +39,19 @@ Notifications::SortMode sortMode() const; void setSortMode(Notifications::SortMode); + Qt::SortOrder sortOrder() const; + void setSortOrder(Qt::SortOrder sortOrder); + signals: void sortModeChanged(); + void sortOrderChanged(); protected: bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override; private: Notifications::SortMode m_sortMode = Notifications::SortByDate; + Qt::SortOrder m_sortOrder = Qt::DescendingOrder; };