@@ -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
13741375void 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
14571472void 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
14641480void labviewer_make_flags_window (Button *caller)
0 commit comments