#pragma once #include "diskinfo.hpp" #include "tickingservice.hpp" #include #include #include #include #include namespace ZShell::services { class Storage : public TickingService { Q_OBJECT QML_ELEMENT QML_SINGLETON Q_PROPERTY(qreal percentage READ percentage NOTIFY percentageChanged) Q_PROPERTY(QQmlListProperty disks READ disksProp NOTIFY disksChanged) Q_PROPERTY(ZShell::services::DiskInfo* manualPrimaryDisk READ manualPrimaryDisk WRITE setManualPrimaryDisk NOTIFY manualPrimaryDiskChanged) Q_PROPERTY(ZShell::services::DiskInfo* primaryDisk READ primaryDisk NOTIFY primaryDiskChanged) public: explicit Storage(QObject* parent = nullptr); [[nodiscard]] qreal percentage() const; [[nodiscard]] QQmlListProperty disksProp(); [[nodiscard]] DiskInfo* manualPrimaryDisk() const; void setManualPrimaryDisk(DiskInfo* disk); [[nodiscard]] DiskInfo* primaryDisk() const; signals: void disksChanged(); void percentageChanged(); void manualPrimaryDiskChanged(); void primaryDiskChanged(); protected: void tick() override; private: [[nodiscard]] static QStringList resolveToPhysicalDisks(const QString& devicePath); [[nodiscard]] static bool isPseudoFs(QByteArrayView fsType); [[nodiscard]] static bool sameOrder(const QList& a, const QList& b); static qsizetype disksCount(QQmlListProperty* prop); static DiskInfo* disksAt(QQmlListProperty* prop, qsizetype i); QList m_disks; QPointer m_manualPrimaryDisk; }; } // namespace ZShell::services