summaryrefslogtreecommitdiff
path: root/src/shared-main-lib/monitormodel.h
blob: dd2b7f81515b5d58e06cf5837063f66894f78d12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// 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

#pragma once

#include <QAbstractListModel>
#include <QtAppManCommon/global.h>
#include <QtQml/qqmllist.h>
#include <QList>
#include <QStringList>
#include <QTimer>

QT_BEGIN_NAMESPACE_AM

class MonitorModel : public QAbstractListModel
{
    Q_OBJECT
    Q_CLASSINFO("AM-QmlType", "QtApplicationManager/MonitorModel 2.0")

    Q_PROPERTY(QQmlListProperty<QObject> dataSources READ dataSources NOTIFY dataSourcesChanged)
    Q_CLASSINFO("DefaultProperty", "dataSources")

    Q_PROPERTY(int count READ count NOTIFY countChanged)
    Q_PROPERTY(int maximumCount READ maximumCount WRITE setMaximumCount  NOTIFY maximumCountChanged)

    Q_PROPERTY(int interval READ interval WRITE setInterval NOTIFY intervalChanged)
    Q_PROPERTY(bool running READ running WRITE setRunning NOTIFY runningChanged)

public:
    MonitorModel(QObject *parent = nullptr);
    ~MonitorModel() override;

    QQmlListProperty<QObject> dataSources();

    static void dataSources_append(QQmlListProperty<QObject> *property, QObject *value);
    static qsizetype dataSources_count(QQmlListProperty<QObject> *property);
    static QObject *dataSources_at(QQmlListProperty<QObject> *property, qsizetype index);
    static void dataSources_clear(QQmlListProperty<QObject> *property);

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    QVariant data(const QModelIndex &index, int role) const override;
    QHash<int, QByteArray> 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;

signals:
    void countChanged();
    void intervalChanged();
    void runningChanged();
    void maximumCountChanged();
    void dataSourcesChanged();

private slots:
    void readDataSourcesAndAddRow();

private:
    struct DataRow {
        QHash<int, QVariant> dataFromRoleIndex;
    };

    struct DataSource {
        QObject *obj;
        QVector<QByteArray> 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(QByteArray roleName, DataSource *dataSource);

    QList<DataSource*> m_dataSources;
    QList<QByteArray> m_roleNamesList; // also maps a role index to its name
    QHash<QByteArray, int> m_roleNameToIndex;

    QList<DataRow*> m_rows;

    QTimer m_timer;
    int m_maximumCount = 10;
};

QT_END_NAMESPACE_AM