feat: don't treat generic trackers differently from other xr devices; refactor devices box

This commit is contained in:
Gabriele Musco 2024-08-02 11:11:20 +02:00
commit d533a05cb4
2 changed files with 52 additions and 68 deletions

View file

@ -43,52 +43,37 @@ impl SimpleComponent for DevicesBox {
self.set_devices(devs); self.set_devices(devs);
let mut guard = self.device_rows.guard(); let mut guard = self.device_rows.guard();
guard.clear(); guard.clear();
if !self.devices.is_empty() { if self.devices.is_empty() {
return;
}
let mut has_head = false; let mut has_head = false;
let mut has_left = false; let mut has_left = false;
let mut has_right = false; let mut has_right = false;
let mut models: Vec<DeviceRowModelInit> = vec![]; let mut models: Vec<DeviceRowModelInit> = Vec::new();
let mut generic: Vec<&XRDevice> = vec![];
for dev in &self.devices { for dev in &self.devices {
match dev.dev_type { match dev.dev_type {
XRDeviceRole::Head => { XRDeviceRole::Head => {
has_head = true; has_head = true;
let mut init = DeviceRowModelInit::from_xr_device(dev); let mut init = DeviceRowModelInit::from(dev);
if dev.name == "Simulated HMD" { if dev.name == "Simulated HMD" || dev.name == "Qwerty HMD" {
init.state = Some(DeviceRowState::Warning); init.state = Some(DeviceRowState::Warning);
init.subtitle = Some("No HMD detected (Simulated HMD)".into()); init.subtitle = Some(format!("No HMD detected ({})", dev.name));
} }
models.push(init); models.push(init);
} }
XRDeviceRole::Left => { XRDeviceRole::Left => {
has_left = true; has_left = true;
models.push(DeviceRowModelInit::from_xr_device(dev)); models.push(DeviceRowModelInit::from(dev));
} }
XRDeviceRole::Right => { XRDeviceRole::Right => {
has_right = true; has_right = true;
models.push(DeviceRowModelInit::from_xr_device(dev)); models.push(DeviceRowModelInit::from(dev));
}
XRDeviceRole::GenericTracker => {
generic.push(dev);
} }
_ => { _ => {
models.push(DeviceRowModelInit::from_xr_device(dev)); models.push(DeviceRowModelInit::from(dev));
} }
}; };
} }
if !generic.is_empty() {
models.push(DeviceRowModelInit {
title: Some(XRDeviceRole::GenericTracker.to_string()),
subtitle: Some(
generic
.iter()
.map(|d| format!("{} ({})", d.name, d.index))
.collect::<Vec<String>>()
.join("\n"),
),
..Default::default()
});
}
if !has_right { if !has_right {
models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Right)); models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Right));
} }
@ -100,12 +85,10 @@ impl SimpleComponent for DevicesBox {
} }
models.sort_by(|m1, m2| { models.sort_by(|m1, m2| {
let dt1 = XRDeviceRole::from_display_str( let dt1 =
m1.title.as_ref().unwrap_or(&String::new()), XRDeviceRole::from_display_str(m1.title.as_deref().unwrap_or_default());
); let dt2 =
let dt2 = XRDeviceRole::from_display_str( XRDeviceRole::from_display_str(m2.title.as_deref().unwrap_or_default());
m2.title.as_ref().unwrap_or(&String::new()),
);
dt1.cmp(&dt2) dt1.cmp(&dt2)
}); });
@ -115,7 +98,6 @@ impl SimpleComponent for DevicesBox {
} }
} }
} }
}
fn init( fn init(
_init: Self::Init, _init: Self::Init,

View file

@ -54,8 +54,8 @@ pub struct DeviceRowModelInit {
pub battery_status: Option<EnvisionBatteryStatus>, pub battery_status: Option<EnvisionBatteryStatus>,
} }
impl DeviceRowModelInit { impl From<&XRDevice> for DeviceRowModelInit {
pub fn from_xr_device(d: &XRDevice) -> Self { fn from(d: &XRDevice) -> Self {
Self { Self {
title: Some(d.dev_type.to_string()), title: Some(d.dev_type.to_string()),
subtitle: Some(d.name.clone()), subtitle: Some(d.name.clone()),
@ -63,7 +63,9 @@ impl DeviceRowModelInit {
..Default::default() ..Default::default()
} }
} }
}
impl DeviceRowModelInit {
pub fn new_missing(t: XRDeviceRole) -> Self { pub fn new_missing(t: XRDeviceRole) -> Self {
DeviceRowModelInit { DeviceRowModelInit {
title: Some(t.to_string()), title: Some(t.to_string()),