Wire all wizard step controls to shared JobConfig state

All four configurable steps (resize, convert, compress, metadata) now
have signal handlers that update the shared JobConfig via AppState.
The run_processing function builds ProcessingJob from actual user
choices instead of hardcoded values. Fixed clippy warnings (collapsed
if-let chain, removed needless borrow).
This commit is contained in:
2026-03-06 11:51:01 +02:00
parent eeb418ccdd
commit b855955786
6 changed files with 333 additions and 161 deletions

View File

@@ -1,6 +1,7 @@
use adw::prelude::*;
use crate::app::{AppState, MetadataMode};
pub fn build_metadata_page() -> adw::NavigationPage {
pub fn build_metadata_page(state: &AppState) -> adw::NavigationPage {
let scrolled = gtk::ScrolledWindow::builder()
.hscrollbar_policy(gtk::PolicyType::Never)
.vexpand(true)
@@ -15,11 +16,13 @@ pub fn build_metadata_page() -> adw::NavigationPage {
.margin_end(24)
.build();
let cfg = state.job_config.borrow();
// Enable toggle
let enable_row = adw::SwitchRow::builder()
.title("Enable Metadata Handling")
.subtitle("Control what image metadata to keep or remove")
.active(true)
.active(cfg.metadata_enabled)
.build();
let enable_group = adw::PreferencesGroup::new();
@@ -38,7 +41,7 @@ pub fn build_metadata_page() -> adw::NavigationPage {
.build();
strip_all_row.add_prefix(&gtk::Image::from_icon_name("user-trash-symbolic"));
let strip_all_check = gtk::CheckButton::new();
strip_all_check.set_active(true);
strip_all_check.set_active(cfg.metadata_mode == MetadataMode::StripAll);
strip_all_row.add_suffix(&strip_all_check);
strip_all_row.set_activatable_widget(Some(&strip_all_check));
@@ -50,6 +53,7 @@ pub fn build_metadata_page() -> adw::NavigationPage {
privacy_row.add_prefix(&gtk::Image::from_icon_name("security-medium-symbolic"));
let privacy_check = gtk::CheckButton::new();
privacy_check.set_group(Some(&strip_all_check));
privacy_check.set_active(cfg.metadata_mode == MetadataMode::Privacy);
privacy_row.add_suffix(&privacy_check);
privacy_row.set_activatable_widget(Some(&privacy_check));
@@ -61,6 +65,7 @@ pub fn build_metadata_page() -> adw::NavigationPage {
keep_all_row.add_prefix(&gtk::Image::from_icon_name("emblem-ok-symbolic"));
let keep_all_check = gtk::CheckButton::new();
keep_all_check.set_group(Some(&strip_all_check));
keep_all_check.set_active(cfg.metadata_mode == MetadataMode::KeepAll);
keep_all_row.add_suffix(&keep_all_check);
keep_all_row.set_activatable_widget(Some(&keep_all_check));
@@ -69,30 +74,39 @@ pub fn build_metadata_page() -> adw::NavigationPage {
presets_group.add(&keep_all_row);
content.append(&presets_group);
// Advanced - per-category controls
let advanced_group = adw::PreferencesGroup::builder()
.title("Fine-Grained Control")
.description("Choose exactly which metadata categories to strip")
.build();
drop(cfg);
let categories = [
("GPS / Location Data", "Coordinates, altitude, location name", true),
("Camera Info", "Camera model, serial number, lens info", true),
("Software / Editing", "Software used, editing history", true),
("Timestamps", "Date taken, date modified", false),
("Copyright / Author", "Copyright notice, creator name", false),
];
for (title, subtitle, default_strip) in &categories {
let row = adw::SwitchRow::builder()
.title(format!("Strip {}", title))
.subtitle(*subtitle)
.active(*default_strip)
.build();
advanced_group.add(&row);
// Wire signals
{
let jc = state.job_config.clone();
enable_row.connect_active_notify(move |row| {
jc.borrow_mut().metadata_enabled = row.is_active();
});
}
{
let jc = state.job_config.clone();
strip_all_check.connect_toggled(move |check| {
if check.is_active() {
jc.borrow_mut().metadata_mode = MetadataMode::StripAll;
}
});
}
{
let jc = state.job_config.clone();
privacy_check.connect_toggled(move |check| {
if check.is_active() {
jc.borrow_mut().metadata_mode = MetadataMode::Privacy;
}
});
}
{
let jc = state.job_config.clone();
keep_all_check.connect_toggled(move |check| {
if check.is_active() {
jc.borrow_mut().metadata_mode = MetadataMode::KeepAll;
}
});
}
content.append(&advanced_group);
scrolled.set_child(Some(&content));