Skip to main content

nmrs_gui/ui/
wired_page.rs

1use glib::clone;
2use gtk::prelude::*;
3use gtk::{Align, Box, Button, Image, Label, Orientation};
4use nmrs::models::Device;
5
6pub struct WiredPage {
7    root: gtk::Box,
8
9    title: gtk::Label,
10    state_label: gtk::Label,
11
12    interface: gtk::Label,
13    device_type: gtk::Label,
14    mac_address: gtk::Label,
15    driver: gtk::Label,
16    managed: gtk::Label,
17}
18
19impl WiredPage {
20    pub fn new(stack: &gtk::Stack) -> Self {
21        let root = Box::new(Orientation::Vertical, 12);
22        root.add_css_class("network-page");
23
24        let back = Button::with_label("← Back");
25        back.add_css_class("back-button");
26        back.set_halign(Align::Start);
27        back.set_cursor_from_name(Some("pointer"));
28        back.connect_clicked(clone![
29            #[weak]
30            stack,
31            move |_| {
32                stack.set_visible_child_name("networks");
33            }
34        ]);
35        root.append(&back);
36
37        let header = Box::new(Orientation::Horizontal, 6);
38        let icon = Image::from_icon_name("network-wired-symbolic");
39        icon.set_pixel_size(24);
40
41        let title = Label::new(None);
42        title.add_css_class("network-title");
43
44        let spacer = Box::new(Orientation::Horizontal, 0);
45        spacer.set_hexpand(true);
46
47        header.append(&icon);
48        header.append(&title);
49        header.append(&spacer);
50        root.append(&header);
51
52        let basic_box = Box::new(Orientation::Vertical, 6);
53        basic_box.add_css_class("basic-section");
54
55        let basic_header = Label::new(Some("Basic"));
56        basic_header.add_css_class("section-header");
57        basic_box.append(&basic_header);
58
59        let state_label = Label::new(None);
60        let interface = Label::new(None);
61
62        Self::add_row(&basic_box, "Connection State", &state_label);
63        Self::add_row(&basic_box, "Interface", &interface);
64
65        root.append(&basic_box);
66
67        let advanced_box = Box::new(Orientation::Vertical, 8);
68        advanced_box.add_css_class("advanced-section");
69
70        let advanced_header = Label::new(Some("Advanced"));
71        advanced_header.add_css_class("section-header");
72        advanced_box.append(&advanced_header);
73
74        let device_type = Label::new(None);
75        let mac_address = Label::new(None);
76        let driver = Label::new(None);
77        let managed = Label::new(None);
78
79        Self::add_row(&advanced_box, "Device Type", &device_type);
80        Self::add_row(&advanced_box, "MAC Address", &mac_address);
81        Self::add_row(&advanced_box, "Driver", &driver);
82        Self::add_row(&advanced_box, "Managed", &managed);
83
84        root.append(&advanced_box);
85
86        Self {
87            root,
88            title,
89            state_label,
90
91            interface,
92            device_type,
93            mac_address,
94            driver,
95            managed,
96        }
97    }
98
99    fn add_row(parent: &gtk::Box, key_text: &str, val_widget: &gtk::Label) {
100        let row = Box::new(Orientation::Vertical, 3);
101        row.set_halign(Align::Start);
102
103        let key = Label::new(Some(key_text));
104        key.add_css_class("info-label");
105        key.set_halign(Align::Start);
106
107        val_widget.add_css_class("info-value");
108        val_widget.set_halign(Align::Start);
109
110        row.append(&key);
111        row.append(val_widget);
112        parent.append(&row);
113    }
114
115    pub fn update(&self, device: &Device) {
116        self.title
117            .set_text(&format!("Wired Device: {}", device.interface));
118        self.state_label.set_text(&format!("{}", device.state));
119        self.interface.set_text(&device.interface);
120        self.device_type
121            .set_text(&format!("{}", device.device_type));
122        self.mac_address.set_text(&device.identity.current_mac);
123        self.driver
124            .set_text(&device.driver.clone().unwrap_or_else(|| "-".into()));
125        self.managed.set_text(
126            device
127                .managed
128                .map(|m| if m { "Yes" } else { "No" })
129                .unwrap_or("-"),
130        );
131    }
132
133    pub fn widget(&self) -> &gtk::Box {
134        &self.root
135    }
136}