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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user