WIP: load devices in UI
This commit is contained in:
parent
260ecdc531
commit
c93bdab059
@ -2,7 +2,7 @@ use std::rc::Rc;
|
||||
use gtk::prelude::*;
|
||||
use relm4::prelude::*;
|
||||
|
||||
use crate::orchestrator::Orchestrator;
|
||||
use crate::{devices::MkDevice, orchestrator::Orchestrator, registry::RegistryItem, util::unique_id::UniqueId};
|
||||
|
||||
pub struct MainWindow
|
||||
{
|
||||
@ -40,6 +40,7 @@ pub struct MainWindowWidgets
|
||||
|
||||
pub struct MainWindowDeviceWidgets
|
||||
{
|
||||
devices_sorted: Vec<SortedDevice>,
|
||||
devices_combobox: gtk::ComboBoxText
|
||||
}
|
||||
|
||||
@ -64,10 +65,12 @@ impl SimpleComponent for MainWindow
|
||||
}
|
||||
|
||||
|
||||
fn init(_data: Self::Init, window: Self::Root, _sender: ComponentSender<Self>, ) -> ComponentParts<Self>
|
||||
fn init(data: Self::Init, window: Self::Root, _sender: ComponentSender<Self>, ) -> ComponentParts<Self>
|
||||
{
|
||||
let orchestrator = data.orchestrator.as_ref();
|
||||
|
||||
let model = MainWindow {};
|
||||
let widgets = Self::init_ui(&window);
|
||||
let widgets = Self::init_ui(&window, &orchestrator);
|
||||
|
||||
ComponentParts { model, widgets }
|
||||
}
|
||||
@ -85,14 +88,14 @@ impl SimpleComponent for MainWindow
|
||||
|
||||
impl MainWindow
|
||||
{
|
||||
fn init_ui(window: >k::Window) -> MainWindowWidgets
|
||||
fn init_ui(window: >k::Window, orchestrator: &Orchestrator) -> MainWindowWidgets
|
||||
{
|
||||
let tabs = gtk::Notebook::builder().build();
|
||||
window.set_child(Some(&tabs));
|
||||
|
||||
MainWindowWidgets
|
||||
{
|
||||
device: Self::init_device_tab(&tabs)
|
||||
device: Self::init_device_tab(&tabs, &orchestrator)
|
||||
//Self::new_box_tab(&tabs, "mainwindow.tab.analoginputs");
|
||||
//Self::new_box_tab(&tabs, "mainwindow.tab.digitalinputs");
|
||||
//Self::add_box_tab(&tabs, "mainwindow.tab.analogoutputs");
|
||||
@ -101,7 +104,7 @@ impl MainWindow
|
||||
}
|
||||
|
||||
|
||||
fn init_device_tab(tabs: >k::Notebook) -> MainWindowDeviceWidgets
|
||||
fn init_device_tab(tabs: >k::Notebook, orchestrator: &Orchestrator) -> MainWindowDeviceWidgets
|
||||
{
|
||||
let tab = Self::new_box_tab(&tabs, "mainwindow.tab.device");
|
||||
|
||||
@ -120,13 +123,36 @@ impl MainWindow
|
||||
tab.append(&devices_combobox);
|
||||
|
||||
|
||||
// TEMP
|
||||
devices_combobox.append_text("Test");
|
||||
devices_combobox.append_text("Test 2");
|
||||
let mut devices_sorted: Vec<SortedDevice> = orchestrator.devices()
|
||||
.map(|device| SortedDevice
|
||||
{
|
||||
unique_id: device.unique_id(),
|
||||
name: device.name()
|
||||
})
|
||||
.collect();
|
||||
|
||||
devices_sorted.sort_by(|a, b| a.name.to_lowercase().cmp(&b.name.to_lowercase()));
|
||||
|
||||
let current_device_id = orchestrator.current_device_id();
|
||||
|
||||
|
||||
for (index, device) in devices_sorted.iter().enumerate()
|
||||
{
|
||||
devices_combobox.append_text(device.name.as_str());
|
||||
|
||||
if let Some(device_id) = current_device_id
|
||||
{
|
||||
if device_id == device.unique_id
|
||||
{
|
||||
devices_combobox.set_active(Some(index as u32));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
MainWindowDeviceWidgets
|
||||
{
|
||||
devices_sorted,
|
||||
devices_combobox
|
||||
}
|
||||
}
|
||||
@ -151,4 +177,11 @@ impl MainWindow
|
||||
|
||||
tab
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
struct SortedDevice
|
||||
{
|
||||
unique_id: UniqueId,
|
||||
name: String
|
||||
}
|
@ -55,10 +55,22 @@ impl Orchestrator
|
||||
}
|
||||
|
||||
|
||||
pub fn current_device(&self) -> Option<&MkDevice>
|
||||
pub fn devices(&self) -> impl Iterator<Item = &MkDevice>
|
||||
{
|
||||
self.device_registry.iter()
|
||||
}
|
||||
|
||||
|
||||
pub fn current_device_id(&self) -> Option<UniqueId>
|
||||
{
|
||||
let Some(device_id) = &self.settings.device_id else { return None };
|
||||
self.device_registry.by_id(UniqueId::new(device_id.as_str()))
|
||||
Some(UniqueId::new(device_id.as_str()))
|
||||
}
|
||||
|
||||
pub fn current_device(&self) -> Option<&MkDevice>
|
||||
{
|
||||
let Some(device_id) = self.current_device_id() else { return None };
|
||||
self.device_registry.by_id(device_id)
|
||||
}
|
||||
|
||||
|
||||
|
@ -23,7 +23,7 @@ pub struct MkRegistry<T> where T: RegistryItem
|
||||
|
||||
|
||||
|
||||
impl<'a, T> MkRegistry<T> where T: RegistryItem
|
||||
impl<T> MkRegistry<T> where T: RegistryItem
|
||||
{
|
||||
pub fn new() -> Self
|
||||
{
|
||||
@ -43,6 +43,12 @@ impl<'a, T> MkRegistry<T> where T: RegistryItem
|
||||
}
|
||||
|
||||
|
||||
pub fn iter(&self) -> impl Iterator<Item = &T>
|
||||
{
|
||||
self.items.values()
|
||||
}
|
||||
|
||||
|
||||
pub fn by_id(&self, id: UniqueId) -> Option<&T>
|
||||
{
|
||||
self.items.get(id.as_str())
|
||||
|
@ -5,6 +5,7 @@ use regex::Regex;
|
||||
/// A string which must conform to the specified regex pattern,
|
||||
/// otherwise it will panic by design. Intended for code validation,
|
||||
/// not for runtime input validation.
|
||||
#[derive(PartialEq, Eq)]
|
||||
pub struct ValidatedString<T: ValidatedStringPattern>
|
||||
{
|
||||
inner: String,
|
||||
|
Loading…
Reference in New Issue
Block a user