Skip to content
Merged
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
781f0f2
chore: MenuBarの定義を分散
sevenc-nanashi Mar 6, 2025
2a585ef
chore: エンジンをelectron限定にする
sevenc-nanashi Mar 6, 2025
4bdfe1c
fix: regexp -> regex
sevenc-nanashi Mar 6, 2025
9febf74
update: スナップショットを更新
sevenc-nanashi Mar 6, 2025
3e9fd4d
(スナップショットを更新)
github-actions[bot] Mar 6, 2025
b057712
fix: パターンを修正
sevenc-nanashi Mar 6, 2025
8341c18
#2596 の変更提案プルリクエスト (#6)
Hiroshiba Mar 8, 2025
f4c987b
chore: storeを引数で渡す
sevenc-nanashi Mar 8, 2025
c855472
refactor: 2次元配列にする
sevenc-nanashi Mar 8, 2025
4080f50
merge: upstream/main -> refactor/menu
sevenc-nanashi Mar 9, 2025
6d87525
refactor: 設計を大きく変える
sevenc-nanashi Mar 9, 2025
e710b59
chore: disableOnReloadingLocked -> disableWhileReloadingLock
sevenc-nanashi Mar 9, 2025
42a4e7d
test: テストを追加
sevenc-nanashi Mar 9, 2025
e5fdb72
fix: 動いてなかったのを修正
sevenc-nanashi Mar 9, 2025
21ed598
test: スナップショットを更新
sevenc-nanashi Mar 9, 2025
05aaedf
(スナップショットを更新)
github-actions[bot] Mar 9, 2025
4c63ae2
revert: 誤爆
sevenc-nanashi Mar 10, 2025
5063d47
chore: MenuBarRoots -> MenuBarCategories
sevenc-nanashi Mar 10, 2025
08f89bc
chore: menuItemIndex -> menuItemStructure
sevenc-nanashi Mar 10, 2025
ea9830c
chore: removeNonValue -> removeNullableAndBoolean
sevenc-nanashi Mar 10, 2025
79933cc
style: pnpm run fmt
sevenc-nanashi Mar 10, 2025
2b442e0
merge: upstream/main -> refactor/menu
sevenc-nanashi Mar 13, 2025
9fa76ce
chore: MenuBarCategories -> MenuBarCategory
sevenc-nanashi Mar 17, 2025
c5bbd40
chore: 不要なsatisfiesを消す
sevenc-nanashi Mar 17, 2025
6fd9e39
chore: 三項演算子をやめる
sevenc-nanashi Mar 17, 2025
1b47920
Update src/components/Sing/menuBarData.ts
Hiroshiba Mar 20, 2025
eda1d65
Merge: main -> refactor/menu
sevenc-nanashi Mar 21, 2025
29dbe9e
style: nr fmt
sevenc-nanashi Mar 21, 2025
ffee58c
chore: domain下からcomponents/Menu下に移動
sevenc-nanashi Mar 21, 2025
6da79d6
refactor: ループを回す向きを改善
sevenc-nanashi Mar 21, 2025
aed06aa
chore: Menu/menuBarData -> Menu/MenuBar/menuBarData
sevenc-nanashi Mar 21, 2025
984f348
refactor: リファクタ
sevenc-nanashi Mar 22, 2025
434f231
refactor: 関数名を変更
sevenc-nanashi Mar 22, 2025
fd8071b
refactor: 引数名を変更
sevenc-nanashi Mar 22, 2025
56beb02
chore: TODOを追加
sevenc-nanashi Mar 22, 2025
b335446
refactor: useCommonMenuBarDataを移動
sevenc-nanashi Mar 22, 2025
1a620e8
refactor: 命名をする
sevenc-nanashi Mar 22, 2025
28d4468
chore: TODOを追加
sevenc-nanashi Mar 22, 2025
d1e3f9f
chore: コメントを変える
sevenc-nanashi Mar 23, 2025
b8d1292
refactor(menu): メニュー項目の結合処理をリファクタリング (#8)
Hiroshiba Mar 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ export default defineConfigWithVueTs(
{
patterns: [
{
group: ["electron"],
regex: "^electron(\\/|$)",
message:
"このファイル内でelectronはimportできません。許可されているファイル内へ移すか、ESLintの設定を見直してください",
},
Expand Down
22 changes: 2 additions & 20 deletions src/backend/electron/ipc.ts
Original file line number Diff line number Diff line change
@@ -1,41 +1,23 @@
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<IpcIHData[K]["return"]>;
};

export type IpcMainHandle = {
[K in keyof IpcIHData]: (
event: IpcMainInvokeEvent,
...args: IpcIHData[K]["args"]
) => Promise<IpcIHData[K]["return"]> | 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"]> | IpcSOData[K]["return"];
};

// FIXME: asを使わないようオーバーロードにした。オーバーロードも使わない書き方にしたい。
export function registerIpcMainHandle<T extends IpcMainHandle>(
listeners: T,
Expand Down
7 changes: 7 additions & 0 deletions src/backend/electron/renderer/ipc.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { IpcIHData } from "@/type/ipc";

export type IpcRendererInvoke = {
[K in keyof IpcIHData]: (
...args: IpcIHData[K]["args"]
) => Promise<IpcIHData[K]["return"]>;
};
116 changes: 116 additions & 0 deletions src/backend/electron/renderer/menuBarData.ts
Original file line number Diff line number Diff line change
@@ -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<MenuBarContent["engine"]>(() => {
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<MenuItemData>([
{
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,
};
};
41 changes: 25 additions & 16 deletions src/components/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
<TooltipProvider disableHoverableContent :delayDuration="500">
<MenuBar
v-if="openedEditor != undefined"
:fileSubMenuData="subMenuData.fileSubMenuData.value"
:editSubMenuData="subMenuData.editSubMenuData.value"
:viewSubMenuData="subMenuData.viewSubMenuData.value"
:fileSubMenuData="subMenuData.file"
:editSubMenuData="subMenuData.edit"
:viewSubMenuData="subMenuData.view"
:engineSubMenuData="subMenuData.engine"
:settingSubMenuData="subMenuData.setting"
:editor="openedEditor"
/>
Comment on lines 5 to 13
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このsubMenuData、それぞれ渡さなくてもまとめて渡しちゃえるようになったかも?
まあ別のプルリクエストでさらにファクタリングとかでもよさそう!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ忘れそうなんでTODO書いておくかissueを作るというメモを何処かに書いても良いかも。
(TODOコメントがあったものがマージされたとき、issueを作るの忘れてませんかと言ってくれるボットみたいながいてくれると便利かも?)

<KeepAlive>
Expand Down Expand Up @@ -37,22 +39,29 @@ import MenuBar from "@/components/Menu/MenuBar/MenuBar.vue";
import { useMenuBarData as useTalkMenuBarData } from "@/components/Talk/menuBarData";
import { useMenuBarData as useSingMenuBarData } from "@/components/Sing/menuBarData";
import { setFontToCss, setThemeToCss } from "@/domain/dom";
import { ExhaustiveError } from "@/type/utility";
import { useCommonMenuBarData } from "@/components/Menu/MenuBar/menuBarData";
import { concatMenuBarData } from "@/components/Menu/MenuBar/menuBarData";
import { isElectron } from "@/helpers/platform";
import { useElectronMenuBarData } from "@/backend/electron/renderer/menuBarData";
import { removeNullableAndBoolean } from "@/helpers/arrayHelper";

const store = useStore();

const talkMenuBarData = useTalkMenuBarData();
const singMenuBarData = useSingMenuBarData();

const subMenuData = computed(() => {
if (openedEditor.value === "talk" || openedEditor.value == undefined) {
return talkMenuBarData;
} else if (openedEditor.value === "song") {
return singMenuBarData;
}

throw new ExhaustiveError(openedEditor.value);
});
const commonMenuBarData = useCommonMenuBarData(store);
const talkMenuBarData = useTalkMenuBarData(store);
const singMenuBarData = useSingMenuBarData(store);
const electronMenuBarData = useElectronMenuBarData(store);

const subMenuData = computed(() =>
concatMenuBarData(
removeNullableAndBoolean([
commonMenuBarData,
store.state.openedEditor === "talk" && talkMenuBarData,
store.state.openedEditor === "song" && singMenuBarData,
isElectron && electronMenuBarData,
]),
),
);

const openedEditor = computed(() => store.state.openedEditor);

Expand Down
Loading
Loading