use std::{cell::Cell, path::PathBuf, rc::Rc};
use gtk::prelude::*;
use webkit2gtk::WebView;
use crate::{application::window::Window, webview::FileDropEvent};
pub(crate) fn connect_drag_event(
webview: Rc<WebView>,
window: Rc<Window>,
handler: Box<dyn Fn(&Window, FileDropEvent) -> bool>,
) {
let listener = Rc::new((handler, Cell::new(None)));
let listener_ref = listener.clone();
let w = window.clone();
webview.connect_drag_data_received(move |_, _, _, _, data, info, _| {
if info == 2 {
let uris = data
.uris()
.iter()
.map(|gstr| {
let path = gstr.as_str();
PathBuf::from(path.to_string().strip_prefix("file://").unwrap_or(path))
})
.collect::<Vec<PathBuf>>();
listener_ref.1.set(Some(uris.clone()));
listener_ref.0(&w, FileDropEvent::Hovered(uris));
} else {
}
});
let listener_ref = listener.clone();
let w = window.clone();
webview.connect_drag_drop(move |_, _, _, _, _| {
let uris = listener_ref.1.take();
if let Some(uris) = uris {
listener_ref.0(&w, FileDropEvent::Dropped(uris))
} else {
false
}
});
let listener_ref = listener.clone();
let w = window.clone();
webview.connect_drag_leave(move |_, _, time| {
if time == 0 {
listener_ref.0(&w, FileDropEvent::Cancelled);
} else {
}
});
let listener_ref = listener.clone();
let w = window;
webview
.connect_drag_failed(move |_, _, _| gtk::Inhibit(listener_ref.0(&w, FileDropEvent::Cancelled)));
}