Use undo toast for integration removal instead of immediate action
This commit is contained in:
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user