Use undo toast for integration removal instead of immediate action

This commit is contained in:
lashman
2026-02-28 01:51:40 +02:00
parent 91882abc3c
commit 5254de4a52

View File

@@ -921,10 +921,35 @@ impl DriftwoodWindow {
let toast_overlay = window.imp().toast_overlay.get().unwrap().clone(); let toast_overlay = window.imp().toast_overlay.get().unwrap().clone();
if let Ok(Some(record)) = db.get_appimage_by_id(record_id) { if let Ok(Some(record)) = db.get_appimage_by_id(record_id) {
if record.integrated { if record.integrated {
// Remove integration immediately, offer undo toast
integrator::undo_all_modifications(&db, record_id).ok(); integrator::undo_all_modifications(&db, record_id).ok();
integrator::remove_integration(&record).ok(); integrator::remove_integration(&record).ok();
db.set_integrated(record_id, false, None).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 { } else {
match integrator::integrate_tracked(&record, &db) { match integrator::integrate_tracked(&record, &db) {
Ok(result) => { Ok(result) => {