use crate::app::EncodingSettings; use eframe::egui; pub struct Settings; impl Settings { pub fn new() -> Self { Self } pub fn show(&mut self, ui: &mut egui::Ui, settings: &mut EncodingSettings) { ui.heading("Encoding Settings"); ui.add_space(12.0); // Quality slider ui.horizontal(|ui| { ui.label("Quality:"); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.label(format!("{}", settings.quality)); }); }); let quality_slider = egui::Slider::new(&mut settings.quality, 0..=100) .show_value(false); ui.add(quality_slider); ui.add_space(4.0); ui.label( egui::RichText::new("0 = smallest file, 100 = best quality") .small() .weak(), ); ui.add_space(12.0); // Alpha quality slider ui.horizontal(|ui| { ui.label("Alpha Quality:"); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.label(format!("{}", settings.alpha_quality)); }); }); let alpha_slider = egui::Slider::new(&mut settings.alpha_quality, 0..=100) .show_value(false); ui.add(alpha_slider); ui.add_space(4.0); ui.label( egui::RichText::new("Separate quality for transparency") .small() .weak(), ); ui.add_space(12.0); // Speed slider ui.horizontal(|ui| { ui.label("Speed:"); ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { ui.label(format!("{}", settings.speed)); }); }); let speed_slider = egui::Slider::new(&mut settings.speed, 0..=10) .show_value(false); ui.add(speed_slider); ui.add_space(4.0); ui.label( egui::RichText::new("0 = slowest/best, 10 = fastest") .small() .weak(), ); ui.add_space(16.0); ui.separator(); ui.add_space(8.0); // Lossless checkbox let mut lossless = settings.lossless; if ui.checkbox(&mut lossless, "Lossless mode").changed() { settings.lossless = lossless; if lossless { settings.quality = 100; settings.alpha_quality = 100; } } ui.add_space(4.0); ui.label( egui::RichText::new("Perfect quality, larger files") .small() .weak(), ); ui.add_space(16.0); ui.separator(); ui.add_space(8.0); // FPS Override ui.label("FPS Override (for videos):"); ui.add_space(4.0); let has_override = settings.fps_override.is_some(); let mut fps_value = settings.fps_override.unwrap_or(30.0); ui.horizontal(|ui| { let mut use_override = has_override; if ui.checkbox(&mut use_override, "").changed() { if use_override { settings.fps_override = Some(fps_value); } else { settings.fps_override = None; } } ui.add_enabled_ui(has_override, |ui| { let fps_edit = egui::DragValue::new(&mut fps_value) .speed(0.5) .range(1.0..=120.0) .suffix(" fps"); if ui.add(fps_edit).changed() && has_override { settings.fps_override = Some(fps_value); } }); if !has_override { ui.label(egui::RichText::new("Auto-detect").weak()); } }); ui.add_space(16.0); ui.separator(); ui.add_space(8.0); // Output directory ui.label("Output Directory:"); ui.add_space(4.0); if ui .checkbox(&mut settings.use_same_directory, "Same as source") .changed() { if settings.use_same_directory { settings.output_directory = None; } } ui.add_enabled_ui(!settings.use_same_directory, |ui| { ui.horizontal(|ui| { let dir_text = settings .output_directory .as_ref() .map(|p| p.display().to_string()) .unwrap_or_else(|| "Not set".to_string()); ui.label(egui::RichText::new(&dir_text).small()); }); if ui.button("Browse...").clicked() { if let Some(path) = rfd::FileDialog::new().pick_folder() { settings.output_directory = Some(path); } } }); } }