Sat, 05 Oct 2019 23:47:03 +0300
added the settings editor
3 | 1 | #pragma once |
2 | #include <memory> | |
3 | #include "main.h" | |
4 | #include "header.h" | |
5 | #include "objecttypes/modelobject.h" | |
6 | ||
7 | class Model : public QObject | |
8 | { | |
9 | Q_OBJECT | |
10 | public: | |
11 | class EditContext; | |
12 | Model(); | |
5 | 13 | Model(const Model&) = delete; |
3 | 14 | int size() const; |
15 | EditContext edit(); | |
6 | 16 | signals: |
17 | void objectAdded(modelobjects::Id id, int position); | |
3 | 18 | private: |
19 | template<typename T, typename... Args> | |
20 | T* append(Args&&... args); | |
21 | template<typename T, typename... Args> | |
22 | T* insert(int position, Args&&... args); | |
23 | bool modified = false; | |
24 | QString path; | |
25 | using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; | |
26 | LDHeader header; | |
27 | std::vector<ModelObjectPointer> body; | |
6 | 28 | std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; |
3 | 29 | }; |
30 | ||
31 | template<typename T, typename... Args> | |
32 | T* Model::append(Args&&... args) | |
33 | { | |
34 | this->body.push_back(std::make_unique<T>(args...)); | |
6 | 35 | T* pointer = static_cast<T*>(this->body.back().get()); |
36 | this->objectsById[pointer->id] = pointer; | |
37 | emit objectAdded(pointer->id, this->body.size() - 1); | |
38 | return pointer; | |
3 | 39 | } |
40 | ||
41 | template<typename T, typename... Args> | |
42 | T* Model::insert(int position, Args&&... args) | |
43 | { | |
44 | this->body.insert(position, std::make_unique<T>(args...)); | |
6 | 45 | T* pointer = static_cast<T*>(this->body[position]); |
46 | this->objectsById[pointer->id] = pointer; | |
47 | emit objectAdded(pointer->id, position); | |
48 | return pointer; | |
3 | 49 | } |