refactor: extract secondary subtitle mode runtime service

This commit is contained in:
2026-02-09 22:39:51 -08:00
parent 8ba1b7953d
commit 469091a2a8
2 changed files with 47 additions and 11 deletions

View File

@@ -0,0 +1,32 @@
import { SecondarySubMode } from "../../types";
export interface CycleSecondarySubModeDeps {
getSecondarySubMode: () => SecondarySubMode;
setSecondarySubMode: (mode: SecondarySubMode) => void;
getLastSecondarySubToggleAtMs: () => number;
setLastSecondarySubToggleAtMs: (timestampMs: number) => void;
broadcastSecondarySubMode: (mode: SecondarySubMode) => void;
showMpvOsd: (text: string) => void;
now?: () => number;
}
const SECONDARY_SUB_CYCLE: SecondarySubMode[] = ["hidden", "visible", "hover"];
const SECONDARY_SUB_TOGGLE_DEBOUNCE_MS = 120;
export function cycleSecondarySubModeService(
deps: CycleSecondarySubModeDeps,
): void {
const now = deps.now ? deps.now() : Date.now();
if (now - deps.getLastSecondarySubToggleAtMs() < SECONDARY_SUB_TOGGLE_DEBOUNCE_MS) {
return;
}
deps.setLastSecondarySubToggleAtMs(now);
const currentMode = deps.getSecondarySubMode();
const currentIndex = SECONDARY_SUB_CYCLE.indexOf(currentMode);
const nextMode =
SECONDARY_SUB_CYCLE[(currentIndex + 1) % SECONDARY_SUB_CYCLE.length];
deps.setSecondarySubMode(nextMode);
deps.broadcastSecondarySubMode(nextMode);
deps.showMpvOsd(`Secondary subtitle: ${nextMode}`);
}

View File

@@ -117,6 +117,7 @@ import { runOverlayShortcutLocalFallback } from "./core/services/overlay-shortcu
import { createOverlayShortcutRuntimeHandlers } from "./core/services/overlay-shortcut-runtime-service"; import { createOverlayShortcutRuntimeHandlers } from "./core/services/overlay-shortcut-runtime-service";
import { createNumericShortcutSessionService } from "./core/services/numeric-shortcut-session-service"; import { createNumericShortcutSessionService } from "./core/services/numeric-shortcut-session-service";
import { handleCliCommandService } from "./core/services/cli-command-service"; import { handleCliCommandService } from "./core/services/cli-command-service";
import { cycleSecondarySubModeService } from "./core/services/secondary-subtitle-service";
import { showDesktopNotification } from "./core/utils/notification"; import { showDesktopNotification } from "./core/utils/notification";
import { openYomitanSettingsWindow } from "./core/services/yomitan-settings-service"; import { openYomitanSettingsWindow } from "./core/services/yomitan-settings-service";
import { tokenizeSubtitleService } from "./core/services/tokenizer-service"; import { tokenizeSubtitleService } from "./core/services/tokenizer-service";
@@ -845,17 +846,20 @@ function tryHandleOverlayShortcutLocalFallback(input: Electron.Input): boolean {
} }
function cycleSecondarySubMode(): void { function cycleSecondarySubMode(): void {
const now = Date.now(); cycleSecondarySubModeService({
if (now - lastSecondarySubToggleAtMs < 120) { getSecondarySubMode: () => secondarySubMode,
return; setSecondarySubMode: (mode) => {
} secondarySubMode = mode;
lastSecondarySubToggleAtMs = now; },
getLastSecondarySubToggleAtMs: () => lastSecondarySubToggleAtMs,
const cycle: SecondarySubMode[] = ["hidden", "visible", "hover"]; setLastSecondarySubToggleAtMs: (timestampMs) => {
const idx = cycle.indexOf(secondarySubMode); lastSecondarySubToggleAtMs = timestampMs;
secondarySubMode = cycle[(idx + 1) % cycle.length]; },
broadcastToOverlayWindows("secondary-subtitle:mode", secondarySubMode); broadcastSecondarySubMode: (mode) => {
showMpvOsd(`Secondary subtitle: ${secondarySubMode}`); broadcastToOverlayWindows("secondary-subtitle:mode", mode);
},
showMpvOsd: (text) => showMpvOsd(text),
});
} }
function showMpvOsd(text: string): void { function showMpvOsd(text: string): void {