src/modeleditcontext.cpp

changeset 76
7c4a63a02632
parent 73
97df974b5ed5
child 77
028798a72591
equal deleted inserted replaced
75:204dc77e5654 76:7c4a63a02632
29 this->model().objectsById[id] = object.get(); 29 this->model().objectsById[id] = object.get();
30 this->model().append(std::move(object)); 30 this->model().append(std::move(object));
31 return id; 31 return id;
32 } 32 }
33 33
34 void Model::EditContext::remove(int position)
35 {
36 this->model().remove(position);
37 }
38
34 void Model::EditContext::setObjectProperty( 39 void Model::EditContext::setObjectProperty(
35 ldraw::Object* object, 40 ldraw::id_t id,
36 ldraw::Property property, 41 ldraw::Property property,
37 const QVariant& value) 42 const QVariant& value)
38 { 43 {
39 object->setProperty(property, value); 44 ldraw::Object* object = this->model().objectAt(id);
45 if (object != nullptr)
46 {
47 object->setProperty(property, value);
48 }
40 } 49 }
41 50
42 void Model::EditContext::invertObject(ldraw::id_t id) 51 void Model::EditContext::invertObject(ldraw::id_t id)
43 { 52 {
44 auto it = this->model().objectsById.find(id); 53 auto it = this->model().objectsById.find(id);
52 Model& Model::EditContext::model() 61 Model& Model::EditContext::model()
53 { 62 {
54 return this->storedModel; 63 return this->storedModel;
55 } 64 }
56 65
66 namespace
67 {
68 using PropertyTriplet = std::tuple<ldraw::Property, ldraw::Property, ldraw::Property>;
69 }
70
71 static std::array<PropertyTriplet, 2> diagonalToPointProperties(ldraw::Diagonal diagonal)
72 {
73 std::array<PropertyTriplet, 2> result;
74 switch (diagonal)
75 {
76 case ldraw::Diagonal::Diagonal_13:
77 result = {
78 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point3),
79 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point3, ldraw::Property::Point4)
80 };
81 break;
82 case ldraw::Diagonal::Diagonal_24:
83 result = {
84 std::make_tuple(ldraw::Property::Point1, ldraw::Property::Point2, ldraw::Property::Point4),
85 std::make_tuple(ldraw::Property::Point2, ldraw::Property::Point3, ldraw::Property::Point4)
86 };
87 break;
88 }
89 return result;
90 }
91
57 auto ldraw::splitQuadrilateral( 92 auto ldraw::splitQuadrilateral(
58 Model::EditContext& editor, 93 Model::EditContext& editor,
59 ldraw::quadrilateralid_t quadrilateral_id, 94 ldraw::quadrilateralid_t quadrilateral_id,
60 ldraw::QuadrilateralSplit splitType 95 ldraw::Diagonal splitType
61 ) -> std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> 96 ) -> std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>>
62 { 97 {
63 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result; 98 std::optional<std::pair<ldraw::triangleid_t, ldraw::triangleid_t>> result;
64 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id); 99 QModelIndex index;
100 const ldraw::Quadrilateral* quadrilateral = editor.model().get(quadrilateral_id, &index);
65 if (quadrilateral != nullptr) 101 if (quadrilateral != nullptr)
66 { 102 {
67 103 Q_ASSERT(index.isValid());
104 int position = index.row();
105 editor.remove(position);
106 std::vector<ldraw::triangleid_t> triangles;
107 triangles.reserve(2);
108 const std::array<PropertyTriplet, 2> split = diagonalToPointProperties(splitType);
109 for (const PropertyTriplet& properties : split)
110 {
111 const ldraw::triangleid_t triangle = editor.insert<ldraw::Triangle>(
112 position,
113 quadrilateral->getProperty(std::get<0>(properties)).value<glm::vec3>(),
114 quadrilateral->getProperty(std::get<1>(properties)).value<glm::vec3>(),
115 quadrilateral->getProperty(std::get<2>(properties)).value<glm::vec3>(),
116 ldraw::Color{quadrilateral->getProperty(ldraw::Property::Color).toInt()});
117 triangles.push_back(triangle);
118 position += 1;
119 }
120 result = {triangles[0], triangles[1]};
68 } 121 }
69 return result; 122 return result;
70 } 123 }

mercurial