// Copyright (C) 2021 The Qt Company Ltd. // Copyright (C) 2019 Luxoft Sweden AB // Copyright (C) 2018 Pelagicore AG // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef MONITORMODEL_H #define MONITORMODEL_H #include #include #include #include #include #include QT_BEGIN_NAMESPACE_AM class MonitorModel : public QAbstractListModel { Q_OBJECT Q_PROPERTY(QQmlListProperty dataSources READ dataSources NOTIFY dataSourcesChanged FINAL) Q_CLASSINFO("DefaultProperty", "dataSources") Q_PROPERTY(int count READ count NOTIFY countChanged FINAL) Q_PROPERTY(int maximumCount READ maximumCount WRITE setMaximumCount NOTIFY maximumCountChanged FINAL) Q_PROPERTY(int interval READ interval WRITE setInterval NOTIFY intervalChanged FINAL) Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged FINAL) public: MonitorModel(QObject *parent = nullptr); ~MonitorModel() override; QQmlListProperty dataSources(); static void dataSources_append(QQmlListProperty *property, QObject *value); static qsizetype dataSources_count(QQmlListProperty *property); static QObject *dataSources_at(QQmlListProperty *property, qsizetype index); static void dataSources_clear(QQmlListProperty *property); int rowCount(const QModelIndex &parent = QModelIndex()) const override; QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override; int count() const; bool running() const; void setRunning(bool value); int interval() const; void setInterval(int value); int maximumCount() const; void setMaximumCount(int value); Q_INVOKABLE void clear(); Q_INVOKABLE QVariantMap get(int row) const; Q_SIGNALS: void countChanged(); void intervalChanged(); void runningChanged(); void maximumCountChanged(); void dataSourcesChanged(); private Q_SLOTS: void readDataSourcesAndAddRow(); private: struct DataRow { QHash dataFromRoleIndex; }; struct DataSource { QObject *obj = nullptr; QVector roleNames; }; void clearDataSources(); void appendDataSource(QObject *dataSource); void fillDataRow(DataRow *dataRow); void readDataSource(DataSource *dataSource, DataRow *dataRow); void trimHistory(); bool extractRoleNamesFromJsArray(DataSource *dataSource); bool extractRoleNamesFromStringList(DataSource *dataSource); void addRoleName(const QByteArray &roleName, DataSource *dataSource); QList m_dataSources; QByteArrayList m_roleNamesList; // also maps a role index to its name QHash m_roleNameToIndex; QList m_rows; QTimer m_timer; int m_maximumCount = 10; }; QT_END_NAMESPACE_AM #endif // MONITORMODEL_H