use std::sync::Arc; use anyhow::Result; use rfactor_sm_reader::{rF2VehicleTelemetry, VehicleScoringInfoV01}; use ui::prelude::*; use crate::overlay::{rfactor_data::DataReceiver, UiOverlay}; pub struct Pedals { gui: Arc, brake: Arc, throttle: Arc, } impl Pedals { pub fn new(gui_handler: &Arc) -> Result { const DESC: &str = include_str!("ui_files/pedals.xml"); let gui = GuiBuilder::from_str(gui_handler, DESC)?; let brake = gui.element("brake")?; let throttle = gui.element("throttle")?; Ok(Self { gui, brake, throttle, }) } } impl Drop for Pedals { fn drop(&mut self) { self.gui.disable().unwrap(); } } impl UiOverlay for Pedals { fn enable_ui(&mut self) -> Result<()> { self.gui.enable() } } impl DataReceiver for Pedals { fn scoring_update(&mut self, _vehicle_scoring: &[VehicleScoringInfoV01]) -> Result<()> { Ok(()) } fn telemetry_update( &mut self, player_id: Option, telemetries: &[rF2VehicleTelemetry], ) -> Result<()> { if let Some(id) = player_id { if let Some(telemetry) = telemetries.iter().find(|telemetry| telemetry.id == id) { self.brake .set_progress(telemetry.unfiltered_throttle as f32)?; self.throttle .set_progress(telemetry.unfiltered_throttle as f32)?; } } Ok(()) } }