forked from quickshell/quickshell
all: replace list properties with ObjectModels
This commit is contained in:
parent
6326f60ce2
commit
5016dbf0d4
11 changed files with 201 additions and 152 deletions
|
@ -9,6 +9,7 @@
|
|||
#include <qtmetamacros.h>
|
||||
#include <qtypes.h>
|
||||
|
||||
#include "../../core/model.hpp"
|
||||
#include "../../dbus/dbusmenu/dbusmenu.hpp"
|
||||
#include "../../dbus/properties.hpp"
|
||||
#include "host.hpp"
|
||||
|
@ -106,46 +107,25 @@ SystemTray::SystemTray(QObject* parent): QObject(parent) {
|
|||
// clang-format on
|
||||
|
||||
for (auto* item: host->items()) {
|
||||
this->mItems.push_back(new SystemTrayItem(item, this));
|
||||
this->mItems.insertObject(new SystemTrayItem(item, this));
|
||||
}
|
||||
}
|
||||
|
||||
void SystemTray::onItemRegistered(StatusNotifierItem* item) {
|
||||
this->mItems.push_back(new SystemTrayItem(item, this));
|
||||
emit this->itemsChanged();
|
||||
this->mItems.insertObject(new SystemTrayItem(item, this));
|
||||
}
|
||||
|
||||
void SystemTray::onItemUnregistered(StatusNotifierItem* item) {
|
||||
SystemTrayItem* trayItem = nullptr;
|
||||
|
||||
this->mItems.removeIf([item, &trayItem](SystemTrayItem* testItem) {
|
||||
if (testItem->item == item) {
|
||||
trayItem = testItem;
|
||||
return true;
|
||||
} else return false;
|
||||
});
|
||||
|
||||
emit this->itemsChanged();
|
||||
|
||||
delete trayItem;
|
||||
for (const auto* storedItem: this->mItems.valueList()) {
|
||||
if (storedItem->item == item) {
|
||||
this->mItems.removeObject(storedItem);
|
||||
delete storedItem;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QQmlListProperty<SystemTrayItem> SystemTray::items() {
|
||||
return QQmlListProperty<SystemTrayItem>(
|
||||
this,
|
||||
nullptr,
|
||||
&SystemTray::itemsCount,
|
||||
&SystemTray::itemAt
|
||||
);
|
||||
}
|
||||
|
||||
qsizetype SystemTray::itemsCount(QQmlListProperty<SystemTrayItem>* property) {
|
||||
return reinterpret_cast<SystemTray*>(property->object)->mItems.count(); // NOLINT
|
||||
}
|
||||
|
||||
SystemTrayItem* SystemTray::itemAt(QQmlListProperty<SystemTrayItem>* property, qsizetype index) {
|
||||
return reinterpret_cast<SystemTray*>(property->object)->mItems.at(index); // NOLINT
|
||||
}
|
||||
ObjectModel<SystemTrayItem>* SystemTray::items() { return &this->mItems; }
|
||||
|
||||
SystemTrayItem* SystemTrayMenuWatcher::trayItem() const { return this->item; }
|
||||
|
||||
|
|
|
@ -2,10 +2,9 @@
|
|||
|
||||
#include <qobject.h>
|
||||
#include <qqmlintegration.h>
|
||||
#include <qqmllist.h>
|
||||
#include <qtmetamacros.h>
|
||||
#include <qtypes.h>
|
||||
|
||||
#include "../../core/model.hpp"
|
||||
#include "item.hpp"
|
||||
|
||||
namespace SystemTrayStatus { // NOLINT
|
||||
|
@ -108,27 +107,21 @@ signals:
|
|||
class SystemTray: public QObject {
|
||||
Q_OBJECT;
|
||||
/// List of all system tray icons.
|
||||
Q_PROPERTY(QQmlListProperty<SystemTrayItem> items READ items NOTIFY itemsChanged);
|
||||
Q_PROPERTY(ObjectModel<SystemTrayItem>* items READ items CONSTANT);
|
||||
QML_ELEMENT;
|
||||
QML_SINGLETON;
|
||||
|
||||
public:
|
||||
explicit SystemTray(QObject* parent = nullptr);
|
||||
|
||||
[[nodiscard]] QQmlListProperty<SystemTrayItem> items();
|
||||
|
||||
signals:
|
||||
void itemsChanged();
|
||||
[[nodiscard]] ObjectModel<SystemTrayItem>* items();
|
||||
|
||||
private slots:
|
||||
void onItemRegistered(qs::service::sni::StatusNotifierItem* item);
|
||||
void onItemUnregistered(qs::service::sni::StatusNotifierItem* item);
|
||||
|
||||
private:
|
||||
static qsizetype itemsCount(QQmlListProperty<SystemTrayItem>* property);
|
||||
static SystemTrayItem* itemAt(QQmlListProperty<SystemTrayItem>* property, qsizetype index);
|
||||
|
||||
QList<SystemTrayItem*> mItems;
|
||||
ObjectModel<SystemTrayItem> mItems {this};
|
||||
};
|
||||
|
||||
///! Accessor for SystemTrayItem menus.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue