summaryrefslogtreecommitdiff
path: root/crates/flasher-qt/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/flasher-qt/src/main.rs')
-rw-r--r--crates/flasher-qt/src/main.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/crates/flasher-qt/src/main.rs b/crates/flasher-qt/src/main.rs
new file mode 100644
index 0000000..f131bc5
--- /dev/null
+++ b/crates/flasher-qt/src/main.rs
@@ -0,0 +1,69 @@
+use qmetaobject::{QmlEngine, QString, QVariant};
+use std::fs;
+
+const BOARDS: &str = include_str!("../../../alt-rootfs-installer/SUPPORTED-BOARDS");
+const QML: &str = include_str!("../qml/Main.qml");
+
+fn main() {
+ let mut engine = QmlEngine::new();
+ engine.set_property(
+ QString::from("supportedBoardsText"),
+ QVariant::from(QString::from(BOARDS)),
+ );
+ engine.set_property(
+ QString::from("availableDrivesText"),
+ QVariant::from(QString::from(available_drives().join("\n"))),
+ );
+ engine.load_data(QML.into());
+ engine.exec();
+}
+
+fn available_drives() -> Vec<String> {
+ let mut drives = Vec::new();
+ let Ok(entries) = fs::read_dir("/sys/block") else {
+ return drives;
+ };
+
+ for entry in entries.flatten() {
+ let name = entry.file_name().to_string_lossy().into_owned();
+ if name.starts_with("loop") || name.starts_with("ram") || name.starts_with("zram") {
+ continue;
+ }
+ let removable = fs::read_to_string(entry.path().join("removable"))
+ .map(|value| value.trim() == "1")
+ .unwrap_or(false);
+ if !removable && !name.starts_with("mmcblk") {
+ continue;
+ }
+
+ let sectors = fs::read_to_string(entry.path().join("size"))
+ .ok()
+ .and_then(|value| value.trim().parse::<u64>().ok())
+ .unwrap_or(0);
+ let model = fs::read_to_string(entry.path().join("device/model"))
+ .unwrap_or_default()
+ .trim()
+ .to_owned();
+ let description = if model.is_empty() {
+ format!("/dev/{name}")
+ } else {
+ model
+ };
+ drives.push(format!(
+ "{description} · {} · /dev/{name}",
+ format_size(sectors.saturating_mul(512))
+ ));
+ }
+ drives.sort();
+ drives
+}
+
+fn format_size(bytes: u64) -> String {
+ const GIB: f64 = 1024.0 * 1024.0 * 1024.0;
+ const MIB: f64 = 1024.0 * 1024.0;
+ if bytes as f64 >= GIB {
+ format!("{:.1} GB", bytes as f64 / GIB)
+ } else {
+ format!("{:.0} MB", bytes as f64 / MIB)
+ }
+}