Improve UX, add popover tour, metadata, and hicolor icons

This commit is contained in:
2026-03-08 14:18:15 +02:00
parent 388670964a
commit 28253f009d
26 changed files with 2292 additions and 473 deletions

View File

@@ -57,7 +57,9 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
.activatable(true)
.visible(config.output_fixed_path.is_some())
.build();
fixed_path_row.add_prefix(&gtk::Image::from_icon_name("folder-open-symbolic"));
let fp_icon = gtk::Image::from_icon_name("folder-open-symbolic");
fp_icon.set_accessible_role(gtk::AccessibleRole::Presentation);
fixed_path_row.add_prefix(&fp_icon);
let choose_fixed_btn = gtk::Button::builder()
.icon_name("document-open-symbolic")
@@ -65,6 +67,9 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
.valign(gtk::Align::Center)
.build();
choose_fixed_btn.add_css_class("flat");
choose_fixed_btn.update_property(&[
gtk::accessible::Property::Label("Choose output folder"),
]);
fixed_path_row.add_suffix(&choose_fixed_btn);
// Shared state for fixed path
@@ -164,7 +169,34 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
.build();
reset_button.add_css_class("destructive-action");
// Reset welcome wizard / tutorial
let reset_welcome_state: std::rc::Rc<Cell<bool>> = std::rc::Rc::new(Cell::new(false));
let reset_welcome_row = adw::ActionRow::builder()
.title("Reset welcome wizard")
.subtitle("Show the setup wizard and tutorial again on next launch")
.build();
let reset_welcome_btn = gtk::Button::builder()
.label("Reset")
.valign(gtk::Align::Center)
.build();
reset_welcome_btn.add_css_class("destructive-action");
{
let rws = reset_welcome_state.clone();
let row = reset_welcome_row.clone();
reset_welcome_btn.connect_clicked(move |btn| {
rws.set(true);
btn.set_sensitive(false);
row.set_subtitle("Will show on next launch");
});
}
reset_welcome_row.add_suffix(&reset_welcome_btn);
ui_group.add(&skill_row);
ui_group.add(&reset_welcome_row);
general_page.add(&ui_group);
// File Manager Integration
@@ -432,6 +464,9 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
.css_classes(["boxed-list"])
.build();
watch_list.set_widget_name("watch-folder-list");
watch_list.update_property(&[
gtk::accessible::Property::Label("Configured watch folders for automatic processing"),
]);
// Shared state for watch folders
let watch_folders_state: std::rc::Rc<std::cell::RefCell<Vec<pixstrip_core::watcher::WatchFolder>>> =
@@ -564,9 +599,10 @@ pub fn build_settings_dialog() -> adw::PreferencesDialog {
// Save settings when the dialog closes
dialog.connect_closed(move |_| {
let welcome_reset = reset_welcome_state.get();
let new_config = AppConfig {
first_run_complete: true,
tutorial_complete: true, // preserve if settings are being saved
first_run_complete: !welcome_reset,
tutorial_complete: !welcome_reset,
output_subfolder: subfolder_row.text().to_string(),
output_fixed_path: if output_mode_row.selected() == 1 {
fixed_path_state.borrow().clone()