WIP from 2024-12-01

This commit is contained in:
2Shirt 2025-01-11 16:24:54 -08:00
parent 3674fbdee7
commit 76a27cd179
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
4 changed files with 78 additions and 15 deletions

View file

@ -90,6 +90,9 @@
// Diagnostic modes
"DiagMenu": {
"<Enter>": "Process",
"<Up>": "KeyUp",
"<Down>": "KeyDown",
"<i>": "InstallDriver",
"<q>": "Quit", // Quit the application
"<Ctrl-d>": "Quit", // Another way to quit
"<Ctrl-c>": "Quit", // Yet another way to quit

View file

@ -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<usize>, Option<usize>), // indicies for (source, dest) or (boot, os)

View file

@ -138,9 +138,13 @@ impl App {
}
pub fn next_mode(&mut self) -> Option<Mode> {
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))?;
}
}

View file

@ -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<UnboundedSender<Action>>,
config: Config,
diag_menu: StatefulList<DiagMenu>,
disk_id_dest: Option<usize>,
table_type: Option<PartitionTableType>,
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<Option<Action>> {
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<usize> = 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::<ListItem>::new();
let list_items_strings: Vec<String> = 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);
}