Mon, 11 May 2020 12:18:59 +0300
object editing
| 89 | 1 | #include <QFormLayout> | 
| 
83
 
b8bd338eb602
refactor, added splitter
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
81 
diff
changeset
 | 
2 | #include <QSplitter> | 
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
3 | #include "model.h" | 
| 
86
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
4 | #include "modeleditcontext.h" | 
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
5 | #include "widgets/vec3editor.h" | 
| 
86
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
6 | #include "ui/polygonobjecteditor.h" | 
| 
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
7 | |
| 89 | 8 | static constexpr char INDEX_NAME[] = "_ldforge_index"; | 
| 9 | static constexpr char PROPERTY_NAME[] = "_ldforge_property"; | |
| 10 | static constexpr char OBJECT_ID_NAME[] = "_ldforge_id"; | |
| 11 | static constexpr char LABEL_NAME[] = "_ldforge_label"; | |
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
12 | |
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
13 | PolygonObjectEditor::PolygonObjectEditor(Model* model, ldraw::id_t id, QWidget* parent) : | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
14 | QWidget{parent}, | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
15 | model{model}, | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
16 | storedObjectId{ldraw::NULL_ID.value} | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
17 | { | 
| 89 | 18 | this->splitter.emplace(Qt::Vertical, this); | 
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
19 | this->setObjectId(id); | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
20 | } | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
21 | |
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
22 | // destructor needed for std::unique_ptr | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
23 | PolygonObjectEditor::~PolygonObjectEditor() | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
24 | { | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
25 | } | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
26 | |
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
27 | ldraw::id_t PolygonObjectEditor::objectId() const | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
28 | { | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
29 | return this->storedObjectId; | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
30 | } | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
31 | |
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
32 | void PolygonObjectEditor::setObjectId(ldraw::id_t id) | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
33 | { | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
34 | this->storedObjectId = id; | 
| 89 | 35 | this->buildWidgets(); | 
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
36 | } | 
| 
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
37 | |
| 89 | 38 | void PolygonObjectEditor::buildWidgets() | 
| 
86
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
39 | { | 
| 89 | 40 | this->widgets.clear(); | 
| 41 | delete this->layout(); | |
| 42 | QFormLayout* layout = new QFormLayout{this}; | |
| 43 | this->setLayout(layout); | |
| 44 | for (int n : {0, 1, 2, 3}) | |
| 45 | { | |
| 46 | this->setupPointWidget(n); | |
| 47 | } | |
| 48 | for (std::unique_ptr<QWidget>& widget : this->widgets) | |
| 
86
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
49 | { | 
| 89 | 50 | const QString label = widget->property(LABEL_NAME).toString(); | 
| 51 | layout->addRow(label, widget.get()); | |
| 52 | } | |
| 53 | layout->addRow("", &*this->splitter); | |
| 54 | } | |
| 55 | ||
| 56 | void PolygonObjectEditor::setupPointWidget(int n) | |
| 57 | { | |
| 58 | const ldraw::Object* const object = this->model->get(this->objectId()); | |
| 59 | const ldraw::Property property = ldraw::pointProperty(n); | |
| 60 | const QVariant value = object->getProperty(property); | |
| 61 | if (value.isValid()) | |
| 62 | { | |
| 63 | std::unique_ptr<Vec3Editor> editor = std::make_unique<Vec3Editor>(value.value<glm::vec3>(), this); | |
| 64 | QObject::connect(editor.get(), &Vec3Editor::valueChanged, this, &PolygonObjectEditor::pointChanged); | |
| 65 | editor->setProperty(INDEX_NAME, QVariant::fromValue(n)); | |
| 66 | editor->setProperty(LABEL_NAME, &ldraw::traits(property).name[0]); | |
| 67 | this->widgets.push_back(std::move(editor)); | |
| 
86
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
68 | } | 
| 
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
69 | } | 
| 
 
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
 
Teemu Piippo <teemu@hecknology.net> 
parents: 
84 
diff
changeset
 | 
70 | |
| 89 | 71 | void PolygonObjectEditor::pointChanged(const glm::vec3& value) | 
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
72 | { | 
| 89 | 73 | Model::EditContext editcontext = this->model->edit(); | 
| 74 | const int n = this->sender()->property(INDEX_NAME).toInt(); | |
| 75 | const ldraw::Property property = ldraw::pointProperty(n); | |
| 76 | editcontext.setObjectProperty(this->objectId(), property, QVariant::fromValue(value)); | |
| 
81
 
62373840e33a
object editor widgets start to form up
 
Teemu Piippo <teemu@hecknology.net> 
parents:  
diff
changeset
 | 
77 | } |