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)