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:
110
pixstrip-gtk/src/steps/step_output.rs
Normal file
110
pixstrip-gtk/src/steps/step_output.rs
Normal file
@@ -0,0 +1,110 @@
|
||||
use adw::prelude::*;
|
||||
|
||||
pub fn build_output_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();
|
||||
|
||||
// Operation summary
|
||||
let summary_group = adw::PreferencesGroup::builder()
|
||||
.title("Operation Summary")
|
||||
.description("Review your processing settings before starting")
|
||||
.build();
|
||||
|
||||
let summary_placeholder = adw::ActionRow::builder()
|
||||
.title("No operations configured")
|
||||
.subtitle("Go back and configure your workflow settings")
|
||||
.build();
|
||||
summary_placeholder.add_prefix(>k::Image::from_icon_name("dialog-information-symbolic"));
|
||||
|
||||
summary_group.add(&summary_placeholder);
|
||||
content.append(&summary_group);
|
||||
|
||||
// Output directory
|
||||
let output_group = adw::PreferencesGroup::builder()
|
||||
.title("Output Directory")
|
||||
.build();
|
||||
|
||||
let output_row = adw::ActionRow::builder()
|
||||
.title("Output Location")
|
||||
.subtitle("processed/ (subfolder next to originals)")
|
||||
.activatable(true)
|
||||
.build();
|
||||
output_row.add_prefix(>k::Image::from_icon_name("folder-symbolic"));
|
||||
|
||||
let choose_button = gtk::Button::builder()
|
||||
.icon_name("folder-open-symbolic")
|
||||
.tooltip_text("Choose output folder")
|
||||
.valign(gtk::Align::Center)
|
||||
.build();
|
||||
choose_button.add_css_class("flat");
|
||||
output_row.add_suffix(&choose_button);
|
||||
output_row.add_suffix(>k::Image::from_icon_name("go-next-symbolic"));
|
||||
|
||||
let structure_row = adw::SwitchRow::builder()
|
||||
.title("Preserve Directory Structure")
|
||||
.subtitle("Keep subfolder hierarchy in output")
|
||||
.active(false)
|
||||
.build();
|
||||
|
||||
output_group.add(&output_row);
|
||||
output_group.add(&structure_row);
|
||||
content.append(&output_group);
|
||||
|
||||
// Overwrite behavior
|
||||
let overwrite_group = adw::PreferencesGroup::builder()
|
||||
.title("If Files Already Exist")
|
||||
.build();
|
||||
|
||||
let overwrite_row = adw::ComboRow::builder()
|
||||
.title("Overwrite Behavior")
|
||||
.subtitle("What to do when output file already exists")
|
||||
.build();
|
||||
let overwrite_model = gtk::StringList::new(&[
|
||||
"Ask before overwriting",
|
||||
"Auto-rename with suffix",
|
||||
"Always overwrite",
|
||||
"Skip existing files",
|
||||
]);
|
||||
overwrite_row.set_model(Some(&overwrite_model));
|
||||
|
||||
overwrite_group.add(&overwrite_row);
|
||||
content.append(&overwrite_group);
|
||||
|
||||
// Image count
|
||||
let stats_group = adw::PreferencesGroup::builder()
|
||||
.title("Batch Info")
|
||||
.build();
|
||||
|
||||
let count_row = adw::ActionRow::builder()
|
||||
.title("Images to process")
|
||||
.subtitle("0 images")
|
||||
.build();
|
||||
count_row.add_prefix(>k::Image::from_icon_name("image-x-generic-symbolic"));
|
||||
|
||||
stats_group.add(&count_row);
|
||||
content.append(&stats_group);
|
||||
|
||||
scrolled.set_child(Some(&content));
|
||||
|
||||
let clamp = adw::Clamp::builder()
|
||||
.maximum_size(600)
|
||||
.child(&scrolled)
|
||||
.build();
|
||||
|
||||
adw::NavigationPage::builder()
|
||||
.title("Output & Process")
|
||||
.tag("step-output")
|
||||
.child(&clamp)
|
||||
.build()
|
||||
}
|
||||
Reference in New Issue
Block a user