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.
This commit is contained in:
2026-03-06 13:16:11 +02:00
parent b78f1cd7c4
commit 7840765e5b

View File

@@ -35,6 +35,9 @@ fn build_welcome_dialog() -> adw::Dialog {
let skill_page = build_skill_page(&nav_view); let skill_page = build_skill_page(&nav_view);
nav_view.add(&skill_page); 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); let output_page = build_output_page(&dialog);
nav_view.add(&output_page); nav_view.add(&output_page);
@@ -150,7 +153,7 @@ fn build_skill_page(nav_view: &adw::NavigationView) -> adw::NavigationPage {
}; };
let _ = store.save(&cfg); let _ = store.save(&cfg);
} }
nav.push_by_tag("output-location"); nav.push_by_tag("file-manager");
}); });
content.append(&title); content.append(&title);
@@ -165,6 +168,98 @@ fn build_skill_page(nav_view: &adw::NavigationView) -> adw::NavigationPage {
.build() .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(&gtk::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(&gtk::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 { fn build_output_page(dialog: &adw::Dialog) -> adw::NavigationPage {
let content = gtk::Box::builder() let content = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical) .orientation(gtk::Orientation::Vertical)