select: Restore the selection when canceling (#1501)

Fix #1495
This commit is contained in:
Floyd Wang 2025-11-04 18:22:00 +08:00 committed by GitHub
parent 3a9198b5de
commit 27f1f960a0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -215,7 +215,24 @@ where
fn cancel(&mut self, window: &mut Window, cx: &mut Context<ListState<Self>>) {
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<ListState<Self>>,
) {
let selected_value = self
.selected_index
fn confirm(&mut self, _: bool, window: &mut Window, cx: &mut Context<ListState<Self>>) {
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<D: SelectDelegate + 'static> {
bounds: Bounds<Pixels>,
open: bool,
selected_value: Option<<D::Item as SelectItem>::Value>,
final_selected_index: Option<IndexPath>,
_subscriptions: Vec<Subscription>,
}
@ -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();
}