Skip to content

Commit 9da9884

Browse files
authored
Merge pull request #1 from ERFouX/dev
feat(ui): add NBFC config dropdown with laptop model detection
2 parents d0f0e1d + 5c16fdc commit 9da9884

File tree

1 file changed

+102
-2
lines changed

1 file changed

+102
-2
lines changed

src/main.rs

Lines changed: 102 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,103 @@
1-
fn main() {
2-
println!("Hello, world!");
1+
use eframe::egui;
2+
use std::fs;
3+
use std::process::Command;
4+
5+
struct Veltrix {
6+
configs: Vec<String>,
7+
selected: Option<usize>,
8+
laptop_model: String,
9+
}
10+
11+
impl Veltrix {
12+
fn name() -> &'static str {
13+
"Veltrix"
14+
}
15+
16+
fn new(_cc: &eframe::CreationContext<'_>) -> Self {
17+
let configs = get_nbfc_list();
18+
let laptop_model = read_laptop_model();
19+
20+
let selected = configs.iter().position(|c| c == &laptop_model);
21+
22+
Self {
23+
configs,
24+
selected,
25+
laptop_model,
26+
}
27+
}
28+
}
29+
30+
impl eframe::App for Veltrix {
31+
fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
32+
egui::CentralPanel::default().show(ctx, |ui| {
33+
ui.heading("Welcome to Veltrix !\n");
34+
if self.selected.is_none() {
35+
ui.label("Please select a config");
36+
} else {
37+
ui.label(format!("Laptop model: {}", self.laptop_model));
38+
}
39+
40+
if !self.configs.is_empty() {
41+
let selected_text = self
42+
.selected
43+
.map(|i| self.configs[i].as_str())
44+
.unwrap_or("Select NBFC Config");
45+
46+
egui::ComboBox::from_label("Config List\n")
47+
.selected_text(selected_text)
48+
.show_ui(ui, |ui| {
49+
for (i, config) in self.configs.iter().enumerate() {
50+
if ui
51+
.selectable_label(self.selected == Some(i), config)
52+
.clicked()
53+
{
54+
self.selected = Some(i);
55+
}
56+
}
57+
});
58+
59+
if let Some(i) = self.selected {
60+
ui.colored_label(egui::Color32::GREEN, format!("Selected Config: {}", self.configs[i]));
61+
} else {
62+
ui.colored_label(egui::Color32::YELLOW, "No config selected!");
63+
}
64+
} else {
65+
ui.colored_label(egui::Color32::RED, "No config found!");
66+
}
67+
});
68+
}
69+
}
70+
71+
fn main() -> eframe::Result<()> {
72+
let native_options = eframe::NativeOptions {
73+
viewport: egui::ViewportBuilder::default().with_inner_size((600.0, 700.0)),
74+
..eframe::NativeOptions::default()
75+
};
76+
77+
eframe::run_native(
78+
Veltrix::name(),
79+
native_options,
80+
Box::new(|cc| Ok(Box::new(Veltrix::new(cc)))),
81+
)
82+
}
83+
84+
fn read_laptop_model() -> String {
85+
fs::read_to_string("/sys/class/dmi/id/product_name")
86+
.unwrap_or_else(|_| "Unknown".into())
87+
.trim()
88+
.to_string()
89+
}
90+
91+
fn get_nbfc_list() -> Vec<String> {
92+
let output = Command::new("nbfc")
93+
.arg("config")
94+
.arg("--list")
95+
.output()
96+
.expect("failed to execute nbfc");
97+
98+
String::from_utf8_lossy(&output.stdout)
99+
.lines()
100+
.map(|line| line.trim().to_string())
101+
.filter(|line| !line.is_empty())
102+
.collect()
3103
}

0 commit comments

Comments
 (0)