mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-27 18:22:41 -08:00
refactor: extract secondary subtitle mode runtime service
This commit is contained in:
32
src/core/services/secondary-subtitle-service.ts
Normal file
32
src/core/services/secondary-subtitle-service.ts
Normal 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}`);
|
||||||
|
}
|
||||||
26
src/main.ts
26
src/main.ts
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user