diff --git a/pixstrip-core/src/pipeline.rs b/pixstrip-core/src/pipeline.rs index 60b9b8b..89e1bbb 100644 --- a/pixstrip-core/src/pipeline.rs +++ b/pixstrip-core/src/pipeline.rs @@ -89,6 +89,19 @@ impl ProcessingJob { }) .unwrap_or("bin"); - self.output_dir.join(format!("{}.{}", stem, ext)) + let filename = format!("{}.{}", stem, ext); + + if self.preserve_directory_structure { + // Maintain relative path from input_dir + if let Ok(rel) = source.path.strip_prefix(&self.input_dir) { + if let Some(parent) = rel.parent() { + if parent.components().count() > 0 { + return self.output_dir.join(parent).join(filename); + } + } + } + } + + self.output_dir.join(filename) } } diff --git a/pixstrip-gtk/src/app.rs b/pixstrip-gtk/src/app.rs index 3591dd7..bc061bf 100644 --- a/pixstrip-gtk/src/app.rs +++ b/pixstrip-gtk/src/app.rs @@ -1682,6 +1682,17 @@ fn show_results( } } + // Play completion sound (if enabled in settings) + if config.play_completion_sound { + std::thread::spawn(|| { + // Use canberra-gtk-play for system sound (standard on GNOME) + let _ = std::process::Command::new("canberra-gtk-play") + .arg("--id=complete") + .arg("--description=Processing complete") + .output(); + }); + } + // Auto-open output folder if enabled if config.auto_open_output { let output = ui.state.output_dir.borrow().clone();