From 7840765e5b49c60e31a82c0bc0166c65ff1b89a4 Mon Sep 17 00:00:00 2001 From: lashman Date: Fri, 6 Mar 2026 13:16:11 +0200 Subject: [PATCH] Add File Manager Integration page to welcome wizard Add fourth welcome wizard page that detects installed file managers (Nautilus, Nemo, Thunar, Dolphin) and offers integration toggles for each. Follows the design doc specification for the first-run experience. --- pixstrip-gtk/src/welcome.rs | 97 ++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) diff --git a/pixstrip-gtk/src/welcome.rs b/pixstrip-gtk/src/welcome.rs index bf6fccc..09c0d60 100644 --- a/pixstrip-gtk/src/welcome.rs +++ b/pixstrip-gtk/src/welcome.rs @@ -35,6 +35,9 @@ fn build_welcome_dialog() -> adw::Dialog { let skill_page = build_skill_page(&nav_view); nav_view.add(&skill_page); + let fm_page = build_file_manager_page(&nav_view); + nav_view.add(&fm_page); + let output_page = build_output_page(&dialog); nav_view.add(&output_page); @@ -150,7 +153,7 @@ fn build_skill_page(nav_view: &adw::NavigationView) -> adw::NavigationPage { }; let _ = store.save(&cfg); } - nav.push_by_tag("output-location"); + nav.push_by_tag("file-manager"); }); content.append(&title); @@ -165,6 +168,98 @@ fn build_skill_page(nav_view: &adw::NavigationView) -> adw::NavigationPage { .build() } +fn build_file_manager_page(nav_view: &adw::NavigationView) -> adw::NavigationPage { + let content = gtk::Box::builder() + .orientation(gtk::Orientation::Vertical) + .spacing(12) + .margin_top(24) + .margin_bottom(24) + .margin_start(24) + .margin_end(24) + .build(); + + let title = gtk::Label::builder() + .label("File Manager Integration") + .css_classes(["title-2"]) + .halign(gtk::Align::Start) + .build(); + + let subtitle = gtk::Label::builder() + .label("Add 'Process with Pixstrip' to your file manager's right-click menu.") + .css_classes(["dim-label"]) + .halign(gtk::Align::Start) + .wrap(true) + .build(); + + let group = adw::PreferencesGroup::builder() + .title("Detected File Managers") + .description("Toggle integration for each file manager") + .build(); + + // Detect installed file managers + let file_managers = [ + ("Nautilus", "org.gnome.Nautilus", "system-file-manager-symbolic"), + ("Nemo", "org.nemo.Nemo", "system-file-manager-symbolic"), + ("Thunar", "thunar", "system-file-manager-symbolic"), + ("Dolphin", "org.kde.dolphin", "system-file-manager-symbolic"), + ]; + + let mut found_any = false; + for (name, desktop_id, icon) in &file_managers { + // Check if the file manager is installed by looking for its .desktop file + let is_installed = gtk::gio::AppInfo::all() + .iter() + .any(|info| { + info.id() + .map(|id| id.as_str().contains(desktop_id)) + .unwrap_or(false) + }); + + if is_installed { + found_any = true; + let row = adw::SwitchRow::builder() + .title(*name) + .subtitle(format!("Add right-click menu to {}", name)) + .active(false) + .build(); + row.add_prefix(>k::Image::from_icon_name(icon)); + group.add(&row); + } + } + + if !found_any { + let row = adw::ActionRow::builder() + .title("No supported file managers found") + .subtitle("You can configure this later in Settings") + .build(); + row.add_prefix(>k::Image::from_icon_name("dialog-information-symbolic")); + group.add(&row); + } + + let next_button = gtk::Button::builder() + .label("Continue") + .halign(gtk::Align::Center) + .build(); + next_button.add_css_class("suggested-action"); + next_button.add_css_class("pill"); + + let nav = nav_view.clone(); + next_button.connect_clicked(move |_| { + nav.push_by_tag("output-location"); + }); + + content.append(&title); + content.append(&subtitle); + content.append(&group); + content.append(&next_button); + + adw::NavigationPage::builder() + .title("File Manager") + .tag("file-manager") + .child(&content) + .build() +} + fn build_output_page(dialog: &adw::Dialog) -> adw::NavigationPage { let content = gtk::Box::builder() .orientation(gtk::Orientation::Vertical)