summaryrefslogtreecommitdiffhomepage
path: root/packages/desktop-electron/src/main/menu.ts
diff options
context:
space:
mode:
authorBrendan Allan <[email protected]>2026-03-04 15:12:34 +0800
committerGitHub <[email protected]>2026-03-04 15:12:34 +0800
commit5cf235fa6cf7b4c890c68f8ff68a96fcae992abf (patch)
tree25fdfd8ce95ad048fb097822995dcf060e8d6d8b /packages/desktop-electron/src/main/menu.ts
parente4f0825c56300286ec0aa82b1006e4006a17e1e1 (diff)
downloadopencode-5cf235fa6cf7b4c890c68f8ff68a96fcae992abf.tar.gz
opencode-5cf235fa6cf7b4c890c68f8ff68a96fcae992abf.zip
desktop: add electron version (#15663)
Diffstat (limited to 'packages/desktop-electron/src/main/menu.ts')
-rw-r--r--packages/desktop-electron/src/main/menu.ts116
1 files changed, 116 insertions, 0 deletions
diff --git a/packages/desktop-electron/src/main/menu.ts b/packages/desktop-electron/src/main/menu.ts
new file mode 100644
index 000000000..53707ba7f
--- /dev/null
+++ b/packages/desktop-electron/src/main/menu.ts
@@ -0,0 +1,116 @@
+import { BrowserWindow, Menu, shell } from "electron"
+
+import { UPDATER_ENABLED } from "./constants"
+
+type Deps = {
+ trigger: (id: string) => void
+ installCli: () => void
+ checkForUpdates: () => void
+ reload: () => void
+ relaunch: () => void
+}
+
+export function createMenu(deps: Deps) {
+ if (process.platform !== "darwin") return
+
+ const template: Electron.MenuItemConstructorOptions[] = [
+ {
+ label: "OpenCode",
+ submenu: [
+ { role: "about" },
+ {
+ label: "Check for Updates...",
+ enabled: UPDATER_ENABLED,
+ click: () => deps.checkForUpdates(),
+ },
+ {
+ label: "Install CLI...",
+ click: () => deps.installCli(),
+ },
+ {
+ label: "Reload Webview",
+ click: () => deps.reload(),
+ },
+ {
+ label: "Restart",
+ click: () => deps.relaunch(),
+ },
+ { type: "separator" },
+ { role: "hide" },
+ { role: "hideOthers" },
+ { role: "unhide" },
+ { type: "separator" },
+ { role: "quit" },
+ ],
+ },
+ {
+ label: "File",
+ submenu: [
+ { label: "New Session", accelerator: "Shift+Cmd+S", click: () => deps.trigger("session.new") },
+ { label: "Open Project...", accelerator: "Cmd+O", click: () => deps.trigger("project.open") },
+ { type: "separator" },
+ { role: "close" },
+ ],
+ },
+ {
+ label: "Edit",
+ submenu: [
+ { role: "undo" },
+ { role: "redo" },
+ { type: "separator" },
+ { role: "cut" },
+ { role: "copy" },
+ { role: "paste" },
+ { role: "selectAll" },
+ ],
+ },
+ {
+ label: "View",
+ submenu: [
+ { label: "Toggle Sidebar", accelerator: "Cmd+B", click: () => deps.trigger("sidebar.toggle") },
+ { label: "Toggle Terminal", accelerator: "Ctrl+`", click: () => deps.trigger("terminal.toggle") },
+ { label: "Toggle File Tree", click: () => deps.trigger("fileTree.toggle") },
+ { type: "separator" },
+ { label: "Back", click: () => deps.trigger("common.goBack") },
+ { label: "Forward", click: () => deps.trigger("common.goForward") },
+ { type: "separator" },
+ {
+ label: "Previous Session",
+ accelerator: "Option+ArrowUp",
+ click: () => deps.trigger("session.previous"),
+ },
+ {
+ label: "Next Session",
+ accelerator: "Option+ArrowDown",
+ click: () => deps.trigger("session.next"),
+ },
+ { type: "separator" },
+ {
+ label: "Toggle Developer Tools",
+ accelerator: "Alt+Cmd+I",
+ click: () => BrowserWindow.getFocusedWindow()?.webContents.toggleDevTools(),
+ },
+ ],
+ },
+ {
+ label: "Help",
+ submenu: [
+ { label: "OpenCode Documentation", click: () => shell.openExternal("https://opencode.ai/docs") },
+ { label: "Support Forum", click: () => shell.openExternal("https://discord.com/invite/opencode") },
+ { type: "separator" },
+ { type: "separator" },
+ {
+ label: "Share Feedback",
+ click: () =>
+ shell.openExternal("https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml"),
+ },
+ {
+ label: "Report a Bug",
+ click: () => shell.openExternal("https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml"),
+ },
+ ],
+ },
+ ]
+
+ Menu.setApplicationMenu(Menu.buildFromTemplate(template))
+}