1 #pragma once |
1 #pragma once |
|
2 #include <QAbstractListModel> |
2 #include <memory> |
3 #include <memory> |
3 #include "main.h" |
4 #include "main.h" |
4 #include "header.h" |
5 #include "header.h" |
5 #include "objecttypes/modelobject.h" |
6 #include "objecttypes/modelobject.h" |
6 |
7 |
7 class Model : public QObject |
8 enum class HeaderProperty |
|
9 { |
|
10 Name |
|
11 }; |
|
12 |
|
13 class Model : public QAbstractListModel |
8 { |
14 { |
9 Q_OBJECT |
15 Q_OBJECT |
10 public: |
16 public: |
11 class EditContext; |
17 class EditContext; |
12 Model(); |
18 Model(); |
13 Model(const Model&) = delete; |
19 Model(const Model&) = delete; |
14 int size() const; |
20 int size() const; |
15 EditContext edit(); |
21 EditContext edit(); |
|
22 int rowCount(const QModelIndex&) const override; |
|
23 QVariant data(const QModelIndex& index, int role) const override; |
|
24 QVariant getHeaderProperty(const HeaderProperty property); |
|
25 const QString& getName() const; |
16 signals: |
26 signals: |
17 void objectAdded(modelobjects::Id id, int position); |
27 void objectAdded(modelobjects::Id id, int position); |
18 private: |
28 private: |
|
29 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; |
19 template<typename T, typename... Args> |
30 template<typename T, typename... Args> |
20 T* append(Args&&... args); |
31 T* append(Args&&... args); |
|
32 void append(ModelObjectPointer&& object); |
21 template<typename T, typename... Args> |
33 template<typename T, typename... Args> |
22 T* insert(int position, Args&&... args); |
34 T* insert(int position, Args&&... args); |
23 bool modified = false; |
35 bool modified = false; |
24 QString path; |
36 QString path; |
25 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; |
|
26 LDHeader header; |
37 LDHeader header; |
27 std::vector<ModelObjectPointer> body; |
38 std::vector<ModelObjectPointer> body; |
28 std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; |
39 std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; |
29 }; |
40 }; |
30 |
41 |
31 template<typename T, typename... Args> |
42 template<typename T, typename... Args> |
32 T* Model::append(Args&&... args) |
43 T* Model::append(Args&&... args) |
33 { |
44 { |
|
45 emit layoutAboutToBeChanged(); |
34 this->body.push_back(std::make_unique<T>(args...)); |
46 this->body.push_back(std::make_unique<T>(args...)); |
35 T* pointer = static_cast<T*>(this->body.back().get()); |
47 T* pointer = static_cast<T*>(this->body.back().get()); |
36 this->objectsById[pointer->id] = pointer; |
48 this->objectsById[pointer->id] = pointer; |
37 emit objectAdded(pointer->id, this->body.size() - 1); |
49 emit objectAdded(pointer->id, this->body.size() - 1); |
|
50 emit layoutChanged(); |
38 return pointer; |
51 return pointer; |
39 } |
52 } |
40 |
53 |
41 template<typename T, typename... Args> |
54 template<typename T, typename... Args> |
42 T* Model::insert(int position, Args&&... args) |
55 T* Model::insert(int position, Args&&... args) |
43 { |
56 { |
|
57 emit layoutAboutToBeChanged(); |
44 this->body.insert(position, std::make_unique<T>(args...)); |
58 this->body.insert(position, std::make_unique<T>(args...)); |
45 T* pointer = static_cast<T*>(this->body[position]); |
59 T* pointer = static_cast<T*>(this->body[position]); |
46 this->objectsById[pointer->id] = pointer; |
60 this->objectsById[pointer->id] = pointer; |
47 emit objectAdded(pointer->id, position); |
61 emit objectAdded(pointer->id, position); |
|
62 emit layoutChanged(); |
48 return pointer; |
63 return pointer; |
49 } |
64 } |