parent
3a9198b5de
commit
27f1f960a0
1 changed files with 34 additions and 9 deletions
|
|
@ -215,7 +215,24 @@ where
|
||||||
|
|
||||||
fn cancel(&mut self, window: &mut Window, cx: &mut Context<ListState<Self>>) {
|
fn cancel(&mut self, window: &mut Window, cx: &mut Context<ListState<Self>>) {
|
||||||
let state = self.state.clone();
|
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| {
|
_ = state.update(cx, |this, cx| {
|
||||||
this.open = false;
|
this.open = false;
|
||||||
this.focus(window, cx);
|
this.focus(window, cx);
|
||||||
|
|
@ -223,14 +240,9 @@ where
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn confirm(
|
fn confirm(&mut self, _: bool, window: &mut Window, cx: &mut Context<ListState<Self>>) {
|
||||||
&mut self,
|
let selected_index = self.selected_index;
|
||||||
_secondary: bool,
|
let selected_value = selected_index
|
||||||
window: &mut Window,
|
|
||||||
cx: &mut Context<ListState<Self>>,
|
|
||||||
) {
|
|
||||||
let selected_value = self
|
|
||||||
.selected_index
|
|
||||||
.and_then(|ix| self.delegate.item(ix))
|
.and_then(|ix| self.delegate.item(ix))
|
||||||
.map(|item| item.value().clone());
|
.map(|item| item.value().clone());
|
||||||
let state = self.state.clone();
|
let state = self.state.clone();
|
||||||
|
|
@ -238,6 +250,7 @@ where
|
||||||
cx.defer_in(window, move |_, window, cx| {
|
cx.defer_in(window, move |_, window, cx| {
|
||||||
_ = state.update(cx, |this, cx| {
|
_ = state.update(cx, |this, cx| {
|
||||||
cx.emit(SelectEvent::Confirm(selected_value.clone()));
|
cx.emit(SelectEvent::Confirm(selected_value.clone()));
|
||||||
|
this.final_selected_index = selected_index;
|
||||||
this.selected_value = selected_value;
|
this.selected_value = selected_value;
|
||||||
this.open = false;
|
this.open = false;
|
||||||
this.focus(window, cx);
|
this.focus(window, cx);
|
||||||
|
|
@ -327,6 +340,7 @@ pub struct SelectState<D: SelectDelegate + 'static> {
|
||||||
bounds: Bounds<Pixels>,
|
bounds: Bounds<Pixels>,
|
||||||
open: bool,
|
open: bool,
|
||||||
selected_value: Option<<D::Item as SelectItem>::Value>,
|
selected_value: Option<<D::Item as SelectItem>::Value>,
|
||||||
|
final_selected_index: Option<IndexPath>,
|
||||||
_subscriptions: Vec<Subscription>,
|
_subscriptions: Vec<Subscription>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -575,6 +589,7 @@ where
|
||||||
open: false,
|
open: false,
|
||||||
bounds: Bounds::default(),
|
bounds: Bounds::default(),
|
||||||
empty: None,
|
empty: None,
|
||||||
|
final_selected_index: None,
|
||||||
_subscriptions,
|
_subscriptions,
|
||||||
};
|
};
|
||||||
this.set_selected_index(selected_index, window, cx);
|
this.set_selected_index(selected_index, window, cx);
|
||||||
|
|
@ -591,6 +606,7 @@ where
|
||||||
self.list.update(cx, |list, cx| {
|
self.list.update(cx, |list, cx| {
|
||||||
list._set_selected_index(selected_index, window, cx);
|
list._set_selected_index(selected_index, window, cx);
|
||||||
});
|
});
|
||||||
|
self.final_selected_index = selected_index;
|
||||||
self.update_selected_value(window, cx);
|
self.update_selected_value(window, cx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -649,6 +665,15 @@ where
|
||||||
return;
|
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;
|
self.open = false;
|
||||||
cx.notify();
|
cx.notify();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue