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