Support choosing which player uses a controller

This commit is contained in:
2024-11-29 14:36:46 -05:00
parent 9ff62af310
commit 24474fabd0
3 changed files with 134 additions and 10 deletions
+37 -3
View File
@@ -42,7 +42,7 @@ impl InputWindow {
}
}
fn render_key_bindings(&mut self, ui: &mut Ui, sim_id: SimId) {
fn show_key_bindings(&mut self, ui: &mut Ui, sim_id: SimId) {
let mappings = self.mappings.for_sim(sim_id);
let binding_names = {
let mapping = mappings.read().unwrap();
@@ -86,6 +86,37 @@ impl InputWindow {
}
});
}
fn show_gamepads(&mut self, ui: &mut Ui) {
let mut gamepads = self.mappings.gamepad_info();
gamepads.sort_by_key(|g| usize::from(g.id));
if gamepads.is_empty() {
ui.label("No gamepads connected.");
return;
}
for (index, gamepad) in gamepads.into_iter().enumerate() {
ui.horizontal(|ui| {
ui.label(format!("Gamepad {index}: {}", gamepad.name));
let mut bound_to = gamepad.bound_to;
let mut rebind = false;
rebind |= ui
.selectable_value(&mut bound_to, Some(SimId::Player1), "Player 1")
.changed();
rebind |= ui
.selectable_value(&mut bound_to, Some(SimId::Player2), "Player 2")
.changed();
rebind |= ui.selectable_value(&mut bound_to, None, "Nobody").changed();
if rebind {
match bound_to {
Some(sim_id) => self.mappings.assign_gamepad(gamepad.id, sim_id),
None => self.mappings.unassign_gamepad(gamepad.id),
}
}
});
}
}
}
impl AppWindow for InputWindow {
@@ -104,12 +135,14 @@ impl AppWindow for InputWindow {
ui.horizontal(|ui| {
ui.selectable_value(&mut self.active_tab, InputTab::Player1, "Player 1");
ui.selectable_value(&mut self.active_tab, InputTab::Player2, "Player 2");
ui.selectable_value(&mut self.active_tab, InputTab::Gamepads, "Gamepads");
});
});
CentralPanel::default().show(ctx, |ui| {
match self.active_tab {
InputTab::Player1 => self.render_key_bindings(ui, SimId::Player1),
InputTab::Player2 => self.render_key_bindings(ui, SimId::Player2),
InputTab::Player1 => self.show_key_bindings(ui, SimId::Player1),
InputTab::Player2 => self.show_key_bindings(ui, SimId::Player2),
InputTab::Gamepads => self.show_gamepads(ui),
};
});
}
@@ -130,4 +163,5 @@ impl AppWindow for InputWindow {
enum InputTab {
Player1,
Player2,
Gamepads,
}