Preserve source/dest disk selection

This commit is contained in:
2Shirt 2024-11-13 00:20:40 -08:00
parent 5e29c1ab48
commit f6d45b7de0
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
2 changed files with 49 additions and 20 deletions

View file

@ -213,8 +213,8 @@ impl Component for Left {
self.title_text = String::from("Processing"); self.title_text = String::from("Processing");
} }
(_, Mode::SelectParts) => { (_, Mode::SelectParts) => {
self.selections[0] = None; let mut one: Option<usize> = None;
self.selections[1] = None; let mut two: Option<usize> = None;
self.title_text = String::from("Select Boot and OS Partitions"); self.title_text = String::from("Select Boot and OS Partitions");
// Get list of partitions for destination disk // Get list of partitions for destination disk

View file

@ -36,14 +36,16 @@ pub struct Right {
cur_mode: Mode, cur_mode: Mode,
list_disks: StatefulList<Disk>, list_disks: StatefulList<Disk>,
list_parts: StatefulList<Partition>, list_parts: StatefulList<Partition>,
table_type: Option<PartitionTableType>,
prev_mode: Mode, prev_mode: Mode,
selected_disks: Vec<Option<usize>>,
selections: Vec<Option<usize>>, selections: Vec<Option<usize>>,
table_type: Option<PartitionTableType>,
} }
impl Right { impl Right {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
selected_disks: vec![None, None],
selections: vec![None, None], selections: vec![None, None],
..Default::default() ..Default::default()
} }
@ -84,6 +86,11 @@ impl Component for Right {
Mode::SelectParts => self.list_parts.next(), Mode::SelectParts => self.list_parts.next(),
_ => {} _ => {}
}, },
Action::Process => {
if self.prev_mode == Mode::SelectDisks && self.cur_mode == Mode::Confirm {
self.selected_disks = self.selections.clone();
}
}
Action::Select(one, two) => { Action::Select(one, two) => {
self.selections[0] = one; self.selections[0] = one;
self.selections[1] = two; self.selections[1] = two;
@ -93,10 +100,19 @@ impl Component for Right {
self.prev_mode = self.cur_mode; self.prev_mode = self.cur_mode;
self.cur_mode = new_mode; self.cur_mode = new_mode;
match self.cur_mode { match self.cur_mode {
Mode::SelectDisks | Mode::SelectParts => { Mode::SelectDisks => {
self.selections[0] = None; self.selections[0] = None;
self.selections[1] = None; self.selections[1] = None;
} }
Mode::SelectParts => {
self.selections[0] = None;
self.selections[1] = None;
}
Mode::SelectTableType => {
self.selections[0] = None;
self.selections[1] = None;
self.table_type = None;
}
_ => {} _ => {}
} }
} }
@ -124,7 +140,9 @@ impl Component for Right {
(_, Mode::InstallDrivers) => { (_, Mode::InstallDrivers) => {
body_text.push(Line::from(Span::raw(format!("CPU: {}", get_cpu_name())))); body_text.push(Line::from(Span::raw(format!("CPU: {}", get_cpu_name()))));
} }
(_, Mode::SelectDisks) | (Mode::SelectDisks | Mode::SelectTableType, Mode::Confirm) => { (_, Mode::SelectDisks)
| (Mode::SelectDisks | Mode::SelectTableType, Mode::Confirm)
| (_, Mode::SelectTableType) => {
// Source Disk // Source Disk
body_text.push(Line::from(Span::styled( body_text.push(Line::from(Span::styled(
"Source:", "Source:",
@ -138,9 +156,14 @@ impl Component for Right {
), ),
Style::new().green().bold(), Style::new().green().bold(),
))); )));
let index = if self.selections[0].is_some() { let index = if self.selected_disks[0].is_some() {
// Selected in prior mode
self.selected_disks[0]
} else if self.selections[0].is_some() {
// Selected in this mode
self.selections[0] self.selections[0]
} else { } else {
// Highlighted entry
self.list_disks.selected() self.list_disks.selected()
}; };
if let Some(i) = index { if let Some(i) = index {
@ -163,24 +186,30 @@ impl Component for Right {
} }
// Destination Disk // Destination Disk
let index = match (self.selections[0], self.selections[1]) { let index = if self.selected_disks[1].is_some() {
(Some(one), None) => { // Selected in prior mode
// First selected self.selected_disks[1]
if let Some(two) = self.selections[1] { } else {
if one != two { // Select(ed) in this mode
self.selections[1] match (self.selections[0], self.selections[1]) {
(Some(one), None) => {
// First selected
if let Some(two) = self.selections[1] {
if one != two {
self.selections[1]
} else {
None
}
} else { } else {
None self.list_disks.selected()
} }
} else {
self.list_disks.selected()
} }
(Some(_), Some(_)) => {
// Both selected
self.selections[1]
}
(_, _) => None,
} }
(Some(_), Some(_)) => {
// Both selected
self.selections[1]
}
(_, _) => None,
}; };
if let Some(i) = index { if let Some(i) = index {
// Divider // Divider