40 EditContext edit(); |
40 EditContext edit(); |
41 int rowCount(const QModelIndex&) const override; |
41 int rowCount(const QModelIndex&) const override; |
42 QVariant data(const QModelIndex& index, int role) const override; |
42 QVariant data(const QModelIndex& index, int role) const override; |
43 QVariant getHeaderProperty(const HeaderProperty property); |
43 QVariant getHeaderProperty(const HeaderProperty property); |
44 const QString& getName() const; |
44 const QString& getName() const; |
45 QVariant getObjectProperty(const int index, const linetypes::Property property) const; |
45 QVariant getObjectProperty(const int index, const ldraw::Property property) const; |
46 std::vector<gl::Polygon> getPolygons(class DocumentManager* documents) const; |
46 std::vector<gl::Polygon> getPolygons(class DocumentManager* documents) const; |
47 void getObjectPolygons(const int index, std::vector<gl::Polygon>& polygons_out, linetypes::GetPolygonsContext* context) const; |
47 void getObjectPolygons(const int index, std::vector<gl::Polygon>& polygons_out, ldraw::GetPolygonsContext* context) const; |
48 signals: |
48 signals: |
49 void objectAdded(linetypes::Id id, int position); |
49 void objectAdded(ldraw::Id id, int position); |
50 private: |
50 private: |
51 using ModelObjectPointer = std::unique_ptr<linetypes::Object>; |
51 using ModelObjectPointer = std::unique_ptr<ldraw::Object>; |
52 template<typename T, typename... Args> |
52 template<typename T, typename... Args> |
53 linetypes::Id append(Args&&... args); |
53 ldraw::Id append(Args&&... args); |
54 void append(ModelObjectPointer&& object); |
54 void append(ModelObjectPointer&& object); |
55 template<typename T, typename... Args> |
55 template<typename T, typename... Args> |
56 linetypes::Id insert(int position, Args&&... args); |
56 ldraw::Id insert(int position, Args&&... args); |
57 bool modified = false; |
57 bool modified = false; |
58 QString path; |
58 QString path; |
59 LDHeader header; |
59 LDHeader header; |
60 std::vector<ModelObjectPointer> body; |
60 std::vector<ModelObjectPointer> body; |
61 std::map<linetypes::Id, linetypes::Object*> objectsById; |
61 std::map<ldraw::Id, ldraw::Object*> objectsById; |
62 mutable std::vector<gl::Polygon> cachedPolygons; |
62 mutable std::vector<gl::Polygon> cachedPolygons; |
63 mutable bool needRecache = true; |
63 mutable bool needRecache = true; |
64 }; |
64 }; |
65 |
65 |
66 template<typename T, typename... Args> |
66 template<typename T, typename... Args> |
67 linetypes::Id Model::append(Args&&... args) |
67 ldraw::Id Model::append(Args&&... args) |
68 { |
68 { |
69 emit layoutAboutToBeChanged(); |
69 emit layoutAboutToBeChanged(); |
70 this->body.push_back(std::make_unique<T>(args...)); |
70 this->body.push_back(std::make_unique<T>(args...)); |
71 linetypes::Object* pointer = this->body.back().get(); |
71 ldraw::Object* pointer = this->body.back().get(); |
72 this->objectsById[pointer->id] = pointer; |
72 this->objectsById[pointer->id] = pointer; |
73 emit objectAdded(pointer->id, this->body.size() - 1); |
73 emit objectAdded(pointer->id, this->body.size() - 1); |
74 emit layoutChanged(); |
74 emit layoutChanged(); |
75 return pointer->id; |
75 return pointer->id; |
76 } |
76 } |
77 |
77 |
78 template<typename T, typename... Args> |
78 template<typename T, typename... Args> |
79 linetypes::Id Model::insert(int position, Args&&... args) |
79 ldraw::Id Model::insert(int position, Args&&... args) |
80 { |
80 { |
81 emit layoutAboutToBeChanged(); |
81 emit layoutAboutToBeChanged(); |
82 this->body.insert(position, std::make_unique<T>(args...)); |
82 this->body.insert(position, std::make_unique<T>(args...)); |
83 linetypes::Object* pointer = this->body[position].get(); |
83 ldraw::Object* pointer = this->body[position].get(); |
84 this->objectsById[pointer->id] = pointer; |
84 this->objectsById[pointer->id] = pointer; |
85 emit objectAdded(pointer->id, position); |
85 emit objectAdded(pointer->id, position); |
86 emit layoutChanged(); |
86 emit layoutChanged(); |
87 return pointer->id; |
87 return pointer->id; |
88 } |
88 } |