Fix WIM info selection

This commit is contained in:
2Shirt 2026-01-09 02:37:49 -08:00
parent 9919a993a0
commit 6e3a0a582f
Signed by: 2Shirt
GPG key ID: 152FAC923B0E132C
3 changed files with 86 additions and 46 deletions

View file

@ -166,11 +166,12 @@ impl App {
)); ));
// Build Diskpart script to format destination disk // Build Diskpart script to format destination disk
let disk_list = self.state.disk_list.lock().unwrap(); if let Some(disk) = self.state.get_dest_disk() {
if let Some(disk_index) = self.state.disk_index_dest let table_type = self
&& let Some(disk) = disk_list.get(disk_index) .state
{ .table_type
let table_type = self.state.table_type.clone().unwrap(); .clone()
.expect("Failed to get table type.");
let diskpart_script = build_dest_format_script( let diskpart_script = build_dest_format_script(
disk.id, disk.id,
&table_type, &table_type,
@ -196,15 +197,24 @@ impl App {
let wimlib_imagex = program_files.join("wimlib\\wimlib-imagex.exe"); let wimlib_imagex = program_files.join("wimlib\\wimlib-imagex.exe");
// Get image info // Get image info
let wim_sources = self.state.wim_sources.lock().unwrap(); let wim_file_index = self
let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap()); .state
let wim_index = self.state.wim_image_index.unwrap() + 1; // wimapply uses 1-based index .wim_file_index
.expect("Failed to get source WIM file index");
let mut wim_image_index = self
.state
.wim_image_index
.expect("Failed to get source WIM image index");
let wim_sources = self
.state
.wim_sources
.lock()
.expect("Failed to get WIM Sources");
let wim_file = wim_sources.get_file(wim_file_index);
wim_image_index += 1; // wimapply uses 1-based index
// Add actions // Add actions
let disk_list = self.state.disk_list.lock().unwrap(); if let Some(disk) = self.state.get_dest_disk() {
if let Some(disk_index) = self.state.disk_index_dest
&& let Some(disk) = disk_list.get(disk_index)
{
let num_parts = disk.parts.len(); let num_parts = disk.parts.len();
let dest_path = format!("{}:\\", disk.get_part_letter(num_parts - 1)); let dest_path = format!("{}:\\", disk.get_part_letter(num_parts - 1));
self.tasks.add(TaskType::CommandWait( self.tasks.add(TaskType::CommandWait(
@ -212,7 +222,7 @@ impl App {
vec![ vec![
String::from("apply"), String::from("apply"),
wim_file.path, wim_file.path,
format!("{wim_index}"), format!("{wim_image_index}"),
dest_path, dest_path,
], ],
)); ));
@ -223,21 +233,29 @@ impl App {
popup::Type::Info, popup::Type::Info,
String::from("Updating boot configuration"), String::from("Updating boot configuration"),
))?; ))?;
let wim_sources = self.state.wim_sources.lock().unwrap(); let wim_index = self
let wim_file = wim_sources.get_file(self.state.wim_file_index.unwrap()); .state
.wim_image_index
.expect("Failed to get source WIM index");
let wim_sources = self
.state
.wim_sources
.lock()
.expect("Failed to get WIM Sources");
let wim_file = wim_sources.get_file(wim_index);
// Get System32 path // Get System32 path
let system32 = get_system32_path(&self.action_tx); let system32 = get_system32_path(&self.action_tx);
// Add actions // Add actions
let disk_list = self.state.disk_list.lock().unwrap(); if let Some(disk) = self.state.get_dest_disk() {
if let Some(disk_index) = self.state.disk_index_dest let table_type = self
&& let Some(disk) = disk_list.get(disk_index) .state
{ .table_type
let table_type = self.state.table_type.clone().unwrap(); .clone()
.expect("Failed to get table type.");
let letter_boot = disk.get_part_letter(0); let letter_boot = disk.get_part_letter(0);
let letter_os = let letter_os = disk.get_part_letter(match table_type {
disk.get_part_letter(match self.state.table_type.clone().unwrap() {
PartitionTableType::Guid => 2, PartitionTableType::Guid => 2,
PartitionTableType::Legacy => 1, PartitionTableType::Legacy => 1,
}); });
@ -541,9 +559,11 @@ impl App {
} }
} }
Mode::SelectWinSource => { Mode::SelectWinSource => {
info!("Set WIM file to: {one:?}");
self.state.wim_file_index = one; self.state.wim_file_index = one;
} }
Mode::SelectWinImage => { Mode::SelectWinImage => {
info!("Set WIM index to: {one:?}");
self.state.wim_image_index = one; self.state.wim_image_index = one;
} }
_ => {} _ => {}
@ -711,7 +731,7 @@ fn build_left_items(app: &App) -> Action {
Mode::SelectDisks => { Mode::SelectDisks => {
select_type = SelectionType::One; select_type = SelectionType::One;
title = String::from("Select Destination Disk"); title = String::from("Select Destination Disk");
let disk_list = app.state.disk_list.lock().unwrap(); let disk_list = app.state.disk_list.lock().expect("Failed to get disk list");
disk_list disk_list
.iter() .iter()
.for_each(|disk| items.push(disk.description.to_string())); .for_each(|disk| items.push(disk.description.to_string()));
@ -790,14 +810,19 @@ fn build_right_items(app: &App) -> Action {
} else { } else {
labels.push(vec![dest_dv_line]); labels.push(vec![dest_dv_line]);
} }
let disk_list = app.state.disk_list.lock().unwrap(); let disk_list = app.state.disk_list.lock().expect("Failed to get disk list");
disk_list disk_list
.iter() .iter()
.for_each(|disk| items.push(get_disk_description_right(disk, &None))); .for_each(|disk| items.push(get_disk_description_right(disk, &None)));
} }
Mode::SelectWinSource => { Mode::SelectWinSource => {
// Disk Info // Disk Info
let type_str = match app.state.table_type.clone().unwrap() { let type_str = match app
.state
.table_type
.clone()
.expect("Failed to get table type")
{
PartitionTableType::Guid => "GPT", PartitionTableType::Guid => "GPT",
PartitionTableType::Legacy => "MBR", PartitionTableType::Legacy => "MBR",
}; };
@ -815,11 +840,8 @@ fn build_right_items(app: &App) -> Action {
}, },
DVLine::blank(), DVLine::blank(),
]; ];
let disk_list = app.state.disk_list.lock().unwrap(); if let Some(disk) = app.state.get_dest_disk() {
if let Some(index) = app.state.disk_index_dest get_disk_description_right(&disk, &None)
&& let Some(disk) = disk_list.get(index)
{
get_disk_description_right(disk, &None)
.into_iter() .into_iter()
.for_each(|dv_line| label_dv_lines.push(dv_line)); .for_each(|dv_line| label_dv_lines.push(dv_line));
} }
@ -870,7 +892,12 @@ fn build_right_items(app: &App) -> Action {
panic!("Failed to get source WIM file"); panic!("Failed to get source WIM file");
} }
// Disk Info // Disk Info
let type_str = match app.state.table_type.clone().unwrap() { let type_str = match app
.state
.table_type
.clone()
.expect("Failed to get table type")
{
PartitionTableType::Guid => "GPT", PartitionTableType::Guid => "GPT",
PartitionTableType::Legacy => "MBR", PartitionTableType::Legacy => "MBR",
}; };
@ -888,11 +915,8 @@ fn build_right_items(app: &App) -> Action {
}, },
DVLine::blank(), DVLine::blank(),
]; ];
let disk_list = app.state.disk_list.lock().unwrap(); if let Some(disk) = app.state.get_dest_disk() {
if let Some(index) = app.state.disk_index_dest get_disk_description_right(&disk, &None)
&& let Some(disk) = disk_list.get(index)
{
get_disk_description_right(disk, &None)
.into_iter() .into_iter()
.for_each(|dv_line| label_dv_lines.push(dv_line)); .for_each(|dv_line| label_dv_lines.push(dv_line));
} }
@ -976,11 +1000,8 @@ fn build_right_items(app: &App) -> Action {
} else { } else {
labels.push(vec![dest_dv_line]); labels.push(vec![dest_dv_line]);
} }
let disk_list = app.state.disk_list.lock().unwrap(); if let Some(disk) = app.state.get_dest_disk() {
if let Some(index) = app.state.disk_index_dest items.push(get_disk_description_right(&disk, &None));
&& let Some(disk) = disk_list.get(index)
{
items.push(get_disk_description_right(disk, &None));
} }
} }
_ => {} _ => {}

View file

@ -62,6 +62,17 @@ impl State {
} }
} }
pub fn get_dest_disk(&self) -> Option<Disk> {
let mut dest_disk: Option<Disk> = None;
if let Ok(disk_list) = self.disk_list.lock()
&& let Some(disk_index) = self.disk_index_dest
&& let Some(disk) = disk_list.get(disk_index)
{
dest_disk = Some(disk.clone());
}
dest_disk
}
pub fn reset_all(&mut self) { pub fn reset_all(&mut self) {
self.wim_file_index = None; self.wim_file_index = None;
self.wim_image_index = None; self.wim_image_index = None;

View file

@ -26,6 +26,7 @@ use std::{
use tempfile::NamedTempFile; use tempfile::NamedTempFile;
use tokio::task::JoinHandle; use tokio::task::JoinHandle;
use tracing::info;
use xml::reader::{EventReader, XmlEvent}; use xml::reader::{EventReader, XmlEvent};
use core::system::disk::bytes_to_string; use core::system::disk::bytes_to_string;
@ -187,10 +188,17 @@ impl WimSources {
rel_index = index - num_local; rel_index = index - num_local;
use_local = false; use_local = false;
}; };
info!("Converted Index: {index} -> {rel_index}");
if use_local { if use_local {
self.local.get(rel_index).unwrap().clone() self.local
.get(rel_index)
.expect("Failed to get local file by rel_index")
.to_owned()
} else { } else {
self.network.get(rel_index).unwrap().clone() self.network
.get(rel_index)
.expect("Failed to get network file by rel_index")
.to_owned()
} }
} }