Allow remapping keybinds correctly

This commit is contained in:
Sofia 2026-07-26 02:17:29 +03:00
parent 97cc8b1712
commit 2464ad00db
2 changed files with 67 additions and 4 deletions

View File

@ -6,7 +6,7 @@ use std::{
use godot::{ use godot::{
classes::{ classes::{
AudioServer, FileAccess, InputEvent, InputEventKey, InputEventMouse, InputEventMouseButton, AudioServer, FileAccess, InputEvent, InputEventKey, InputEventMouse, InputEventMouseButton,
file_access::ModeFlags, InputMap, file_access::ModeFlags,
}, },
global::{Key, MouseButton}, global::{Key, MouseButton},
prelude::*, prelude::*,
@ -177,6 +177,15 @@ impl GameSettingsManager {
set_bus_volume(MUSIC_BUS, settings.volume.music()); set_bus_volume(MUSIC_BUS, settings.volume.music());
set_bus_volume(ANNOUNCER_BUS, settings.volume.announcer()); set_bus_volume(ANNOUNCER_BUS, settings.volume.announcer());
set_keybind("right", settings.keybinds.move_right);
set_keybind("left", settings.keybinds.move_left);
set_keybind("forward", settings.keybinds.move_forward);
set_keybind("backward", settings.keybinds.move_backward);
set_keybind("weapon_1", settings.keybinds.select_raygun);
set_keybind("weapon_2", settings.keybinds.select_shotgun);
set_keybind("shoot", settings.keybinds.shoot);
set_keybind("punch", settings.keybinds.melee);
self.settings = settings; self.settings = settings;
if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) { if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) {
if let Ok(serialized) = toml::to_string(&self.settings) { if let Ok(serialized) = toml::to_string(&self.settings) {
@ -226,3 +235,8 @@ fn set_bus_volume(bus: &str, volume: f32) {
let idx = AudioServer::singleton().get_bus_index(bus); let idx = AudioServer::singleton().get_bus_index(bus);
AudioServer::singleton().set_bus_volume_linear(idx, volume); AudioServer::singleton().set_bus_volume_linear(idx, volume);
} }
fn set_keybind(action: &str, keybind: Keybind) {
InputMap::singleton().action_erase_events(action);
InputMap::singleton().action_add_event(action, &keybind.into_event());
}

View File

@ -2,8 +2,8 @@ use std::collections::HashMap;
use godot::{ use godot::{
classes::{ classes::{
Button, Control, GridContainer, IPanelContainer, InputEvent, InputEventKey, InputMap, Button, Control, GridContainer, IPanelContainer, InputEvent, InputEventKey,
Label, LineEdit, PanelContainer, control::SizeFlags, InputEventMouseButton, InputMap, Label, LineEdit, PanelContainer, control::SizeFlags,
}, },
prelude::*, prelude::*,
}; };
@ -110,6 +110,8 @@ pub struct SettingsPanel {
settings: HashMap<Setting, SettingValue>, settings: HashMap<Setting, SettingValue>,
keybind_button: Option<(Setting, Gd<Button>)>,
base: Base<PanelContainer>, base: Base<PanelContainer>,
} }
@ -263,6 +265,18 @@ impl IPanelContainer for SettingsPanel {
toggle_button.set_text(&value.to_string()); toggle_button.set_text(&value.to_string());
toggle_button.set_toggle_mode(true); toggle_button.set_toggle_mode(true);
let setting_clone = setting.clone();
let button_clone = toggle_button.clone();
toggle_button
.signals()
.pressed()
.connect_other(self, move |s| {
if let Some((_, mut button)) = s.keybind_button.take() {
button.set_pressed(false);
}
s.keybind_button = Some((setting_clone, button_clone.clone()))
});
toggle_button.upcast() toggle_button.upcast()
} }
}; };
@ -273,7 +287,16 @@ impl IPanelContainer for SettingsPanel {
} }
} }
fn input(&mut self, event: Gd<InputEvent>) {} fn input(&mut self, event: Gd<InputEvent>) {
if let Some((setting, mut button)) = self.keybind_button.clone()
&& let Some(keybind) = Keybind::from_event(event)
{
self.keybind_button.take();
self.on_change(setting.clone(), SettingValue::Keybind(keybind));
button.set_text(&keybind.to_string());
button.set_pressed(false);
}
}
} }
#[godot_api] #[godot_api]
@ -290,6 +313,7 @@ impl SettingsPanel {
(Setting::DefaultName, SettingValue::String(value)) => { (Setting::DefaultName, SettingValue::String(value)) => {
new_settings.default_name = value.clone() new_settings.default_name = value.clone()
} }
(Setting::MasterVolume, SettingValue::SliderNumber(value)) => { (Setting::MasterVolume, SettingValue::SliderNumber(value)) => {
new_settings.volume.master_volume = value.value; new_settings.volume.master_volume = value.value;
} }
@ -302,6 +326,31 @@ impl SettingsPanel {
(Setting::AnnouncerVolume, SettingValue::SliderNumber(value)) => { (Setting::AnnouncerVolume, SettingValue::SliderNumber(value)) => {
new_settings.volume.announcer_volume = value.value; new_settings.volume.announcer_volume = value.value;
} }
(Setting::MoveRight, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.move_right = *keybind;
}
(Setting::MoveLeft, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.move_left = *keybind;
}
(Setting::MoveForward, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.move_forward = *keybind;
}
(Setting::MoveBackward, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.move_backward = *keybind;
}
(Setting::SelectRaygun, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.select_raygun = *keybind;
}
(Setting::SelectShotgun, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.select_raygun = *keybind;
}
(Setting::Shoot, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.shoot = *keybind;
}
(Setting::Melee, SettingValue::Keybind(keybind)) => {
new_settings.keybinds.melee = *keybind;
}
_ => {} _ => {}
} }
} }