1 #include "lab/dialogs/backgrounds.h"
2 #include "lab/labv2_internal.h"
3 
get_directory_or_vp(const char * path)4 SCP_string get_directory_or_vp(const char* path)
5 {
6 	SCP_string result(path);
7 
8 	// Is this a mission in a directory?
9 	size_t found = result.find("data" DIR_SEPARATOR_STR "missions");
10 
11 	if (found == std::string::npos) // Guess not
12 	{
13 		found = result.find(".vp");
14 	}
15 
16 	auto directory_name_pos = result.rfind(DIR_SEPARATOR_CHAR, found - strlen(DIR_SEPARATOR_STR) - 1);
17 
18 	result = result.substr(directory_name_pos, found - directory_name_pos);
19 
20 	found = result.find(DIR_SEPARATOR_CHAR);
21 	// Strip directory separators
22 	while (found != std::string::npos) {
23 		result.erase(found, strlen(DIR_SEPARATOR_STR));
24 		found = result.find(DIR_SEPARATOR_CHAR);
25 	}
26 
27 	return result;
28 }
29 
labviewer_change_background(Tree * caller)30 void labviewer_change_background(Tree* caller) {
31 	getLabManager()->Renderer->useBackground(caller->GetSelectedItem()->Name);
32 }
33 
open(Button *)34 void BackgroundDialog::open(Button* /*caller*/) {
35 	if (dialogWindow != nullptr)
36 		return;
37 
38 	dialogWindow = (DialogWindow*)getLabManager()->Screen->Add(new DialogWindow("Mission Backgrounds", gr_screen.center_offset_x + 250, gr_screen.center_offset_y + 50));
39 	Assert(Opener != nullptr);
40 	dialogWindow->SetOwner(Opener->getDialog());
41 
42 	SCP_vector<SCP_string> missions;
43 
44 	cf_get_file_list(missions, CF_TYPE_MISSIONS, NOX("*.fs2"));
45 
46 	SCP_map<SCP_string, SCP_vector<SCP_string>> directories;
47 
48 	for (const auto& filename : missions) {
49 		auto res = cf_find_file_location((filename + ".fs2").c_str(), CF_TYPE_MISSIONS);
50 
51 		if (res.found) {
52 			auto location = get_directory_or_vp(res.full_name.c_str());
53 
54 			directories[location].push_back(filename);
55 		}
56 	}
57 
58 	auto Num_mission_directories = directories.size();
59 	auto Mission_directories = new TreeItem * [Num_mission_directories];
60 
61 	Tree* missiontree = (Tree*)dialogWindow->AddChild(new Tree("Missions", 0, 0));
62 	missiontree->AddItem(nullptr, "None", 0, true, labviewer_change_background);
63 
64 	int i = 0;
65 	for (auto const &directory : directories) {
66 		auto directoryItem = Mission_directories[i];
67 		directoryItem = missiontree->AddItem(nullptr, directory.first);
68 
69 		for (const auto& Lab_mission : directory.second) {
70 			missiontree->AddItem(directoryItem, Lab_mission, 0, true, labviewer_change_background);
71 		}
72 	}
73 }