WIP from 2024-12-01
This commit is contained in:
parent
3674fbdee7
commit
76a27cd179
4 changed files with 78 additions and 15 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))?;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue