Fri, 01 Jul 2022 16:46:43 +0300
Fix right click to delete not really working properly
Instead of removing the point that had been added, it would remove
the point that is being drawn, which would cause it to overwrite the
previous point using the new point, causing a bit of a delay
24 | 1 | /* |
2 | * LDForge: LDraw parts authoring CAD | |
3 | * Copyright (C) 2013 - 2020 Teemu Piippo | |
4 | * | |
5 | * This program is free software: you can redistribute it and/or modify | |
6 | * it under the terms of the GNU General Public License as published by | |
7 | * the Free Software Foundation, either version 3 of the License, or | |
8 | * (at your option) any later version. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | * GNU General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU General Public License | |
16 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
17 | */ | |
18 | ||
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
19 | #include <QPixmap> |
264
76a025db4948
Convert all includes to be relative to project root directory. Files that cannot be found in this manner use angle brackets.
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
251
diff
changeset
|
20 | #include "src/model.h" |
3 | 21 | |
232
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
22 | constexpr unsigned int gcd(unsigned int a, unsigned int b) |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
23 | { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
24 | while (a != b) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
25 | if (b > a) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
26 | b -= a; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
27 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
28 | else if (a > b) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
29 | a -= b; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
30 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
31 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
32 | return a; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
33 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
34 | |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
35 | static_assert(gcd(16, 15) == 1); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
36 | static_assert(gcd(16, 4) == 4); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
37 | static_assert(gcd(272, 192) == 16); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
38 | |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
39 | static constexpr const char* circularPrimitiveTypeString(const CircularPrimitive& circ) |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
40 | { |
242
16855456992d
Substitute circular primitives in during file parsing
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
232
diff
changeset
|
41 | return circularPrimitiveStems[circ.type]; |
232
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
42 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
43 | |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
44 | static QString circularPrimitiveFilePath(const CircularPrimitive& circ) |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
45 | { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
46 | QString result; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
47 | if (circ.fraction.divisions != 16) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
48 | result += QString::number(circ.fraction.divisions) + QStringLiteral("\\"); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
49 | } |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
50 | const unsigned int factor = gcd(circ.fraction.segments, circ.fraction.divisions); |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
51 | unsigned int num = circ.fraction.segments / factor; |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
52 | unsigned int denom = circ.fraction.divisions / factor; |
232
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
53 | if (denom < 4) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
54 | num *= 4 / denom; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
55 | denom = 4; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
56 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
57 | result += QStringLiteral("%1-%2").arg(num).arg(denom); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
58 | result += QString::fromLatin1(circularPrimitiveTypeString(circ)); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
59 | result += QStringLiteral(".dat"); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
60 | return result; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
61 | } |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
62 | |
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
63 | static const char* iconPathForElement(const ModelElement& element) |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
64 | { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
65 | return std::visit(overloaded{ |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
66 | [](const Colored<SubfileReference>&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
67 | return ":/icons/linetype-subfile.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
68 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
69 | [](const Colored<LineSegment>&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
70 | return ":/icons/linetype-edgeline.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
71 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
72 | [](const Colored<Triangle>&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
73 | return ":/icons/linetype-triangle.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
74 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
75 | [](const Colored<Quadrilateral>&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
76 | return ":/icons/linetype-quadrilateral.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
77 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
78 | [](const Colored<ConditionalEdge>&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
79 | return ":/icons/linetype-conditionaledge.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
80 | }, |
232
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
81 | [](const Colored<CircularPrimitive>&) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
82 | return ":/icons/linetype-circularprimitive.png"; |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
83 | }, |
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
84 | [](const Comment&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
85 | return ":/icons/chatbubble-ellipses-outline.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
86 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
87 | [](const Empty&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
88 | return ""; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
89 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
90 | [](const ParseError&) { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
91 | return ":/icons/linetype-errorline.png"; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
92 | }, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
93 | }, element); |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
94 | } |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
95 | |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
96 | static QPixmap iconForElement(const ModelElement& element) |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
97 | { |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
98 | // We avoid processing the same image over and over again by storing it |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
99 | // in a static constant. However, we need one per each possible type |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
100 | // of ModelElement, so we put the pixmap constant inside a templated lambda, |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
101 | // which gets instiated once for each type of ModelElement. |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
102 | return std::visit([](auto&& element){ |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
103 | static const QPixmap pixmap = QPixmap::fromImage( |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
104 | QImage{iconPathForElement(element)} |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
105 | .scaledToHeight(24, Qt::SmoothTransformation) |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
106 | ); |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
107 | return pixmap; |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
108 | }, element); |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
109 | } |
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
110 | |
200 | 111 | QString modelElementToString(const ModelElement &element) |
112 | { | |
113 | return std::visit(overloaded{ | |
114 | [](const Colored<SubfileReference>& ref) { | |
115 | return QStringLiteral("1 %1 %2 %3") | |
116 | .arg(ref.color.index) | |
117 | .arg(transformToString(ref.transformation)) | |
118 | .arg(ref.name); | |
119 | }, | |
120 | [](const Colored<LineSegment>& seg) { | |
121 | return QStringLiteral("2 %1 %2 %3") | |
122 | .arg(seg.color.index) | |
123 | .arg(vertexToString(seg.p1)) | |
124 | .arg(vertexToString(seg.p2)); | |
125 | }, | |
126 | [](const Colored<Triangle>& triangle) { | |
127 | return QStringLiteral("3 %1 %2 %3 %4") | |
128 | .arg(triangle.color.index) | |
129 | .arg(vertexToString(triangle.p1)) | |
130 | .arg(vertexToString(triangle.p2)) | |
131 | .arg(vertexToString(triangle.p3)); | |
132 | }, | |
133 | [](const Colored<Quadrilateral>& quad) { | |
134 | return QStringLiteral("4 %1 %2 %3 %4 %5") | |
135 | .arg(quad.color.index) | |
136 | .arg(vertexToString(quad.p1)) | |
137 | .arg(vertexToString(quad.p2)) | |
138 | .arg(vertexToString(quad.p3)) | |
139 | .arg(vertexToString(quad.p4)); | |
140 | }, | |
141 | [](const Colored<ConditionalEdge>& cedge) { | |
142 | return QStringLiteral("5 %1 %2 %3 %4 %5") | |
143 | .arg(cedge.color.index) | |
144 | .arg(vertexToString(cedge.p1)) | |
145 | .arg(vertexToString(cedge.p2)) | |
146 | .arg(vertexToString(cedge.c1)) | |
147 | .arg(vertexToString(cedge.c2)); | |
148 | }, | |
232
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
149 | [](const Colored<CircularPrimitive>& circ) { |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
150 | return QStringLiteral("1 %1 %2 %3") |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
151 | .arg(circ.color.index) |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
152 | .arg(transformToString(circ.transformation)) |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
153 | .arg(circularPrimitiveFilePath(circ)); |
8efa3a33172e
Add base code for circular primitives
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
208
diff
changeset
|
154 | }, |
200 | 155 | [](const Comment& comment) { |
156 | return "0 " + comment.text; | |
157 | }, | |
158 | [](const Empty&) { | |
159 | return QStringLiteral(""); | |
160 | }, | |
161 | [](const ParseError& parseError) { | |
162 | return parseError.code; | |
163 | }, | |
164 | }, element); | |
165 | } | |
166 | ||
148 | 167 | Model::Model(QObject *parent) : |
168 | QAbstractListModel{parent} | |
86
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
76
diff
changeset
|
169 | { |
4bec0525ef1b
PolygonObjectEditor can now modify the object properly
Teemu Piippo <teemu@hecknology.net>
parents:
76
diff
changeset
|
170 | } |
3 | 171 | |
200 | 172 | Model::~Model() |
173 | { | |
174 | } | |
175 | ||
309
d862721d19a3
Fixed ModelId being used to identify both models and elements, added ElementId to identify elements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
176 | ElementId Model::append(const ModelElement &value) |
3 | 177 | { |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
178 | const std::size_t position = this->size(); |
309
d862721d19a3
Fixed ModelId being used to identify both models and elements, added ElementId to identify elements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
179 | const ElementId id = this->runningId; |
200 | 180 | this->runningId.value += 1; |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
181 | const int row = narrow<int>(signed_cast(this->size())); |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
182 | Q_EMIT this->beginInsertRows({}, row, row); |
200 | 183 | this->body.push_back({value, id}); |
184 | this->positions[id] = position; | |
185 | Q_EMIT this->endInsertRows(); | |
186 | return id; | |
187 | } | |
188 | ||
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
189 | const ModelElement &Model::at(std::size_t position) const |
200 | 190 | { |
191 | return this->body[position].data; | |
3 | 192 | } |
193 | ||
309
d862721d19a3
Fixed ModelId being used to identify both models and elements, added ElementId to identify elements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
194 | ElementId Model::idAt(std::size_t position) const |
200 | 195 | { |
196 | return this->body[position].id; | |
197 | } | |
198 | ||
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
199 | void Model::assignAt(std::size_t position, const ModelElement &element) |
133
e39326ee48dc
Begin work on edit history
Teemu Piippo <teemu@hecknology.net>
parents:
112
diff
changeset
|
200 | { |
200 | 201 | this->body[position].data = element; |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
202 | const QModelIndex index = this->index(narrow<int>(signed_cast(position))); |
200 | 203 | Q_EMIT this->dataChanged(index, index); |
204 | } | |
205 | ||
309
d862721d19a3
Fixed ModelId being used to identify both models and elements, added ElementId to identify elements
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
264
diff
changeset
|
206 | std::optional<std::size_t> Model::find(ElementId id) const |
200 | 207 | { |
208 | return pointerToOptional(findInMap(this->positions, id)); | |
209 | } | |
210 | ||
204
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
211 | template<typename K, typename V> |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
212 | void removeFromMap(std::map<K, V>& map, const K& key) |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
213 | { |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
214 | const auto it = map.find(key); |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
215 | if (it != map.end()) { |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
216 | map.erase(it); |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
217 | } |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
218 | } |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
219 | |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
220 | void Model::remove(const std::size_t index) |
200 | 221 | { |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
222 | if (index < this->body.size()) { |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
223 | const int row = narrow<int>(signed_cast(index)); |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
224 | Q_EMIT this->beginRemoveRows({}, row, row); |
204
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
225 | removeFromMap(this->positions, this->body[index].id); |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
226 | this->body.erase(this->body.begin() + row); |
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
227 | for (std::size_t i = index; i < this->body.size(); ++i) { |
204
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
228 | this->positions[this->body[i].id] = i; |
52e10e8d88cc
Concentrate model editing into one coroutine inside main()
Teemu Piippo <teemu@hecknology.net>
parents:
200
diff
changeset
|
229 | } |
200 | 230 | Q_EMIT this->endRemoveRows(); |
133
e39326ee48dc
Begin work on edit history
Teemu Piippo <teemu@hecknology.net>
parents:
112
diff
changeset
|
231 | } |
e39326ee48dc
Begin work on edit history
Teemu Piippo <teemu@hecknology.net>
parents:
112
diff
changeset
|
232 | } |
e39326ee48dc
Begin work on edit history
Teemu Piippo <teemu@hecknology.net>
parents:
112
diff
changeset
|
233 | |
200 | 234 | int Model::rowCount(const QModelIndex &) const |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
235 | { |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
236 | return narrow<int>(signed_cast(this->size())); |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
237 | } |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
238 | |
200 | 239 | QVariant Model::data(const QModelIndex &index, int role) const |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
240 | { |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
241 | const std::size_t i = unsigned_cast(index.row()); |
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
242 | const ModelElement& element = this->body[i].data; |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
243 | switch(role) |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
244 | { |
158
5bd755eaa5a8
Add icons from ionicons
Teemu Piippo <teemu@hecknology.net>
parents:
153
diff
changeset
|
245 | case Qt::DecorationRole: |
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
246 | return iconForElement(element); |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
247 | case Qt::DisplayRole: |
208
930928b760a2
Add model icons back into the list view
Teemu Piippo <teemu@hecknology.net>
parents:
204
diff
changeset
|
248 | return modelElementToString(element); |
200 | 249 | /* |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
250 | case Qt::ForegroundRole: |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
251 | return object->textRepresentationForeground(); |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
252 | case Qt::BackgroundRole: |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
253 | return object->textRepresentationBackground(); |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
254 | case Qt::FontRole: |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
255 | return object->textRepresentationFont(); |
200 | 256 | */ |
8
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
257 | default: |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
258 | return {}; |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
259 | } |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
260 | } |
44679e468ba9
major update with many things
Teemu Piippo <teemu@hecknology.net>
parents:
3
diff
changeset
|
261 | |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
262 | const ModelElement &Model::operator[](std::size_t index) const |
200 | 263 | { |
264 | return this->body[index].data; | |
265 | } | |
266 | ||
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
267 | std::size_t Model::size() const |
51 | 268 | { |
200 | 269 | return this->body.size(); |
270 | } | |
271 | ||
272 | void save(const Model &model, QIODevice *device) | |
273 | { | |
274 | QTextStream out{device}; | |
250
2837b549e616
I felt that the compiler was too kind to me, so I enabled a big pile of warnings
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
242
diff
changeset
|
275 | for (std::size_t i = 0; i < model.size(); ++i) { |
200 | 276 | out << modelElementToString(model[i]) << "\r\n"; |
173
8a3047468994
Fix performance issues in Model::find
Teemu Piippo <teemu@hecknology.net>
parents:
159
diff
changeset
|
277 | } |
51 | 278 | } |
279 | ||
137
fb9990772357
Add documentation to model.cpp
Teemu Piippo <teemu@hecknology.net>
parents:
133
diff
changeset
|
280 | /** |
141 | 281 | * @brief Sets the path to the model |
282 | * @param path New path to use | |
283 | */ | |
200 | 284 | void updateHeaderNameField(Model& model, const QString &name) |
141 | 285 | { |
286 | // Update the "Name: 1234.dat" comment | |
200 | 287 | if (model.size() >= 2) { |
288 | if (const Comment* nameObject = std::get_if<Comment>(&model[1])) { | |
289 | if (nameObject->text.startsWith("Name: ")) { | |
290 | model[1] = Comment{"Name: " + name}; | |
141 | 291 | } |
292 | } | |
293 | } | |
294 | } |