QmlMaterial 0.1.0
Loading...
Searching...
No Matches
appstream_release_model.hpp
1#pragma once
2
3#include <QtCore/QAbstractListModel>
4#include <QtCore/QByteArray>
5#include <QtCore/QStringList>
6#include <QtCore/QUrl>
7#include <QtCore/QVariantList>
8#include <QtQml/QQmlEngine>
9
10#include <vector>
11
12#include "qml_material/export.hpp"
13
14class QXmlStreamReader;
15
16namespace qml_material
17{
18
19class QML_MATERIAL_API AppStreamReleaseModel : public QAbstractListModel {
20 Q_OBJECT
21 QML_ELEMENT
22
23 Q_PROPERTY(QUrl source READ source WRITE setSource NOTIFY sourceChanged)
24 Q_PROPERTY(Status status READ status NOTIFY statusChanged)
25 Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged)
26 Q_PROPERTY(int count READ rowCount NOTIFY countChanged)
27
28public:
29 enum Status
30 {
31 Null,
32 Ready,
33 Error,
34 };
35 Q_ENUM(Status)
36
37 enum Role
38 {
39 VersionRole = Qt::UserRole + 1,
40 DateRole,
41 SectionsRole,
42 };
43
44 explicit AppStreamReleaseModel(QObject* parent = nullptr);
45
46 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
47 QVariant data(const QModelIndex& index, int role) const override;
48 QHash<int, QByteArray> roleNames() const override;
49
50 QUrl source() const;
51 void setSource(const QUrl& source);
52 Status status() const;
53 QString errorString() const;
54
55 Q_INVOKABLE void reload();
56
57Q_SIGNALS:
58 void sourceChanged();
59 void statusChanged();
60 void errorStringChanged();
61 void countChanged();
62
63private:
64 struct Release {
65 QString version;
66 QString date;
67 QVariantList sections;
68 };
69
70 static bool parseDocument(QByteArray xml, std::vector<Release>& releases, QString& error);
71 static void collectReleases(QXmlStreamReader& reader, std::vector<Release>& releases);
72 static Release parseRelease(QXmlStreamReader& reader);
73 static QVariantList parseDescription(QXmlStreamReader& reader);
74
75 void replace(std::vector<Release> releases, Status status, QString error);
76
77 QUrl m_source;
78 Status m_status { Null };
79 QString m_error_string;
80 std::vector<Release> m_releases;
81};
82
83} // namespace qml_material