Tue, 01 Mar 2022 17:00:19 +0200
work on edit history
3 | 1 | #pragma once |
2 | #include <QPointF> | |
3 | #include <QString> | |
4 | #include <QStringView> | |
5 | #include "main.h" | |
6 | #include "colors.h" | |
21 | 7 | #include "gl/common.h" |
89 | 8 | #include "linetypes/propertygenerics.h" |
9 | ||
10 | class Model; | |
3 | 11 | |
35
98906a94732f
renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents:
33
diff
changeset
|
12 | namespace ldraw |
3 | 13 | { |
21 | 14 | struct GetPolygonsContext; |
13 | 15 | class Object; |
16 | class ColoredObject; | |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
17 | class Empty; |
77
028798a72591
added some meta stuff, simplified quadrilateral splitting and tested it
Teemu Piippo <teemu@hecknology.net>
parents:
73
diff
changeset
|
18 | class UnhandledProperty; |
3 | 19 | } |
20 | ||
21 | 21 | class DocumentManager; |
22 | ||
35
98906a94732f
renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents:
33
diff
changeset
|
23 | struct ldraw::GetPolygonsContext |
21 | 24 | { |
148 | 25 | ::ModelId modelId; |
21 | 26 | ::DocumentManager* documents; |
27 | }; | |
28 | ||
35
98906a94732f
renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents:
33
diff
changeset
|
29 | class ldraw::Object |
3 | 30 | { |
31 | public: | |
32 | enum class SetPropertyResult | |
33 | { | |
34 | Success = 0, | |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
35 | PropertyNotHandled |
3 | 36 | }; |
132
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
37 | /** |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
38 | * @brief Enumerates different object types |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
39 | */ |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
40 | enum class Type |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
41 | { |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
42 | Empty, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
43 | Comment, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
44 | MetaCommand, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
45 | ErrorLine, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
46 | SubfileReference, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
47 | EdgeLine, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
48 | ConditionalEdge, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
49 | Triangle, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
50 | Quadrilateral, |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
51 | }; |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
52 | friend bool handled(SetPropertyResult result) |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
53 | { |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
54 | return result == SetPropertyResult::Success; |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
55 | } |
81
62373840e33a
object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
56 | class BadPointIndex : public std::exception |
62373840e33a
object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
57 | { |
62373840e33a
object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
58 | }; |
13 | 59 | Object(); |
60 | Object(const Object&) = delete; | |
61 | virtual ~Object(); | |
73
97df974b5ed5
ldraw::Id is now templated for extra type safety
Teemu Piippo <teemu@hecknology.net>
parents:
35
diff
changeset
|
62 | const id_t id; |
3 | 63 | virtual bool hasColor() const; |
64 | virtual QVariant getProperty(Property id) const; | |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
65 | template<ldraw::Property property> |
141 | 66 | PropertyType<property> getProperty() const; |
67 | template<ldraw::Property property> | |
89 | 68 | SetPropertyResult setProperty(const PropertyType<property>& value); |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
69 | SetPropertyResult setProperty(const PropertyKeyValue& pair); |
6 | 70 | virtual QString textRepresentation() const = 0; |
71 | virtual QBrush textRepresentationForeground() const; | |
72 | virtual QBrush textRepresentationBackground() const; | |
73 | virtual QFont textRepresentationFont() const; | |
21 | 74 | virtual void getPolygons(std::vector<gl::Polygon>& polygons, GetPolygonsContext* context) const; |
26 | 75 | virtual void invert() {} |
81
62373840e33a
object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
76 | virtual int numPoints() const { return 0; } |
62373840e33a
object editor widgets start to form up
Teemu Piippo <teemu@hecknology.net>
parents:
77
diff
changeset
|
77 | virtual const glm::vec3& getPoint(int index) const; |
132
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
78 | virtual QDataStream& serialize(QDataStream& stream) const; |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
79 | virtual QDataStream& deserialize(QDataStream& stream); |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
80 | virtual Type typeIdentifier() const = 0; |
141 | 81 | virtual QString toLDrawCode() const = 0; |
132
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
82 | |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
83 | protected: |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
84 | template<Property property, typename Function> |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
85 | void handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function); |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
86 | virtual void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair); |
3 | 87 | }; |
88 | ||
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
89 | template<ldraw::Property property> |
89 | 90 | ldraw::Object::SetPropertyResult ldraw::Object::setProperty(const ldraw::PropertyType<property>& value) |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
91 | { |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
92 | SetPropertyResult result = SetPropertyResult::PropertyNotHandled; |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
93 | this->setProperty(&result, PropertyKeyValue{property, QVariant::fromValue(value)}); |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
94 | return result; |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
95 | } |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
96 | |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
97 | template<ldraw::Property property, typename Function> |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
98 | void ldraw::Object::handle(SetPropertyResult* result, const PropertyKeyValue& pair, Function function) |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
99 | { |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
100 | if (pair.key == property) |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
101 | { |
89 | 102 | function(pair.value.value<ldraw::PropertyType<property>>()); |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
103 | *result = SetPropertyResult::Success; |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
104 | } |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
105 | } |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
106 | |
141 | 107 | template<ldraw::Property property> |
108 | ldraw::PropertyType<property> ldraw::Object::getProperty() const | |
109 | { | |
110 | return this->getProperty(property).value<ldraw::PropertyType<property>>(); | |
111 | } | |
112 | ||
35
98906a94732f
renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents:
33
diff
changeset
|
113 | class ldraw::ColoredObject : public Object |
3 | 114 | { |
115 | public: | |
139
72098474d362
Document and refactor colors.cpp and colors.h
Teemu Piippo <teemu@hecknology.net>
parents:
132
diff
changeset
|
116 | ColoredObject(const Color colorIndex = ldraw::MAIN_COLOR); |
3 | 117 | bool hasColor() const override final; |
118 | QVariant getProperty(Property id) const override; | |
132
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
119 | QDataStream &serialize(QDataStream& stream) const override; |
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
120 | QDataStream& deserialize(QDataStream& stream) override; |
139
72098474d362
Document and refactor colors.cpp and colors.h
Teemu Piippo <teemu@hecknology.net>
parents:
132
diff
changeset
|
121 | Color colorIndex = ldraw::MAIN_COLOR; |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
122 | protected: |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
81
diff
changeset
|
123 | void setProperty(SetPropertyResult* result, const PropertyKeyValue& pair) override; |
3 | 124 | }; |
6 | 125 | |
13 | 126 | /** |
127 | * @brief Represents an empty line. | |
128 | */ | |
35
98906a94732f
renamed the linetypes namespace to ldraw namespace and added more structures to it
Teemu Piippo <teemu@hecknology.net>
parents:
33
diff
changeset
|
129 | class ldraw::Empty : public Object |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
130 | { |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
131 | QString textRepresentation() const override; |
132
488d0ba6070b
Begin work with serialization
Teemu Piippo <teemu@hecknology.net>
parents:
89
diff
changeset
|
132 | Type typeIdentifier() const override; |
141 | 133 | QString toLDrawCode() const override; |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
6
diff
changeset
|
134 | }; |