From 69430e38732247eeb4f542e31caf4098c5cb5bbb Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Thu, 27 Mar 2025 13:51:43 -0700 Subject: [PATCH] service/tray: provide default sorting for SystemTray.items Items are first sorted by category, and then by name. --- src/core/model.hpp | 15 +++++++++++++++ src/services/status_notifier/qml.cpp | 14 ++++++++++++-- src/services/status_notifier/qml.hpp | 3 +++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/core/model.hpp b/src/core/model.hpp index 56297bfa..f9c258cf 100644 --- a/src/core/model.hpp +++ b/src/core/model.hpp @@ -1,5 +1,7 @@ #pragma once +#include + #include #include #include @@ -98,6 +100,19 @@ public: this->UntypedObjectModel::insertObject(object, index); } + void insertObjectSorted(T* object, const std::function& compare) { + auto& list = this->valueList(); + auto iter = list.begin(); + + while (iter != list.end()) { + if (!compare(object, *iter)) break; + ++iter; + } + + auto idx = iter - list.begin(); + this->UntypedObjectModel::insertObject(object, idx); + } + void removeObject(const T* object) { this->UntypedObjectModel::removeObject(object); } // Assumes only one instance of a specific value diff --git a/src/services/status_notifier/qml.cpp b/src/services/status_notifier/qml.cpp index 0c980f16..15231ff6 100644 --- a/src/services/status_notifier/qml.cpp +++ b/src/services/status_notifier/qml.cpp @@ -17,10 +17,20 @@ SystemTray::SystemTray(QObject* parent): QObject(parent) { // clang-format on for (auto* item: host->items()) { - this->mItems.insertObject(item); + this->mItems.insertObjectSorted(item, &SystemTray::compareItems); } } -void SystemTray::onItemRegistered(StatusNotifierItem* item) { this->mItems.insertObject(item); } +void SystemTray::onItemRegistered(StatusNotifierItem* item) { + this->mItems.insertObjectSorted(item, &SystemTray::compareItems); +} + void SystemTray::onItemUnregistered(StatusNotifierItem* item) { this->mItems.removeObject(item); } ObjectModel* SystemTray::items() { return &this->mItems; } + +bool SystemTray::compareItems( + qs::service::sni::StatusNotifierItem* a, + qs::service::sni::StatusNotifierItem* b +) { + return a->category() > b->category() || a->id().compare(b->id(), Qt::CaseInsensitive) >= 0; +} diff --git a/src/services/status_notifier/qml.hpp b/src/services/status_notifier/qml.hpp index d77279dc..f9ae9bad 100644 --- a/src/services/status_notifier/qml.hpp +++ b/src/services/status_notifier/qml.hpp @@ -31,5 +31,8 @@ private slots: void onItemUnregistered(qs::service::sni::StatusNotifierItem* item); private: + static bool + compareItems(qs::service::sni::StatusNotifierItem* a, qs::service::sni::StatusNotifierItem* b); + ObjectModel mItems {this}; };