use iced::Task;
use crate::directory_tree::DirectoryTree;
use crate::directory_tree::drag::{DragMsg, DragState};
use crate::directory_tree::message::DirectoryTreeEvent;
use crate::directory_tree::selection::SelectionMode;
impl DirectoryTree {
pub(super) fn on_drag(&mut self, msg: DragMsg) -> Task<DirectoryTreeEvent> {
match msg {
DragMsg::Pressed(path, is_dir) => {
let sources: Vec<std::path::PathBuf> = if self.is_selected(&path) {
self.selected_paths.clone()
} else {
vec![path.clone()]
};
self.drag = Some(DragState {
sources,
primary: path,
primary_is_dir: is_dir,
hover: None,
});
Task::none()
}
DragMsg::Entered(path) => {
if let Some(d) = self.drag.as_mut() {
let is_dir = self.root.find_mut(&path).map(|n| n.is_dir).unwrap_or(false);
if d.is_valid_target(&path, is_dir) {
d.hover = Some(path);
} else {
d.hover = None;
}
}
Task::none()
}
DragMsg::Exited(path) => {
if let Some(d) = self.drag.as_mut()
&& d.hover.as_deref() == Some(path.as_path())
{
d.hover = None;
}
Task::none()
}
DragMsg::Released(path) => {
let Some(d) = self.drag.take() else {
return Task::none();
};
if path == d.primary {
return Task::done(DirectoryTreeEvent::Selected(
d.primary,
d.primary_is_dir,
SelectionMode::Replace,
));
}
if let Some(dest) = d.hover {
return Task::done(DirectoryTreeEvent::DragCompleted {
sources: d.sources,
destination: dest,
});
}
Task::none()
}
DragMsg::Cancelled => {
self.drag = None;
Task::none()
}
}
}
}