veloren_voxygen_egui/
admin.rs1use 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}