mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-27 18:22:41 -08:00
refactor: extract overlay visibility facade runtime
This commit is contained in:
@@ -16,7 +16,7 @@
|
|||||||
"docs:build": "vitepress build docs",
|
"docs:build": "vitepress build docs",
|
||||||
"docs:preview": "vitepress preview docs --host 0.0.0.0 --port 4173 --strictPort",
|
"docs:preview": "vitepress preview docs --host 0.0.0.0 --port 4173 --strictPort",
|
||||||
"test:config": "pnpm run build && node --test dist/config/config.test.js",
|
"test:config": "pnpm run build && node --test dist/config/config.test.js",
|
||||||
"test:core": "pnpm run build && node --test dist/cli/args.test.js dist/cli/help.test.js dist/core/services/cli-command-service.test.js dist/core/services/numeric-shortcut-session-service.test.js dist/core/services/secondary-subtitle-service.test.js dist/core/services/mpv-render-metrics-service.test.js dist/core/services/mpv-runtime-service.test.js dist/core/services/runtime-options-runtime-service.test.js dist/core/services/overlay-modal-restore-service.test.js dist/core/services/runtime-config-service.test.js dist/core/services/overlay-bridge-runtime-service.test.js",
|
"test:core": "pnpm run build && node --test dist/cli/args.test.js dist/cli/help.test.js dist/core/services/cli-command-service.test.js dist/core/services/numeric-shortcut-session-service.test.js dist/core/services/secondary-subtitle-service.test.js dist/core/services/mpv-render-metrics-service.test.js dist/core/services/mpv-runtime-service.test.js dist/core/services/runtime-options-runtime-service.test.js dist/core/services/overlay-modal-restore-service.test.js dist/core/services/runtime-config-service.test.js dist/core/services/overlay-bridge-runtime-service.test.js dist/core/services/overlay-visibility-facade-service.test.js",
|
||||||
"test:subtitle": "pnpm run build && node --test dist/subtitle/stages.test.js dist/subtitle/pipeline.test.js",
|
"test:subtitle": "pnpm run build && node --test dist/subtitle/stages.test.js dist/subtitle/pipeline.test.js",
|
||||||
"generate:config-example": "pnpm run build && node dist/generate-config-example.js",
|
"generate:config-example": "pnpm run build && node dist/generate-config-example.js",
|
||||||
"start": "pnpm run build && electron . --start",
|
"start": "pnpm run build && electron . --start",
|
||||||
|
|||||||
63
src/core/services/overlay-visibility-facade-service.test.ts
Normal file
63
src/core/services/overlay-visibility-facade-service.test.ts
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
import test from "node:test";
|
||||||
|
import assert from "node:assert/strict";
|
||||||
|
import {
|
||||||
|
OverlayVisibilityFacadeDeps,
|
||||||
|
setVisibleOverlayVisibleRuntimeFacadeService,
|
||||||
|
toggleInvisibleOverlayRuntimeFacadeService,
|
||||||
|
toggleVisibleOverlayRuntimeFacadeService,
|
||||||
|
} from "./overlay-visibility-facade-service";
|
||||||
|
|
||||||
|
function makeDeps(initialVisible = false, initialInvisible = false): {
|
||||||
|
deps: OverlayVisibilityFacadeDeps;
|
||||||
|
getState: () => { visible: boolean; invisible: boolean; mpvSubVisible: boolean | null };
|
||||||
|
} {
|
||||||
|
let visible = initialVisible;
|
||||||
|
let invisible = initialInvisible;
|
||||||
|
let mpvSubVisible: boolean | null = null;
|
||||||
|
|
||||||
|
const deps: OverlayVisibilityFacadeDeps = {
|
||||||
|
getVisibleOverlayVisible: () => visible,
|
||||||
|
getInvisibleOverlayVisible: () => invisible,
|
||||||
|
setVisibleOverlayVisibleState: (value) => {
|
||||||
|
visible = value;
|
||||||
|
},
|
||||||
|
setInvisibleOverlayVisibleState: (value) => {
|
||||||
|
invisible = value;
|
||||||
|
},
|
||||||
|
updateVisibleOverlayVisibility: () => {},
|
||||||
|
updateInvisibleOverlayVisibility: () => {},
|
||||||
|
syncInvisibleOverlayMousePassthrough: () => {},
|
||||||
|
shouldBindVisibleOverlayToMpvSubVisibility: () => true,
|
||||||
|
isMpvConnected: () => true,
|
||||||
|
setMpvSubVisibility: (value) => {
|
||||||
|
mpvSubVisible = value;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
deps,
|
||||||
|
getState: () => ({ visible, invisible, mpvSubVisible }),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
test("setVisibleOverlayVisibleRuntimeFacadeService updates visible state and mpv subtitle visibility", () => {
|
||||||
|
const { deps, getState } = makeDeps(false, true);
|
||||||
|
setVisibleOverlayVisibleRuntimeFacadeService(true, deps);
|
||||||
|
assert.deepEqual(getState(), {
|
||||||
|
visible: true,
|
||||||
|
invisible: true,
|
||||||
|
mpvSubVisible: false,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test("toggleVisibleOverlayRuntimeFacadeService flips visible overlay state", () => {
|
||||||
|
const { deps, getState } = makeDeps(false, false);
|
||||||
|
toggleVisibleOverlayRuntimeFacadeService(deps);
|
||||||
|
assert.equal(getState().visible, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
test("toggleInvisibleOverlayRuntimeFacadeService flips invisible overlay state", () => {
|
||||||
|
const { deps, getState } = makeDeps(false, false);
|
||||||
|
toggleInvisibleOverlayRuntimeFacadeService(deps);
|
||||||
|
assert.equal(getState().invisible, true);
|
||||||
|
});
|
||||||
64
src/core/services/overlay-visibility-facade-service.ts
Normal file
64
src/core/services/overlay-visibility-facade-service.ts
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
import {
|
||||||
|
setInvisibleOverlayVisibleService,
|
||||||
|
setVisibleOverlayVisibleService,
|
||||||
|
} from "./overlay-visibility-runtime-service";
|
||||||
|
|
||||||
|
export interface OverlayVisibilityFacadeDeps {
|
||||||
|
getVisibleOverlayVisible: () => boolean;
|
||||||
|
getInvisibleOverlayVisible: () => boolean;
|
||||||
|
setVisibleOverlayVisibleState: (visible: boolean) => void;
|
||||||
|
setInvisibleOverlayVisibleState: (visible: boolean) => void;
|
||||||
|
updateVisibleOverlayVisibility: () => void;
|
||||||
|
updateInvisibleOverlayVisibility: () => void;
|
||||||
|
syncInvisibleOverlayMousePassthrough: () => void;
|
||||||
|
shouldBindVisibleOverlayToMpvSubVisibility: () => boolean;
|
||||||
|
isMpvConnected: () => boolean;
|
||||||
|
setMpvSubVisibility: (visible: boolean) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setVisibleOverlayVisibleRuntimeFacadeService(
|
||||||
|
visible: boolean,
|
||||||
|
deps: OverlayVisibilityFacadeDeps,
|
||||||
|
): void {
|
||||||
|
setVisibleOverlayVisibleService({
|
||||||
|
visible,
|
||||||
|
setVisibleOverlayVisibleState: deps.setVisibleOverlayVisibleState,
|
||||||
|
updateVisibleOverlayVisibility: deps.updateVisibleOverlayVisibility,
|
||||||
|
updateInvisibleOverlayVisibility: deps.updateInvisibleOverlayVisibility,
|
||||||
|
syncInvisibleOverlayMousePassthrough: deps.syncInvisibleOverlayMousePassthrough,
|
||||||
|
shouldBindVisibleOverlayToMpvSubVisibility:
|
||||||
|
deps.shouldBindVisibleOverlayToMpvSubVisibility,
|
||||||
|
isMpvConnected: deps.isMpvConnected,
|
||||||
|
setMpvSubVisibility: deps.setMpvSubVisibility,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setInvisibleOverlayVisibleRuntimeFacadeService(
|
||||||
|
visible: boolean,
|
||||||
|
deps: OverlayVisibilityFacadeDeps,
|
||||||
|
): void {
|
||||||
|
setInvisibleOverlayVisibleService({
|
||||||
|
visible,
|
||||||
|
setInvisibleOverlayVisibleState: deps.setInvisibleOverlayVisibleState,
|
||||||
|
updateInvisibleOverlayVisibility: deps.updateInvisibleOverlayVisibility,
|
||||||
|
syncInvisibleOverlayMousePassthrough: deps.syncInvisibleOverlayMousePassthrough,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toggleVisibleOverlayRuntimeFacadeService(
|
||||||
|
deps: OverlayVisibilityFacadeDeps,
|
||||||
|
): void {
|
||||||
|
setVisibleOverlayVisibleRuntimeFacadeService(
|
||||||
|
!deps.getVisibleOverlayVisible(),
|
||||||
|
deps,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function toggleInvisibleOverlayRuntimeFacadeService(
|
||||||
|
deps: OverlayVisibilityFacadeDeps,
|
||||||
|
): void {
|
||||||
|
setInvisibleOverlayVisibleRuntimeFacadeService(
|
||||||
|
!deps.getInvisibleOverlayVisible(),
|
||||||
|
deps,
|
||||||
|
);
|
||||||
|
}
|
||||||
48
src/main.ts
48
src/main.ts
@@ -172,10 +172,14 @@ import {
|
|||||||
} from "./core/services/overlay-window-service";
|
} from "./core/services/overlay-window-service";
|
||||||
import { initializeOverlayRuntimeService } from "./core/services/overlay-runtime-init-service";
|
import { initializeOverlayRuntimeService } from "./core/services/overlay-runtime-init-service";
|
||||||
import {
|
import {
|
||||||
setInvisibleOverlayVisibleService,
|
|
||||||
setVisibleOverlayVisibleService,
|
|
||||||
syncInvisibleOverlayMousePassthroughService,
|
syncInvisibleOverlayMousePassthroughService,
|
||||||
} from "./core/services/overlay-visibility-runtime-service";
|
} from "./core/services/overlay-visibility-runtime-service";
|
||||||
|
import {
|
||||||
|
setInvisibleOverlayVisibleRuntimeFacadeService,
|
||||||
|
setVisibleOverlayVisibleRuntimeFacadeService,
|
||||||
|
toggleInvisibleOverlayRuntimeFacadeService,
|
||||||
|
toggleVisibleOverlayRuntimeFacadeService,
|
||||||
|
} from "./core/services/overlay-visibility-facade-service";
|
||||||
import {
|
import {
|
||||||
MpvIpcClient,
|
MpvIpcClient,
|
||||||
MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY,
|
MPV_REQUEST_ID_SECONDARY_SUB_VISIBILITY,
|
||||||
@@ -1102,11 +1106,23 @@ function syncInvisibleOverlayMousePassthrough(): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function setVisibleOverlayVisible(visible: boolean): void {
|
function setVisibleOverlayVisible(visible: boolean): void {
|
||||||
setVisibleOverlayVisibleService({
|
setVisibleOverlayVisibleRuntimeFacadeService(visible, getOverlayVisibilityFacadeDeps());
|
||||||
visible,
|
}
|
||||||
setVisibleOverlayVisibleState: (nextVisible) => {
|
|
||||||
|
function setInvisibleOverlayVisible(visible: boolean): void {
|
||||||
|
setInvisibleOverlayVisibleRuntimeFacadeService(visible, getOverlayVisibilityFacadeDeps());
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOverlayVisibilityFacadeDeps() {
|
||||||
|
return {
|
||||||
|
getVisibleOverlayVisible: () => visibleOverlayVisible,
|
||||||
|
getInvisibleOverlayVisible: () => invisibleOverlayVisible,
|
||||||
|
setVisibleOverlayVisibleState: (nextVisible: boolean) => {
|
||||||
visibleOverlayVisible = nextVisible;
|
visibleOverlayVisible = nextVisible;
|
||||||
},
|
},
|
||||||
|
setInvisibleOverlayVisibleState: (nextVisible: boolean) => {
|
||||||
|
invisibleOverlayVisible = nextVisible;
|
||||||
|
},
|
||||||
updateVisibleOverlayVisibility: () => updateVisibleOverlayVisibility(),
|
updateVisibleOverlayVisibility: () => updateVisibleOverlayVisibility(),
|
||||||
updateInvisibleOverlayVisibility: () => updateInvisibleOverlayVisibility(),
|
updateInvisibleOverlayVisibility: () => updateInvisibleOverlayVisibility(),
|
||||||
syncInvisibleOverlayMousePassthrough: () =>
|
syncInvisibleOverlayMousePassthrough: () =>
|
||||||
@@ -1114,26 +1130,18 @@ function setVisibleOverlayVisible(visible: boolean): void {
|
|||||||
shouldBindVisibleOverlayToMpvSubVisibility: () =>
|
shouldBindVisibleOverlayToMpvSubVisibility: () =>
|
||||||
shouldBindVisibleOverlayToMpvSubVisibility(),
|
shouldBindVisibleOverlayToMpvSubVisibility(),
|
||||||
isMpvConnected: () => Boolean(mpvClient && mpvClient.connected),
|
isMpvConnected: () => Boolean(mpvClient && mpvClient.connected),
|
||||||
setMpvSubVisibility: (mpvSubVisible) => {
|
setMpvSubVisibility: (mpvSubVisible: boolean) => {
|
||||||
setMpvSubVisibilityRuntimeService(mpvClient, mpvSubVisible);
|
setMpvSubVisibilityRuntimeService(mpvClient, mpvSubVisible);
|
||||||
},
|
},
|
||||||
});
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function setInvisibleOverlayVisible(visible: boolean): void {
|
function toggleVisibleOverlay(): void {
|
||||||
setInvisibleOverlayVisibleService({
|
toggleVisibleOverlayRuntimeFacadeService(getOverlayVisibilityFacadeDeps());
|
||||||
visible,
|
}
|
||||||
setInvisibleOverlayVisibleState: (nextVisible) => {
|
function toggleInvisibleOverlay(): void {
|
||||||
invisibleOverlayVisible = nextVisible;
|
toggleInvisibleOverlayRuntimeFacadeService(getOverlayVisibilityFacadeDeps());
|
||||||
},
|
|
||||||
updateInvisibleOverlayVisibility: () => updateInvisibleOverlayVisibility(),
|
|
||||||
syncInvisibleOverlayMousePassthrough: () =>
|
|
||||||
syncInvisibleOverlayMousePassthrough(),
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function toggleVisibleOverlay(): void { setVisibleOverlayVisible(!visibleOverlayVisible); }
|
|
||||||
function toggleInvisibleOverlay(): void { setInvisibleOverlayVisible(!invisibleOverlayVisible); }
|
|
||||||
function setOverlayVisible(visible: boolean): void { setVisibleOverlayVisible(visible); }
|
function setOverlayVisible(visible: boolean): void { setVisibleOverlayVisible(visible); }
|
||||||
function toggleOverlay(): void { toggleVisibleOverlay(); }
|
function toggleOverlay(): void { toggleVisibleOverlay(); }
|
||||||
function handleOverlayModalClosed(modal: OverlayHostedModal): void {
|
function handleOverlayModalClosed(modal: OverlayHostedModal): void {
|
||||||
|
|||||||
Reference in New Issue
Block a user