Add all wizard step UIs: workflow, images, resize, convert, compress, metadata, output

Full Adwaita widget-based layouts for all 7 wizard steps with
PreferencesGroups, SwitchRows, SpinRows, ComboRows, FlowBoxes,
ExpanderRows for social media presets, quality slider with named
marks, metadata radio group, and output configuration.
This commit is contained in:
2026-03-06 11:08:38 +02:00
parent 20f4c24538
commit a66db2b3bb
10 changed files with 980 additions and 26 deletions

View File

@@ -0,0 +1,125 @@
use adw::prelude::*;
pub fn build_compress_page() -> adw::NavigationPage {
let scrolled = gtk::ScrolledWindow::builder()
.hscrollbar_policy(gtk::PolicyType::Never)
.vexpand(true)
.build();
let content = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.spacing(12)
.margin_top(12)
.margin_bottom(12)
.margin_start(24)
.margin_end(24)
.build();
// Enable toggle
let enable_row = adw::SwitchRow::builder()
.title("Enable Compression")
.subtitle("Reduce file size with quality control")
.active(true)
.build();
let enable_group = adw::PreferencesGroup::new();
enable_group.add(&enable_row);
content.append(&enable_group);
// Quality slider
let quality_group = adw::PreferencesGroup::builder()
.title("Quality Level")
.description("Higher quality means larger files")
.build();
let quality_scale = gtk::Scale::builder()
.orientation(gtk::Orientation::Horizontal)
.adjustment(&gtk::Adjustment::new(3.0, 1.0, 5.0, 1.0, 1.0, 0.0))
.draw_value(false)
.hexpand(true)
.build();
quality_scale.set_round_digits(0);
// Add named marks
quality_scale.add_mark(1.0, gtk::PositionType::Bottom, Some("Web"));
quality_scale.add_mark(2.0, gtk::PositionType::Bottom, Some("Low"));
quality_scale.add_mark(3.0, gtk::PositionType::Bottom, Some("Medium"));
quality_scale.add_mark(4.0, gtk::PositionType::Bottom, Some("High"));
quality_scale.add_mark(5.0, gtk::PositionType::Bottom, Some("Maximum"));
let quality_label = gtk::Label::builder()
.label("Medium - Good balance of quality and size")
.css_classes(["dim-label"])
.margin_top(4)
.build();
let quality_box = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical)
.spacing(4)
.margin_top(8)
.margin_bottom(8)
.margin_start(12)
.margin_end(12)
.build();
quality_box.append(&quality_scale);
quality_box.append(&quality_label);
quality_group.add(&quality_box);
content.append(&quality_group);
// Size estimation placeholder
let estimate_group = adw::PreferencesGroup::builder()
.title("Size Estimation")
.description("Load images to see real compression results")
.build();
let estimate_row = adw::ActionRow::builder()
.title("Estimated savings")
.subtitle("Add images to see file size comparison")
.build();
estimate_row.add_prefix(&gtk::Image::from_icon_name("drive-harddisk-symbolic"));
estimate_group.add(&estimate_row);
content.append(&estimate_group);
// Advanced options
let advanced_group = adw::PreferencesGroup::builder()
.title("Advanced Options")
.build();
let jpeg_row = adw::SpinRow::builder()
.title("JPEG Quality")
.subtitle("1-100, higher is better quality")
.adjustment(&gtk::Adjustment::new(85.0, 1.0, 100.0, 1.0, 10.0, 0.0))
.build();
let png_row = adw::SpinRow::builder()
.title("PNG Compression Level")
.subtitle("1-6, higher is slower but smaller")
.adjustment(&gtk::Adjustment::new(3.0, 1.0, 6.0, 1.0, 1.0, 0.0))
.build();
let webp_row = adw::SpinRow::builder()
.title("WebP Quality")
.subtitle("1-100, higher is better quality")
.adjustment(&gtk::Adjustment::new(80.0, 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);
content.append(&advanced_group);
scrolled.set_child(Some(&content));
let clamp = adw::Clamp::builder()
.maximum_size(600)
.child(&scrolled)
.build();
adw::NavigationPage::builder()
.title("Compress")
.tag("step-compress")
.child(&clamp)
.build()
}