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