Add keep-in-place option for drag-and-drop imports

This commit is contained in:
lashman
2026-02-27 23:37:03 +02:00
parent 4173f33bbf
commit e7a056c75a

View File

@@ -64,11 +64,12 @@ pub fn show_drop_dialog(
.build(); .build();
dialog.add_response("cancel", &i18n("Cancel")); dialog.add_response("cancel", &i18n("Cancel"));
dialog.add_response("add-only", &i18n("Just add")); dialog.add_response("keep-in-place", &i18n("Keep in place"));
dialog.add_response("add-and-integrate", &i18n("Add to app menu")); dialog.add_response("copy-only", &i18n("Copy to Applications"));
dialog.add_response("copy-and-integrate", &i18n("Copy & add to menu"));
dialog.set_response_appearance("add-and-integrate", adw::ResponseAppearance::Suggested); dialog.set_response_appearance("copy-and-integrate", adw::ResponseAppearance::Suggested);
dialog.set_default_response(Some("add-and-integrate")); dialog.set_default_response(Some("copy-and-integrate"));
dialog.set_close_response("cancel"); dialog.set_close_response("cancel");
let toast_ref = toast_overlay.clone(); let toast_ref = toast_overlay.clone();
@@ -78,7 +79,8 @@ pub fn show_drop_dialog(
return; return;
} }
let integrate = response == "add-and-integrate"; let copy = response != "keep-in-place";
let integrate = response == "copy-and-integrate";
let files = files.clone(); let files = files.clone();
let toast_ref = toast_ref.clone(); let toast_ref = toast_ref.clone();
let on_complete_ref = on_complete.clone(); let on_complete_ref = on_complete.clone();
@@ -86,7 +88,7 @@ pub fn show_drop_dialog(
glib::spawn_future_local(async move { glib::spawn_future_local(async move {
// Phase 1: Fast registration (copy + DB upsert only) // Phase 1: Fast registration (copy + DB upsert only)
let result = gio::spawn_blocking(move || { let result = gio::spawn_blocking(move || {
register_dropped_files(&files) register_dropped_files(&files, copy)
}) })
.await; .await;
@@ -149,6 +151,7 @@ pub fn show_drop_dialog(
/// Returns a list of registered files for background analysis. /// Returns a list of registered files for background analysis.
fn register_dropped_files( fn register_dropped_files(
files: &[PathBuf], files: &[PathBuf],
copy_to_target: bool,
) -> Result<Vec<RegisteredFile>, String> { ) -> Result<Vec<RegisteredFile>, String> {
let db = Database::open().map_err(|e| format!("Failed to open database: {}", e))?; let db = Database::open().map_err(|e| format!("Failed to open database: {}", e))?;
@@ -192,8 +195,8 @@ fn register_dropped_files(
.unwrap_or(false) .unwrap_or(false)
}); });
let final_path = if in_scan_dir { let final_path = if in_scan_dir || !copy_to_target {
// Ensure executable even if already in scan dir // Keep the file where it is; just ensure it's executable
#[cfg(unix)] #[cfg(unix)]
{ {
use std::os::unix::fs::PermissionsExt; use std::os::unix::fs::PermissionsExt;