11 class EditContext; |
11 class EditContext; |
12 Model(); |
12 Model(); |
13 Model(const Model&) = delete; |
13 Model(const Model&) = delete; |
14 int size() const; |
14 int size() const; |
15 EditContext edit(); |
15 EditContext edit(); |
|
16 signals: |
|
17 void objectAdded(modelobjects::Id id, int position); |
16 private: |
18 private: |
17 template<typename T, typename... Args> |
19 template<typename T, typename... Args> |
18 T* append(Args&&... args); |
20 T* append(Args&&... args); |
19 template<typename T, typename... Args> |
21 template<typename T, typename... Args> |
20 T* insert(int position, Args&&... args); |
22 T* insert(int position, Args&&... args); |
21 bool modified = false; |
23 bool modified = false; |
22 QString path; |
24 QString path; |
23 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; |
25 using ModelObjectPointer = std::unique_ptr<modelobjects::BaseObject>; |
24 LDHeader header; |
26 LDHeader header; |
25 std::vector<ModelObjectPointer> body; |
27 std::vector<ModelObjectPointer> body; |
|
28 std::map<modelobjects::Id, modelobjects::BaseObject*> objectsById; |
26 }; |
29 }; |
27 |
30 |
28 template<typename T, typename... Args> |
31 template<typename T, typename... Args> |
29 T* Model::append(Args&&... args) |
32 T* Model::append(Args&&... args) |
30 { |
33 { |
31 this->body.push_back(std::make_unique<T>(args...)); |
34 this->body.push_back(std::make_unique<T>(args...)); |
32 return static_cast<T*>(this->body.back().get()); |
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; |
33 } |
39 } |
34 |
40 |
35 template<typename T, typename... Args> |
41 template<typename T, typename... Args> |
36 T* Model::insert(int position, Args&&... args) |
42 T* Model::insert(int position, Args&&... args) |
37 { |
43 { |
38 this->body.insert(position, std::make_unique<T>(args...)); |
44 this->body.insert(position, std::make_unique<T>(args...)); |
39 return this->body[position]; |
45 T* pointer = static_cast<T*>(this->body[position]); |
|
46 this->objectsById[pointer->id] = pointer; |
|
47 emit objectAdded(pointer->id, position); |
|
48 return pointer; |
40 } |
49 } |