use crate::{AdminCommandState, EguiAction, EguiActions}; use common::cmd::ServerChatCommand; use egui::{style::Margin, CollapsingHeader, Context, Resize, Slider, Ui, Vec2, Window}; use lazy_static::lazy_static; lazy_static! { static ref ITEM_SPECS: Vec = { let mut item_specs = common::cmd::ITEM_SPECS .iter() .map(|item_desc| item_desc.replace("common.items.", "")) .collect::>(); item_specs.sort(); item_specs }; } lazy_static! { static ref ENTITY_CONFIGS: Vec = { let mut entity_configs = common::cmd::ENTITY_CONFIGS .iter() .map(|entity_desc| entity_desc.replace("common.entity.", "")) .collect::>(); entity_configs.sort(); entity_configs }; } pub fn draw_admin_commands_window( ctx: &Context, state: &mut AdminCommandState, open: &mut bool, egui_actions: &mut EguiActions, ) { Window::new("Admin Commands") .open(open) .default_width(400.0) .default_height(600.0) .show(ctx, |ui| { ui.spacing_mut().item_spacing = Vec2::new(10.0, 10.0); ui.vertical(|ui| { CollapsingHeader::new("Give Items") .default_open(true) .show(ui, |ui| { draw_give_items(ui, state, egui_actions); }); CollapsingHeader::new("Kits") .default_open(false) .show(ui, |ui| { draw_kits(ui, state, egui_actions); }); CollapsingHeader::new("Spawn Entities") .default_open(false) .show(ui, |ui| { draw_spawn_entities(ui, state, egui_actions); }) }); }); } fn draw_kits(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) { ui.vertical(|ui| { if ui.button("Give Kit").clicked() { egui_actions.actions.push(EguiAction::ChatCommand { cmd: ServerChatCommand::Kit, args: vec![common::cmd::KITS[state.kits_selected_idx].clone()], }); }; crate::widgets::filterable_list(ui, &common::cmd::KITS, "", &mut state.kits_selected_idx) }); } fn draw_give_items(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) { ui.spacing_mut().window_margin = Margin::same(10.0); Resize::default() .default_size([400.0, 200.0]) .show(ui, |ui| { ui.horizontal(|ui| { ui.add( Slider::new(&mut state.give_item_qty, 1..=100000) .logarithmic(true) .clamp_to_range(true) .text("Qty"), ); if ui.button("Give Items").clicked() { egui_actions.actions.push(EguiAction::ChatCommand { cmd: ServerChatCommand::GiveItem, args: vec![ format!( "common.items.{}", ITEM_SPECS[state.give_item_selected_idx].clone() ), format!("{}", state.give_item_qty), ], }); }; }); ui.horizontal(|ui| { ui.label("Filter:"); ui.text_edit_singleline(&mut state.give_item_search_text); }); crate::widgets::filterable_list( ui, &ITEM_SPECS, &state.give_item_search_text, &mut state.give_item_selected_idx, ); }); } fn draw_spawn_entities(ui: &mut Ui, state: &mut AdminCommandState, egui_actions: &mut EguiActions) { ui.spacing_mut().window_margin = Margin::same(10.0); Resize::default() .default_size([400.0, 200.0]) .show(ui, |ui| { ui.horizontal(|ui| { ui.add( Slider::new(&mut state.spawn_entity_qty, 1..=49) .logarithmic(true) .clamp_to_range(true) .text("Qty"), ); if ui.button("Spawn Entities").clicked() { egui_actions.actions.push(EguiAction::ChatCommand { cmd: ServerChatCommand::MakeNpc, args: vec![ format!( "common.entity.{}", ENTITY_CONFIGS[state.spawn_entity_selected_idx].clone() ), format!("{}", state.spawn_entity_qty), ], }); }; }); ui.horizontal(|ui| { ui.label("Filter:"); ui.text_edit_singleline(&mut state.spawn_entity_search_text); }); crate::widgets::filterable_list( ui, &ENTITY_CONFIGS, &state.spawn_entity_search_text, &mut state.spawn_entity_selected_idx, ); }); }