use std::collections::HashMap; use godot::{ classes::{ Button, Control, GridContainer, IPanelContainer, InputEvent, InputEventKey, InputEventMouseButton, InputMap, Label, LineEdit, PanelContainer, control::{FocusBehaviorRecursive, FocusMode, SizeFlags}, }, prelude::*, }; use crate::{ game_settings::{GameSettingsManager, Keybind}, ui::slider::SliderContainer, }; #[derive(Debug, Clone, Copy, PartialEq, PartialOrd, Ord, Eq, Hash)] pub enum Setting { // General settings FoV, DefaultName, // Volume settings MasterVolume, SfxVolume, MusicVolume, AnnouncerVolume, // Keybinds MoveLeft, MoveForward, MoveRight, MoveBackward, Shoot, Melee, Jump, SelectRaygun, SelectShotgun, } pub enum SettingsTab { General, Volume, Keybinds, } impl ToString for Setting { fn to_string(&self) -> String { match self { Setting::FoV => "Field of View", Setting::DefaultName => "Default Name", Setting::MasterVolume => "Master volume", Setting::SfxVolume => "Sfx Volume", Setting::MusicVolume => "Music Volume", Setting::AnnouncerVolume => "Announcer Volume", Setting::MoveLeft => "Move left", Setting::MoveRight => "Move right", Setting::MoveForward => "Move forward", Setting::MoveBackward => "Move backward", Setting::SelectRaygun => "Select Raygun", Setting::SelectShotgun => "Select Shotgun", Setting::Shoot => "Shoot", Setting::Melee => "Melee", Setting::Jump => "Jump", } .to_string() } } impl Setting { pub fn tab(&self) -> SettingsTab { match self { Setting::FoV => SettingsTab::General, Setting::DefaultName => SettingsTab::General, Setting::MasterVolume => SettingsTab::Volume, Setting::SfxVolume => SettingsTab::Volume, Setting::MusicVolume => SettingsTab::Volume, Setting::AnnouncerVolume => SettingsTab::Volume, _ => SettingsTab::Keybinds, } } } #[derive(Clone)] pub enum SettingValue { SliderNumber(SliderValue), String(String), Keybind(Keybind), } #[derive(Clone, Copy)] pub struct SliderValue { min: f64, max: f64, value: f64, } #[derive(GodotClass)] #[class(base=PanelContainer, init)] pub struct SettingsPanel { #[export] general_grid: Option>, #[export] volume_grid: Option>, #[export] keybinds_grid: Option>, #[export] slider_scene: Option>, settings: HashMap, keybind_button: Option<(Setting, Gd