From 465cb657450aef96bbf71114b92bfd930f9c4c3c Mon Sep 17 00:00:00 2001 From: JoyLin <72300219+JoyElliot@users.noreply.github.com> Date: Sun, 27 Sep 2026 19:03:26 +0800 Subject: [PATCH] fix(sftp): close conflict dialogs after selecting an action (#311) Dispatch dialog closure from uniquely identified conflict-action buttons, preserving transfer policies and disabled overwrite behavior. Keep Enter from dismissing the dialog before an explicit strategy is selected. --- .../workspace/remote_files/transfers.rs | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/nebula_app/src/gpui_shell/workspace/remote_files/transfers.rs b/nebula_app/src/gpui_shell/workspace/remote_files/transfers.rs index e293239..6754663 100644 --- a/nebula_app/src/gpui_shell/workspace/remote_files/transfers.rs +++ b/nebula_app/src/gpui_shell/workspace/remote_files/transfers.rs @@ -2,6 +2,7 @@ use super::*; use crate::i18n::Message; +use gpui_component::dialog::CancelDialog; impl NebulaWorkspace { pub(super) fn remote_transfer_snapshot(&self) -> Option { @@ -296,20 +297,22 @@ impl NebulaWorkspace { let overwrite_workspace = workspace.clone(); let overwrite_pending = pending.clone(); let overwrite_target = target.clone(); + // DialogClose 的固定 ID 会让同级包装器共享点击状态;直接在按钮上 + // 派发关闭动作,也让鼠标和键盘激活使用同一条路径。 let footer = DialogFooter::new() .child( - DialogClose::new().child( - Button::new("sftp-conflict-cancel") - .label(language.text(Message::TransferCancel)), - ), + Button::new("sftp-conflict-cancel") + .label(language.text(Message::TransferCancel)) + .on_click(|_, window, cx| { + window.dispatch_action(Box::new(CancelDialog), cx); + }), ) .child(div().flex_1()) .child( - DialogClose::new().child( - Button::new("sftp-conflict-skip") - .label(language.text(Message::TransferSkip)) - .on_click(move |_, _, cx| { - let Some(workspace) = skip_workspace.upgrade() else { return }; + Button::new("sftp-conflict-skip") + .label(language.text(Message::TransferSkip)) + .on_click(move |_, window, cx| { + if let Some(workspace) = skip_workspace.upgrade() { let _ = workspace.update(cx, |workspace, cx| { workspace.start_remote_transfer( skip_pending.clone(), @@ -318,15 +321,15 @@ impl NebulaWorkspace { cx, ); }); - }), - ), + } + window.dispatch_action(Box::new(CancelDialog), cx); + }), ) .child( - DialogClose::new().child( - Button::new("sftp-conflict-keep-both") - .label(language.text(Message::TransferKeepBoth)) - .on_click(move |_, _, cx| { - let Some(workspace) = keep_workspace.upgrade() else { return }; + Button::new("sftp-conflict-keep-both") + .label(language.text(Message::TransferKeepBoth)) + .on_click(move |_, window, cx| { + if let Some(workspace) = keep_workspace.upgrade() { let _ = workspace.update(cx, |workspace, cx| { workspace.start_remote_transfer( keep_pending.clone(), @@ -335,17 +338,17 @@ impl NebulaWorkspace { cx, ); }); - }), - ), + } + window.dispatch_action(Box::new(CancelDialog), cx); + }), ) .child( - DialogClose::new().child( - Button::new("sftp-conflict-overwrite") - .label(language.text(Message::TransferOverwrite)) - .danger() - .disabled(!overwrite_allowed) - .on_click(move |_, _, cx| { - let Some(workspace) = overwrite_workspace.upgrade() else { return }; + Button::new("sftp-conflict-overwrite") + .label(language.text(Message::TransferOverwrite)) + .danger() + .disabled(!overwrite_allowed) + .on_click(move |_, window, cx| { + if let Some(workspace) = overwrite_workspace.upgrade() { let _ = workspace.update(cx, |workspace, cx| { workspace.start_remote_transfer( overwrite_pending.clone(), @@ -354,13 +357,20 @@ impl NebulaWorkspace { cx, ); }); - }), - ), + } + window.dispatch_action(Box::new(CancelDialog), cx); + }), ); center_modal_dialog(dialog, window, 220.0) .close_button(false) .overlay_closable(true) + // 此处没有默认传输策略。Enter 应交给聚焦按钮的按下/抬起处理, + // 不能由 Dialog 的默认确认动作直接关闭而跳过策略选择。 + .on_ok(|_, _, cx| { + cx.propagate(); + false + }) .title( div() .text_lg()