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:
125
pixstrip-gtk/src/steps/step_compress.rs
Normal file
125
pixstrip-gtk/src/steps/step_compress.rs
Normal 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(>k::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(>k::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(>k::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(>k::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(>k::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()
|
||||
}
|
||||
Reference in New Issue
Block a user