From 27f1f960a0cc73e0055e31df5ca1f55af7753225 Mon Sep 17 00:00:00 2001 From: Floyd Wang Date: Tue, 4 Nov 2025 18:22:00 +0800 Subject: [PATCH] select: Restore the selection when canceling (#1501) Fix #1495 --- crates/ui/src/select.rs | 43 ++++++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/crates/ui/src/select.rs b/crates/ui/src/select.rs index d60b9696..34f597d3 100644 --- a/crates/ui/src/select.rs +++ b/crates/ui/src/select.rs @@ -215,7 +215,24 @@ where fn cancel(&mut self, window: &mut Window, cx: &mut Context>) { let state = self.state.clone(); - cx.defer_in(window, move |_, window, cx| { + let final_selected_index = state + .read_with(cx, |this, _| this.final_selected_index) + .ok() + .flatten(); + + // If the selected index is not the final selected index, we need to restore it. + let need_restore = if final_selected_index != self.selected_index { + self.selected_index = final_selected_index; + true + } else { + false + }; + + cx.defer_in(window, move |this, window, cx| { + if need_restore { + this.set_selected_index(final_selected_index, window, cx); + } + _ = state.update(cx, |this, cx| { this.open = false; this.focus(window, cx); @@ -223,14 +240,9 @@ where }); } - fn confirm( - &mut self, - _secondary: bool, - window: &mut Window, - cx: &mut Context>, - ) { - let selected_value = self - .selected_index + fn confirm(&mut self, _: bool, window: &mut Window, cx: &mut Context>) { + let selected_index = self.selected_index; + let selected_value = selected_index .and_then(|ix| self.delegate.item(ix)) .map(|item| item.value().clone()); let state = self.state.clone(); @@ -238,6 +250,7 @@ where cx.defer_in(window, move |_, window, cx| { _ = state.update(cx, |this, cx| { cx.emit(SelectEvent::Confirm(selected_value.clone())); + this.final_selected_index = selected_index; this.selected_value = selected_value; this.open = false; this.focus(window, cx); @@ -327,6 +340,7 @@ pub struct SelectState { bounds: Bounds, open: bool, selected_value: Option<::Value>, + final_selected_index: Option, _subscriptions: Vec, } @@ -575,6 +589,7 @@ where open: false, bounds: Bounds::default(), empty: None, + final_selected_index: None, _subscriptions, }; this.set_selected_index(selected_index, window, cx); @@ -591,6 +606,7 @@ where self.list.update(cx, |list, cx| { list._set_selected_index(selected_index, window, cx); }); + self.final_selected_index = selected_index; self.update_selected_value(window, cx); } @@ -649,6 +665,15 @@ where return; } + // If the selected index is not the final selected index, we need to restore it. + let final_selected_index = self.final_selected_index; + let selected_index = self.selected_index(cx); + if final_selected_index != selected_index { + self.list.update(cx, |list, cx| { + list.set_selected_index(self.final_selected_index, window, cx); + }); + } + self.open = false; cx.notify(); }