Show all session results to resolve #3

This commit is contained in:
2024-07-06 11:41:42 -04:00
parent f13dc7f10e
commit 288ef6a9c4

View File

@@ -28,6 +28,43 @@ enum State {
ShouldQuit, ShouldQuit,
} }
struct SessionResult {
intention: String,
duration: Duration,
session_ratings: Vec<SessionRating>,
rating: u8,
rating_f64: f64,
}
impl SessionResult {
fn rate(&mut self) {
let mut rating = 0_f64;
let total_duration = self
.session_ratings
.iter()
.map(|r| r.duration)
.fold(Duration::ZERO, |acc, dur| acc.saturating_add(dur));
for session_rating in &self.session_ratings {
let ratio: f64 = session_rating.duration.as_secs_f64() / total_duration.as_secs_f64();
rating += (session_rating.rating as f64) * ratio;
}
self.rating_f64 = rating;
if rating > 2.5 {
self.rating = 3;
} else if rating > 2.0 {
self.rating = 2;
} else if rating > 1.0 {
self.rating = 1;
} else {
self.rating = 0;
}
}
}
#[derive(Clone)]
struct SessionRating { struct SessionRating {
window_title: Rc<String>, window_title: Rc<String>,
duration: Duration, duration: Duration,
@@ -46,6 +83,7 @@ struct App {
session_remaining: Duration, session_remaining: Duration,
session_ratings: Vec<SessionRating>, session_ratings: Vec<SessionRating>,
session_ratings_index: usize, session_ratings_index: usize,
session_results: Vec<SessionResult>,
last_tick_50ms: Instant, last_tick_50ms: Instant,
last_tick_1s: Instant, last_tick_1s: Instant,
} }
@@ -66,6 +104,7 @@ impl App {
session_remaining: Duration::new(0, 0), session_remaining: Duration::new(0, 0),
session_ratings: Vec::new(), session_ratings: Vec::new(),
session_ratings_index: 0, session_ratings_index: 0,
session_results: Vec::new(),
last_tick_50ms: Instant::now(), last_tick_50ms: Instant::now(),
last_tick_1s: Instant::now(), last_tick_1s: Instant::now(),
} }
@@ -133,6 +172,22 @@ impl App {
Duration::from_millis(50).saturating_sub(self.last_tick_50ms.elapsed()) Duration::from_millis(50).saturating_sub(self.last_tick_50ms.elapsed())
} }
fn get_session_results(&self) -> Vec<Line> {
self.session_results
.iter()
.map(|r| {
Line::from(Span::styled(
format!("{} {}", duration_as_str(&r.duration), r.intention,),
match r.rating {
2 => Style::new().fg(Color::LightYellow),
3 => Style::new().fg(Color::LightGreen),
_ => Style::new().fg(Color::LightRed),
},
))
})
.collect()
}
fn get_session_stats(&self) -> Vec<Line> { fn get_session_stats(&self) -> Vec<Line> {
let mut zero_encountered = if self.state != State::End { let mut zero_encountered = if self.state != State::End {
true true
@@ -270,6 +325,15 @@ fn handle_events(app: &mut App) -> Result<()> {
if app.session_ratings_index >= app.session_ratings.len() { if app.session_ratings_index >= app.session_ratings.len() {
app.state = State::InputIntention; app.state = State::InputIntention;
let mut session_result = SessionResult {
intention: app.user_intention.clone(),
duration: app.session_start.elapsed(),
session_ratings: std::mem::take(&mut app.session_ratings),
rating: 0,
rating_f64: 0.0,
};
session_result.rate();
app.session_results.push(session_result);
} }
} }
@@ -336,11 +400,19 @@ fn ui(frame: &mut Frame, app: &App) {
layout_duration, layout_duration,
); );
let stats = app.get_session_stats(); if app.state == State::InputIntention || app.state == State::InputDuration {
frame.render_widget( let results = app.get_session_results();
Paragraph::new(stats).block(Block::bordered().title("Session")), frame.render_widget(
layout_titles, Paragraph::new(results).block(Block::bordered().title("Previous Sessions")),
); layout_titles,
);
} else {
let stats = app.get_session_stats();
frame.render_widget(
Paragraph::new(stats).block(Block::bordered().title("Session Stats")),
layout_titles,
);
}
let mut spans: Vec<Span> = Vec::new(); let mut spans: Vec<Span> = Vec::new();
if app.user_intention.len() == 0 { if app.user_intention.len() == 0 {