1 #include "lab/dialogs/weapon_classes.h"
2 #include "lab/labv2_internal.h"
3 #include "weapon/weapon.h"
4 
changeWeapon(Tree * caller)5 void changeWeapon(Tree* caller) {
6 	auto class_index = caller->GetSelectedItem()->GetData();
7 
8 	getLabManager()->changeDisplayedObject(LabMode::Weapon, class_index);
9 }
10 
open(Button *)11 void WeaponClasses::open(Button* /*caller*/) {
12 	if (dialogWindow != nullptr)
13 		return;
14 
15 	dialogWindow = (DialogWindow*)getLabManager()->Screen->Add(new DialogWindow("Weapon Classes", gr_screen.center_offset_x + 50, gr_screen.center_offset_y + 50));
16 	Assert(Opener != nullptr);
17 	dialogWindow->SetOwner(Opener->getDialog());
18 	auto tree = (Tree*)dialogWindow->AddChild(new Tree("Weapon Tree", 0, 0));
19 
20 	SCP_vector<TreeItem*> typeHeaders;
21 
22 	for (auto i = 0; i < Num_weapon_subtypes; ++i) {
23 		typeHeaders.push_back(tree->AddItem(nullptr, Weapon_subtype_names[i], 0, false));
24 	}
25 
26 	auto idx = 0;
27 	for (auto wip : Weapon_info) {
28 		if (wip.subtype == WP_UNUSED)
29 			continue;
30 
31 		if (wip.subtype >= Num_weapon_subtypes) {
32 			Error(LOCATION, "Unknown weapon subtype in weapon %s!!!", wip.name);
33 		}
34 
35 		TreeItem* header = nullptr;
36 		if (wip.wi_flags[Weapon::Info_Flags::Beam])
37 			header = typeHeaders[WP_BEAM];
38 		else
39 			header = typeHeaders[wip.subtype];
40 
41 		tree->AddItem(header, wip.get_display_name(), idx, false, changeWeapon);
42 		++idx;
43 	}
44 }
45 
update(LabMode newLabMode,int classIndex)46 void WeaponClasses::update(LabMode newLabMode, int classIndex) {
47 	// if the incoming mode is not LabMode::Weapon, close this dialog
48 	if (newLabMode != LabMode::Weapon) {
49 		close();
50 		return;
51 	}
52 
53 	if (Class_toolbar == nullptr) {
54 		Class_toolbar = (DialogWindow*)getLabManager()->Screen->Add(new DialogWindow("Class Toolbar", gr_screen.center_offset_x + 0,
55 			gr_screen.center_offset_y + getLabManager()->Toolbar->GetHeight(), -1, -1, WS_NOTITLEBAR | WS_NONMOVEABLE));
56 		Assert(Opener != nullptr);
57 		Class_toolbar->SetOwner(Opener->getDialog());
58 	}
59 	Class_toolbar->DeleteChildren();
60 
61 	auto x = 0;
62 	for (auto &subdialog : Subdialogs) {
63 		auto *dgo = new DialogOpener(subdialog, x, 0);
64 		subdialog->setOpener(dgo);
65 		auto *cbp = Class_toolbar->AddChild(dgo);
66 		x += cbp->GetWidth();
67 
68 		subdialog->update(newLabMode, classIndex);
69 	}
70 }