veloren_voxygen_egui/
admin.rs

1use crate::{AdminCommandState, EguiAction, EguiActions};
2use common::cmd::ServerChatCommand;
3use egui::{CollapsingHeader, Context, Resize, Slider, Ui, Vec2, Window, style::Margin};
4use lazy_static::lazy_static;
5
6lazy_static! {
7    static ref ITEM_SPECS: Vec<String> = {
8        let mut item_specs = common::cmd::ITEM_SPECS
9            .iter()
10            .map(|item_desc| item_desc.replace("common.items.", ""))
11            .collect::<Vec<String>>();
12        item_specs.sort();
13        item_specs
14    };
15}
16lazy_static! {
17    static ref ENTITY_CONFIGS: Vec<String> = {
18        let mut entity_configs = common::cmd::ENTITY_CONFIGS
19            .iter()
20            .map(|entity_desc| entity_desc.replace("common.entity.", ""))
21            .collect::<Vec<String>>();
22        entity_configs.sort();
23        entity_configs
24    };
25}
26
27pub fn draw_admin_commands_window(
28    ctx: &Context,
29    state: &mut AdminCommandState,
30    open: &mut bool,
31    egui_actions: &mut EguiActions,
32) {
33    Window::new("Admin Commands")
34        .open(open)
35        .default_width(400.0)
36        .default_height(600.0)
37        .show(ctx, |ui| {
38            ui.spacing_mut().item_spacing = Vec2::new(10.0, 10.0);
39            ui.vertical(|ui| {
40                CollapsingHeader::new("Give Items")
41                    .default_open(true)
42                    .show(ui, |ui| {
43                        draw_give_items(ui, state, egui_actions);
44                    });
45                CollapsingHeader::new("Kits")
46                    .default_open(false)
47                    .show(ui, |ui| {
48                        draw_kits(ui, state, egui_actions);
49                    });
50                CollapsingHeader::new("Spawn Entities")
51                    .default_open(false)
52                    .show(ui, |ui| {
53                        draw_spawn_entities(ui, state, egui_actions);
54                    })
55            });
56        });
57}
58
59fn draw_kits(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) {
60    ui.vertical(|ui| {
61        if ui.button("Give Kit").clicked() {
62            egui_actions.actions.push(EguiAction::ChatCommand {
63                cmd: ServerChatCommand::Kit,
64                args: vec![common::cmd::KITS[state.kits_selected_idx].clone()],
65            });
66        };
67        crate::widgets::filterable_list(ui, &common::cmd::KITS, "", &mut state.kits_selected_idx)
68    });
69}
70
71fn draw_give_items(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) {
72    ui.spacing_mut().window_margin = Margin::same(10.0);
73    Resize::default()
74        .default_size([400.0, 200.0])
75        .show(ui, |ui| {
76            ui.horizontal(|ui| {
77                ui.add(
78                    Slider::new(&mut state.give_item_qty, 1..=100000)
79                        .logarithmic(true)
80                        .clamp_to_range(true)
81                        .text("Qty"),
82                );
83                if ui.button("Give Items").clicked() {
84                    egui_actions.actions.push(EguiAction::ChatCommand {
85                        cmd: ServerChatCommand::GiveItem,
86                        args: vec![
87                            format!(
88                                "common.items.{}",
89                                ITEM_SPECS[state.give_item_selected_idx].clone()
90                            ),
91                            format!("{}", state.give_item_qty),
92                        ],
93                    });
94                };
95            });
96            ui.horizontal(|ui| {
97                ui.label("Filter:");
98
99                ui.text_edit_singleline(&mut state.give_item_search_text);
100            });
101
102            crate::widgets::filterable_list(
103                ui,
104                &ITEM_SPECS,
105                &state.give_item_search_text,
106                &mut state.give_item_selected_idx,
107            );
108        });
109}
110fn draw_spawn_entities(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) {
111    ui.spacing_mut().window_margin = Margin::same(10.0);
112    Resize::default()
113        .default_size([400.0, 200.0])
114        .show(ui, |ui| {
115            ui.horizontal(|ui| {
116                ui.add(
117                    Slider::new(&mut state.spawn_entity_qty, 1..=49)
118                        .logarithmic(true)
119                        .clamp_to_range(true)
120                        .text("Qty"),
121                );
122                if ui.button("Spawn Entities").clicked() {
123                    egui_actions.actions.push(EguiAction::ChatCommand {
124                        cmd: ServerChatCommand::MakeNpc,
125                        args: vec![
126                            format!(
127                                "common.entity.{}",
128                                ENTITY_CONFIGS[state.spawn_entity_selected_idx].clone()
129                            ),
130                            format!("{}", state.spawn_entity_qty),
131                        ],
132                    });
133                };
134            });
135            ui.horizontal(|ui| {
136                ui.label("Filter:");
137
138                ui.text_edit_singleline(&mut state.spawn_entity_search_text);
139            });
140
141            crate::widgets::filterable_list(
142                ui,
143                &ENTITY_CONFIGS,
144                &state.spawn_entity_search_text,
145                &mut state.spawn_entity_selected_idx,
146            );
147        });
148}