Do not allow drag and drop of FS entries into the remote projects (#19565)

Release Notes:

- N/A
This commit is contained in:
Kirill Bulatov 2024-10-22 22:34:54 +03:00 committed by GitHub
parent 23ad470daf
commit 7a6550c1d1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 87 additions and 71 deletions

View file

@ -356,9 +356,11 @@ impl AssistantPanel {
let project = workspace.project().clone(); let project = workspace.project().clone();
pane.set_custom_drop_handle(cx, move |_, dropped_item, cx| { pane.set_custom_drop_handle(cx, move |_, dropped_item, cx| {
let action = maybe!({ let action = maybe!({
if project.read(cx).is_local() {
if let Some(paths) = dropped_item.downcast_ref::<ExternalPaths>() { if let Some(paths) = dropped_item.downcast_ref::<ExternalPaths>() {
return Some(InsertDraggedFiles::ExternalFiles(paths.paths().to_vec())); return Some(InsertDraggedFiles::ExternalFiles(paths.paths().to_vec()));
} }
}
let project_paths = if let Some(tab) = dropped_item.downcast_ref::<DraggedTab>() let project_paths = if let Some(tab) = dropped_item.downcast_ref::<DraggedTab>()
{ {

View file

@ -2327,6 +2327,7 @@ impl ProjectPanel {
let depth = details.depth; let depth = details.depth;
let worktree_id = details.worktree_id; let worktree_id = details.worktree_id;
let selections = Arc::new(self.marked_entries.clone()); let selections = Arc::new(self.marked_entries.clone());
let is_local = self.project.read(cx).is_local();
let dragged_selection = DraggedSelection { let dragged_selection = DraggedSelection {
active_selection: selection, active_selection: selection,
@ -2334,7 +2335,8 @@ impl ProjectPanel {
}; };
div() div()
.id(entry_id.to_proto() as usize) .id(entry_id.to_proto() as usize)
.on_drag_move::<ExternalPaths>(cx.listener( .when(is_local, |div| {
div.on_drag_move::<ExternalPaths>(cx.listener(
move |this, event: &DragMoveEvent<ExternalPaths>, cx| { move |this, event: &DragMoveEvent<ExternalPaths>, cx| {
if event.bounds.contains(&event.event.position) { if event.bounds.contains(&event.event.position) {
if this.last_external_paths_drag_over_entry == Some(entry_id) { if this.last_external_paths_drag_over_entry == Some(entry_id) {
@ -2377,14 +2379,15 @@ impl ProjectPanel {
} }
}, },
)) ))
.on_drop( .on_drop(cx.listener(
cx.listener(move |this, external_paths: &ExternalPaths, cx| { move |this, external_paths: &ExternalPaths, cx| {
this.last_external_paths_drag_over_entry = None; this.last_external_paths_drag_over_entry = None;
this.marked_entries.clear(); this.marked_entries.clear();
this.drop_external_files(external_paths.paths(), entry_id, cx); this.drop_external_files(external_paths.paths(), entry_id, cx);
cx.stop_propagation(); cx.stop_propagation();
}), },
) ))
})
.on_drag(dragged_selection, move |selection, cx| { .on_drag(dragged_selection, move |selection, cx| {
cx.new_view(|_| DraggedProjectEntryView { cx.new_view(|_| DraggedProjectEntryView {
details: details.clone(), details: details.clone(),
@ -2802,6 +2805,7 @@ impl Render for ProjectPanel {
fn render(&mut self, cx: &mut gpui::ViewContext<Self>) -> impl IntoElement { fn render(&mut self, cx: &mut gpui::ViewContext<Self>) -> impl IntoElement {
let has_worktree = !self.visible_entries.is_empty(); let has_worktree = !self.visible_entries.is_empty();
let project = self.project.read(cx); let project = self.project.read(cx);
let is_local = project.is_local();
if has_worktree { if has_worktree {
let item_count = self let item_count = self
@ -2939,11 +2943,12 @@ impl Render for ProjectPanel {
.log_err(); .log_err();
})), })),
) )
.drag_over::<ExternalPaths>(|style, _, cx| { .when(is_local, |div| {
div.drag_over::<ExternalPaths>(|style, _, cx| {
style.bg(cx.theme().colors().drop_target_background) style.bg(cx.theme().colors().drop_target_background)
}) })
.on_drop( .on_drop(cx.listener(
cx.listener(move |this, external_paths: &ExternalPaths, cx| { move |this, external_paths: &ExternalPaths, cx| {
this.last_external_paths_drag_over_entry = None; this.last_external_paths_drag_over_entry = None;
this.marked_entries.clear(); this.marked_entries.clear();
if let Some(task) = this if let Some(task) = this
@ -2960,8 +2965,9 @@ impl Render for ProjectPanel {
task.detach_and_log_err(cx); task.detach_and_log_err(cx);
} }
cx.stop_propagation(); cx.stop_propagation();
}), },
) ))
})
} }
} }
} }

View file

@ -89,6 +89,7 @@ impl TerminalPanel {
pane.display_nav_history_buttons(None); pane.display_nav_history_buttons(None);
pane.set_should_display_tab_bar(|_| true); pane.set_should_display_tab_bar(|_| true);
let is_local = workspace.project().read(cx).is_local();
let workspace = workspace.weak_handle(); let workspace = workspace.weak_handle();
pane.set_custom_drop_handle(cx, move |pane, dropped_item, cx| { pane.set_custom_drop_handle(cx, move |pane, dropped_item, cx| {
if let Some(tab) = dropped_item.downcast_ref::<DraggedTab>() { if let Some(tab) = dropped_item.downcast_ref::<DraggedTab>() {
@ -128,9 +129,11 @@ impl TerminalPanel {
{ {
add_paths_to_terminal(pane, &[entry_path], cx); add_paths_to_terminal(pane, &[entry_path], cx);
} }
} else if let Some(paths) = dropped_item.downcast_ref::<ExternalPaths>() { } else if is_local {
if let Some(paths) = dropped_item.downcast_ref::<ExternalPaths>() {
add_paths_to_terminal(pane, paths.paths(), cx); add_paths_to_terminal(pane, paths.paths(), cx);
} }
}
ControlFlow::Break(()) ControlFlow::Break(())
}); });

View file

@ -2570,6 +2570,7 @@ impl Render for Pane {
let should_display_tab_bar = self.should_display_tab_bar.clone(); let should_display_tab_bar = self.should_display_tab_bar.clone();
let display_tab_bar = should_display_tab_bar(cx); let display_tab_bar = should_display_tab_bar(cx);
let is_local = self.project.read(cx).is_local();
v_flex() v_flex()
.key_context(key_context) .key_context(key_context)
@ -2697,7 +2698,9 @@ impl Render for Pane {
.group("") .group("")
.on_drag_move::<DraggedTab>(cx.listener(Self::handle_drag_move)) .on_drag_move::<DraggedTab>(cx.listener(Self::handle_drag_move))
.on_drag_move::<DraggedSelection>(cx.listener(Self::handle_drag_move)) .on_drag_move::<DraggedSelection>(cx.listener(Self::handle_drag_move))
.on_drag_move::<ExternalPaths>(cx.listener(Self::handle_drag_move)) .when(is_local, |div| {
div.on_drag_move::<ExternalPaths>(cx.listener(Self::handle_drag_move))
})
.map(|div| { .map(|div| {
if let Some(item) = self.active_item() { if let Some(item) = self.active_item() {
div.v_flex() div.v_flex()
@ -2723,7 +2726,9 @@ impl Render for Pane {
.bg(cx.theme().colors().drop_target_background) .bg(cx.theme().colors().drop_target_background)
.group_drag_over::<DraggedTab>("", |style| style.visible()) .group_drag_over::<DraggedTab>("", |style| style.visible())
.group_drag_over::<DraggedSelection>("", |style| style.visible()) .group_drag_over::<DraggedSelection>("", |style| style.visible())
.group_drag_over::<ExternalPaths>("", |style| style.visible()) .when(is_local, |div| {
div.group_drag_over::<ExternalPaths>("", |style| style.visible())
})
.when_some(self.can_drop_predicate.clone(), |this, p| { .when_some(self.can_drop_predicate.clone(), |this, p| {
this.can_drop(move |a, cx| p(a, cx)) this.can_drop(move |a, cx| p(a, cx))
}) })