Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
StatusNotifierItemModel.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 fuddlesworth
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#pragma once
5
6#include <PhosphorServices/phosphorservices_export.h>
7
8// Qt's MOC needs fully-defined pointer types for Q_PROPERTY, signal
9// parameters, and Q_INVOKABLE returns (qmetatype.h's
10// `checkTypeIsSuitableForMetaType` static-asserts `is_complete<T>`).
11// Forward decls compile in older Qt but fail with Qt ≥ 6.10.
14
15#include <QAbstractListModel>
16#include <QPointer>
17#include <QQmlEngine>
18
19namespace PhosphorServices {
20
25class PHOSPHORSERVICES_EXPORT StatusNotifierItemModel : public QAbstractListModel
26{
27 Q_OBJECT
28 Q_DISABLE_COPY_MOVE(StatusNotifierItemModel)
29 QML_ELEMENT
30 Q_PROPERTY(PhosphorServices::StatusNotifierHost* host READ host WRITE setHost NOTIFY hostChanged)
31 // `count` mirrors rowCount() and emits countChanged on every
32 // insert/remove. QAbstractListModel does NOT expose this by
33 // default — QML's `model.count` binding silently evaluates to
34 // `undefined` without it, and any `visible: model.count > 0`
35 // expression collapses to false, hiding the whole tray.
36 Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
37
38public:
39 enum Roles {
40 IdRole = Qt::UserRole + 1,
44 // Icon URL forms — bind to QML's Image.source (a QUrl). The
45 // underlying QImage is published to the
46 // `image://phosphor-services/` provider as a side-effect of
47 // model attachment / item icon changes.
51 // Raw QImage forms — kept for C++ consumers / future ImageItem
52 // bindings. Not directly usable as Image.source.
63 };
64 Q_ENUM(Roles)
65
66 explicit StatusNotifierItemModel(QObject* parent = nullptr);
68
69 [[nodiscard]] StatusNotifierHost* host() const;
70 void setHost(StatusNotifierHost* host);
71
72 [[nodiscard]] int rowCount(const QModelIndex& parent = {}) const override;
73 [[nodiscard]] QVariant data(const QModelIndex& index, int role) const override;
74 [[nodiscard]] QHash<int, QByteArray> roleNames() const override;
75
80 Q_INVOKABLE void activate(int row, int x, int y);
81 Q_INVOKABLE void secondaryActivate(int row, int x, int y);
82 Q_INVOKABLE void contextMenu(int row, int x, int y);
83 Q_INVOKABLE void scroll(int row, int delta, const QString& orientation);
84 Q_INVOKABLE PhosphorServices::StatusNotifierItem* itemAt(int row) const;
85
86Q_SIGNALS:
89
90private:
91 QPointer<StatusNotifierHost> m_host;
92
93 void connectItem(StatusNotifierItem* item);
94 void onItemAdded(StatusNotifierItem* item);
95 void onItemRemoved(StatusNotifierItem* item);
96 void onItemDataChanged(StatusNotifierItem* item);
97 int rowFor(StatusNotifierItem* item) const;
98};
99
100} // namespace PhosphorServices
The shell-side counterpart to StatusNotifierWatcher.
Definition StatusNotifierHost.h:32
QAbstractListModel adapter over StatusNotifierHost::items().
Definition StatusNotifierItemModel.h:26
void secondaryActivate(int row, int x, int y)
QHash< int, QByteArray > roleNames() const override
void contextMenu(int row, int x, int y)
void scroll(int row, int delta, const QString &orientation)
QVariant data(const QModelIndex &index, int role) const override
Roles
Definition StatusNotifierItemModel.h:39
@ ToolTipBodyRole
Definition StatusNotifierItemModel.h:57
@ AttentionIconImageRole
Definition StatusNotifierItemModel.h:55
@ CategoryRole
Definition StatusNotifierItemModel.h:42
@ StatusRole
Definition StatusNotifierItemModel.h:43
@ ItemObjectRole
the raw StatusNotifierItem* for Q_INVOKABLE methods
Definition StatusNotifierItemModel.h:62
@ ItemIsMenuRole
Definition StatusNotifierItemModel.h:59
@ IconImageRole
Definition StatusNotifierItemModel.h:53
@ MenuPathRole
Definition StatusNotifierItemModel.h:58
@ ToolTipTitleRole
Definition StatusNotifierItemModel.h:56
@ IconUrlRole
Definition StatusNotifierItemModel.h:48
@ DBusServiceRole
Definition StatusNotifierItemModel.h:60
@ TitleRole
Definition StatusNotifierItemModel.h:41
@ AttentionIconUrlRole
Definition StatusNotifierItemModel.h:50
@ OverlayIconImageRole
Definition StatusNotifierItemModel.h:54
@ DBusPathRole
Definition StatusNotifierItemModel.h:61
@ OverlayIconUrlRole
Definition StatusNotifierItemModel.h:49
void activate(int row, int x, int y)
QML-friendly action invocations — looks up the item by row and dispatches.
PhosphorServices::StatusNotifierItem * itemAt(int row) const
One system-tray item.
Definition StatusNotifierItem.h:21
Definition DBusMenuModel.h:15