#pragma once #include #include #include #include #include #include #include #include #include "../../core/imageprovider.hpp" #include "../../dbus/dbusmenu/dbusmenu.hpp" #include "../../dbus/properties.hpp" #include "dbus_item.h" #include "dbus_item_types.hpp" Q_DECLARE_LOGGING_CATEGORY(logStatusNotifierItem); namespace qs::service::sni { class StatusNotifierItem; class TrayImageHandle: public QsImageHandle { public: explicit TrayImageHandle(StatusNotifierItem* item); QPixmap requestPixmap(const QString& id, QSize* size, const QSize& requestedSize) override; public: StatusNotifierItem* item; }; class StatusNotifierItem: public QObject { Q_OBJECT; public: explicit StatusNotifierItem(const QString& address, QObject* parent = nullptr); [[nodiscard]] bool isValid() const; [[nodiscard]] bool isReady() const; [[nodiscard]] QString iconId() const; [[nodiscard]] QPixmap createPixmap(const QSize& size) const; [[nodiscard]] qs::dbus::dbusmenu::DBusMenu* createMenu() const; void activate(); void secondaryActivate(); void scroll(qint32 delta, bool horizontal); // clang-format off dbus::DBusPropertyGroup properties; dbus::DBusProperty id {this->properties, "Id"}; dbus::DBusProperty title {this->properties, "Title"}; dbus::DBusProperty status {this->properties, "Status"}; dbus::DBusProperty category {this->properties, "Category"}; dbus::DBusProperty windowId {this->properties, "WindowId"}; dbus::DBusProperty iconThemePath {this->properties, "IconThemePath"}; dbus::DBusProperty iconName {this->properties, "IconName"}; dbus::DBusProperty iconPixmaps {this->properties, "IconPixmap"}; dbus::DBusProperty overlayIconName {this->properties, "OverlayIconName"}; dbus::DBusProperty overlayIconPixmaps {this->properties, "OverlayIconPixmap"}; dbus::DBusProperty attentionIconName {this->properties, "AttentionIconName"}; dbus::DBusProperty attentionIconPixmaps {this->properties, "AttentionIconPixmap"}; dbus::DBusProperty attentionMovieName {this->properties, "AttentionMovieName"}; dbus::DBusProperty tooltip {this->properties, "ToolTip"}; dbus::DBusProperty isMenu {this->properties, "ItemIsMenu"}; dbus::DBusProperty menuPath {this->properties, "Menu"}; // clang-format on signals: void iconChanged(); void ready(); private slots: void updateIcon(); void onGetAllFinished(); private: DBusStatusNotifierItem* item = nullptr; TrayImageHandle imageHandle {this}; bool mReady = false; dbus::dbusmenu::DBusMenu* mMenu = nullptr; // bumped to inhibit caching quint32 iconIndex = 0; QString watcherId; }; } // namespace qs::service::sni