nmrs_gui/ui/
wired_page.rs1use 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: >k::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: >k::Box, key_text: &str, val_widget: >k::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) -> >k::Box {
134 &self.root
135 }
136}