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
parent 0f3bea883f
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);
let mut guard = self.device_rows.guard();
guard.clear();
if !self.devices.is_empty() {
let mut has_head = false;
let mut has_left = false;
let mut has_right = false;
let mut models: Vec<DeviceRowModelInit> = vec![];
let mut generic: Vec<&XRDevice> = vec![];
for dev in &self.devices {
match dev.dev_type {
XRDeviceRole::Head => {
has_head = true;
let mut init = DeviceRowModelInit::from_xr_device(dev);
if dev.name == "Simulated HMD" {
init.state = Some(DeviceRowState::Warning);
init.subtitle = Some("No HMD detected (Simulated HMD)".into());
}
models.push(init);
if self.devices.is_empty() {
return;
}
let mut has_head = false;
let mut has_left = false;
let mut has_right = false;
let mut models: Vec<DeviceRowModelInit> = Vec::new();
for dev in &self.devices {
match dev.dev_type {
XRDeviceRole::Head => {
has_head = true;
let mut init = DeviceRowModelInit::from(dev);
if dev.name == "Simulated HMD" || dev.name == "Qwerty HMD" {
init.state = Some(DeviceRowState::Warning);
init.subtitle = Some(format!("No HMD detected ({})", dev.name));
}
XRDeviceRole::Left => {
has_left = true;
models.push(DeviceRowModelInit::from_xr_device(dev));
}
XRDeviceRole::Right => {
has_right = true;
models.push(DeviceRowModelInit::from_xr_device(dev));
}
XRDeviceRole::GenericTracker => {
generic.push(dev);
}
_ => {
models.push(DeviceRowModelInit::from_xr_device(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 {
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.push(init);
}
XRDeviceRole::Left => {
has_left = true;
models.push(DeviceRowModelInit::from(dev));
}
XRDeviceRole::Right => {
has_right = true;
models.push(DeviceRowModelInit::from(dev));
}
_ => {
models.push(DeviceRowModelInit::from(dev));
}
};
}
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| {
let dt1 = XRDeviceRole::from_display_str(
m1.title.as_ref().unwrap_or(&String::new()),
);
let dt2 = XRDeviceRole::from_display_str(
m2.title.as_ref().unwrap_or(&String::new()),
);
dt1.cmp(&dt2)
});
models.sort_by(|m1, m2| {
let dt1 =
XRDeviceRole::from_display_str(m1.title.as_deref().unwrap_or_default());
let dt2 =
XRDeviceRole::from_display_str(m2.title.as_deref().unwrap_or_default());
dt1.cmp(&dt2)
});
for model in models {
guard.push_back(model);
}
for model in models {
guard.push_back(model);
}
}
}

View file

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