Update boot-diags menus
This commit is contained in:
parent
46e53ef105
commit
827451322d
5 changed files with 126 additions and 68 deletions
|
|
@ -29,7 +29,7 @@ use core::{
|
|||
line::{DVLine, get_disk_description_right, get_part_description},
|
||||
state::{CloneSettings, Mode},
|
||||
system::{
|
||||
boot::{self, SafeMode},
|
||||
boot::{self, SafeMode, configure_disk},
|
||||
cpu::get_cpu_name,
|
||||
disk::PartitionTableType,
|
||||
drivers,
|
||||
|
|
@ -76,6 +76,7 @@ pub struct App {
|
|||
diag_groups: Arc<Mutex<Vec<DiagGroup>>>,
|
||||
list: StatefulList<Mode>,
|
||||
boot_modes: Vec<SafeMode>,
|
||||
setup_modes: Vec<SafeMode>,
|
||||
selections: Vec<Option<usize>>,
|
||||
system32: String,
|
||||
tasks: Tasks,
|
||||
|
|
@ -122,6 +123,7 @@ impl App {
|
|||
diag_groups: diag_groups_arc,
|
||||
list,
|
||||
boot_modes: vec![SafeMode::Enable, SafeMode::Disable],
|
||||
setup_modes: vec![SafeMode::Disable, SafeMode::Enable],
|
||||
system32: String::new(),
|
||||
selections: vec![None, None],
|
||||
tasks,
|
||||
|
|
@ -154,9 +156,10 @@ impl App {
|
|||
Mode::ScanDisks => Mode::SelectDisks,
|
||||
Mode::SelectDisks => Mode::SelectParts,
|
||||
Mode::SelectParts => Mode::DiagMenu,
|
||||
Mode::BootDiags | Mode::BootSetup => Mode::DiagMenu,
|
||||
Mode::BootDiags => Mode::DiagMenu,
|
||||
Mode::BootScan => Mode::BootDiags,
|
||||
Mode::InjectDrivers | Mode::SetBootMode => Mode::DiagMenu,
|
||||
Mode::BootSetup | Mode::InjectDrivers | Mode::SetBootMode => Mode::Process,
|
||||
Mode::Process => Mode::DiagMenu,
|
||||
Mode::Done => Mode::DiagMenu,
|
||||
Mode::Failed => Mode::Failed,
|
||||
// Default to current mode
|
||||
|
|
@ -204,6 +207,10 @@ impl App {
|
|||
self.queue_boot_scan_tasks()?;
|
||||
}
|
||||
Mode::InjectDrivers | Mode::InstallDrivers => self.clone.scan_drivers(),
|
||||
Mode::Process => {
|
||||
self.action_tx
|
||||
.send(Action::DisplayPopup(popup::Type::Info, String::from("...")))?;
|
||||
}
|
||||
Mode::ScanDisks => {
|
||||
if self.tasks.idle() {
|
||||
self.tasks.add(TaskType::ScanDisks);
|
||||
|
|
@ -361,10 +368,6 @@ impl App {
|
|||
Mode::Done => {
|
||||
self.action_tx.send(Action::NextScreen)?;
|
||||
}
|
||||
Mode::BootSetup => {
|
||||
let new_mode = self.next_mode();
|
||||
self.action_tx.send(Action::SetMode(new_mode))?;
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
Action::Resize(w, h) => self.handle_resize(tui, w, h)?,
|
||||
|
|
@ -384,6 +387,14 @@ impl App {
|
|||
}
|
||||
}
|
||||
}
|
||||
Mode::BootSetup => {
|
||||
if let Some(index) = one {
|
||||
if let Some(boot_mode) = self.setup_modes.get(index) {
|
||||
info!("create_boot_files?");
|
||||
create_boot_files(self, boot_mode.clone());
|
||||
}
|
||||
}
|
||||
}
|
||||
Mode::SelectDisks => {
|
||||
self.clone.disk_index_dest = one;
|
||||
}
|
||||
|
|
@ -774,19 +785,17 @@ fn get_chunks(r: Rect) -> Vec<Rect> {
|
|||
|
||||
fn build_footer_string(cur_mode: Mode) -> String {
|
||||
match cur_mode {
|
||||
Mode::BootDiags => {
|
||||
Mode::BootDiags | Mode::BootSetup | Mode::InjectDrivers | Mode::SetBootMode => {
|
||||
String::from("(Enter) to select / (m) for menu / (s) to start over / (q) to quit")
|
||||
}
|
||||
Mode::BootScan | Mode::BootSetup | Mode::Home | Mode::ScanDisks => {
|
||||
Mode::BootScan | Mode::Home | Mode::Process | Mode::ScanDisks => {
|
||||
String::from("(q) to quit")
|
||||
}
|
||||
Mode::DiagMenu | Mode::SelectParts => {
|
||||
String::from("(Enter) to select / (s) to start over / (q) to quit")
|
||||
}
|
||||
Mode::Done => String::from("(Enter) to continue / (q) to quit"),
|
||||
Mode::InstallDrivers | Mode::InjectDrivers | Mode::SetBootMode => {
|
||||
String::from("(Enter) to select / (q) to quit")
|
||||
}
|
||||
Mode::InstallDrivers => String::from("(Enter) to select / (q) to quit"),
|
||||
Mode::LogView => {
|
||||
String::from("(Enter | Esc) to close log / (up | down) to scroll / (q) to quit")
|
||||
}
|
||||
|
|
@ -848,7 +857,7 @@ fn build_left_items(app: &App) -> Action {
|
|||
.iter()
|
||||
.for_each(|disk| items.push(disk.description.to_string()));
|
||||
}
|
||||
Mode::BootScan | Mode::ScanDisks => {
|
||||
Mode::BootScan | Mode::Process | Mode::ScanDisks => {
|
||||
select_type = SelectionType::Loop;
|
||||
title = String::from("Processing");
|
||||
}
|
||||
|
|
@ -887,13 +896,18 @@ fn build_left_items(app: &App) -> Action {
|
|||
}
|
||||
}
|
||||
Mode::BootSetup => {
|
||||
select_type = SelectionType::Loop;
|
||||
select_type = SelectionType::One;
|
||||
let (new_title, _) = get_mode_strings(app.cur_mode);
|
||||
title = new_title;
|
||||
app.boot_modes.iter().rev().for_each(|entry| match entry {
|
||||
SafeMode::Disable => items.push(String::from("Normal Mode")),
|
||||
SafeMode::Enable => items.push(String::from("Locked in Safe Mode")),
|
||||
});
|
||||
}
|
||||
Mode::SetBootMode => {
|
||||
select_type = SelectionType::One;
|
||||
title = String::from("Set Boot Mode");
|
||||
let (new_title, _) = get_mode_strings(app.cur_mode);
|
||||
title = new_title;
|
||||
app.boot_modes.iter().for_each(|entry| {
|
||||
items.push(format!("{:?} Safe Mode", entry));
|
||||
});
|
||||
|
|
@ -919,13 +933,37 @@ fn build_right_items(app: &App) -> Action {
|
|||
let mut items: Vec<Vec<DVLine>> = Vec::new();
|
||||
let mut labels: Vec<Vec<DVLine>> = Vec::new();
|
||||
let mut start_index = 0;
|
||||
let disk_header = get_disk_header(app);
|
||||
match app.cur_mode {
|
||||
Mode::DiagMenu => {
|
||||
let header_lines = get_disk_header(app);
|
||||
if !header_lines.is_empty() {
|
||||
items.push(header_lines);
|
||||
Mode::BootDiags
|
||||
| Mode::BootSetup
|
||||
| Mode::DiagMenu
|
||||
| Mode::InjectDrivers
|
||||
| Mode::InstallDrivers
|
||||
| Mode::Process
|
||||
| Mode::SetBootMode => {
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::from("CPU")],
|
||||
line_colors: vec![Color::Cyan],
|
||||
}]);
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![get_cpu_name()],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::new()],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
start_index += 3;
|
||||
if !disk_header.is_empty() {
|
||||
items.push(disk_header);
|
||||
start_index += 1;
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
match app.cur_mode {
|
||||
Mode::DiagMenu => {
|
||||
app.list.items.iter().for_each(|mode| {
|
||||
let (name, description) = get_mode_strings(*mode);
|
||||
items.push(vec![
|
||||
|
|
@ -945,11 +983,6 @@ fn build_right_items(app: &App) -> Action {
|
|||
});
|
||||
}
|
||||
Mode::BootDiags => {
|
||||
let header_lines = get_disk_header(app);
|
||||
if !header_lines.is_empty() {
|
||||
items.push(header_lines);
|
||||
start_index += 1;
|
||||
}
|
||||
if let Ok(diag_groups) = app.diag_groups.lock() {
|
||||
let mut summary: Vec<DVLine> = Vec::new();
|
||||
diag_groups
|
||||
|
|
@ -958,16 +991,15 @@ fn build_right_items(app: &App) -> Action {
|
|||
items.push(summary);
|
||||
}
|
||||
}
|
||||
Mode::InjectDrivers | Mode::InstallDrivers => {
|
||||
Mode::BootSetup => {
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::from("CPU")],
|
||||
line_colors: vec![Color::Cyan],
|
||||
}]);
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![get_cpu_name()],
|
||||
line_parts: vec![String::from("Normal Mode")],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::from("Safe Mode")],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
start_index += 2;
|
||||
}
|
||||
Mode::SelectDisks => {
|
||||
let dest_dv_line = DVLine {
|
||||
|
|
@ -1002,28 +1034,41 @@ 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],
|
||||
}]);
|
||||
}
|
||||
};
|
||||
});
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::from("Enable Safe Mode (minimal)")],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
items.push(vec![DVLine {
|
||||
line_parts: vec![String::from("Disable Safe Mode")],
|
||||
line_colors: vec![Color::Reset],
|
||||
}]);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
Action::UpdateRight(labels, start_index, items)
|
||||
}
|
||||
|
||||
fn create_boot_files(app: &mut App, safe_mode: SafeMode) {
|
||||
let mut tasks: Vec<TaskType> = Vec::new();
|
||||
if let Some(index) = app.clone.disk_index_dest {
|
||||
let disk_list = app.clone.disk_list.lock().unwrap();
|
||||
if let Some(disk) = disk_list.get(index) {
|
||||
let letter_boot = disk.get_part_letter(app.clone.part_index_boot.unwrap());
|
||||
let letter_os = disk.get_part_letter(app.clone.part_index_os.unwrap());
|
||||
tasks = configure_disk(
|
||||
&letter_boot,
|
||||
&letter_os,
|
||||
safe_mode,
|
||||
&app.system32,
|
||||
&disk.part_type,
|
||||
);
|
||||
}
|
||||
}
|
||||
tasks
|
||||
.into_iter()
|
||||
.for_each(|task_type| app.tasks.add(task_type));
|
||||
}
|
||||
|
||||
fn get_disk_header(app: &App) -> Vec<DVLine> {
|
||||
let mut header_lines: Vec<DVLine> = Vec::new();
|
||||
if let Some(index) = app.clone.disk_index_dest {
|
||||
|
|
@ -1036,17 +1081,6 @@ fn get_disk_header(app: &App) -> Vec<DVLine> {
|
|||
if let Some(index) = app.clone.part_index_os {
|
||||
parts.push(index);
|
||||
}
|
||||
// Disk Details
|
||||
header_lines.append(&mut vec![
|
||||
DVLine {
|
||||
line_parts: vec![String::from("Disk")],
|
||||
line_colors: vec![Color::Cyan],
|
||||
},
|
||||
DVLine {
|
||||
line_parts: vec![String::new()],
|
||||
line_colors: vec![Color::Reset],
|
||||
},
|
||||
]);
|
||||
header_lines.append(&mut get_disk_description_right(disk, &Some(parts)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,6 +127,8 @@
|
|||
"<Enter>": "Process",
|
||||
"<Up>": "KeyUp",
|
||||
"<Down>": "KeyDown",
|
||||
"<m>": "DiagMainMenu",
|
||||
"<s>": "ScanDisks",
|
||||
"<q>": "Quit",
|
||||
"<Ctrl-d>": "Quit",
|
||||
"<Ctrl-c>": "Quit",
|
||||
|
|
@ -150,6 +152,14 @@
|
|||
"<Enter>": "Process",
|
||||
"<Up>": "KeyUp",
|
||||
"<Down>": "KeyDown",
|
||||
"<m>": "DiagMainMenu",
|
||||
"<s>": "ScanDisks",
|
||||
"<q>": "Quit",
|
||||
"<Ctrl-d>": "Quit",
|
||||
"<Ctrl-c>": "Quit",
|
||||
"<Ctrl-z>": "Suspend"
|
||||
},
|
||||
"Process": {
|
||||
"<q>": "Quit",
|
||||
"<Ctrl-d>": "Quit",
|
||||
"<Ctrl-c>": "Quit",
|
||||
|
|
@ -159,6 +169,8 @@
|
|||
"<Enter>": "Process",
|
||||
"<Up>": "KeyUp",
|
||||
"<Down>": "KeyDown",
|
||||
"<m>": "DiagMainMenu",
|
||||
"<s>": "ScanDisks",
|
||||
"<q>": "Quit",
|
||||
"<Ctrl-d>": "Quit",
|
||||
"<Ctrl-c>": "Quit",
|
||||
|
|
|
|||
|
|
@ -36,6 +36,7 @@ pub enum Mode {
|
|||
BootScan,
|
||||
BootSetup,
|
||||
LogView,
|
||||
Process,
|
||||
InjectDrivers,
|
||||
SetBootMode,
|
||||
// Clone
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ use crate::tasks::TaskType;
|
|||
use color_eyre::Result;
|
||||
use std::path::PathBuf;
|
||||
|
||||
#[derive(Clone, Debug, Default)]
|
||||
#[derive(Clone, Debug, Default, PartialEq)]
|
||||
pub enum SafeMode {
|
||||
#[default]
|
||||
Disable,
|
||||
|
|
@ -31,6 +31,7 @@ pub enum SafeMode {
|
|||
pub fn configure_disk(
|
||||
letter_boot: &str,
|
||||
letter_os: &str,
|
||||
safe_mode: SafeMode,
|
||||
system32: &str,
|
||||
table_type: &PartitionTableType,
|
||||
) -> Vec<TaskType> {
|
||||
|
|
@ -64,11 +65,13 @@ pub fn configure_disk(
|
|||
));
|
||||
}
|
||||
|
||||
// Lock in safe mode
|
||||
tasks.push(
|
||||
set_mode(letter_boot, &SafeMode::Enable, system32, table_type)
|
||||
.expect("Failed to create set_mode task."),
|
||||
);
|
||||
// Lock in safe mode (if needed)
|
||||
if safe_mode == SafeMode::Enable {
|
||||
tasks.push(
|
||||
set_mode(letter_boot, &SafeMode::Enable, system32, table_type)
|
||||
.expect("Failed to create set_mode task."),
|
||||
);
|
||||
}
|
||||
|
||||
// Done
|
||||
tasks
|
||||
|
|
@ -82,7 +85,7 @@ pub fn inject_driver(driver: &Driver, letter_os: &str, system32: &str) -> Result
|
|||
vec![
|
||||
format!("/image:{letter_os}:\\"),
|
||||
String::from("/add-driver"),
|
||||
format!("/driver:\"{}\"", driver_path,),
|
||||
format!("/driver:{driver_path}"),
|
||||
String::from("/recurse"),
|
||||
],
|
||||
))
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@ impl App {
|
|||
| Mode::InjectDrivers
|
||||
| Mode::LogView
|
||||
| Mode::PEMenu
|
||||
| Mode::Process
|
||||
| Mode::SetBootMode => panic!("This shouldn't happen?"),
|
||||
}
|
||||
}
|
||||
|
|
@ -152,6 +153,7 @@ impl App {
|
|||
| Mode::InjectDrivers
|
||||
| Mode::LogView
|
||||
| Mode::PEMenu
|
||||
| Mode::Process
|
||||
| Mode::SetBootMode => panic!("This shouldn't happen?"),
|
||||
};
|
||||
|
||||
|
|
@ -242,9 +244,13 @@ impl App {
|
|||
}
|
||||
|
||||
// Create boot files
|
||||
for task in
|
||||
boot::configure_disk(&letter_boot, &letter_os, &system32, &table_type)
|
||||
{
|
||||
for task in boot::configure_disk(
|
||||
&letter_boot,
|
||||
&letter_os,
|
||||
boot::SafeMode::Enable,
|
||||
&system32,
|
||||
&table_type,
|
||||
) {
|
||||
self.tasks.add(task);
|
||||
}
|
||||
|
||||
|
|
@ -631,6 +637,7 @@ fn build_footer_string(cur_mode: Mode) -> String {
|
|||
| Mode::InjectDrivers
|
||||
| Mode::LogView
|
||||
| Mode::PEMenu
|
||||
| Mode::Process
|
||||
| Mode::SetBootMode => panic!("This shouldn't happen?"),
|
||||
}
|
||||
}
|
||||
|
|
@ -703,6 +710,7 @@ fn build_left_items(app: &App, cur_mode: Mode) -> Action {
|
|||
| Mode::InjectDrivers
|
||||
| Mode::LogView
|
||||
| Mode::PEMenu
|
||||
| Mode::Process
|
||||
| Mode::SetBootMode => panic!("This shouldn't happen?"),
|
||||
};
|
||||
Action::UpdateLeft(title, labels, items, select_type)
|
||||
|
|
|
|||
Loading…
Reference in a new issue