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 }