feat: redesign devices list

This commit is contained in:
Gabriele Musco 2023-09-09 15:13:35 +02:00
commit a7534529cb
No known key found for this signature in database
GPG key ID: 1068D795C80E51DE

View file

@ -3,6 +3,7 @@ use crate::{
xr_devices::{XRDevice, XRDevices}, xr_devices::{XRDevice, XRDevices},
}; };
use gtk::prelude::*; use gtk::prelude::*;
use adw::prelude::*;
use relm4::prelude::*; use relm4::prelude::*;
use super::alert::alert; use super::alert::alert;
@ -57,18 +58,12 @@ impl SimpleComponent for DevicesBox {
set_margin_top: 12, set_margin_top: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.devices.is_some(), set_visible: model.devices.is_some(),
gtk::Separator { gtk::ListBox {
set_orientation: gtk::Orientation::Horizontal, add_css_class: "boxed-list",
set_hexpand: true, set_selection_mode: gtk::SelectionMode::None,
}, set_margin_all: 12,
// Head // Head
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
gtk::Image {
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_icon_name: Some(match model.get_dev(XRDevice::Head) { set_icon_name: Some(match model.get_dev(XRDevice::Head) {
Some(_) => "emblem-ok-symbolic", Some(_) => "emblem-ok-symbolic",
@ -76,28 +71,15 @@ impl SimpleComponent for DevicesBox {
}), }),
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Head).is_none()), set_class_active: ("error", model.get_dev(XRDevice::Head).is_none()),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Head: {}", match model.get_dev(XRDevice::Head) { set_title: format!("Head: {}", match model.get_dev(XRDevice::Head) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
#[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Head).is_none()),
// TODO: status icon with popover // TODO: status icon with popover
}, },
},
// Left // Left
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
gtk::Image {
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_icon_name: Some(match model.get_dev(XRDevice::Left) { set_icon_name: Some(match model.get_dev(XRDevice::Left) {
Some(_) => "emblem-ok-symbolic", Some(_) => "emblem-ok-symbolic",
@ -105,28 +87,15 @@ impl SimpleComponent for DevicesBox {
}), }),
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Left).is_none()), set_class_active: ("error", model.get_dev(XRDevice::Left).is_none()),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Left: {}", match model.get_dev(XRDevice::Left) { set_title: format!("Left: {}", match model.get_dev(XRDevice::Left) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
#[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Left).is_none()),
// TODO: status icon with popover // TODO: status icon with popover
}, },
},
// Right // Right
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
gtk::Image {
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_icon_name: Some(match model.get_dev(XRDevice::Right) { set_icon_name: Some(match model.get_dev(XRDevice::Right) {
Some(_) => "emblem-ok-symbolic", Some(_) => "emblem-ok-symbolic",
@ -134,132 +103,70 @@ impl SimpleComponent for DevicesBox {
}), }),
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Right).is_none()), set_class_active: ("error", model.get_dev(XRDevice::Right).is_none()),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Right: {}", match model.get_dev(XRDevice::Right) { set_title: format!("Right: {}", match model.get_dev(XRDevice::Right) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
#[track = "model.changed(Self::devices())"]
set_class_active: ("error", model.get_dev(XRDevice::Right).is_none()),
// TODO: status icon with popover // TODO: status icon with popover
}, },
},
// Gamepad // Gamepad
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.get_dev(XRDevice::Gamepad).is_some(), set_visible: model.get_dev(XRDevice::Gamepad).is_some(),
gtk::Image {
set_icon_name: Some("emblem-ok-symbolic"), set_icon_name: Some("emblem-ok-symbolic"),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Gamepad: {}", match model.get_dev(XRDevice::Gamepad) { set_title: format!("Gamepad: {}", match model.get_dev(XRDevice::Gamepad) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
}, },
},
// Eyes // Eyes
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.get_dev(XRDevice::Eyes).is_some(), set_visible: model.get_dev(XRDevice::Eyes).is_some(),
gtk::Image {
set_icon_name: Some("emblem-ok-symbolic"), set_icon_name: Some("emblem-ok-symbolic"),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Eye Tracking: {}", match model.get_dev(XRDevice::Eyes) { set_title: format!("Eye Tracking: {}", match model.get_dev(XRDevice::Eyes) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
}, },
},
// Hand Tracking Left // Hand Tracking Left
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.get_dev(XRDevice::HandTrackingLeft).is_some(), set_visible: model.get_dev(XRDevice::HandTrackingLeft).is_some(),
gtk::Image {
set_icon_name: Some("emblem-ok-symbolic"), set_icon_name: Some("emblem-ok-symbolic"),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Hand Tracking Left: {}", match model.get_dev(XRDevice::HandTrackingLeft) { set_title: format!("Hand Tracking Left: {}", match model.get_dev(XRDevice::HandTrackingLeft) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
}, },
},
// Hand Tracking Right // Hand Tracking Right
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.get_dev(XRDevice::HandTrackingRight).is_some(), set_visible: model.get_dev(XRDevice::HandTrackingRight).is_some(),
gtk::Image {
set_icon_name: Some("emblem-ok-symbolic"), set_icon_name: Some("emblem-ok-symbolic"),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Hand Tracking Left: {}", match model.get_dev(XRDevice::HandTrackingRight) { set_title: format!("Hand Tracking Left: {}", match model.get_dev(XRDevice::HandTrackingRight) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
}, },
},
// Generic Trackers // Generic Trackers
gtk::Box { adw::ActionRow {
set_orientation: gtk::Orientation::Horizontal,
set_hexpand: true,
set_spacing: 12,
set_margin_start: 12,
set_margin_end: 12,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_visible: model.get_dev(XRDevice::GenericTracker).is_some(), set_visible: model.get_dev(XRDevice::GenericTracker).is_some(),
gtk::Image {
set_icon_name: Some("emblem-ok-symbolic"), set_icon_name: Some("emblem-ok-symbolic"),
},
gtk::Label {
set_xalign: 0.0,
set_hexpand: true,
#[track = "model.changed(Self::devices())"] #[track = "model.changed(Self::devices())"]
set_label: format!("Generic Trackers: {}", match model.get_dev(XRDevice::GenericTracker) { set_title: format!("Generic Trackers: {}", match model.get_dev(XRDevice::GenericTracker) {
Some(v) => v.clone(), Some(v) => v.clone(),
None => "None".to_string(), None => "None".to_string(),
}).as_str(), }).as_str(),
}, add_suffix: save_trackers_btn = &gtk::Button {
gtk::Button { set_halign: gtk::Align::Center,
set_halign: gtk::Align::Start, set_valign: gtk::Align::Center,
set_hexpand: false,
set_icon_name: "document-save-symbolic", set_icon_name: "document-save-symbolic",
set_tooltip_text: Some("Save current trackers"), set_tooltip_text: Some("Save current trackers"),
set_css_classes: &["circular", "flat"], set_css_classes: &["circular", "flat"],
@ -270,6 +177,7 @@ impl SimpleComponent for DevicesBox {
}, },
} }
} }
}
fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) { fn update(&mut self, message: Self::Input, _sender: ComponentSender<Self>) {
self.reset(); self.reset();