Skip to content

Commit 17b0870

Browse files
authored
ship flags stylization pass (#7437)
1 parent 05619eb commit 17b0870

4 files changed

Lines changed: 79 additions & 76 deletions

File tree

qtfred/src/mission/dialogs/ShipEditor/ShipFlagsDialogModel.cpp

Lines changed: 47 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
//
2-
//
3-
41
#include "ShipFlagsDialogModel.h"
52

63
#include <object/object.h>
@@ -13,81 +10,82 @@ static const Ship::Ship_Flags player_start_hidden_flags[] = {
1310
Ship::Ship_Flags::Reinforcement,
1411
Ship::Ship_Flags::Kill_before_mission,
1512
};
16-
int ShipFlagsDialogModel::tristate_set(int val, int cur_state)
13+
14+
int ShipFlagsDialogModel::tristateSet(int val, int curState)
1715
{
18-
// cur_state uses Qt::CheckState encoding (0=Unchecked, 1=PartiallyChecked, 2=Checked)
19-
if (cur_state == Qt::PartiallyChecked)
16+
// curState uses Qt::CheckState encoding (0=Unchecked, 1=PartiallyChecked, 2=Checked)
17+
if (curState == Qt::PartiallyChecked)
2018
return Qt::PartiallyChecked;
21-
bool cur_bool = (cur_state == Qt::Checked);
19+
bool cur_bool = (curState == Qt::Checked);
2220
if (static_cast<bool>(val) != cur_bool)
2321
return Qt::PartiallyChecked;
24-
return cur_state;
22+
return curState;
2523
}
26-
std::pair<SCP_string, int>* ShipFlagsDialogModel::getFlag(const SCP_string& flag_name)
27-
{
2824

29-
for (auto& flag : flags) {
30-
if (!stricmp(flag_name.c_str(), flag.first.c_str())) {
25+
std::pair<SCP_string, int>* ShipFlagsDialogModel::getFlag(const SCP_string& flagName)
26+
{
27+
for (auto& flag : _flags) {
28+
if (!stricmp(flagName.c_str(), flag.first.c_str())) {
3129
return &flag;
3230
}
3331
}
3432
// Only assert if the name isn't a known flag at all; it may have been legitimately filtered out for ship starts
3533
bool known = false;
3634
for (size_t i = 0; i < Num_Parse_ship_flags && !known; ++i)
37-
known = !stricmp(flag_name.c_str(), Parse_ship_flags[i].name);
35+
known = !stricmp(flagName.c_str(), Parse_ship_flags[i].name);
3836
for (size_t i = 0; i < Num_Parse_ship_ai_flags && !known; ++i)
39-
known = !stricmp(flag_name.c_str(), Parse_ship_ai_flags[i].name);
37+
known = !stricmp(flagName.c_str(), Parse_ship_ai_flags[i].name);
4038
for (size_t i = 0; i < Num_Parse_ship_object_flags && !known; ++i)
41-
known = !stricmp(flag_name.c_str(), Parse_ship_object_flags[i].name);
42-
Assertion(known, "Illegal flag name \"%s\"", flag_name.c_str());
39+
known = !stricmp(flagName.c_str(), Parse_ship_object_flags[i].name);
40+
Assertion(known, "Illegal flag name \"%s\"", flagName.c_str());
4341
return nullptr;
4442
}
4543

46-
void ShipFlagsDialogModel::setFlag(const SCP_string& flag_name, int value)
44+
void ShipFlagsDialogModel::setFlag(const SCP_string& flagName, int state)
4745
{
48-
for (auto& flag : flags) {
49-
if (!stricmp(flag_name.c_str(), flag.first.c_str())) {
50-
flag.second = value;
46+
for (auto& flag : _flags) {
47+
if (!stricmp(flagName.c_str(), flag.first.c_str())) {
48+
flag.second = state;
5149
set_modified();
5250
}
5351
}
5452
}
5553

56-
void ShipFlagsDialogModel::setDestroyTime(int value)
54+
void ShipFlagsDialogModel::setDestroyTime(int destroyTime)
5755
{
58-
modify(destroytime, value);
56+
modify(_destroyTime, destroyTime);
5957
}
6058

6159
int ShipFlagsDialogModel::getDestroyTime() const
6260
{
63-
return destroytime;
61+
return _destroyTime;
6462
}
6563

66-
void ShipFlagsDialogModel::setEscortPriority(int value)
64+
void ShipFlagsDialogModel::setEscortPriority(int priority)
6765
{
68-
modify(escortp, value);
66+
modify(_escortPriority, priority);
6967
}
7068

7169
int ShipFlagsDialogModel::getEscortPriority() const
7270
{
73-
return escortp;
71+
return _escortPriority;
7472
}
7573

76-
void ShipFlagsDialogModel::setKamikazeDamage(int value)
74+
void ShipFlagsDialogModel::setKamikazeDamage(int damage)
7775
{
78-
modify(kamikazed, value);
76+
modify(_kamikazeDamage, damage);
7977
}
8078

8179
int ShipFlagsDialogModel::getKamikazeDamage() const
8280
{
83-
return kamikazed;
81+
return _kamikazeDamage;
8482
}
8583

86-
void ShipFlagsDialogModel::update_ship(const int shipnum)
84+
void ShipFlagsDialogModel::updateShip(int shipNum)
8785
{
88-
ship* shipp = &Ships[shipnum];
86+
ship* shipp = &Ships[shipNum];
8987
object* objp = &Objects[shipp->objnum];
90-
for (const auto& [name, checked] : flags) {
88+
for (const auto& [name, checked] : _flags) {
9189
// PartiallyChecked means mixed selection — leave each ship's flag as-is
9290
if (checked == Qt::PartiallyChecked)
9391
continue;
@@ -145,10 +143,11 @@ void ShipFlagsDialogModel::update_ship(const int shipnum)
145143
}
146144
}
147145
}
148-
Ai_info[shipp->ai_index].kamikaze_damage = kamikazed;
149-
shipp->escort_priority = escortp;
150-
shipp->final_death_time = destroytime;
146+
Ai_info[shipp->ai_index].kamikaze_damage = _kamikazeDamage;
147+
shipp->escort_priority = _escortPriority;
148+
shipp->final_death_time = _destroyTime;
151149
}
150+
152151
ShipFlagsDialogModel::ShipFlagsDialogModel(QObject* parent, EditorViewport* viewport)
153152
: AbstractDialogModel(parent, viewport)
154153
{
@@ -163,7 +162,7 @@ bool ShipFlagsDialogModel::apply()
163162
while (objp != END_OF_LIST(&obj_used_list)) {
164163
if ((objp->type == OBJ_START) || (objp->type == OBJ_SHIP)) {
165164
if (objp->flags[Object::Object_Flags::Marked]) {
166-
update_ship(objp->instance);
165+
updateShip(objp->instance);
167166
}
168167
}
169168
objp = GET_NEXT(objp);
@@ -176,7 +175,7 @@ void ShipFlagsDialogModel::reject() {}
176175

177176
const SCP_vector<std::pair<SCP_string, int>>& ShipFlagsDialogModel::getFlagsList()
178177
{
179-
return flags;
178+
return _flags;
180179
}
181180

182181
SCP_vector<std::pair<SCP_string, SCP_string>> ShipFlagsDialogModel::getShipFlagDescriptions()
@@ -262,9 +261,9 @@ void ShipFlagsDialogModel::initializeData()
262261
if (objp->flags[Object::Object_Flags::Marked]) {
263262
shipp = &Ships[objp->instance];
264263
if (first) {
265-
kamikazed = Ai_info[shipp->ai_index].kamikaze_damage;
266-
escortp = shipp->escort_priority;
267-
destroytime = shipp->final_death_time;
264+
_kamikazeDamage = Ai_info[shipp->ai_index].kamikaze_damage;
265+
_escortPriority = shipp->escort_priority;
266+
_destroyTime = shipp->final_death_time;
268267
for (size_t i = 0; i < Num_Parse_ship_flags; i++) {
269268
auto flagDef = Parse_ship_flags[i];
270269

@@ -290,12 +289,12 @@ void ShipFlagsDialogModel::initializeData()
290289
if (hidden) continue;
291290
}
292291
bool checked = shipp->flags[flagDef.def];
293-
flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
292+
_flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
294293
}
295294
for (size_t i = 0; i < Num_Parse_ship_ai_flags; i++) {
296295
auto flagDef = Parse_ship_ai_flags[i];
297296
bool checked = Ai_info[shipp->ai_index].ai_flags[flagDef.def];
298-
flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
297+
_flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
299298
}
300299
for (size_t i = 0; i < Num_Parse_ship_object_flags; i++) {
301300
auto flagDef = Parse_ship_object_flags[i];
@@ -305,7 +304,7 @@ void ShipFlagsDialogModel::initializeData()
305304
} else {
306305
checked = objp->flags[flagDef.def];
307306
}
308-
flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
307+
_flags.emplace_back(flagDef.name, checked ? Qt::Checked : Qt::Unchecked);
309308
}
310309
first = 0;
311310
} else {
@@ -333,12 +332,12 @@ void ShipFlagsDialogModel::initializeData()
333332
if (hidden) continue;
334333
}
335334
bool checked = shipp->flags[flagDef.def];
336-
getFlag(flagDef.name)->second = tristate_set(checked, getFlag(flagDef.name)->second);
335+
getFlag(flagDef.name)->second = tristateSet(checked, getFlag(flagDef.name)->second);
337336
}
338337
for (size_t i = 0; i < Num_Parse_ship_ai_flags; i++) {
339338
auto flagDef = Parse_ship_ai_flags[i];
340339
bool checked = Ai_info[shipp->ai_index].ai_flags[flagDef.def];
341-
getFlag(flagDef.name)->second = tristate_set(checked, getFlag(flagDef.name)->second);
340+
getFlag(flagDef.name)->second = tristateSet(checked, getFlag(flagDef.name)->second);
342341
}
343342
for (size_t i = 0; i < Num_Parse_ship_object_flags; i++) {
344343
auto flagDef = Parse_ship_object_flags[i];
@@ -352,15 +351,17 @@ void ShipFlagsDialogModel::initializeData()
352351
} else {
353352
checked = objp->flags[flagDef.def];
354353
}
355-
getFlag(flagDef.name)->second = tristate_set(checked, getFlag(flagDef.name)->second);
354+
getFlag(flagDef.name)->second = tristateSet(checked, getFlag(flagDef.name)->second);
356355
}
357356
}
358357
}
359358
}
360359

361360
objp = GET_NEXT(objp);
362361
}
362+
_modified = false;
363363
modelChanged();
364364
_modified = false;
365365
}
366+
366367
} // namespace fso::fred::dialogs

qtfred/src/mission/dialogs/ShipEditor/ShipFlagsDialogModel.h

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,33 @@
77
namespace fso::fred::dialogs {
88

99
class ShipFlagsDialogModel : public AbstractDialogModel {
10-
private:
11-
static int tristate_set(const int val, const int cur_state);
12-
void update_ship(const int);
13-
SCP_vector<std::pair<SCP_string, int>> flags;
14-
int destroytime;
15-
int escortp;
16-
int kamikazed;
17-
10+
Q_OBJECT
1811
public:
1912
ShipFlagsDialogModel(QObject* parent, EditorViewport* viewport);
20-
void initializeData();
2113

2214
bool apply() override;
2315
void reject() override;
2416

2517
const SCP_vector<std::pair<SCP_string, int>>& getFlagsList();
2618
static SCP_vector<std::pair<SCP_string, SCP_string>> getShipFlagDescriptions();
27-
std::pair<SCP_string, int>* getFlag(const SCP_string& flag_name);
28-
void setFlag(const SCP_string& flag_name, int);
19+
std::pair<SCP_string, int>* getFlag(const SCP_string& flagName);
20+
void setFlag(const SCP_string& flagName, int state);
2921

30-
void setDestroyTime(int);
22+
void setDestroyTime(int destroyTime);
3123
int getDestroyTime() const;
32-
void setEscortPriority(int);
24+
void setEscortPriority(int priority);
3325
int getEscortPriority() const;
34-
void setKamikazeDamage(int);
26+
void setKamikazeDamage(int damage);
3527
int getKamikazeDamage() const;
28+
29+
private: // NOLINT(readability-redundant-access-specifiers)
30+
void initializeData();
31+
static int tristateSet(int val, int curState);
32+
void updateShip(int shipNum);
33+
34+
SCP_vector<std::pair<SCP_string, int>> _flags;
35+
int _destroyTime;
36+
int _escortPriority;
37+
int _kamikazeDamage;
3638
};
37-
} // namespace fso::fred::dialogs
39+
} // namespace fso::fred::dialogs

qtfred/src/ui/dialogs/ShipEditor/ShipFlagsDialog.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ ShipFlagsDialog::ShipFlagsDialog(QWidget* parent, EditorViewport* viewport)
2121
for (const auto& [name, state] : snapshot) {
2222
_model->setFlag(name.toUtf8().constData(), state);
2323
}
24-
updateUI();
24+
updateUi();
2525
});
2626

2727
const auto& flags = _model->getFlagsList();
@@ -33,16 +33,19 @@ ShipFlagsDialog::ShipFlagsDialog(QWidget* parent, EditorViewport* viewport)
3333
toWidget.append({name, p.second});
3434
}
3535

36-
ui->flagList->setFlags(toWidget);
36+
{
37+
QSignalBlocker blocker(ui->flagList);
38+
ui->flagList->setFlags(toWidget);
3739

38-
const auto descs = _model->getShipFlagDescriptions();
39-
QVector<std::pair<QString, QString>> qtDescs;
40-
qtDescs.reserve(static_cast<int>(descs.size()));
41-
for (const auto& d : descs)
42-
qtDescs.append({QString::fromUtf8(d.first.c_str()), QString::fromUtf8(d.second.c_str())});
43-
ui->flagList->setFlagDescriptions(qtDescs);
40+
const auto descs = _model->getShipFlagDescriptions();
41+
QVector<std::pair<QString, QString>> qtDescs;
42+
qtDescs.reserve(static_cast<int>(descs.size()));
43+
for (const auto& d : descs)
44+
qtDescs.append({QString::fromUtf8(d.first.c_str()), QString::fromUtf8(d.second.c_str())});
45+
ui->flagList->setFlagDescriptions(qtDescs);
46+
}
4447

45-
updateUI();
48+
updateUi();
4649
// Resize the dialog to the minimum size
4750
resize(QDialog::sizeHint());
4851
}
@@ -92,7 +95,7 @@ void ShipFlagsDialog::on_kamikazeDamageSpinBox_valueChanged(int value)
9295
{
9396
_model->setKamikazeDamage(value);
9497
}
95-
void ShipFlagsDialog::updateUI()
98+
void ShipFlagsDialog::updateUi()
9699
{
97100
util::SignalBlockers blockers(this);
98101
ui->destroySecondsSpinBox->setValue(_model->getDestroyTime());

qtfred/src/ui/dialogs/ShipEditor/ShipFlagsDialog.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#ifndef SHIPFLAGDIALOG_H
2-
#define SHIPFLAGDIALOG_H
1+
#pragma once
32

43
#include <mission/dialogs/ShipEditor/ShipFlagsDialogModel.h>
54
#include <ui/FredView.h>
@@ -33,8 +32,6 @@ class ShipFlagsDialog : public QDialog {
3332
std::unique_ptr<Ui::ShipFlagsDialog> ui;
3433
std::unique_ptr<ShipFlagsDialogModel> _model;
3534
EditorViewport* _viewport;
36-
void updateUI();
35+
void updateUi();
3736
};
3837
} // namespace fso::fred::dialogs
39-
40-
#endif // !SHIPFLAGDIALOG_H

0 commit comments

Comments
 (0)