src/model.cpp

Fri, 01 Jul 2022 16:46:43 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Fri, 01 Jul 2022 16:46:43 +0300
changeset 312
2637134bc37c
parent 309
d862721d19a3
child 326
65dbfcb859a7
permissions
-rw-r--r--

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
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
1 /*
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
2 * LDForge: LDraw parts authoring CAD
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
3 * Copyright (C) 2013 - 2020 Teemu Piippo
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
4 *
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
5 * This program is free software: you can redistribute it and/or modify
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
6 * it under the terms of the GNU General Public License as published by
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
7 * the Free Software Foundation, either version 3 of the License, or
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
8 * (at your option) any later version.
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
9 *
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
10 * This program is distributed in the hope that it will be useful,
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
13 * GNU General Public License for more details.
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
14 *
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
15 * You should have received a copy of the GNU General Public License
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
17 */
1a0faaaceb84 added license
Teemu Piippo <teemu@hecknology.net>
parents: 21
diff changeset
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
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
111 QString modelElementToString(const ModelElement &element)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
112 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
113 return std::visit(overloaded{
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
114 [](const Colored<SubfileReference>& ref) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
115 return QStringLiteral("1 %1 %2 %3")
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
116 .arg(ref.color.index)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
117 .arg(transformToString(ref.transformation))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
118 .arg(ref.name);
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
119 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
120 [](const Colored<LineSegment>& seg) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
121 return QStringLiteral("2 %1 %2 %3")
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
122 .arg(seg.color.index)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
123 .arg(vertexToString(seg.p1))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
124 .arg(vertexToString(seg.p2));
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
125 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
126 [](const Colored<Triangle>& triangle) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
127 return QStringLiteral("3 %1 %2 %3 %4")
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
128 .arg(triangle.color.index)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
129 .arg(vertexToString(triangle.p1))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
130 .arg(vertexToString(triangle.p2))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
131 .arg(vertexToString(triangle.p3));
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
132 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
133 [](const Colored<Quadrilateral>& quad) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
134 return QStringLiteral("4 %1 %2 %3 %4 %5")
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
135 .arg(quad.color.index)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
136 .arg(vertexToString(quad.p1))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
137 .arg(vertexToString(quad.p2))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
138 .arg(vertexToString(quad.p3))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
139 .arg(vertexToString(quad.p4));
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
140 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
141 [](const Colored<ConditionalEdge>& cedge) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
142 return QStringLiteral("5 %1 %2 %3 %4 %5")
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
143 .arg(cedge.color.index)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
144 .arg(vertexToString(cedge.p1))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
145 .arg(vertexToString(cedge.p2))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
146 .arg(vertexToString(cedge.c1))
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
147 .arg(vertexToString(cedge.c2));
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
155 [](const Comment& comment) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
156 return "0 " + comment.text;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
157 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
158 [](const Empty&) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
159 return QStringLiteral("");
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
160 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
161 [](const ParseError& parseError) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
162 return parseError.code;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
163 },
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
164 }, element);
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
165 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
166
148
e1ced2523cad reworking
Teemu Piippo <teemu@hecknology.net>
parents: 147
diff changeset
167 Model::Model(QObject *parent) :
e1ced2523cad reworking
Teemu Piippo <teemu@hecknology.net>
parents: 147
diff changeset
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
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
171
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
172 Model::~Model()
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
173 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
174 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
183 this->body.push_back({value, id});
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
184 this->positions[id] = position;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
185 Q_EMIT this->endInsertRows();
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
186 return id;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
187 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
190 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
191 return this->body[position].data;
3
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
192 }
55a55a9ec2c2 Added lots of code
Teemu Piippo <teemu@hecknology.net>
parents:
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
195 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
196 return this->body[position].id;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
197 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
203 Q_EMIT this->dataChanged(index, index);
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
204 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
207 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
208 return pointerToOptional(findInMap(this->positions, id));
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
209 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
263 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
264 return this->body[index].data;
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
265 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
1a9eac27698d selection works now
Teemu Piippo <teemu@hecknology.net>
parents: 35
diff changeset
268 {
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
269 return this->body.size();
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
270 }
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
271
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
272 void save(const Model &model, QIODevice *device)
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
273 {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
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
1a9eac27698d selection works now
Teemu Piippo <teemu@hecknology.net>
parents: 35
diff changeset
278 }
1a9eac27698d selection works now
Teemu Piippo <teemu@hecknology.net>
parents: 35
diff changeset
279
137
fb9990772357 Add documentation to model.cpp
Teemu Piippo <teemu@hecknology.net>
parents: 133
diff changeset
280 /**
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
281 * @brief Sets the path to the model
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
282 * @param path New path to use
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
283 */
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
284 void updateHeaderNameField(Model& model, const QString &name)
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
285 {
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
286 // Update the "Name: 1234.dat" comment
200
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
287 if (model.size() >= 2) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
288 if (const Comment* nameObject = std::get_if<Comment>(&model[1])) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
289 if (nameObject->text.startsWith("Name: ")) {
ca23936b455b Giant refactor
Teemu Piippo <teemu@hecknology.net>
parents: 173
diff changeset
290 model[1] = Comment{"Name: " + name};
141
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
291 }
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
292 }
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
293 }
185eb297dc1e Saving works now
Teemu Piippo <teemu@hecknology.net>
parents: 140
diff changeset
294 }

mercurial