Skip to content

Commit 9b1b3e0

Browse files
authored
Merge pull request #1296 from The-E/RestoreFlagWindows
Restore the flag viewers
2 parents d7a6a94 + d2f853f commit 9b1b3e0

File tree

5 files changed

+80
-29
lines changed

5 files changed

+80
-29
lines changed

code/lab/lab.cpp

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,30 +1363,33 @@ void labviewer_set_class_window(int mode)
13631363

13641364

13651365
// ------------------------------ Flags Window --------------------------------
1366-
typedef struct lab_flag {
1367-
Checkbox *cb;
1368-
int flag;
1369-
bool second;
1370-
} lab_flag;
1366+
template<class T>
1367+
struct lab_flag {
1368+
Checkbox* cb;
1369+
T flag;
1370+
};
13711371

1372-
static SCP_vector<lab_flag> Lab_flags;
1372+
static SCP_vector<lab_flag<Ship::Info_Flags>> Ship_Class_Flags;
1373+
static SCP_vector<lab_flag<Weapon::Info_Flags>> Weapon_Class_Flags;
13731374

13741375
void labviewer_flags_clear()
13751376
{
13761377
if (Lab_flags_window != NULL) {
13771378
Lab_flags_window->DeleteChildren();
13781379
}
1379-
1380-
Lab_flags.clear();
1380+
1381+
Ship_Class_Flags.clear();
1382+
Weapon_Class_Flags.clear();
13811383
}
13821384

1383-
void labviewer_flags_add(int *X, int *Y, char *flag_name, int flag, bool flags2 = false)
1385+
template <class T>
1386+
void labviewer_flags_add(int* X, int* Y, const char *flag_name, T flag, SCP_vector<lab_flag<T>>& flag_list)
13841387
{
13851388
int x = 0, y = 0;
13861389

1387-
Assert( (Lab_flags_window != NULL) && (flag_name != NULL) );
1390+
Assert((Lab_flags_window != NULL) && (flag_name != NULL));
13881391

1389-
lab_flag new_flag;
1392+
lab_flag<T> new_flag;
13901393

13911394
if (X) {
13921395
x = *X;
@@ -1396,11 +1399,9 @@ void labviewer_flags_add(int *X, int *Y, char *flag_name, int flag, bool flags2
13961399
y = *Y;
13971400
}
13981401

1399-
new_flag.cb = (Checkbox*) Lab_flags_window->AddChild(new Checkbox(flag_name, x, y));
1402+
new_flag.cb = (Checkbox*)Lab_flags_window->AddChild(new Checkbox(flag_name, x, y));
14001403
new_flag.flag = flag;
1401-
new_flag.second = flags2;
1402-
1403-
Lab_flags.push_back( new_flag );
1404+
flag_list.push_back(new_flag);
14041405

14051406
if (X) {
14061407
*X += new_flag.cb->GetWidth() + 2;
@@ -1424,13 +1425,21 @@ void labviewer_populate_flags_window()
14241425
// clear out anything that already exists
14251426
labviewer_flags_clear();
14261427

1428+
int y = 0;
1429+
14271430
// ship flags ...
14281431
if (Lab_mode == LAB_MODE_SHIP) {
1429-
//Needs reimplementation
1432+
for (size_t i = 0; i < Num_ship_flags; ++i)
1433+
{
1434+
labviewer_flags_add<Ship::Info_Flags>(nullptr, &y, Ship_flags[i].name, Ship_flags[i].def, Ship_Class_Flags);
1435+
}
14301436
}
14311437
// weapon flags ...
14321438
else if (Lab_mode == LAB_MODE_WEAPON) {
1433-
//Needs reimplementation
1439+
for (size_t i = 0; i < num_weapon_info_flags; ++i)
1440+
{
1441+
labviewer_flags_add<Weapon::Info_Flags>(nullptr, &y, Weapon_Info_Flags[i].name, Weapon_Info_Flags[i].def, Weapon_Class_Flags);
1442+
}
14341443
}
14351444
}
14361445

@@ -1439,26 +1448,33 @@ void labviewer_update_flags_window()
14391448
if ( (Lab_selected_index < 0) || (Lab_mode == LAB_MODE_NONE) ) {
14401449
return;
14411450
}
1442-
1443-
// no flags? then don't bother
1444-
if (Lab_flags.empty()) {
1445-
return;
1446-
}
1447-
1448-
1451+
14491452
if (Lab_mode == LAB_MODE_SHIP) {
1450-
//Needs reimplementation
1453+
auto sip = &Ship_info[Lab_selected_index];
1454+
1455+
for (auto flag_def : Ship_Class_Flags)
1456+
{
1457+
if (flag_def.flag == Ship::Info_Flags::NUM_VALUES) continue;
1458+
flag_def.cb->SetFlag(sip->flags, flag_def.flag, sip);
1459+
}
14511460
}
14521461
else if (Lab_mode == LAB_MODE_WEAPON) {
1453-
//Needs reimplementation
1462+
auto wip = &Weapon_info[Lab_selected_index];
1463+
1464+
for (auto flag_def : Weapon_Class_Flags)
1465+
{
1466+
if (flag_def.flag == Weapon::Info_Flags::NUM_VALUES) continue;
1467+
flag_def.cb->SetFlag(wip->wi_flags, flag_def.flag, wip);
1468+
}
14541469
}
14551470
}
14561471

14571472
void labviewer_close_flags_window(GUIObject *caller)
14581473
{
14591474
Lab_flags_window = NULL;
14601475

1461-
Lab_flags.clear();
1476+
Ship_Class_Flags.empty();
1477+
Weapon_Class_Flags.empty();
14621478
}
14631479

14641480
void labviewer_make_flags_window(Button *caller)

code/lab/wmcgui.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2475,9 +2475,19 @@ int Checkbox::DoMouseUp(float frametime)
24752475
*FlagPtr &= ~Flag;
24762476
IsChecked = false;
24772477
}
2478-
} else if (BoolFlagPtr != NULL) {
2478+
}
2479+
else if (BoolFlagPtr != NULL) {
24792480
*BoolFlagPtr = !(*BoolFlagPtr);
24802481
IsChecked = *BoolFlagPtr;
2482+
}
2483+
else if (Sip != nullptr)
2484+
{
2485+
Sip->flags.toggle(static_cast<Ship::Info_Flags>(Flag));
2486+
IsChecked = Sip->flags[static_cast<Ship::Info_Flags>(Flag)];
2487+
} else if (Wip != nullptr)
2488+
{
2489+
Wip->wi_flags.toggle(static_cast<Weapon::Info_Flags>(Flag));
2490+
IsChecked = Wip->wi_flags[static_cast<Weapon::Info_Flags>(Flag)];
24812491
} else {
24822492
IsChecked = !IsChecked;
24832493
}

code/lab/wmcgui.h

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
#include "globalincs/linklist.h"
1414
#include "globalincs/pstypes.h"
1515
#include "io/mouse.h"
16+
#include "ship/ship.h"
17+
#include "weapon/weapon.h"
1618

1719
#include <string>
1820
#include <limits.h>
@@ -622,7 +624,10 @@ class Checkbox : public GUIObject
622624

623625
//For toggling flags with this thing
624626
int* FlagPtr;
625-
int Flag;
627+
size_t Flag;
628+
629+
ship_info* Sip;
630+
weapon_info* Wip;
626631

627632
bool *BoolFlagPtr;
628633

@@ -667,6 +672,20 @@ class Checkbox : public GUIObject
667672
SetFlag((int*)in_flag_ptr, in_flag);
668673
}
669674

675+
void SetFlag(flagset<Ship::Info_Flags>& in_flag_set, Ship::Info_Flags flag_value, ship_info* si) {
676+
FlagPtr = nullptr;
677+
Sip = si;
678+
Flag = static_cast<size_t>(flag_value);
679+
IsChecked = in_flag_set[flag_value];
680+
}
681+
682+
void SetFlag(flagset<Weapon::Info_Flags>& in_flag_set, Weapon::Info_Flags flag_value, weapon_info* wi) {
683+
FlagPtr = nullptr;
684+
Wip = wi;
685+
Flag = static_cast<size_t>(flag_value);
686+
IsChecked = in_flag_set[flag_value];
687+
}
688+
670689
void SetBool(bool *in_bool_ptr) {
671690
BoolFlagPtr = in_bool_ptr;
672691
}

code/ship/ship.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1243,6 +1243,9 @@ class ship_info
12431243
const ship_info &operator=(const ship_info& other);
12441244
};
12451245

1246+
extern flag_def_list_new<Ship::Info_Flags> Ship_flags[];
1247+
extern const size_t Num_ship_flags;
1248+
12461249
extern int Num_wings;
12471250
extern ship Ships[MAX_SHIPS];
12481251
extern ship *Player_ship;

code/weapon/weapon.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,9 @@ typedef struct weapon_info {
467467
void reset();
468468
} weapon_info;
469469

470+
extern flag_def_list_new<Weapon::Info_Flags> Weapon_Info_Flags[];
471+
extern const size_t num_weapon_info_flags;
472+
470473
// Data structure to track the active missiles
471474
typedef struct missile_obj {
472475
missile_obj *next, *prev;

0 commit comments

Comments
 (0)