--- a/src/ui/objecteditor.cpp Wed Jun 22 16:13:01 2022 +0300 +++ b/src/ui/objecteditor.cpp Wed Jun 22 16:13:15 2022 +0300 @@ -8,14 +8,14 @@ #include "widgets/vec3editor.h" #include "ui_objecteditor.h" -using PropertyValue = std::variant< - const glm::vec3*, - const glm::mat4*, - const QString*, - ldraw::Color, - const CircularFraction*>; +using PropertyPointer = std::variant< + glm::vec3*, + glm::mat4*, + QString*, + ldraw::Color*, + CircularFraction*>; -enum PropertyKey +enum class PropertyKey { Point1, Point2, @@ -31,52 +31,102 @@ Fraction, }; -std::map<PropertyKey, PropertyValue> getProperties(const ModelElement& element) +constexpr std::size_t NUM_PROPERTIES = static_cast<int>(PropertyKey::Fraction) + 1; + +static QString propertyName(PropertyKey key) { - std::map<PropertyKey, PropertyValue> result; + switch (key) { + case PropertyKey::Point1: + return ObjectEditor::tr("Vertex 1"); + case PropertyKey::Point2: + return ObjectEditor::tr("Vertex 2"); + case PropertyKey::Point3: + return ObjectEditor::tr("Vertex 3"); + case PropertyKey::Point4: + return ObjectEditor::tr("Vertex 4"); + case PropertyKey::Control1: + return ObjectEditor::tr("Control point 1"); + case PropertyKey::Control2: + return ObjectEditor::tr("Control point 2"); + case PropertyKey::Color: + return ObjectEditor::tr("Colour"); + case PropertyKey::Transformation: + return ObjectEditor::tr("Transformation"); + case PropertyKey::Name: + return ObjectEditor::tr("Name"); + case PropertyKey::Text: + return ObjectEditor::tr("Text"); + case PropertyKey::Code: + return ObjectEditor::tr("Code"); + case PropertyKey::Fraction: + return ObjectEditor::tr("Fraction"); + } + return ""; +} + +static std::map<PropertyKey, PropertyPointer> collectProperties(ModelElement& element) +{ + std::map<PropertyKey, PropertyPointer> result; std::visit<void>(overloaded{ - [&](const Colored<LineSegment>& edge) { - result[Point1] = &edge.p1; - result[Point2] = &edge.p2; - result[Color] = edge.color; - }, - [&](const Colored<Triangle>& tri) { - result[Point1] = &tri.p1; - result[Point2] = &tri.p2; - result[Point3] = &tri.p3; - result[Color] = tri.color; + [&](Colored<LineSegment>& edge) { + result[PropertyKey::Point1] = &edge.p1; + result[PropertyKey::Point2] = &edge.p2; + result[PropertyKey::Color] = &edge.color; }, - [&](const Colored<Quadrilateral>& quad) { - result[Point1] = &quad.p1; - result[Point2] = &quad.p2; - result[Point3] = &quad.p3; - result[Point4] = &quad.p4; - result[Color] = quad.color; + [&](Colored<Triangle>& tri) { + result[PropertyKey::Point1] = &tri.p1; + result[PropertyKey::Point2] = &tri.p2; + result[PropertyKey::Point3] = &tri.p3; + result[PropertyKey::Color] = &tri.color; + }, + [&](Colored<Quadrilateral>& quad) { + result[PropertyKey::Point1] = &quad.p1; + result[PropertyKey::Point2] = &quad.p2; + result[PropertyKey::Point3] = &quad.p3; + result[PropertyKey::Point4] = &quad.p4; + result[PropertyKey::Color] = &quad.color; }, - [&](const Colored<ConditionalEdge>& cedge) { - result[Point1] = &cedge.p1; - result[Point2] = &cedge.p2; - result[Control1] = &cedge.c1; - result[Control2] = &cedge.c2; - result[Color] = cedge.color; + [&](Colored<ConditionalEdge>& cedge) { + result[PropertyKey::Point1] = &cedge.p1; + result[PropertyKey::Point2] = &cedge.p2; + result[PropertyKey::Control1] = &cedge.c1; + result[PropertyKey::Control2] = &cedge.c2; + result[PropertyKey::Color] = &cedge.color; }, - [&](const Colored<SubfileReference>& ref) { - result[Transformation] = &ref.transformation; - result[Name] = &ref.name; - result[Color] = ref.color; + [&](Colored<SubfileReference>& ref) { + result[PropertyKey::Transformation] = &ref.transformation; + result[PropertyKey::Name] = &ref.name; + result[PropertyKey::Color] = &ref.color; }, - [&](const Colored<CircularPrimitive>& circ) { - result[Transformation] = &circ.transformation; - result[Fraction] = &circ.fraction; - result[Color] = circ.color; + [&](Colored<CircularPrimitive>& circ) { + result[PropertyKey::Transformation] = &circ.transformation; + result[PropertyKey::Fraction] = &circ.fraction; + result[PropertyKey::Color] = &circ.color; }, [&](Empty) {}, - [&](const Comment& comment) { - result[Text] = &comment.text; + [&](Comment& comment) { + result[PropertyKey::Text] = &comment.text; }, - [&](const ParseError& parseError) { - result[Code] = &parseError.code; + [&](ParseError& parseError) { + result[PropertyKey::Code] = &parseError.code; }, }, element); return result; } + + +ObjectEditor::ObjectEditor(QWidget* parent) : + QWidget{parent} +{ + this->ui.setupUi(this); + this->editorwidgets.resize(NUM_PROPERTIES); + QFormLayout* layout = new QFormLayout{this}; + for (std::size_t i = 0; i < NUM_PROPERTIES; ++i) { + const auto key = static_cast<PropertyKey>(i); + QLabel* const label = new QLabel{propertyName(key), this}; + QWidget* const field = new QWidget{this}; + this->editorwidgets[i] = field; + layout->addRow(label, field); + } + this->ui.properties->setLayout(layout); +}