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}; };