Use selection list instead of date picker for loading
This commit is contained in:
parent
72829730e6
commit
cc6dc16380
1 changed files with 78 additions and 5 deletions
83
src/main.rs
83
src/main.rs
|
|
@ -727,7 +727,7 @@ struct Report {
|
|||
earnings_2: f64,
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug)]
|
||||
#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Hash)]
|
||||
struct ReportDate {
|
||||
pub year: u64,
|
||||
pub month: u8,
|
||||
|
|
@ -926,6 +926,81 @@ impl EditState {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
enum ReportPickerMsg {
|
||||
Open,
|
||||
Close,
|
||||
Pick,
|
||||
Select(ReportDate),
|
||||
}
|
||||
|
||||
struct ReportPicker<F> {
|
||||
reports: Vec<ReportDate>,
|
||||
on_pick: F,
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
struct ReportPickerState {
|
||||
modal: bool,
|
||||
pick: Option<ReportDate>,
|
||||
}
|
||||
|
||||
impl<M, F> iced::widget::Component<M, Renderer> for ReportPicker<F>
|
||||
where
|
||||
F: FnMut(ReportDate) -> M,
|
||||
{
|
||||
type State = ReportPickerState;
|
||||
type Event = ReportPickerMsg;
|
||||
|
||||
fn update(&mut self, state: &mut Self::State, event: Self::Event) -> Option<M> {
|
||||
match event {
|
||||
ReportPickerMsg::Open => {
|
||||
state.modal = true;
|
||||
}
|
||||
ReportPickerMsg::Close => {
|
||||
state.modal = false;
|
||||
state.pick = None;
|
||||
}
|
||||
ReportPickerMsg::Pick => {
|
||||
if let Some(r) = state.pick.take() {
|
||||
state.modal = false;
|
||||
return Some((self.on_pick)(r));
|
||||
}
|
||||
}
|
||||
ReportPickerMsg::Select(o) => {
|
||||
state.pick = Some(o);
|
||||
}
|
||||
}
|
||||
|
||||
None
|
||||
}
|
||||
|
||||
fn view(&self, state: &Self::State) -> iced_aw::Element<'_, Self::Event, Renderer> {
|
||||
let underlay = button("Load").on_press(ReportPickerMsg::Open);
|
||||
let overlay = match state.modal {
|
||||
true => Some(
|
||||
card(
|
||||
text("Load report"),
|
||||
column![
|
||||
selection_list(&self.reports, |_, v| ReportPickerMsg::Select(v))
|
||||
.height(Length::Shrink),
|
||||
button(text("Load")).on_press(ReportPickerMsg::Pick)
|
||||
]
|
||||
.spacing(5.),
|
||||
)
|
||||
.max_width(300.0)
|
||||
.on_close(ReportPickerMsg::Close),
|
||||
),
|
||||
false => None,
|
||||
};
|
||||
|
||||
modal(underlay, overlay)
|
||||
.backdrop(ReportPickerMsg::Close)
|
||||
.on_esc(ReportPickerMsg::Close)
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
impl Application for Glaurung {
|
||||
type Message = Message;
|
||||
type Theme = Theme;
|
||||
|
|
@ -1148,11 +1223,9 @@ impl Application for Glaurung {
|
|||
title: "Set report date",
|
||||
on_pick: Message::SetDate,
|
||||
}))
|
||||
.push(component(DatePicker {
|
||||
label: "Load",
|
||||
confirm: "Load",
|
||||
title: "Load archived report",
|
||||
.push(component(ReportPicker {
|
||||
on_pick: Message::Load,
|
||||
reports: self.archive.keys().copied().collect(),
|
||||
}));
|
||||
|
||||
if let Some(&last) = self.archive.keys().next_back() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue