Improve Images, Compress, Output, Workflow steps

- Images step: folder drag-and-drop with recursive image scanning, per-file
  list with format and size info, total file size in header, supported
  formats label in empty state
- Compress step: per-format quality controls moved into AdwExpanderRow,
  improved quality level descriptions
- Output step: dynamic image count with total size from loaded_files,
  initial overwrite behavior from config
- Workflow step: properly handle MetadataConfig::Custom in preset import,
  mapping all custom metadata fields to JobConfig
This commit is contained in:
2026-03-06 12:22:15 +02:00
parent e8cdddd08d
commit 4fc4ea7017
4 changed files with 173 additions and 50 deletions

View File

@@ -33,7 +33,7 @@ pub fn build_compress_page(state: &AppState) -> adw::NavigationPage {
// Quality slider
let quality_group = adw::PreferencesGroup::builder()
.title("Quality Level")
.description("Higher quality means larger files")
.description("Higher quality means larger files. This sets the overall quality target.")
.build();
let initial_val = match cfg.quality_preset {
@@ -78,10 +78,14 @@ pub fn build_compress_page(state: &AppState) -> adw::NavigationPage {
quality_group.add(&quality_box);
content.append(&quality_group);
// Advanced options
// Advanced options in expander
let advanced_group = adw::PreferencesGroup::builder()
.title("Advanced Options")
.build();
let advanced_expander = adw::ExpanderRow::builder()
.title("Per-Format Quality")
.description("Fine-tune quality for each format individually")
.subtitle("Fine-tune quality for each format individually")
.build();
let jpeg_row = adw::SpinRow::builder()
@@ -102,9 +106,11 @@ pub fn build_compress_page(state: &AppState) -> adw::NavigationPage {
.adjustment(&gtk::Adjustment::new(cfg.webp_quality as f64, 1.0, 100.0, 1.0, 10.0, 0.0))
.build();
advanced_group.add(&jpeg_row);
advanced_group.add(&png_row);
advanced_group.add(&webp_row);
advanced_expander.add_row(&jpeg_row);
advanced_expander.add_row(&png_row);
advanced_expander.add_row(&webp_row);
advanced_group.add(&advanced_expander);
content.append(&advanced_group);
drop(cfg);
@@ -118,7 +124,7 @@ pub fn build_compress_page(state: &AppState) -> adw::NavigationPage {
}
{
let jc = state.job_config.clone();
let label = quality_label.clone();
let label = quality_label;
quality_scale.connect_value_changed(move |scale| {
let val = scale.value().round() as u32;
let mut c = jc.borrow_mut();
@@ -167,10 +173,10 @@ pub fn build_compress_page(state: &AppState) -> adw::NavigationPage {
fn quality_description(val: u32) -> String {
match val {
1 => "Web Optimized - smallest files, noticeable quality loss".into(),
2 => "Low - small files, some quality loss".into(),
3 => "Medium - good balance of quality and size".into(),
4 => "High - large files, minimal quality loss".into(),
_ => "Maximum - largest files, best possible quality".into(),
1 => "Web Optimized - smallest files, noticeable quality loss. Best for thumbnails.".into(),
2 => "Low - small files, some quality loss. Good for email attachments.".into(),
3 => "Medium - good balance of quality and size. Recommended for most uses.".into(),
4 => "High - large files, minimal quality loss. Good for printing.".into(),
_ => "Maximum - largest files, best possible quality. Archival use.".into(),
}
}