diff --git a/src/window.rs b/src/window.rs index 558e30d..bcabb88 100644 --- a/src/window.rs +++ b/src/window.rs @@ -921,10 +921,35 @@ impl DriftwoodWindow { let toast_overlay = window.imp().toast_overlay.get().unwrap().clone(); if let Ok(Some(record)) = db.get_appimage_by_id(record_id) { if record.integrated { + // Remove integration immediately, offer undo toast integrator::undo_all_modifications(&db, record_id).ok(); integrator::remove_integration(&record).ok(); db.set_integrated(record_id, false, None).ok(); - toast_overlay.add_toast(adw::Toast::new("Integration removed")); + + let undo_toast = adw::Toast::builder() + .title("Removed from app menu") + .button_label("Undo") + .build(); + + let db_undo = db.clone(); + let window_weak_undo = window.downgrade(); + undo_toast.connect_button_clicked(move |_| { + let Some(win) = window_weak_undo.upgrade() else { return }; + if let Ok(Some(rec)) = db_undo.get_appimage_by_id(record_id) { + match integrator::integrate_tracked(&rec, &db_undo) { + Ok(result) => { + let desktop_path = result.desktop_file_path.to_string_lossy().to_string(); + db_undo.set_integrated(record_id, true, Some(&desktop_path)).ok(); + } + Err(e) => log::error!("Re-integration failed: {}", e), + } + let lib_view = win.imp().library_view.get().unwrap(); + if let Ok(records) = db_undo.get_all_appimages() { + lib_view.populate(records); + } + } + }); + toast_overlay.add_toast(undo_toast); } else { match integrator::integrate_tracked(&record, &db) { Ok(result) => {