From 76a27cd17973574bbff5eb57d2ede6257b61d4d7 Mon Sep 17 00:00:00 2001 From: 2Shirt <2xShirt@gmail.com> Date: Sat, 11 Jan 2025 16:24:54 -0800 Subject: [PATCH] WIP from 2024-12-01 --- deja_vu/config/config.json5 | 3 ++ deja_vu/src/action.rs | 3 +- deja_vu/src/app.rs | 20 +++++++--- deja_vu/src/components/left.rs | 67 ++++++++++++++++++++++++++++++---- 4 files changed, 78 insertions(+), 15 deletions(-) diff --git a/deja_vu/config/config.json5 b/deja_vu/config/config.json5 index 94e8666..2bf9438 100644 --- a/deja_vu/config/config.json5 +++ b/deja_vu/config/config.json5 @@ -90,6 +90,9 @@ // Diagnostic modes "DiagMenu": { "": "Process", + "": "KeyUp", + "": "KeyDown", + "": "InstallDriver", "": "Quit", // Quit the application "": "Quit", // Another way to quit "": "Quit", // Yet another way to quit diff --git a/deja_vu/src/action.rs b/deja_vu/src/action.rs index ba18a79..ba6b760 100644 --- a/deja_vu/src/action.rs +++ b/deja_vu/src/action.rs @@ -25,10 +25,11 @@ use crate::{ }, }; -#[derive(Debug, Clone, PartialEq, Eq, Display, Serialize, Deserialize)] +#[derive(Debug, Default, Clone, PartialEq, Eq, Display, Serialize, Deserialize)] pub enum Action { // App InstallDriver, + #[default] Process, ScanDisks, Select(Option, Option), // indicies for (source, dest) or (boot, os) diff --git a/deja_vu/src/app.rs b/deja_vu/src/app.rs index 04021f8..6336a39 100644 --- a/deja_vu/src/app.rs +++ b/deja_vu/src/app.rs @@ -138,9 +138,13 @@ impl App { } pub fn next_mode(&mut self) -> Option { + info!( + "Prev Mode: {:?} // Cur Mode: {:?}", + self.prev_mode, self.cur_mode + ); let new_mode = match (self.prev_mode, self.cur_mode) { // Clone states - (_, Mode::InstallDrivers) => Mode::ScanDisks, + (_, Mode::InstallDrivers) => self.prev_mode, (_, Mode::ScanDisks) => Mode::SelectDisks, (_, Mode::SelectDisks | Mode::SelectTableType | Mode::SelectParts) => { if self.selections[1].is_some() { @@ -158,11 +162,14 @@ impl App { (_, Mode::Failed) => Mode::Failed, // Diagnostic states - (_, Mode::DiagMenu) => Mode::BootDiags, - (_, Mode::BootDiags) => Mode::BootSetup, - (_, Mode::BootSetup) => Mode::InjectDrivers, - (_, Mode::InjectDrivers) => Mode::ToggleSafeBoot, - (_, Mode::ToggleSafeBoot) => Mode::Done, + ( + _, + Mode::DiagMenu + | Mode::BootDiags + | Mode::BootSetup + | Mode::InjectDrivers + | Mode::ToggleSafeBoot, + ) => Mode::DiagMenu, // Invalid states (_, Mode::Confirm) => panic!("This shouldn't happen."), @@ -315,6 +322,7 @@ impl App { action_tx.send(Action::SetMode(Mode::ScanDisks))?; } cli::Command::Diagnose => { + self.prev_mode = Mode::DiagMenu; action_tx.send(Action::SetMode(Mode::DiagMenu))?; } } diff --git a/deja_vu/src/components/left.rs b/deja_vu/src/components/left.rs index 4a9bbf7..8d61f72 100644 --- a/deja_vu/src/components/left.rs +++ b/deja_vu/src/components/left.rs @@ -1,3 +1,5 @@ +use std::fmt; + // This file is part of Deja-vu. // // Deja-vu is free software: you can redistribute it and/or modify it @@ -33,10 +35,23 @@ use crate::{ }, }; +#[derive(Clone, Default)] +pub struct DiagMenu { + name: String, + action: Action, +} + +impl fmt::Display for DiagMenu { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", &self.name) + } +} + #[derive(Default)] pub struct Left { command_tx: Option>, config: Config, + diag_menu: StatefulList, disk_id_dest: Option, table_type: Option, title_text: String, @@ -50,7 +65,28 @@ pub struct Left { impl Left { pub fn new() -> Self { + let menu_entries = vec![ + DiagMenu { + name: String::from("Boot Diagnostics"), + action: Action::SetMode(Mode::BootDiags), + }, + DiagMenu { + name: String::from("Boot Setup"), + action: Action::SetMode(Mode::BootSetup), + }, + DiagMenu { + name: String::from("Inject Drivers"), + action: Action::SetMode(Mode::InjectDrivers), + }, + DiagMenu { + name: String::from("Toggle Safe Mode"), + action: Action::SetMode(Mode::ToggleSafeBoot), + }, + ]; + let mut diag_menu = StatefulList::default(); + diag_menu.set_items(menu_entries); Self { + diag_menu, selections: vec![None, None], title_text: String::from("Home"), ..Default::default() @@ -77,6 +113,7 @@ impl Component for Left { fn update(&mut self, action: Action) -> Result> { match action { Action::KeyUp => match self.mode { + Mode::DiagMenu => self.diag_menu.previous(), Mode::InstallDrivers => self.list_drivers.previous(), Mode::SelectDisks => self.list_disks.previous(), Mode::SelectTableType => self.list_table_types.previous(), @@ -84,6 +121,7 @@ impl Component for Left { _ => {} }, Action::KeyDown => match self.mode { + Mode::DiagMenu => self.diag_menu.next(), Mode::InstallDrivers => self.list_drivers.next(), Mode::SelectDisks => self.list_disks.next(), Mode::SelectTableType => self.list_table_types.next(), @@ -97,12 +135,14 @@ impl Component for Left { command_tx.send(Action::NextScreen)?; } } - Mode::InstallDrivers + Mode::DiagMenu + | Mode::InstallDrivers | Mode::SelectDisks | Mode::SelectTableType | Mode::SelectParts => { // Menu selection sections let selection: Option = match self.mode { + Mode::DiagMenu => self.diag_menu.selected(), Mode::InstallDrivers => self.list_drivers.selected(), Mode::SelectDisks => self.list_disks.selected(), Mode::SelectTableType => self.list_table_types.selected(), @@ -136,6 +176,12 @@ impl Component for Left { // Send selection(s) if needed // NOTE: This is needed to keep the app and all components in sync match self.mode { + Mode::DiagMenu => { + // Only need to select one entry + if let Some(entry) = self.diag_menu.get_selected() { + command_tx.send(entry.action)?; + } + } Mode::InstallDrivers => { // Only need to select one entry if let Some(driver) = self.list_drivers.get_selected() { @@ -163,11 +209,7 @@ impl Component for Left { } } } - Mode::DiagMenu - | Mode::BootDiags - | Mode::BootSetup - | Mode::InjectDrivers - | Mode::ToggleSafeBoot => { + Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers | Mode::ToggleSafeBoot => { if let Some(command_tx) = self.command_tx.clone() { command_tx.send(Action::NextScreen)?; } @@ -292,7 +334,6 @@ impl Component for Left { | Mode::Clone | Mode::PostClone // Diagnostic modes - | Mode::DiagMenu | Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers @@ -324,13 +365,20 @@ impl Component for Left { // Bail early return Ok(()); } - Mode::InstallDrivers + Mode::DiagMenu + | Mode::InstallDrivers | Mode::SelectDisks | Mode::SelectTableType | Mode::SelectParts => { // List modes let mut list_items = Vec::::new(); let list_items_strings: Vec = match self.mode { + Mode::DiagMenu=> self + .diag_menu + .items + .iter() + .map(|i| format!("{i}")) + .collect(), Mode::InstallDrivers => self .list_drivers .items @@ -388,6 +436,9 @@ impl Component for Left { .highlight_symbol(" --> ") .repeat_highlight_symbol(false); match self.mode { + Mode::DiagMenu=> { + frame.render_stateful_widget(list, body_area, &mut self.diag_menu.state); + } Mode::InstallDrivers => { frame.render_stateful_widget(list, body_area, &mut self.list_drivers.state); }