2026-02-05 00:15:54 -05:00
|
|
|
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);
|
|
|
|
|
|
2026-02-05 00:50:13 -05:00
|
|
|
// Quality setting with editable number
|
2026-02-05 00:15:54 -05:00
|
|
|
ui.horizontal(|ui| {
|
|
|
|
|
ui.label("Quality:");
|
|
|
|
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
2026-02-05 00:50:13 -05:00
|
|
|
let mut quality = settings.quality as i32;
|
|
|
|
|
let drag = egui::DragValue::new(&mut quality)
|
|
|
|
|
.range(0..=100)
|
|
|
|
|
.speed(1);
|
|
|
|
|
if ui.add(drag).changed() {
|
|
|
|
|
settings.quality = quality.clamp(0, 100) as u8;
|
|
|
|
|
}
|
2026-02-05 00:15:54 -05:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
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")
|
|
|
|
|
.weak(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
ui.add_space(12.0);
|
|
|
|
|
|
2026-02-05 00:50:13 -05:00
|
|
|
// Alpha quality setting with editable number
|
2026-02-05 00:15:54 -05:00
|
|
|
ui.horizontal(|ui| {
|
|
|
|
|
ui.label("Alpha Quality:");
|
|
|
|
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
2026-02-05 00:50:13 -05:00
|
|
|
let mut alpha = settings.alpha_quality as i32;
|
|
|
|
|
let drag = egui::DragValue::new(&mut alpha)
|
|
|
|
|
.range(0..=100)
|
|
|
|
|
.speed(1);
|
|
|
|
|
if ui.add(drag).changed() {
|
|
|
|
|
settings.alpha_quality = alpha.clamp(0, 100) as u8;
|
|
|
|
|
}
|
2026-02-05 00:15:54 -05:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
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")
|
|
|
|
|
.weak(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
ui.add_space(12.0);
|
|
|
|
|
|
2026-02-05 00:50:13 -05:00
|
|
|
// Speed setting with editable number
|
2026-02-05 00:15:54 -05:00
|
|
|
ui.horizontal(|ui| {
|
|
|
|
|
ui.label("Speed:");
|
|
|
|
|
ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| {
|
2026-02-05 00:50:13 -05:00
|
|
|
let mut speed = settings.speed as i32;
|
|
|
|
|
let drag = egui::DragValue::new(&mut speed)
|
|
|
|
|
.range(0..=10)
|
|
|
|
|
.speed(0.1);
|
|
|
|
|
if ui.add(drag).changed() {
|
|
|
|
|
settings.speed = speed.clamp(0, 10) as u8;
|
|
|
|
|
}
|
2026-02-05 00:15:54 -05:00
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
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")
|
|
|
|
|
.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")
|
|
|
|
|
.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());
|
|
|
|
|
|
2026-02-05 00:50:13 -05:00
|
|
|
ui.label(egui::RichText::new(&dir_text));
|
2026-02-05 00:15:54 -05:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if ui.button("Browse...").clicked() {
|
|
|
|
|
if let Some(path) = rfd::FileDialog::new().pick_folder() {
|
|
|
|
|
settings.output_directory = Some(path);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|