Fixed datepicker not being marked as changed (#2208)

This commit is contained in:
ItsEthra 2022-10-31 23:40:49 +03:00 committed by GitHub
parent 1fb19f08ce
commit 76d0cf5034
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 20 deletions

View file

@ -1,6 +1,6 @@
use super::popup::DatePickerPopup;
use chrono::{Date, Utc};
use egui::{Area, Button, Frame, Key, Order, RichText, Ui, Widget};
use egui::{Area, Button, Frame, InnerResponse, Key, Order, RichText, Ui, Widget};
#[derive(Default, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
@ -79,7 +79,7 @@ impl<'a> Widget for DatePickerButton<'a> {
if button_state.picker_visible {
button = button.fill(visuals.bg_fill).stroke(visuals.bg_stroke);
}
let button_response = ui.add(button);
let mut button_response = ui.add(button);
if button_response.clicked() {
button_state.picker_visible = true;
ui.memory().data.insert_persisted(id, button_state.clone());
@ -101,12 +101,16 @@ impl<'a> Widget for DatePickerButton<'a> {
//TODO(elwerene): Better positioning
let area_response = Area::new(ui.make_persistent_id(&self.id_source))
let InnerResponse {
inner: saved,
response: area_response,
} = Area::new(ui.make_persistent_id(&self.id_source))
.order(Order::Foreground)
.fixed_pos(pos)
.show(ui.ctx(), |ui| {
let frame = Frame::popup(ui.style());
frame.show(ui, |ui| {
frame
.show(ui, |ui| {
ui.set_min_width(width);
ui.set_max_width(width);
@ -118,10 +122,14 @@ impl<'a> Widget for DatePickerButton<'a> {
calendar: self.calendar,
calendar_week: self.calendar_week,
}
.draw(ui);
.draw(ui)
})
})
.response;
.inner
});
if saved {
button_response.mark_changed();
}
if !button_response.clicked()
&& (ui.input().key_pressed(Key::Escape) || area_response.clicked_elsewhere())

View file

@ -33,7 +33,8 @@ pub(crate) struct DatePickerPopup<'a> {
}
impl<'a> DatePickerPopup<'a> {
pub fn draw(&mut self, ui: &mut Ui) {
/// Returns `true` if user pressed `Save` button.
pub fn draw(&mut self, ui: &mut Ui) -> bool {
let id = ui.make_persistent_id("date_picker");
let today = chrono::offset::Utc::now().date();
let mut popup_state = ui
@ -50,7 +51,7 @@ impl<'a> DatePickerPopup<'a> {
}
let weeks = month_data(popup_state.year, popup_state.month);
let mut close = false;
let (mut close, mut saved) = (false, false);
let height = 20.0;
let spacing = 2.0;
ui.spacing_mut().item_spacing = Vec2::splat(spacing);
@ -375,6 +376,7 @@ impl<'a> DatePickerPopup<'a> {
),
Utc,
);
saved = true;
close = true;
}
});
@ -392,6 +394,8 @@ impl<'a> DatePickerPopup<'a> {
.get_persisted_mut_or_default::<DatePickerButtonState>(self.button_id)
.picker_visible = false;
}
saved && close
}
}