| 24 |
24 |
| 25 class Model::EditContext |
25 class Model::EditContext |
| 26 { |
26 { |
| 27 public: |
27 public: |
| 28 template<typename T, typename... Args> |
28 template<typename T, typename... Args> |
| 29 ldraw::id_t append(Args&&... args); |
29 ldraw::Id<T> append(Args&&... args); |
| 30 ldraw::id_t append(std::unique_ptr<ldraw::Object>&& object); |
30 ldraw::id_t append(std::unique_ptr<ldraw::Object>&& object); |
| 31 template<typename T, typename... Args> |
31 template<typename T, typename... Args> |
| 32 ldraw::id_t insert(int position, Args&&... args); |
32 ldraw::Id<T> insert(int position, Args&&... args); |
| |
33 void remove(int position); |
| 33 void setObjectProperty( |
34 void setObjectProperty( |
| 34 ldraw::Object* object, |
35 ldraw::id_t object, |
| 35 ldraw::Property property, |
36 ldraw::Property property, |
| 36 const QVariant &value); |
37 const QVariant &value); |
| 37 void invertObject(ldraw::id_t id); |
38 void invertObject(ldraw::id_t id); |
| 38 Model& model(); |
39 Model& model(); |
| 39 private: |
40 private: |
| 41 friend class Model; |
42 friend class Model; |
| 42 Model& storedModel; |
43 Model& storedModel; |
| 43 }; |
44 }; |
| 44 |
45 |
| 45 template<typename T, typename... Args> |
46 template<typename T, typename... Args> |
| 46 ldraw::id_t Model::EditContext::append(Args&&... args) |
47 ldraw::Id<T> Model::EditContext::append(Args&&... args) |
| 47 { |
48 { |
| 48 return this->storedModel.append<T>(args...); |
49 return this->storedModel.append<T>(args...); |
| 49 } |
50 } |
| 50 |
51 |
| 51 template<typename T, typename... Args> |
52 template<typename T, typename... Args> |
| 52 ldraw::id_t Model::EditContext::insert(int position, Args&&... args) |
53 ldraw::Id<T> Model::EditContext::insert(int position, Args&&... args) |
| 53 { |
54 { |
| 54 return this->storedModel.insert<T>(position, args...); |
55 return this->storedModel.insert<T>(position, args...); |
| 55 } |
56 } |
| 56 |
57 |
| 57 namespace ldraw |
58 namespace ldraw |
| 58 { |
59 { |
| 59 /// Determines how quadrilaterals are split into triangles |
60 /// Determines how quadrilaterals are split into triangles |
| 60 enum class QuadrilateralSplit |
61 enum class Diagonal |
| 61 { |
62 { |
| 62 Split123_134, |
63 Diagonal_13, |
| 63 Split124_234 |
64 Diagonal_24 |
| 64 }; |
65 }; |
| 65 |
66 |
| 66 // Splits the specified quadrilateral into triangles. |
67 // Splits the specified quadrilateral into triangles. |
| 67 // If it is not a quadrilateral then no action is performed |
68 // If it is not a quadrilateral then no action is performed |
| 68 auto splitQuadrilateral(Model::EditContext& editor, |
69 auto splitQuadrilateral(Model::EditContext& editor, |
| 69 quadrilateralid_t quadrilateral_id, |
70 quadrilateralid_t quadrilateral_id, |
| 70 QuadrilateralSplit splitType = QuadrilateralSplit::Split123_134 |
71 Diagonal splitType = Diagonal::Diagonal_13 |
| 71 ) -> std::optional<std::pair<triangleid_t, triangleid_t>>; |
72 ) -> std::optional<std::pair<triangleid_t, triangleid_t>>; |
| 72 } |
73 } |