WIP: Add BootMode menu logic

This commit is contained in:
2Shirt 2025-01-25 22:59:06 -08:00
parent aa4ac8d5e8
commit 1ce7f76229
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
4 changed files with 55 additions and 21 deletions

View file

@ -41,6 +41,13 @@ use ratatui::{
use tokio::sync::mpsc;
use tracing::{debug, info};
#[derive(Clone, Debug, Default)]
pub enum SafeMode {
#[default]
Disable,
Enable,
}
pub struct App {
// TUI
action_rx: mpsc::UnboundedReceiver<Action>,
@ -56,6 +63,7 @@ pub struct App {
clone: CloneSettings,
cur_mode: Mode,
list: StatefulList<Mode>,
boot_modes: Vec<SafeMode>,
selections: Vec<Option<usize>>,
tasks: Tasks,
}
@ -70,7 +78,7 @@ impl App {
Mode::BootDiags,
Mode::BootSetup,
Mode::InjectDrivers,
Mode::ToggleSafeMode,
Mode::SetBootMode,
]);
Ok(Self {
// TUI
@ -94,6 +102,7 @@ impl App {
clone: CloneSettings::new(disk_list_arc),
cur_mode: Mode::Home,
list,
boot_modes: vec![SafeMode::Enable, SafeMode::Disable],
selections: vec![None, None],
tasks,
})
@ -106,7 +115,7 @@ impl App {
Mode::ScanDisks => Mode::SelectDisks,
Mode::SelectDisks => Mode::SelectParts,
Mode::SelectParts => Mode::DiagMenu,
Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers | Mode::ToggleSafeMode => {
Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers | Mode::SetBootMode => {
Mode::DiagMenu
}
Mode::Failed => Mode::Failed,
@ -263,10 +272,7 @@ impl App {
self.action_tx.send(Action::SetMode(new_mode))?;
}
}
Mode::BootDiags
| Mode::BootSetup
| Mode::InjectDrivers
| Mode::ToggleSafeMode => {
Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers => {
let new_mode = self.next_mode();
self.action_tx.send(Action::SetMode(new_mode))?;
}
@ -291,6 +297,12 @@ impl App {
self.clone.part_index_boot = one;
self.clone.part_index_os = two;
}
Mode::SetBootMode => {
if let Some(index) = one {
// TODO: Make real
info!("Setting boot mode to: {:?}", self.boot_modes.get(index));
}
}
_ => {}
},
Action::SetMode(new_mode) => {
@ -395,13 +407,10 @@ fn get_chunks(r: Rect) -> Vec<Rect> {
fn build_footer_string(cur_mode: Mode) -> String {
match cur_mode {
Mode::BootDiags
| Mode::BootSetup
| Mode::Home
| Mode::PEMenu
| Mode::ScanDisks
| Mode::ToggleSafeMode => String::from("(q) to quit"),
Mode::InstallDrivers | Mode::InjectDrivers => {
Mode::BootDiags | Mode::BootSetup | Mode::Home | Mode::PEMenu | Mode::ScanDisks => {
String::from("(q) to quit")
}
Mode::InstallDrivers | Mode::InjectDrivers | Mode::SetBootMode => {
String::from("(Enter) to select / (q) to quit")
}
Mode::DiagMenu | Mode::SelectParts => {
@ -483,11 +492,18 @@ fn build_left_items(app: &App) -> Action {
}
}
}
Mode::BootDiags | Mode::BootSetup | Mode::ToggleSafeMode => {
Mode::BootDiags | Mode::BootSetup => {
select_num = 0;
let (new_title, _) = get_mode_strings(app.cur_mode);
title = new_title;
}
Mode::SetBootMode => {
select_num = 1;
title = String::from("Set Boot Mode");
app.boot_modes.iter().for_each(|entry| {
items.push(format!("{:?} Safe Mode", entry));
});
}
Mode::Done | Mode::Failed => {
select_num = 0;
title = String::from("Done");
@ -633,6 +649,24 @@ fn build_right_items(app: &App) -> Action {
}
}
}
Mode::SetBootMode => {
app.boot_modes.iter().for_each(|mode| {
match mode {
SafeMode::Disable => {
items.push(vec![DVLine {
line_parts: vec![String::from("Disable Safe Mode")],
line_colors: vec![Color::Reset],
}]);
}
SafeMode::Enable => {
items.push(vec![DVLine {
line_parts: vec![String::from("Enable Safe Mode (minimal)")],
line_colors: vec![Color::Reset],
}]);
}
};
});
}
_ => {}
}
Action::UpdateRight(labels, start_index, items)
@ -652,7 +686,7 @@ fn get_mode_strings(mode: Mode) -> (String, String) {
String::from("Inject Drivers"),
String::from("Inject drivers into existing Windows environment"),
),
Mode::ToggleSafeMode => (
Mode::SetBootMode => (
String::from("Toggle Safe Mode"),
String::from("Enable or disable safe mode"),
),

View file

@ -132,7 +132,7 @@
"<Ctrl-c>": "Quit",
"<Ctrl-z>": "Suspend"
},
"ToggleSafeMode": {
"SetBootMode": {
"<Enter>": "Process",
"<Up>": "KeyUp",
"<Down>": "KeyDown",

View file

@ -35,7 +35,7 @@ pub enum Mode {
BootDiags,
BootSetup,
InjectDrivers,
ToggleSafeMode,
SetBootMode,
// Clone
ScanDisks,
InstallDrivers,

View file

@ -120,7 +120,7 @@ impl App {
| Mode::DiagMenu
| Mode::InjectDrivers
| Mode::PEMenu
| Mode::ToggleSafeMode => panic!("This shouldn't happen?"),
| Mode::SetBootMode => panic!("This shouldn't happen?"),
};
new_mode
}
@ -144,7 +144,7 @@ impl App {
| Mode::DiagMenu
| Mode::InjectDrivers
| Mode::PEMenu
| Mode::ToggleSafeMode => panic!("This shouldn't happen?"),
| Mode::SetBootMode => panic!("This shouldn't happen?"),
};
if new_mode == self.cur_mode {
@ -589,7 +589,7 @@ fn build_footer_string(cur_mode: Mode) -> String {
| Mode::DiagMenu
| Mode::InjectDrivers
| Mode::PEMenu
| Mode::ToggleSafeMode => panic!("This shouldn't happen?"),
| Mode::SetBootMode => panic!("This shouldn't happen?"),
}
}
@ -659,7 +659,7 @@ fn build_left_items(app: &App, cur_mode: Mode) -> Action {
| Mode::DiagMenu
| Mode::InjectDrivers
| Mode::PEMenu
| Mode::ToggleSafeMode => panic!("This shouldn't happen?"),
| Mode::SetBootMode => panic!("This shouldn't happen?"),
};
Action::UpdateLeft(title, labels, items, select_num)
}