Allow remapping keybinds correctly
This commit is contained in:
parent
97cc8b1712
commit
2464ad00db
@ -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());
|
||||||
|
}
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user