Added gauge like UI for R2/L2 triggers for finer details
parent
845a88a360
commit
8bfe46acb3
|
@ -229,7 +229,7 @@ checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gamo"
|
name = "gamo"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"color-eyre",
|
"color-eyre",
|
||||||
"gilrs",
|
"gilrs",
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
[package]
|
[package]
|
||||||
name = "gamo"
|
name = "gamo"
|
||||||
version = "1.0.0"
|
version = "1.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
authors = ["Wynd <wyndftw@proton.me>"]
|
||||||
|
description = "TUI gamepad tester"
|
||||||
|
readme = "README.md"
|
||||||
|
repository = "https://git.pixelatedw.xyz/wynd/gamo"
|
||||||
|
license = "GPL-3.0-or-later"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
|
|
@ -10,4 +10,7 @@ there's nothing particularly fancy about this and it does what it says, allows t
|
||||||
|
|
||||||
## controls
|
## controls
|
||||||
|
|
||||||
use `v` to start a weak vibrations test and `V` (uppercase) for a strong vibration test if your gamepad supports them.
|
`v` to start a weak vibrations test
|
||||||
|
`V` (uppercase) for a strong vibration test
|
||||||
|
`r` to start a gamepad scan if none are automatically found
|
||||||
|
`q` or `ESC` are used to quit the app
|
||||||
|
|
49
src/app.rs
49
src/app.rs
|
@ -7,9 +7,10 @@ use ratatui::{
|
||||||
layout::{Constraint, Layout, Rect},
|
layout::{Constraint, Layout, Rect},
|
||||||
style::{Color, Style, Stylize},
|
style::{Color, Style, Stylize},
|
||||||
symbols::Marker,
|
symbols::Marker,
|
||||||
|
text::Span,
|
||||||
widgets::{
|
widgets::{
|
||||||
canvas::{Canvas, Rectangle, Shape},
|
canvas::{Canvas, Rectangle, Shape},
|
||||||
Block, BorderType, Widget,
|
BarChart, Block, BorderType, Gauge, Widget,
|
||||||
},
|
},
|
||||||
DefaultTerminal,
|
DefaultTerminal,
|
||||||
};
|
};
|
||||||
|
@ -169,10 +170,26 @@ impl App {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_trigger_buttons(&self, area: Rect, buf: &mut Buffer) {
|
fn render_trigger_buttons(&self, area: Rect, buf: &mut Buffer) {
|
||||||
|
let right_trigger_value = match self.manager.active_gamepad() {
|
||||||
|
Ok(gp) => match gp.button_data(gilrs::Button::RightTrigger2) {
|
||||||
|
Some(val) => val.value(),
|
||||||
|
None => 0.0,
|
||||||
|
},
|
||||||
|
Err(_) => 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
let left_trigger_value = match self.manager.active_gamepad() {
|
||||||
|
Ok(gp) => match gp.button_data(gilrs::Button::LeftTrigger2) {
|
||||||
|
Some(val) => val.value(),
|
||||||
|
None => 0.0,
|
||||||
|
},
|
||||||
|
Err(_) => 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
let r1_button = self.create_button_ui(gilrs::Button::RightTrigger, "R1");
|
let r1_button = self.create_button_ui(gilrs::Button::RightTrigger, "R1");
|
||||||
let r2_button = self.create_button_ui(gilrs::Button::RightTrigger2, "R2");
|
let r2_button = self.create_gauge_button_ui(gilrs::Button::RightTrigger2, "R2");
|
||||||
let l1_button = self.create_button_ui(gilrs::Button::LeftTrigger, "L1");
|
let l1_button = self.create_button_ui(gilrs::Button::LeftTrigger, "L1");
|
||||||
let l2_button = self.create_button_ui(gilrs::Button::LeftTrigger2, "L2");
|
let l2_button = self.create_gauge_button_ui(gilrs::Button::LeftTrigger2, "L2");
|
||||||
|
|
||||||
let layers = Layout::horizontal([
|
let layers = Layout::horizontal([
|
||||||
Fill(2),
|
Fill(2),
|
||||||
|
@ -246,6 +263,32 @@ impl App {
|
||||||
.style(Style::default().bg(color))
|
.style(Style::default().bg(color))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn create_gauge_button_ui(&self, btn: gilrs::Button, title: &'static str) -> Gauge {
|
||||||
|
let value = match self.manager.active_gamepad() {
|
||||||
|
Ok(gamepad) => match gamepad.button_data(btn) {
|
||||||
|
Some(val) => val.value(),
|
||||||
|
None => 0.0,
|
||||||
|
},
|
||||||
|
Err(_) => 0.0,
|
||||||
|
};
|
||||||
|
let value = value.clamp(0.0, 1.0);
|
||||||
|
|
||||||
|
let color = match value {
|
||||||
|
x if x > 0.0 => Color::Green,
|
||||||
|
_ => Color::DarkGray,
|
||||||
|
};
|
||||||
|
|
||||||
|
let value_label = Span::default().content(format!("{:.1}", value * 100.0));
|
||||||
|
let empty_label = Span::default().content("");
|
||||||
|
|
||||||
|
Gauge::default()
|
||||||
|
.block(Block::bordered().title_top(title).title_bottom(value_label))
|
||||||
|
.gauge_style(Style::default().fg(color))
|
||||||
|
.label(empty_label)
|
||||||
|
.use_unicode(true)
|
||||||
|
.ratio(value.into())
|
||||||
|
}
|
||||||
|
|
||||||
fn create_joystick_ui(&self, axis_x: gilrs::Axis, axis_y: gilrs::Axis) -> impl Widget + '_ {
|
fn create_joystick_ui(&self, axis_x: gilrs::Axis, axis_y: gilrs::Axis) -> impl Widget + '_ {
|
||||||
let (x, y) = match self.manager.active_gamepad() {
|
let (x, y) = match self.manager.active_gamepad() {
|
||||||
Ok(gp) => {
|
Ok(gp) => {
|
||||||
|
|
Loading…
Reference in New Issue