src/model.h

changeset 6
73e448b2943d
parent 5
593a658cba8e
child 8
44679e468ba9
equal deleted inserted replaced
5:593a658cba8e 6:73e448b2943d
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 }

mercurial