Allow remapping keybinds correctly
This commit is contained in:
parent
97cc8b1712
commit
2464ad00db
@ -6,7 +6,7 @@ use std::{
|
||||
use godot::{
|
||||
classes::{
|
||||
AudioServer, FileAccess, InputEvent, InputEventKey, InputEventMouse, InputEventMouseButton,
|
||||
file_access::ModeFlags,
|
||||
InputMap, file_access::ModeFlags,
|
||||
},
|
||||
global::{Key, MouseButton},
|
||||
prelude::*,
|
||||
@ -177,6 +177,15 @@ impl GameSettingsManager {
|
||||
set_bus_volume(MUSIC_BUS, settings.volume.music());
|
||||
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;
|
||||
if let Some(mut file) = FileAccess::open("user://config.toml", ModeFlags::WRITE) {
|
||||
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);
|
||||
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());
|
||||
}
|
||||
|
||||
@ -2,8 +2,8 @@ use std::collections::HashMap;
|
||||
|
||||
use godot::{
|
||||
classes::{
|
||||
Button, Control, GridContainer, IPanelContainer, InputEvent, InputEventKey, InputMap,
|
||||
Label, LineEdit, PanelContainer, control::SizeFlags,
|
||||
Button, Control, GridContainer, IPanelContainer, InputEvent, InputEventKey,
|
||||
InputEventMouseButton, InputMap, Label, LineEdit, PanelContainer, control::SizeFlags,
|
||||
},
|
||||
prelude::*,
|
||||
};
|
||||
@ -110,6 +110,8 @@ pub struct SettingsPanel {
|
||||
|
||||
settings: HashMap<Setting, SettingValue>,
|
||||
|
||||
keybind_button: Option<(Setting, Gd<Button>)>,
|
||||
|
||||
base: Base<PanelContainer>,
|
||||
}
|
||||
|
||||
@ -263,6 +265,18 @@ impl IPanelContainer for SettingsPanel {
|
||||
toggle_button.set_text(&value.to_string());
|
||||
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()
|
||||
}
|
||||
};
|
||||
@ -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]
|
||||
@ -290,6 +313,7 @@ impl SettingsPanel {
|
||||
(Setting::DefaultName, SettingValue::String(value)) => {
|
||||
new_settings.default_name = value.clone()
|
||||
}
|
||||
|
||||
(Setting::MasterVolume, SettingValue::SliderNumber(value)) => {
|
||||
new_settings.volume.master_volume = value.value;
|
||||
}
|
||||
@ -302,6 +326,31 @@ impl SettingsPanel {
|
||||
(Setting::AnnouncerVolume, SettingValue::SliderNumber(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;
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user