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
|
// Diagnostic modes
|
||||||
"DiagMenu": {
|
"DiagMenu": {
|
||||||
"<Enter>": "Process",
|
"<Enter>": "Process",
|
||||||
|
"<Up>": "KeyUp",
|
||||||
|
"<Down>": "KeyDown",
|
||||||
|
"<i>": "InstallDriver",
|
||||||
"<q>": "Quit", // Quit the application
|
"<q>": "Quit", // Quit the application
|
||||||
"<Ctrl-d>": "Quit", // Another way to quit
|
"<Ctrl-d>": "Quit", // Another way to quit
|
||||||
"<Ctrl-c>": "Quit", // Yet 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 {
|
pub enum Action {
|
||||||
// App
|
// App
|
||||||
InstallDriver,
|
InstallDriver,
|
||||||
|
#[default]
|
||||||
Process,
|
Process,
|
||||||
ScanDisks,
|
ScanDisks,
|
||||||
Select(Option<usize>, Option<usize>), // indicies for (source, dest) or (boot, os)
|
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> {
|
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) {
|
let new_mode = match (self.prev_mode, self.cur_mode) {
|
||||||
// Clone states
|
// Clone states
|
||||||
(_, Mode::InstallDrivers) => Mode::ScanDisks,
|
(_, Mode::InstallDrivers) => self.prev_mode,
|
||||||
(_, Mode::ScanDisks) => Mode::SelectDisks,
|
(_, Mode::ScanDisks) => Mode::SelectDisks,
|
||||||
(_, Mode::SelectDisks | Mode::SelectTableType | Mode::SelectParts) => {
|
(_, Mode::SelectDisks | Mode::SelectTableType | Mode::SelectParts) => {
|
||||||
if self.selections[1].is_some() {
|
if self.selections[1].is_some() {
|
||||||
|
|
@ -158,11 +162,14 @@ impl App {
|
||||||
(_, Mode::Failed) => Mode::Failed,
|
(_, Mode::Failed) => Mode::Failed,
|
||||||
|
|
||||||
// Diagnostic states
|
// Diagnostic states
|
||||||
(_, Mode::DiagMenu) => Mode::BootDiags,
|
(
|
||||||
(_, Mode::BootDiags) => Mode::BootSetup,
|
_,
|
||||||
(_, Mode::BootSetup) => Mode::InjectDrivers,
|
Mode::DiagMenu
|
||||||
(_, Mode::InjectDrivers) => Mode::ToggleSafeBoot,
|
| Mode::BootDiags
|
||||||
(_, Mode::ToggleSafeBoot) => Mode::Done,
|
| Mode::BootSetup
|
||||||
|
| Mode::InjectDrivers
|
||||||
|
| Mode::ToggleSafeBoot,
|
||||||
|
) => Mode::DiagMenu,
|
||||||
|
|
||||||
// Invalid states
|
// Invalid states
|
||||||
(_, Mode::Confirm) => panic!("This shouldn't happen."),
|
(_, Mode::Confirm) => panic!("This shouldn't happen."),
|
||||||
|
|
@ -315,6 +322,7 @@ impl App {
|
||||||
action_tx.send(Action::SetMode(Mode::ScanDisks))?;
|
action_tx.send(Action::SetMode(Mode::ScanDisks))?;
|
||||||
}
|
}
|
||||||
cli::Command::Diagnose => {
|
cli::Command::Diagnose => {
|
||||||
|
self.prev_mode = Mode::DiagMenu;
|
||||||
action_tx.send(Action::SetMode(Mode::DiagMenu))?;
|
action_tx.send(Action::SetMode(Mode::DiagMenu))?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
// This file is part of Deja-vu.
|
// This file is part of Deja-vu.
|
||||||
//
|
//
|
||||||
// Deja-vu is free software: you can redistribute it and/or modify it
|
// 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)]
|
#[derive(Default)]
|
||||||
pub struct Left {
|
pub struct Left {
|
||||||
command_tx: Option<UnboundedSender<Action>>,
|
command_tx: Option<UnboundedSender<Action>>,
|
||||||
config: Config,
|
config: Config,
|
||||||
|
diag_menu: StatefulList<DiagMenu>,
|
||||||
disk_id_dest: Option<usize>,
|
disk_id_dest: Option<usize>,
|
||||||
table_type: Option<PartitionTableType>,
|
table_type: Option<PartitionTableType>,
|
||||||
title_text: String,
|
title_text: String,
|
||||||
|
|
@ -50,7 +65,28 @@ pub struct Left {
|
||||||
|
|
||||||
impl Left {
|
impl Left {
|
||||||
pub fn new() -> Self {
|
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 {
|
Self {
|
||||||
|
diag_menu,
|
||||||
selections: vec![None, None],
|
selections: vec![None, None],
|
||||||
title_text: String::from("Home"),
|
title_text: String::from("Home"),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
|
@ -77,6 +113,7 @@ impl Component for Left {
|
||||||
fn update(&mut self, action: Action) -> Result<Option<Action>> {
|
fn update(&mut self, action: Action) -> Result<Option<Action>> {
|
||||||
match action {
|
match action {
|
||||||
Action::KeyUp => match self.mode {
|
Action::KeyUp => match self.mode {
|
||||||
|
Mode::DiagMenu => self.diag_menu.previous(),
|
||||||
Mode::InstallDrivers => self.list_drivers.previous(),
|
Mode::InstallDrivers => self.list_drivers.previous(),
|
||||||
Mode::SelectDisks => self.list_disks.previous(),
|
Mode::SelectDisks => self.list_disks.previous(),
|
||||||
Mode::SelectTableType => self.list_table_types.previous(),
|
Mode::SelectTableType => self.list_table_types.previous(),
|
||||||
|
|
@ -84,6 +121,7 @@ impl Component for Left {
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
Action::KeyDown => match self.mode {
|
Action::KeyDown => match self.mode {
|
||||||
|
Mode::DiagMenu => self.diag_menu.next(),
|
||||||
Mode::InstallDrivers => self.list_drivers.next(),
|
Mode::InstallDrivers => self.list_drivers.next(),
|
||||||
Mode::SelectDisks => self.list_disks.next(),
|
Mode::SelectDisks => self.list_disks.next(),
|
||||||
Mode::SelectTableType => self.list_table_types.next(),
|
Mode::SelectTableType => self.list_table_types.next(),
|
||||||
|
|
@ -97,12 +135,14 @@ impl Component for Left {
|
||||||
command_tx.send(Action::NextScreen)?;
|
command_tx.send(Action::NextScreen)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Mode::InstallDrivers
|
Mode::DiagMenu
|
||||||
|
| Mode::InstallDrivers
|
||||||
| Mode::SelectDisks
|
| Mode::SelectDisks
|
||||||
| Mode::SelectTableType
|
| Mode::SelectTableType
|
||||||
| Mode::SelectParts => {
|
| Mode::SelectParts => {
|
||||||
// Menu selection sections
|
// Menu selection sections
|
||||||
let selection: Option<usize> = match self.mode {
|
let selection: Option<usize> = match self.mode {
|
||||||
|
Mode::DiagMenu => self.diag_menu.selected(),
|
||||||
Mode::InstallDrivers => self.list_drivers.selected(),
|
Mode::InstallDrivers => self.list_drivers.selected(),
|
||||||
Mode::SelectDisks => self.list_disks.selected(),
|
Mode::SelectDisks => self.list_disks.selected(),
|
||||||
Mode::SelectTableType => self.list_table_types.selected(),
|
Mode::SelectTableType => self.list_table_types.selected(),
|
||||||
|
|
@ -136,6 +176,12 @@ impl Component for Left {
|
||||||
// Send selection(s) if needed
|
// Send selection(s) if needed
|
||||||
// NOTE: This is needed to keep the app and all components in sync
|
// NOTE: This is needed to keep the app and all components in sync
|
||||||
match self.mode {
|
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 => {
|
Mode::InstallDrivers => {
|
||||||
// Only need to select one entry
|
// Only need to select one entry
|
||||||
if let Some(driver) = self.list_drivers.get_selected() {
|
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() {
|
if let Some(command_tx) = self.command_tx.clone() {
|
||||||
command_tx.send(Action::NextScreen)?;
|
command_tx.send(Action::NextScreen)?;
|
||||||
}
|
}
|
||||||
|
|
@ -292,7 +334,6 @@ impl Component for Left {
|
||||||
| Mode::Clone
|
| Mode::Clone
|
||||||
| Mode::PostClone
|
| Mode::PostClone
|
||||||
// Diagnostic modes
|
// Diagnostic modes
|
||||||
| Mode::DiagMenu
|
|
||||||
| Mode::BootDiags
|
| Mode::BootDiags
|
||||||
| Mode::BootSetup
|
| Mode::BootSetup
|
||||||
| Mode::InjectDrivers
|
| Mode::InjectDrivers
|
||||||
|
|
@ -324,13 +365,20 @@ impl Component for Left {
|
||||||
// Bail early
|
// Bail early
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
Mode::InstallDrivers
|
Mode::DiagMenu
|
||||||
|
| Mode::InstallDrivers
|
||||||
| Mode::SelectDisks
|
| Mode::SelectDisks
|
||||||
| Mode::SelectTableType
|
| Mode::SelectTableType
|
||||||
| Mode::SelectParts => {
|
| Mode::SelectParts => {
|
||||||
// List modes
|
// List modes
|
||||||
let mut list_items = Vec::<ListItem>::new();
|
let mut list_items = Vec::<ListItem>::new();
|
||||||
let list_items_strings: Vec<String> = match self.mode {
|
let list_items_strings: Vec<String> = match self.mode {
|
||||||
|
Mode::DiagMenu=> self
|
||||||
|
.diag_menu
|
||||||
|
.items
|
||||||
|
.iter()
|
||||||
|
.map(|i| format!("{i}"))
|
||||||
|
.collect(),
|
||||||
Mode::InstallDrivers => self
|
Mode::InstallDrivers => self
|
||||||
.list_drivers
|
.list_drivers
|
||||||
.items
|
.items
|
||||||
|
|
@ -388,6 +436,9 @@ impl Component for Left {
|
||||||
.highlight_symbol(" --> ")
|
.highlight_symbol(" --> ")
|
||||||
.repeat_highlight_symbol(false);
|
.repeat_highlight_symbol(false);
|
||||||
match self.mode {
|
match self.mode {
|
||||||
|
Mode::DiagMenu=> {
|
||||||
|
frame.render_stateful_widget(list, body_area, &mut self.diag_menu.state);
|
||||||
|
}
|
||||||
Mode::InstallDrivers => {
|
Mode::InstallDrivers => {
|
||||||
frame.render_stateful_widget(list, body_area, &mut self.list_drivers.state);
|
frame.render_stateful_widget(list, body_area, &mut self.list_drivers.state);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue