feat(event): Show percentage until event (#122)
using `get_percentage_done`
This commit is contained in:
parent
e2cd536079
commit
4594bc722e
@ -213,7 +213,7 @@ impl App {
|
|||||||
event: EventState::new(EventStateArgs {
|
event: EventState::new(EventStateArgs {
|
||||||
app_time,
|
app_time,
|
||||||
event_time: time::PrimitiveDateTime::parse(
|
event_time: time::PrimitiveDateTime::parse(
|
||||||
"2030-10-03 15:00:00",
|
"2025-10-09 19:54:29",
|
||||||
format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"),
|
format_description!("[year]-[month]-[day] [hour]:[minute]:[second]"),
|
||||||
)
|
)
|
||||||
.unwrap(),
|
.unwrap(),
|
||||||
@ -427,7 +427,7 @@ impl App {
|
|||||||
Content::Countdown => Some(self.countdown.get_clock().get_percentage_done()),
|
Content::Countdown => Some(self.countdown.get_clock().get_percentage_done()),
|
||||||
Content::Timer => None,
|
Content::Timer => None,
|
||||||
Content::Pomodoro => Some(self.pomodoro.get_clock().get_percentage_done()),
|
Content::Pomodoro => Some(self.pomodoro.get_clock().get_percentage_done()),
|
||||||
Content::Event => None,
|
Content::Event => Some(self.event.get_percentage_done()),
|
||||||
Content::LocalTime => None,
|
Content::LocalTime => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,6 +20,7 @@ pub struct EventState {
|
|||||||
title: String,
|
title: String,
|
||||||
event_time: OffsetDateTime,
|
event_time: OffsetDateTime,
|
||||||
app_time: OffsetDateTime,
|
app_time: OffsetDateTime,
|
||||||
|
start_time: OffsetDateTime,
|
||||||
with_decis: bool,
|
with_decis: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,6 +52,7 @@ impl EventState {
|
|||||||
title: event_title,
|
title: event_title,
|
||||||
event_time: event_offset,
|
event_time: event_offset,
|
||||||
app_time: app_datetime,
|
app_time: app_datetime,
|
||||||
|
start_time: app_datetime,
|
||||||
with_decis,
|
with_decis,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -63,6 +65,10 @@ impl EventState {
|
|||||||
pub fn set_with_decis(&mut self, with_decis: bool) {
|
pub fn set_with_decis(&mut self, with_decis: bool) {
|
||||||
self.with_decis = with_decis;
|
self.with_decis = with_decis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn get_percentage_done(&self) -> u16 {
|
||||||
|
get_percentage(self.start_time, self.event_time, self.app_time)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TuiEventHandler for EventState {
|
impl TuiEventHandler for EventState {
|
||||||
@ -71,6 +77,23 @@ impl TuiEventHandler for EventState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_percentage(start: OffsetDateTime, end: OffsetDateTime, current: OffsetDateTime) -> u16 {
|
||||||
|
let total_millis = (end - start).whole_milliseconds();
|
||||||
|
|
||||||
|
if total_millis <= 0 {
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
let elapsed_millis = (current - start).whole_milliseconds();
|
||||||
|
|
||||||
|
if elapsed_millis <= 0 {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
let percentage = (elapsed_millis * 100 / total_millis).min(100);
|
||||||
|
percentage as u16
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct EventWidget {
|
pub struct EventWidget {
|
||||||
pub style: Style,
|
pub style: Style,
|
||||||
@ -148,3 +171,45 @@ impl StatefulWidget for EventWidget {
|
|||||||
label_event.centered().render(v3, buf);
|
label_event.centered().render(v3, buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
use time::macros::datetime;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_percentage() {
|
||||||
|
let start = datetime!(2024-01-01 10:00:00 UTC);
|
||||||
|
let end = datetime!(2024-01-01 20:00:00 UTC);
|
||||||
|
|
||||||
|
// current == start: 0%
|
||||||
|
assert_eq!(get_percentage(start, end, start), 0);
|
||||||
|
|
||||||
|
// current == end: 100%
|
||||||
|
assert_eq!(get_percentage(start, end, end), 100);
|
||||||
|
|
||||||
|
// current halfway: 50%
|
||||||
|
let halfway = datetime!(2024-01-01 15:00:00 UTC);
|
||||||
|
assert_eq!(get_percentage(start, end, halfway), 50);
|
||||||
|
|
||||||
|
// current 25%
|
||||||
|
let quarter = datetime!(2024-01-01 12:30:00 UTC);
|
||||||
|
assert_eq!(get_percentage(start, end, quarter), 25);
|
||||||
|
|
||||||
|
// current 75%
|
||||||
|
let three_quarters = datetime!(2024-01-01 17:30:00 UTC);
|
||||||
|
assert_eq!(get_percentage(start, end, three_quarters), 75);
|
||||||
|
|
||||||
|
// current > end: clamped to 100%
|
||||||
|
let after = datetime!(2024-01-01 22:00:00 UTC);
|
||||||
|
assert_eq!(get_percentage(start, end, after), 100);
|
||||||
|
|
||||||
|
// current < start: 0%
|
||||||
|
let before = datetime!(2024-01-01 08:00:00 UTC);
|
||||||
|
assert_eq!(get_percentage(start, end, before), 0);
|
||||||
|
|
||||||
|
// end <= start: 100%
|
||||||
|
assert_eq!(get_percentage(end, start, halfway), 100);
|
||||||
|
assert_eq!(get_percentage(start, start, start), 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user