diff --git a/crates/shepherd-hud/src/app.rs b/crates/shepherd-hud/src/app.rs index 8793f4c..3c21ae0 100644 --- a/crates/shepherd-hud/src/app.rs +++ b/crates/shepherd-hud/src/app.rs @@ -296,25 +296,35 @@ fn build_hud_content(state: SharedState) -> gtk4::Box { } SessionState::Active { entry_name, - time_remaining_secs, + started_at, + time_limit_secs, paused, .. } => { app_label_clone.set_text(entry_name); - time_display_clone.set_remaining(*time_remaining_secs); + // Calculate remaining time based on elapsed time since session start + let remaining = time_limit_secs.map(|limit| { + let elapsed = started_at.elapsed().as_secs(); + limit.saturating_sub(elapsed) + }); + time_display_clone.set_remaining(remaining); time_display_clone.set_paused(*paused); warning_box_clone.set_visible(false); } SessionState::Warning { entry_name, - time_remaining_secs, + warning_issued_at, + time_remaining_at_warning, .. } => { app_label_clone.set_text(entry_name); - time_display_clone.set_remaining(Some(*time_remaining_secs)); + // Calculate remaining time based on elapsed time since warning was issued + let elapsed = warning_issued_at.elapsed().as_secs(); + let remaining = time_remaining_at_warning.saturating_sub(elapsed); + time_display_clone.set_remaining(Some(remaining)); warning_label_clone.set_text(&format!( "Only {} seconds remaining!", - time_remaining_secs + remaining )); warning_box_clone.set_visible(true); } diff --git a/crates/shepherd-hud/src/state.rs b/crates/shepherd-hud/src/state.rs index 9f72494..5b47951 100644 --- a/crates/shepherd-hud/src/state.rs +++ b/crates/shepherd-hud/src/state.rs @@ -30,7 +30,8 @@ pub enum SessionState { session_id: SessionId, entry_id: EntryId, entry_name: String, - time_remaining_secs: u64, + warning_issued_at: std::time::Instant, + time_remaining_at_warning: u64, }, /// Session is ending @@ -187,7 +188,8 @@ impl SharedState { session_id: session_id.clone(), entry_id: entry_id.clone(), entry_name: entry_name.clone(), - time_remaining_secs: time_remaining.as_secs(), + warning_issued_at: std::time::Instant::now(), + time_remaining_at_warning: time_remaining.as_secs(), }; } }