Thu, 21 Jun 2018 18:46:03 +0300
refactored the segments/divisions editor in MainWindow to a new widget
1302 | 1 | /* |
2 | * LDForge: LDraw parts authoring CAD | |
1326 | 3 | * Copyright (C) 2013 - 2018 Teemu Piippo |
1302 | 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 | ||
1291 | 19 | #include "headeredit.h" |
20 | #include "ui_headeredit.h" | |
1384 | 21 | #include "parser.h" |
1291 | 22 | #include "../lddocument.h" |
23 | #include "../headerhistorymodel.h" | |
24 | ||
25 | static const QStringList categories { | |
26 | "", | |
27 | "Animal", "Antenna", "Arch", "Arm", "Bar", "Baseplate", "Belville", "Boat", "Bracket", | |
28 | "Brick", "Canvas", "Car", "Clikits", "Cockpit", "Cone", "Constraction", | |
29 | "Constraction Accessory", "Container", "Conveyor", "Crane", "Cylinder", "Dish", "Door", | |
30 | "Electric", "Exhaust", "Fence", "Figure", "Figure Accessory", "Flag", "Forklift", "Freestyle", | |
31 | "Garage", "Glass", "Grab", "Hinge", "Homemaker", "Hose", "Ladder", "Lever", "Magnet", "Minifig", | |
32 | "Minifig Accessory", "Minifig Footwear", "Minifig Headwear", "Minifig Hipwear", | |
33 | "Minifig Neckwear", "Monorail", "Panel", "Plane", "Plant", "Plate", "Platform", "Propellor", | |
34 | "Rack", "Roadsign", "Rock", "Scala", "Screw", "Sheet", "Slope", "Sphere", "Staircase", | |
35 | "Sticker", "Support", "Tail", "Tap", "Technic", "Tile", "Tipper", "Tractor", "Trailer", | |
36 | "Train", "Turntable", "Tyre", "Vehicle", "Wedge", "Wheel", "Winch", "Window", "Windscreen", | |
37 | "Wing", "Znap", | |
38 | }; | |
39 | ||
1384 | 40 | LDHeader::FileType headerTypeCast(int index) |
41 | { | |
42 | if (Parser::typeStrings.values().contains(static_cast<LDHeader::FileType>(index))) | |
43 | return static_cast<LDHeader::FileType>(index); | |
44 | else | |
45 | return LDHeader::NoHeader; | |
46 | } | |
47 | ||
1291 | 48 | HeaderEdit::HeaderEdit(QWidget* parent) : |
49 | QWidget {parent}, | |
50 | ui {*new Ui_HeaderEdit}, | |
51 | headerHistoryModel {new HeaderHistoryModel {nullptr, this}} | |
52 | { | |
53 | ui.setupUi(this); | |
54 | ||
55 | this->ui.category->addItems(::categories); | |
56 | this->ui.category->setItemText(0, "(unspecified)"); | |
57 | this->ui.history->setModel(this->headerHistoryModel); | |
58 | ||
59 | connect( | |
60 | ui.description, | |
61 | &QLineEdit::textChanged, | |
62 | [&](const QString& text) | |
63 | { | |
64 | if (this->hasValidHeader()) | |
65 | { | |
66 | this->m_header->description = text; | |
67 | emit descriptionChanged(text); | |
68 | } | |
69 | } | |
70 | ); | |
71 | connect( | |
72 | ui.author, | |
73 | &QLineEdit::textChanged, | |
74 | [&](const QString& text) | |
75 | { | |
76 | if (this->hasValidHeader()) | |
77 | this->m_header->author = text; | |
78 | } | |
79 | ); | |
80 | connect( | |
81 | ui.winding, | |
82 | qOverload<int>(&QComboBox::currentIndexChanged), | |
83 | [&](int index) | |
84 | { | |
85 | if (this->hasValidHeader()) | |
1306
be85306198a2
red/green view rework complete
Teemu Piippo <teemu@hecknology.net>
parents:
1302
diff
changeset
|
86 | this->m_model->setWinding(static_cast<Winding>(index)); |
1291 | 87 | } |
88 | ); | |
89 | connect( | |
90 | ui.license, | |
91 | qOverload<int>(&QComboBox::currentIndexChanged), | |
92 | [&](int index) | |
93 | { | |
94 | if (this->m_header) | |
95 | this->m_header->license = static_cast<decltype(LDHeader::license)>(index); | |
96 | } | |
97 | ); | |
98 | connect( | |
99 | ui.category, | |
100 | qOverload<int>(&QComboBox::currentIndexChanged), | |
101 | [&](int index) | |
102 | { | |
103 | if (this->hasValidHeader()) | |
104 | this->m_header->category = ::categories.value(index); | |
105 | } | |
106 | ); | |
107 | connect( | |
1384 | 108 | ui.type, |
109 | qOverload<int>(&QComboBox::currentIndexChanged), | |
110 | [&](int index) | |
111 | { | |
112 | if (this->hasValidHeader()) | |
113 | this->m_header->type = headerTypeCast(index + 1); | |
114 | } | |
115 | ); | |
116 | connect( | |
1291 | 117 | ui.alias, |
118 | &QCheckBox::stateChanged, | |
119 | [&](int state) | |
120 | { | |
121 | if (this->hasValidHeader()) | |
122 | assignFlag<LDHeader::Alias>(this->m_header->qualfiers, state == Qt::Checked); | |
123 | } | |
124 | ); | |
125 | connect( | |
126 | ui.physicalColor, | |
127 | &QCheckBox::stateChanged, | |
128 | [&](int state) | |
129 | { | |
130 | if (this->hasValidHeader()) | |
131 | { | |
132 | assignFlag<LDHeader::Physical_Color>( | |
133 | this->m_header->qualfiers, | |
134 | state == Qt::Checked | |
135 | ); | |
136 | } | |
137 | } | |
138 | ); | |
139 | connect( | |
140 | ui.flexibleSection, | |
141 | &QCheckBox::stateChanged, | |
142 | [&](int state) | |
143 | { | |
144 | if (this->hasValidHeader()) | |
145 | { | |
146 | assignFlag<LDHeader::Flexible_Section>( | |
147 | this->m_header->qualfiers, | |
148 | state == Qt::Checked | |
149 | ); | |
150 | } | |
151 | } | |
152 | ); | |
1292
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
153 | connect( |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
154 | ui.historyNew, |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
155 | &QPushButton::clicked, |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
156 | [&]() |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
157 | { |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
158 | if (this->hasValidHeader()) |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
159 | { |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
160 | const QModelIndex index = this->ui.history->selectionModel()->currentIndex(); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
161 | int row; |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
162 | |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
163 | if (index.isValid()) |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
164 | row = index.row() + 1; |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
165 | else |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
166 | row = this->headerHistoryModel->rowCount(); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
167 | |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
168 | this->headerHistoryModel->insertRows(row, 1, {}); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
169 | } |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
170 | } |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
171 | ); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
172 | connect( |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
173 | ui.historyDelete, |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
174 | &QPushButton::clicked, |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
175 | [&]() |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
176 | { |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
177 | const QModelIndex index = this->ui.history->selectionModel()->currentIndex(); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
178 | |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
179 | if (this->hasValidHeader() and index.isValid()) |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
180 | this->headerHistoryModel->removeRows(index.row(), 1, {}); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
181 | } |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
182 | ); |
1368
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
183 | connect( |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
184 | ui.help, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
185 | &QPlainTextEdit::textChanged, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
186 | [&]() |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
187 | { |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
188 | if (this->hasValidHeader()) |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
189 | this->m_header->help = ui.help->document()->toPlainText(); |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
190 | } |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
191 | ); |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
192 | connect( |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
193 | ui.keywords, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
194 | &QPlainTextEdit::textChanged, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
195 | [&]() |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
196 | { |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
197 | if (this->hasValidHeader()) |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
198 | this->m_header->keywords = ui.keywords->document()->toPlainText(); |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
199 | } |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
200 | ); |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
201 | connect( |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
202 | ui.cmdline, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
203 | &QLineEdit::textChanged, |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
204 | [&]() |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
205 | { |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
206 | if (this->hasValidHeader()) |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
207 | this->m_header->cmdline = ui.cmdline->text(); |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
208 | } |
36105978da93
added some missing connections
Teemu Piippo <teemu@hecknology.net>
parents:
1340
diff
changeset
|
209 | ); |
1292
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
210 | connect(ui.historyMoveUp, &QPushButton::clicked, [&](){ this->moveRows(-1); }); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
211 | connect(ui.historyMoveDown, &QPushButton::clicked, [&](){ this->moveRows(+2); }); |
1291 | 212 | this->setEnabled(this->hasValidHeader()); |
213 | } | |
214 | ||
1292
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
215 | void HeaderEdit::moveRows(int direction) |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
216 | { |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
217 | if (this->hasValidHeader()) |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
218 | { |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
219 | const QModelIndex index = this->ui.history->selectionModel()->currentIndex(); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
220 | this->headerHistoryModel->moveRows({}, index.row(), 1, {}, index.row() + direction); |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
221 | } |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
222 | } |
66d2050d3bd9
Part history can now be edited
Teemu Piippo <teemu@hecknology.net>
parents:
1291
diff
changeset
|
223 | |
1291 | 224 | HeaderEdit::~HeaderEdit() |
225 | { | |
226 | delete this->headerHistoryModel; | |
227 | delete &this->ui; | |
228 | } | |
229 | ||
1306
be85306198a2
red/green view rework complete
Teemu Piippo <teemu@hecknology.net>
parents:
1302
diff
changeset
|
230 | void HeaderEdit::setDocument(LDDocument* document) |
1291 | 231 | { |
1306
be85306198a2
red/green view rework complete
Teemu Piippo <teemu@hecknology.net>
parents:
1302
diff
changeset
|
232 | LDHeader* header = &document->header; |
be85306198a2
red/green view rework complete
Teemu Piippo <teemu@hecknology.net>
parents:
1302
diff
changeset
|
233 | this->m_model = document; |
1291 | 234 | this->m_header = header; |
1340
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
235 | if (document->header.type != LDHeader::NoHeader) |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
236 | { |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
237 | this->ui.description->setText(header->description); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
238 | this->ui.author->setText(header->author); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
239 | this->ui.category->setCurrentIndex(::categories.indexOf(header->category)); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
240 | this->ui.license->setCurrentIndex(static_cast<int>(header->license)); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
241 | this->ui.alias->setChecked(header->qualfiers & LDHeader::Alias); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
242 | this->ui.physicalColor->setChecked(header->qualfiers & LDHeader::Physical_Color); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
243 | this->ui.flexibleSection->setChecked(header->qualfiers & LDHeader::Flexible_Section); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
244 | this->ui.cmdline->setText(header->cmdline); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
245 | this->ui.winding->setCurrentIndex(document->winding()); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
246 | this->ui.keywords->document()->setPlainText(header->keywords); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
247 | this->ui.help->document()->setPlainText(header->help); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
248 | this->ui.type->setCurrentIndex(static_cast<int>(document->header.type) - 1); |
ea1b3ea9a3ca
more work on 8-primitives
Teemu Piippo <teemu@hecknology.net>
parents:
1326
diff
changeset
|
249 | } |
1291 | 250 | this->headerHistoryModel->setHeader(header); |
251 | this->setEnabled(this->hasValidHeader()); | |
252 | } | |
253 | ||
254 | bool HeaderEdit::hasValidHeader() const | |
255 | { | |
256 | return this->m_header != nullptr and this->m_header->type != LDHeader::NoHeader; | |
257 | } |