diff --git a/apps/stage-tamagotchi/src/main/tray/index.ts b/apps/stage-tamagotchi/src/main/tray/index.ts index bb8418fe0..7cedf022a 100644 --- a/apps/stage-tamagotchi/src/main/tray/index.ts +++ b/apps/stage-tamagotchi/src/main/tray/index.ts @@ -177,7 +177,14 @@ export function setupTray(params: { { type: 'separator' }, { label: params.i18n.t('tamagotchi.electron.tray.menu.labels.label.open_inlay'), click: () => setupInlayWindow({ i18n: params.i18n, serverChannel: params.serverChannel }) }, { label: params.i18n.t('tamagotchi.electron.tray.menu.labels.label.open_widgets'), click: () => params.widgetsWindow.getWindow().then(window => toggleWindowShow(window)) }, - { label: params.i18n.t('tamagotchi.electron.tray.menu.labels.label.open_caption'), click: () => params.captionWindow.getWindow().then(window => toggleWindowShow(window)) }, + { + label: params.i18n.t(params.captionWindow.isVisible() + ? 'tamagotchi.electron.tray.menu.labels.label.close_caption' + : 'tamagotchi.electron.tray.menu.labels.label.open_caption'), + click: () => { + void params.captionWindow.toggleVisibility().then(() => rebuildContextMenu()) + }, + }, { type: 'submenu', label: params.i18n.t('tamagotchi.electron.tray.menu.labels.label.caption_overlay'), @@ -202,6 +209,7 @@ export function setupTray(params: { params.mainWindow.on('resize', rebuildContextMenu) params.mainWindow.on('move', rebuildContextMenu) + params.captionWindow.onVisibilityChanged(rebuildContextMenu) rebuildContextMenu() diff --git a/apps/stage-tamagotchi/src/main/windows/caption/index.ts b/apps/stage-tamagotchi/src/main/windows/caption/index.ts index b73ebf2ee..a471f5658 100644 --- a/apps/stage-tamagotchi/src/main/windows/caption/index.ts +++ b/apps/stage-tamagotchi/src/main/windows/caption/index.ts @@ -264,6 +264,18 @@ export function setupCaptionWindowManager(params: { } let eventaContext: ReturnType['context'] | undefined + let currentWindow: BrowserWindow | undefined + const visibilityListeners = new Set<() => void>() + + const emitVisibilityChanged = () => { + for (const listener of visibilityListeners) { + try { + listener() + } + catch { + } + } + } const reusable = createReusableWindow(async () => { // TODO: once we refactored eventa to support window-namespaced contexts, @@ -272,6 +284,7 @@ export function setupCaptionWindowManager(params: { ipcMain.setMaxListeners(0) const window = createCaptionWindow() + currentWindow = window const { context } = createContext(ipcMain, window) eventaContext = context @@ -304,6 +317,8 @@ export function setupCaptionWindowManager(params: { window.on('resize', persistBounds) window.on('move', persistBounds) + window.on('show', emitVisibilityChanged) + window.on('hide', emitVisibilityChanged) await load(window, withHashRoute(baseUrl(resolve(getElectronMainDirname(), '..', 'renderer')), '/caption')) @@ -327,7 +342,11 @@ export function setupCaptionWindowManager(params: { catch { } + if (currentWindow === window) { + currentWindow = undefined + } eventaContext = undefined + emitVisibilityChanged() }) return window @@ -396,11 +415,39 @@ export function setupCaptionWindowManager(params: { updateConfig(config) } + function isVisible(): boolean { + return Boolean(currentWindow && !currentWindow.isDestroyed() && currentWindow.isVisible()) + } + + async function toggleVisibility() { + if (isVisible()) { + currentWindow?.hide() + return + } + + const window = await reusable.getWindow() + if (window.isMinimized()) { + window.restore() + } + window.show() + window.focus() + } + + function onVisibilityChanged(listener: () => void): () => void { + visibilityListeners.add(listener) + return () => { + visibilityListeners.delete(listener) + } + } + return { getWindow, setFollowWindow, toggleFollowWindow, getIsFollowingWindow, resetToSide, + isVisible, + toggleVisibility, + onVisibilityChanged, } } diff --git a/packages/i18n/src/locales/en/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/en/tamagotchi/electron/tray.yaml index 447efb8db..745196080 100644 --- a/packages/i18n/src/locales/en/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/en/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Open Inlay... open_widgets: Open Widgets... open_caption: Open Caption... + close_caption: Close Caption... caption_overlay: Caption Overlay follow_window: Follow window reset_position: Reset position diff --git a/packages/i18n/src/locales/es/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/es/tamagotchi/electron/tray.yaml index 7cf64ac18..60b982d8a 100644 --- a/packages/i18n/src/locales/es/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/es/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Open Inlay... open_widgets: Open Widgets... open_caption: Open Caption... + close_caption: Cerrar subtítulos... caption_overlay: Caption Overlay follow_window: Follow window reset_position: Reset position diff --git a/packages/i18n/src/locales/fr/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/fr/tamagotchi/electron/tray.yaml index 5bc66b620..f5b8abc52 100644 --- a/packages/i18n/src/locales/fr/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/fr/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Ouvrir l'incrustation... open_widgets: Ouvrir les widgets... open_caption: Ouvrir le sous-titrage... + close_caption: Fermer le sous-titrage... caption_overlay: Superposition des sous-titres follow_window: Suivre la fenêtre reset_position: Réinitialiser la position diff --git a/packages/i18n/src/locales/ja/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/ja/tamagotchi/electron/tray.yaml index 447efb8db..a9a821bc6 100644 --- a/packages/i18n/src/locales/ja/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/ja/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Open Inlay... open_widgets: Open Widgets... open_caption: Open Caption... + close_caption: 字幕を閉じる... caption_overlay: Caption Overlay follow_window: Follow window reset_position: Reset position diff --git a/packages/i18n/src/locales/ko/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/ko/tamagotchi/electron/tray.yaml index 2a65d98f4..03add39bc 100644 --- a/packages/i18n/src/locales/ko/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/ko/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: 인레이 열기... open_widgets: 위젯 열기... open_caption: 자막 열기... + close_caption: 자막 닫기... caption_overlay: 자막 오버레이 follow_window: 창 따라가기 reset_position: 위치 초기화 diff --git a/packages/i18n/src/locales/ru/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/ru/tamagotchi/electron/tray.yaml index 9a57fb678..ece5c95f2 100644 --- a/packages/i18n/src/locales/ru/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/ru/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Open Inlay... open_widgets: Open Widgets... open_caption: Open Caption... + close_caption: Закрыть субтитры... caption_overlay: Caption Overlay follow_window: Follow window reset_position: Reset position diff --git a/packages/i18n/src/locales/vi/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/vi/tamagotchi/electron/tray.yaml index e26fe8b54..9b969cbba 100644 --- a/packages/i18n/src/locales/vi/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/vi/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: Mở khảm... open_widgets: Mở tiện ích... open_caption: Mở phụ đề... + close_caption: Đóng phụ đề... caption_overlay: Lớp phủ phụ đề follow_window: Theo cửa sổ reset_position: Đặt lại vị trí diff --git a/packages/i18n/src/locales/zh-Hans/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/zh-Hans/tamagotchi/electron/tray.yaml index aeb612995..e61d8a8eb 100644 --- a/packages/i18n/src/locales/zh-Hans/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/zh-Hans/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: 打开内嵌... open_widgets: 打开小部件... open_caption: 打开字幕... + close_caption: 关闭字幕... caption_overlay: 字幕覆盖 follow_window: 跟随窗口 reset_position: 重置位置 diff --git a/packages/i18n/src/locales/zh-Hant/tamagotchi/electron/tray.yaml b/packages/i18n/src/locales/zh-Hant/tamagotchi/electron/tray.yaml index ed365e72f..8545a52cb 100644 --- a/packages/i18n/src/locales/zh-Hant/tamagotchi/electron/tray.yaml +++ b/packages/i18n/src/locales/zh-Hant/tamagotchi/electron/tray.yaml @@ -18,6 +18,7 @@ menu: open_inlay: 開啟內嵌…… open_widgets: 開啟套件…… open_caption: 開啟字幕…… + close_caption: 關閉字幕…… caption_overlay: 字幕浮水印 follow_window: 跟隨視窗 reset_position: 重置位置