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,75 +43,57 @@ 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() {
let mut has_head = false; return;
let mut has_left = false; }
let mut has_right = false; let mut has_head = false;
let mut models: Vec<DeviceRowModelInit> = vec![]; let mut has_left = false;
let mut generic: Vec<&XRDevice> = vec![]; let mut has_right = false;
for dev in &self.devices { let mut models: Vec<DeviceRowModelInit> = Vec::new();
match dev.dev_type { for dev in &self.devices {
XRDeviceRole::Head => { match dev.dev_type {
has_head = true; XRDeviceRole::Head => {
let mut init = DeviceRowModelInit::from_xr_device(dev); has_head = true;
if dev.name == "Simulated HMD" { let mut init = DeviceRowModelInit::from(dev);
init.state = Some(DeviceRowState::Warning); if dev.name == "Simulated HMD" || dev.name == "Qwerty HMD" {
init.subtitle = Some("No HMD detected (Simulated HMD)".into()); init.state = Some(DeviceRowState::Warning);
} init.subtitle = Some(format!("No HMD detected ({})", dev.name));
models.push(init);
} }
XRDeviceRole::Left => { models.push(init);
has_left = true; }
models.push(DeviceRowModelInit::from_xr_device(dev)); XRDeviceRole::Left => {
} has_left = true;
XRDeviceRole::Right => { models.push(DeviceRowModelInit::from(dev));
has_right = true; }
models.push(DeviceRowModelInit::from_xr_device(dev)); XRDeviceRole::Right => {
} has_right = true;
XRDeviceRole::GenericTracker => { models.push(DeviceRowModelInit::from(dev));
generic.push(dev); }
} _ => {
_ => { models.push(DeviceRowModelInit::from(dev));
models.push(DeviceRowModelInit::from_xr_device(dev)); }
} };
}; }
} if !has_right {
if !generic.is_empty() { models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Right));
models.push(DeviceRowModelInit { }
title: Some(XRDeviceRole::GenericTracker.to_string()), if !has_left {
subtitle: Some( models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Left));
generic }
.iter() if !has_head {
.map(|d| format!("{} ({})", d.name, d.index)) models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Head));
.collect::<Vec<String>>() }
.join("\n"),
),
..Default::default()
});
}
if !has_right {
models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Right));
}
if !has_left {
models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Left));
}
if !has_head {
models.push(DeviceRowModelInit::new_missing(XRDeviceRole::Head));
}
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)
});
for model in models { for model in models {
guard.push_back(model); guard.push_back(model);
}
} }
} }
} }

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()),