diff --git a/deja_vu/src/app.rs b/deja_vu/src/app.rs index fd8cf8d..9478657 100644 --- a/deja_vu/src/app.rs +++ b/deja_vu/src/app.rs @@ -35,12 +35,11 @@ use crate::{ footer::Footer, fps::FpsCounter, left::Left, popup, right::Right, title::Title, Component, }, config::Config, - state::Mode, + state::{CloneSettings, Mode}, system::{ boot, - disk::{Disk, PartitionTableType}, diskpart::build_dest_format_script, - drivers::{self, Driver}, + drivers::{self}, }, tasks::{Task, Tasks}, tui::{Event, Tui}, @@ -58,16 +57,10 @@ pub struct App { should_suspend: bool, tick_rate: f64, // App + clone: CloneSettings, cur_mode: Mode, - disk_index_dest: Option, - disk_index_source: Option, - disk_list: Arc>>, - part_index_boot: Option, - part_index_os: Option, - driver: Option, prev_mode: Mode, selections: Vec>, - table_type: Option, tasks: Tasks, } @@ -96,16 +89,10 @@ impl App { should_suspend: false, tick_rate, // App + clone: CloneSettings::new(disk_list_arc), cur_mode: Mode::ScanDisks, - disk_index_dest: None, - disk_index_source: None, - disk_list: disk_list_arc, - driver: None, - part_index_boot: None, - part_index_os: None, prev_mode: Mode::ScanDisks, selections: vec![None, None], - table_type: None, tasks, }) } @@ -165,10 +152,10 @@ impl App { ))?; // Build Diskpart script to format destination disk - let disk_list = self.disk_list.lock().unwrap(); - if let Some(disk_index) = self.disk_index_dest { + let disk_list = self.clone.disk_list.lock().unwrap(); + if let Some(disk_index) = self.clone.disk_index_dest { if let Some(disk) = disk_list.get(disk_index) { - let table_type = self.table_type.clone().unwrap(); + let table_type = self.clone.table_type.clone().unwrap(); let diskpart_script = build_dest_format_script(disk.id, &table_type); self.tasks.add(Task::Diskpart(diskpart_script)); } @@ -183,7 +170,7 @@ impl App { self.config.clone_app_path.clone(), Vec::new(), )); - if let Some(dest_index) = self.disk_index_dest { + if let Some(dest_index) = self.clone.disk_index_dest { self.tasks.add(Task::UpdateDestDisk(dest_index)); } } @@ -208,12 +195,12 @@ impl App { }; // Add actions - let disk_list = self.disk_list.lock().unwrap(); - if let Some(disk_index) = self.disk_index_dest { + let disk_list = self.clone.disk_list.lock().unwrap(); + if let Some(disk_index) = self.clone.disk_index_dest { if let Some(disk) = disk_list.get(disk_index) { - let table_type = self.table_type.clone().unwrap(); - let letter_boot = disk.get_part_letter(self.part_index_boot.unwrap()); - let letter_os = disk.get_part_letter(self.part_index_os.unwrap()); + let table_type = self.clone.table_type.clone().unwrap(); + let letter_boot = disk.get_part_letter(self.clone.part_index_boot.unwrap()); + let letter_os = disk.get_part_letter(self.clone.part_index_os.unwrap()); // Safety check if letter_boot.is_empty() || letter_os.is_empty() { @@ -231,8 +218,8 @@ impl App { } // Inject driver(s) (if selected) - if let Some(driver) = &self.driver { - if let Ok(task) = boot::inject_driver(&driver, &letter_os, &system32) { + if let Some(driver) = &self.clone.driver { + if let Ok(task) = boot::inject_driver(driver, &letter_os, &system32) { self.tasks.add(task); } else { self.action_tx.send(Action::Error(format!( @@ -363,12 +350,12 @@ impl App { self.action_tx.send(Action::SetMode(Mode::InstallDrivers))?; } Action::SelectDriver(ref driver) => { - self.driver = Some(driver.clone()); + self.clone.driver = Some(driver.clone()); drivers::load(&driver.inf_paths); self.action_tx.send(Action::NextScreen)?; } Action::SelectTableType(ref table_type) => { - self.table_type = Some(table_type.clone()); + self.clone.table_type = Some(table_type.clone()); self.action_tx.send(Action::NextScreen)?; } Action::Resize(w, h) => self.handle_resize(tui, w, h)?, @@ -390,12 +377,12 @@ impl App { Action::Select(one, two) => { match self.cur_mode { Mode::SelectDisks => { - self.disk_index_source = one; - self.disk_index_dest = two; + self.clone.disk_index_source = one; + self.clone.disk_index_dest = two; } Mode::SelectParts => { - self.part_index_boot = one; - self.part_index_os = two; + self.clone.part_index_boot = one; + self.clone.part_index_os = two; } _ => {} } diff --git a/deja_vu/src/state.rs b/deja_vu/src/state.rs index 7e9cacc..63b0abb 100644 --- a/deja_vu/src/state.rs +++ b/deja_vu/src/state.rs @@ -14,8 +14,15 @@ // along with Deja-vu. If not, see . // +use std::sync::{Arc, Mutex}; + use serde::{Deserialize, Serialize}; +use crate::system::{ + disk::{Disk, PartitionTableType}, + drivers::Driver, +}; + #[derive(Default, Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)] pub enum Mode { #[default] @@ -31,3 +38,23 @@ pub enum Mode { Done, Failed, } + +#[derive(Debug, Default)] +pub struct CloneSettings { + pub disk_index_dest: Option, + pub disk_index_source: Option, + pub disk_list: Arc>>, + pub part_index_boot: Option, + pub part_index_os: Option, + pub driver: Option, + pub table_type: Option, +} + +impl CloneSettings { + pub fn new(disk_list: Arc>>) -> Self { + CloneSettings { + disk_list, + ..Default::default() + } + } +}