diff options
Diffstat (limited to 'crates/flasher-qt/src/main.rs')
| -rw-r--r-- | crates/flasher-qt/src/main.rs | 69 |
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) + } +} |