skullball/rust/src/ui/slider.rs
2026-07-23 21:39:51 +03:00

57 lines
1.3 KiB
Rust

use godot::{
classes::{HBoxContainer, IHBoxContainer, Label, Slider},
prelude::*,
};
#[derive(GodotClass)]
#[class(base=HBoxContainer, init, tool)]
pub struct SliderContainer {
#[export]
label: Option<Gd<Label>>,
#[export]
slider: Option<Gd<Slider>>,
#[export]
pub value: f64,
#[export]
pub min: f64,
#[export]
pub max: f64,
last_value: f64,
base: Base<HBoxContainer>,
}
#[godot_api]
impl IHBoxContainer for SliderContainer {
fn ready(&mut self) {}
fn process(&mut self, _delta: f64) {
if let Some(slider) = &mut self.slider {
slider.set_min(self.min);
slider.set_max(self.max);
if self.last_value != self.value {
slider.set_value(self.value);
}
self.value = slider.get_value();
if self.last_value != self.value {
let value = self.value;
self.signals().on_change().emit(value);
}
self.last_value = self.value;
}
if let Some(label) = &mut self.label
&& let Some(slider) = &self.slider
{
label.set_text(&format!("{}", slider.get_value()));
}
}
}
#[godot_api]
impl SliderContainer {
#[signal]
pub fn on_change(value: f64);
}