diff --git a/src-tauri/src/app_state.rs b/src-tauri/src/app_state.rs index e69d23f..510a79f 100644 --- a/src-tauri/src/app_state.rs +++ b/src-tauri/src/app_state.rs @@ -35,6 +35,7 @@ pub struct OverlayConfig { pub icon: String, pub text_color: String, pub bg_color: String, + pub show_hh_mm: bool, } impl Default for OverlayConfig { @@ -43,6 +44,7 @@ impl Default for OverlayConfig { icon: String::new(), text_color: "white".to_string(), bg_color: "transparent".to_string(), + show_hh_mm: false, } } } diff --git a/src-tauri/src/countdown/commands.rs b/src-tauri/src/countdown/commands.rs index 1235d74..a15e45d 100644 --- a/src-tauri/src/countdown/commands.rs +++ b/src-tauri/src/countdown/commands.rs @@ -176,6 +176,7 @@ pub async fn set_overlay_config( icon: String, text_color: String, bg_color: String, + show_hh_mm: bool, ) -> Result<(), String> { state .overlay_configs @@ -187,6 +188,7 @@ pub async fn set_overlay_config( icon, text_color, bg_color, + show_hh_mm, }, ); let _ = state.event_bus.send(AppEvent::ConfigChanged(id)); diff --git a/src-tauri/src/server/routes.rs b/src-tauri/src/server/routes.rs index e4a2fc6..23474a2 100644 --- a/src-tauri/src/server/routes.rs +++ b/src-tauri/src/server/routes.rs @@ -22,12 +22,6 @@ pub async fn overlay_countdown( State(state): State>, Query(q): Query, ) -> Html { - let remaining = build_snapshot_dtos(&state) - .await - .ok() - .and_then(|snaps| snaps.into_iter().find(|s| s.id == q.id)) - .map(|s| format_remaining(s.duration as u64)) - .unwrap_or_else(|| "??:??:??.???".to_string()); let config = state .overlay_configs .lock() @@ -35,6 +29,12 @@ pub async fn overlay_countdown( .get(&q.id) .cloned() .unwrap_or_default(); + let remaining = build_snapshot_dtos(&state) + .await + .ok() + .and_then(|snaps| snaps.into_iter().find(|s| s.id == q.id)) + .map(|s| format_remaining(s.duration as u64, config.show_hh_mm)) + .unwrap_or_else(|| format_unknown(config.show_hh_mm)); let mut env = minijinja::Environment::new(); env.add_template( @@ -60,15 +60,22 @@ pub async fn sse_countdown( State(state): State>, Path(id): Path, ) -> Sse>> { + let show_hh_mm = state + .overlay_configs + .lock() + .await + .get(&id) + .map(|cfg| cfg.show_hh_mm) + .unwrap_or(false); let rx = state.event_bus.subscribe(); let stream = BroadcastStream::new(rx).filter_map(move |event| match event { Ok(AppEvent::Tick(p)) if p.id == id => Some(Ok(Event::default() .event("tick") - .data(format_remaining(p.remaining_ms)))), + .data(format_remaining(p.remaining_ms, show_hh_mm)))), Ok(AppEvent::Changed(snaps)) => snaps.iter().find(|s| s.id == id).map(|s| { Ok(Event::default() .event("tick") - .data(format_remaining(s.duration as u64))) + .data(format_remaining(s.duration as u64, show_hh_mm))) }), Ok(AppEvent::ConfigChanged(cid)) if cid == id => { Some(Ok(Event::default().event("reload").data(""))) @@ -82,12 +89,23 @@ pub async fn sse_countdown( ) } -fn format_remaining(ms: u64) -> String { +fn format_remaining(ms: u64, show_hh_mm: bool) -> String { + let total_seconds = ms / 1_000; + if !show_hh_mm { + return total_seconds.to_string(); + } let h = ms / 3_600_000; let m = (ms % 3_600_000) / 60_000; let s = (ms % 60_000) / 1_000; - let millis = ms % 1_000; - format!("{:02}:{:02}:{:02}.{:03}", h, m, s, millis) + format!("{:02}:{:02}:{:02}", h, m, s) +} + +fn format_unknown(show_hh_mm: bool) -> String { + if show_hh_mm { + "??:??:??".to_string() + } else { + "??".to_string() + } } pub async fn list_icons() -> Json> { diff --git a/src/features/countdown/api/countdown.client.ts b/src/features/countdown/api/countdown.client.ts index 2b1addd..85aab86 100644 --- a/src/features/countdown/api/countdown.client.ts +++ b/src/features/countdown/api/countdown.client.ts @@ -57,12 +57,14 @@ export async function setOverlayConfig( icon: string, textColor: string, bgColor: string, + showHhMm: boolean, ): Promise { const payload: OverlayConfigPayload = { id, icon, textColor, bgColor, + showHhMm, }; await invokeCommand("set_overlay_config", payload); } diff --git a/src/features/countdown/components/CountdownPage.svelte b/src/features/countdown/components/CountdownPage.svelte index 6052619..e4dab0b 100644 --- a/src/features/countdown/components/CountdownPage.svelte +++ b/src/features/countdown/components/CountdownPage.svelte @@ -11,6 +11,7 @@ textColor: string; bgColor: string; bgTransparent: boolean; + showHHMM: boolean; }; let label = ""; @@ -39,6 +40,7 @@ textColor: "#ffffff", bgColor: "#000000", bgTransparent: true, + showHHMM: false, }, }; } @@ -57,7 +59,13 @@ function pushConfig(id: number) { const s = getSettings(id); - void setOverlayConfig(id, s.icon, s.textColor, s.bgTransparent ? "transparent" : s.bgColor); + void setOverlayConfig( + id, + s.icon, + s.textColor, + s.bgTransparent ? "transparent" : s.bgColor, + s.showHHMM, + ).catch((error) => console.error(error)); } async function copyUrl(id: number) { @@ -93,7 +101,7 @@ - + @@ -103,9 +111,9 @@ {#if getSettings(item.id).icon} {getSettings(item.id).icon} {/if} {item.label} @@ -122,34 +130,43 @@
{#if item.state === "Idle"} - + {:else if item.state === "Running"} - + {:else if item.state === "Paused"} - + {/if} - - + +
-
+

Icon

{#each icons as name} {/each}
+
+
-
- - + +
diff --git a/src/features/countdown/model/countdown.types.ts b/src/features/countdown/model/countdown.types.ts index 508306f..3b10a23 100644 --- a/src/features/countdown/model/countdown.types.ts +++ b/src/features/countdown/model/countdown.types.ts @@ -58,4 +58,5 @@ export type OverlayConfigPayload = { icon: string; textColor: string; bgColor: string; + showHhMm: boolean; };