QmlMaterial 0.1.0
Loading...
Searching...
No Matches
snake_model.hpp
1#pragma once
2
3#include <QtCore/QAbstractListModel>
4#include <QtCore/QTimer>
5#include <QtQml/QQmlEngine>
6
7#include "qml_material/enum.hpp"
8
9namespace qml_material
10{
11struct SnakeModelItem {
12 Q_GADGET
13
14 Q_PROPERTY(qint32 sid MEMBER id FINAL)
15 Q_PROPERTY(QString text MEMBER text FINAL)
16 Q_PROPERTY(qint32 duration MEMBER duration FINAL)
17 Q_PROPERTY(Enum::ToastFlags flag MEMBER flag FINAL)
18 Q_PROPERTY(QObject* action MEMBER action FINAL)
19public:
20 qint32 id { 0 };
21 QString text {};
22 qint32 duration { 0 };
23 Enum::ToastFlags flag {};
24 QObject* action { nullptr };
25};
26
27class SnakeModel : public QAbstractListModel {
28 Q_OBJECT
29 QML_ELEMENT
30public:
31 using iterator = std::vector<SnakeModelItem>::iterator;
32
33 SnakeModel(QObject* parent = nullptr);
34 virtual ~SnakeModel();
35
36 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
37 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
38 QHash<int, QByteArray> roleNames() const override;
39
40 Q_INVOKABLE SnakeModelItem createSnake();
41
42 bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex()) override;
43 auto findById(qint32 id) -> iterator;
44
45 Q_SLOT void showSnake(const SnakeModelItem&);
46 Q_SLOT void removeById(qint32 id);
47
48private:
49 Q_SLOT void onRemovePriv(const QModelIndex& parent, int first, int last);
50 qint32 removeExtra(qint32 id);
51
52 std::int32_t m_snake_id;
53 std::vector<SnakeModelItem> m_items;
54 std::vector<SnakeModelItem> m_saved_items;
55
56 struct Extra {
57 QTimer* timer { nullptr };
58 };
59 std::unordered_map<qint32, Extra> m_extra;
60};
61} // namespace qml_material