diff --git a/eslint.config.js b/eslint.config.js index 11254ca234..525364a1bc 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -243,7 +243,7 @@ export default defineConfigWithVueTs( { patterns: [ { - group: ["electron"], + regex: "^electron(\\/|$)", message: "このファイル内でelectronはimportできません。許可されているファイル内へ移すか、ESLintの設定を見直してください", }, diff --git a/src/backend/electron/ipc.ts b/src/backend/electron/ipc.ts index 890d416ca6..37b80f6b76 100644 --- a/src/backend/electron/ipc.ts +++ b/src/backend/electron/ipc.ts @@ -1,20 +1,9 @@ -import { - BrowserWindow, - ipcMain, - IpcMainInvokeEvent, - IpcRendererEvent, -} from "electron"; +import { BrowserWindow, ipcMain, IpcMainInvokeEvent } from "electron"; import { IpcIHData, IpcSOData } from "@/type/ipc"; import { createLogger } from "@/helpers/log"; const log = createLogger("ipc"); -export type IpcRendererInvoke = { - [K in keyof IpcIHData]: ( - ...args: IpcIHData[K]["args"] - ) => Promise; -}; - export type IpcMainHandle = { [K in keyof IpcIHData]: ( event: IpcMainInvokeEvent, @@ -22,20 +11,13 @@ export type IpcMainHandle = { ) => Promise | IpcIHData[K]["return"]; }; -export type IpcMainSend = { +type IpcMainSend = { [K in keyof IpcSOData]: ( win: BrowserWindow, ...args: IpcSOData[K]["args"] ) => void; }; -export type IpcRendererOn = { - [K in keyof IpcSOData]: ( - event: IpcRendererEvent, - ...args: IpcSOData[K]["args"] - ) => Promise | IpcSOData[K]["return"]; -}; - // FIXME: asを使わないようオーバーロードにした。オーバーロードも使わない書き方にしたい。 export function registerIpcMainHandle( listeners: T, diff --git a/src/backend/electron/renderer/ipc.ts b/src/backend/electron/renderer/ipc.ts new file mode 100644 index 0000000000..2c4a9b9798 --- /dev/null +++ b/src/backend/electron/renderer/ipc.ts @@ -0,0 +1,7 @@ +import { IpcIHData } from "@/type/ipc"; + +export type IpcRendererInvoke = { + [K in keyof IpcIHData]: ( + ...args: IpcIHData[K]["args"] + ) => Promise; +}; diff --git a/src/backend/electron/renderer/menuBarData.ts b/src/backend/electron/renderer/menuBarData.ts new file mode 100644 index 0000000000..52ece33852 --- /dev/null +++ b/src/backend/electron/renderer/menuBarData.ts @@ -0,0 +1,116 @@ +import { computed } from "vue"; +import { useEngineIcons } from "@/composables/useEngineIcons"; +import { + MaybeComputedMenuBarContent, + MenuBarContent, +} from "@/components/Menu/MenuBar/menuBarData"; +import { MenuItemData } from "@/components/Menu/type"; +import { Store } from "@/store"; +import { removeNullableAndBoolean } from "@/helpers/arrayHelper"; + +export const useElectronMenuBarData = ( + store: Store, +): MaybeComputedMenuBarContent => { + const engineIds = computed(() => store.state.engineIds); + const engineInfos = computed(() => store.state.engineInfos); + const engineManifests = computed(() => store.state.engineManifests); + const engineIcons = useEngineIcons(engineManifests); + const enableMultiEngine = computed(() => store.state.enableMultiEngine); + + // 「エンジン」メニューのエンジン毎の項目 + const engineSubMenuData = computed(() => { + let singleEngineSubMenuData: MenuItemData[]; + if (Object.values(engineInfos.value).length === 1) { + singleEngineSubMenuData = [ + { + type: "button", + label: "再起動", + onClick: () => { + void store.actions.RESTART_ENGINES({ + engineIds: [engineIds.value[0]], + }); + }, + disableWhenUiLocked: false, + }, + ]; + } else { + singleEngineSubMenuData = store.getters.GET_SORTED_ENGINE_INFOS.map( + (engineInfo): MenuItemData => ({ + type: "root", + label: engineInfo.name, + icon: + engineManifests.value[engineInfo.uuid] && + engineIcons.value[engineInfo.uuid], + disableWhenUiLocked: false, + subMenu: removeNullableAndBoolean([ + engineInfo.path != "" && { + type: "button", + label: "フォルダを開く", + onClick: () => { + void store.actions.OPEN_ENGINE_DIRECTORY({ + engineId: engineInfo.uuid, + }); + }, + disableWhenUiLocked: false, + }, + { + type: "button", + label: "再起動", + onClick: () => { + void store.actions.RESTART_ENGINES({ + engineIds: [engineInfo.uuid], + }); + }, + disableWhenUiLocked: false, + }, + ]), + }), + ); + } + + const allEnginesSubMenuData = enableMultiEngine.value + ? removeNullableAndBoolean([ + { + type: "button", + label: "全てのエンジンを再起動", + onClick: () => { + void store.actions.RESTART_ENGINES({ + engineIds: engineIds.value, + }); + }, + disableWhenUiLocked: false, + }, + { + type: "button", + label: "エンジンの管理", + onClick: () => { + void store.actions.SET_DIALOG_OPEN({ + isEngineManageDialogOpen: true, + }); + }, + disableWhenUiLocked: false, + }, + store.state.isMultiEngineOffMode && { + type: "button", + label: "マルチエンジンをオンにして再読み込み", + onClick() { + void store.actions.RELOAD_APP({ + isMultiEngineOffMode: false, + }); + }, + disableWhenUiLocked: false, + disableWhileReloadingLock: true, + }, + ]) + : []; + + return { + singleEngine: singleEngineSubMenuData, + allEngines: allEnginesSubMenuData, + }; + }); + + return { + engine: engineSubMenuData, + }; +}; diff --git a/src/backend/electron/preload.ts b/src/backend/electron/renderer/preload.ts similarity index 100% rename from src/backend/electron/preload.ts rename to src/backend/electron/renderer/preload.ts diff --git a/src/components/App.vue b/src/components/App.vue index 50c1d87164..df56e65149 100644 --- a/src/components/App.vue +++ b/src/components/App.vue @@ -1,11 +1,14 @@