diff --git a/src/ui/detail_view.rs b/src/ui/detail_view.rs index 3345ca0..407ca35 100644 --- a/src/ui/detail_view.rs +++ b/src/ui/detail_view.rs @@ -143,11 +143,47 @@ pub fn build_detail_page(record: &AppImageRecord, db: &Rc) -> adw::Nav ); }); + header.pack_start(&launch_button); + + // Uninstall button + let uninstall_button = gtk::Button::builder() + .icon_name("user-trash-symbolic") + .tooltip_text("Uninstall this AppImage") + .build(); + uninstall_button.add_css_class("flat"); + uninstall_button.update_property(&[ + gtk::accessible::Property::Label("Uninstall application"), + ]); + let record_for_uninstall = record.clone(); + let db_uninstall = db.clone(); + let toast_uninstall = toast_overlay.clone(); + let is_integrated_header = record.integrated; + uninstall_button.connect_clicked(move |_btn| { + let fp = footprint::get_footprint(&db_uninstall, record_for_uninstall.id, record_for_uninstall.size_bytes as u64); + let fp_paths: Vec<(String, String, u64)> = fp.paths.iter() + .filter(|p| p.exists) + .map(|p| ( + p.path.to_string_lossy().to_string(), + p.path_type.label().to_string(), + p.size_bytes, + )) + .collect(); + show_uninstall_dialog( + &toast_uninstall, + &record_for_uninstall, + &db_uninstall, + is_integrated_header, + &fp_paths, + ); + }); + header.pack_end(&uninstall_button); + // Check for Update button let update_button = gtk::Button::builder() .icon_name("software-update-available-symbolic") .tooltip_text("Check for updates") .build(); + update_button.add_css_class("flat"); update_button.update_property(&[ gtk::accessible::Property::Label("Check for updates"), ]);