diff --git a/src/app.rs b/src/app.rs index 3793479..9b53cb0 100644 --- a/src/app.rs +++ b/src/app.rs @@ -61,9 +61,11 @@ pub struct App { tick_rate: f64, // App cur_mode: Mode, - disk_dest: Option, + disk_id_dest: Option, + disk_id_source: Option, disk_list: Arc>>, - disk_source: Option, + part_num_boot: Option, + part_num_os: Option, driver: Option, prev_mode: Mode, selections: Vec>, @@ -109,10 +111,12 @@ impl App { tick_rate, // App cur_mode: Mode::ScanDisks, - disk_dest: None, + disk_id_dest: None, + disk_id_source: None, disk_list: Arc::new(Mutex::new(Vec::new())), - disk_source: None, driver: None, + part_num_boot: None, + part_num_os: None, prev_mode: Mode::ScanDisks, selections: vec![None, None], table_type: None, @@ -302,6 +306,17 @@ impl App { self.action_tx.send(Action::SetMode(Mode::ScanDisks))?; } Action::Select(one, two) => { + match self.cur_mode { + Mode::SelectDisks => { + self.disk_id_source = one.clone(); + self.disk_id_dest = two.clone(); + } + Mode::SelectParts => { + self.part_num_boot = one.clone(); + self.part_num_os = two.clone(); + } + _ => {} + } self.selections[0] = one; self.selections[1] = two; } diff --git a/src/components/left.rs b/src/components/left.rs index aa7c193..c60c5f9 100644 --- a/src/components/left.rs +++ b/src/components/left.rs @@ -33,6 +33,8 @@ use crate::{ pub struct Left { command_tx: Option>, config: Config, + disk_id_dest: Option, + table_type: Option, title_text: String, list_disks: StatefulList, list_drivers: StatefulList, @@ -148,6 +150,7 @@ impl Component for Left { Mode::SelectTableType => { // Only need to select one entry if let Some(table_type) = self.list_table_types.pop_selected() { + self.table_type = Some(table_type.clone()); command_tx.send(Action::SelectTableType(table_type))?; } } @@ -168,6 +171,11 @@ impl Component for Left { _ => {} }, Action::Select(Some(index), None) => self.selections[0] = Some(index), + Action::Select(_, Some(index)) => { + if self.mode == Mode::SelectDisks { + self.disk_id_dest = Some(index); + } + } Action::SetMode(new_mode) => { let prev_mode = self.mode; self.mode = new_mode; @@ -209,10 +217,34 @@ impl Component for Left { self.title_text = String::from("Processing"); } (_, Mode::SelectParts) => { - // TODO: Get list of partitions self.selections[0] = None; self.selections[1] = 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 + if let Some(index) = &self.disk_id_dest { + if let Some(disk) = self.list_disks.items.get(*index).to_owned() { + self.list_parts.set_items(disk.parts.clone()); + + // Auto-select first partition and highlight likely OS partition + if let Some(table_type) = &self.table_type { + match table_type { + PartitionTableType::Guid => { + if disk.parts.len() >= 3 { + self.selections[0] = Some(0); + self.list_parts.state.select(Some(2)); + } + } + PartitionTableType::Legacy => { + if disk.parts.len() >= 2 { + self.selections[0] = Some(0); + self.list_parts.state.select(Some(1)); + } + } + } + } + } + } } (Mode::SelectDisks | Mode::SelectParts, Mode::Confirm) => { self.title_text = String::from("Confirm Selections") @@ -310,7 +342,11 @@ impl Component for Left { if let Some(selection_one) = self.selections[0] { if selection_one == index { item_style = Style::new().yellow(); - item_text_tail = " ~already selected~"; + item_text_tail = match self.mode { + Mode::SelectDisks => " ~source disk~", + Mode::SelectParts => " ~boot volume~", + _ => "", + } } } list_items.push(