فهرست منبع

tauri: macos-only app menu

Brendan Allan 2 ماه پیش
والد
کامیت
87efd27459
4فایلهای تغییر یافته به همراه102 افزوده شده و 3 حذف شده
  1. 0 1
      packages/tauri/scripts/predev.ts
  2. 6 2
      packages/tauri/src/index.tsx
  3. 94 0
      packages/tauri/src/menu.ts
  4. 2 0
      packages/tauri/src/updater.ts

+ 0 - 1
packages/tauri/scripts/predev.ts

@@ -1,4 +1,3 @@
-import * as fs from "node:fs/promises"
 import { $ } from "bun"
 
 import { copyBinaryToSidecarFolder, getCurrentSidecar } from "./utils"

+ 6 - 2
packages/tauri/src/index.tsx

@@ -1,12 +1,14 @@
 // @refresh reload
 import { render } from "solid-js/web"
 import { App, PlatformProvider, Platform } from "@opencode-ai/desktop"
-import { runUpdater } from "./updater"
 import { onMount } from "solid-js"
 import { open, save } from "@tauri-apps/plugin-dialog"
 import { open as shellOpen } from "@tauri-apps/plugin-shell"
 import { type as ostype } from "@tauri-apps/plugin-os"
 
+import { runUpdater, UPDATER_ENABLED } from "./updater"
+import { createMenu } from "./menu"
+
 const root = document.getElementById("root")
 if (import.meta.env.DEV && !(root instanceof HTMLElement)) {
   throw new Error(
@@ -48,9 +50,11 @@ const platform: Platform = {
   },
 }
 
+createMenu()
+
 render(() => {
   onMount(() => {
-    if (window.__OPENCODE__?.updaterEnabled) runUpdater()
+    if (UPDATER_ENABLED) runUpdater()
   })
 
   return (

+ 94 - 0
packages/tauri/src/menu.ts

@@ -0,0 +1,94 @@
+import { Menu, MenuItem, PredefinedMenuItem, Submenu } from "@tauri-apps/api/menu"
+import { type as ostype } from "@tauri-apps/plugin-os"
+
+import { runUpdater, UPDATER_ENABLED } from "./updater"
+
+export async function createMenu() {
+  if (ostype() !== "macos") return;
+
+  const menu = await Menu.new({
+    items: [
+      await Submenu.new({
+        text: "OpenCode",
+        items: [
+          await PredefinedMenuItem.new({
+            item: { About: null },
+          }),
+          await MenuItem.new({
+            enabled: UPDATER_ENABLED,
+            action: () => runUpdater(),
+            text: "Check For Updates...",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Separator",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Hide",
+          }),
+          await PredefinedMenuItem.new({
+            item: "HideOthers",
+          }),
+          await PredefinedMenuItem.new({
+            item: "ShowAll",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Separator",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Quit",
+          }),
+        ].filter(Boolean),
+      }),
+      // await Submenu.new({
+      //   text: "File",
+      //   items: [
+      //     await MenuItem.new({
+      //       enabled: false,
+      //       text: "Open Project...",
+      //     }),
+      //     await PredefinedMenuItem.new({
+      //       item: "Separator"
+      //     }),
+      //     await MenuItem.new({
+      //       enabled: false,
+      //       text: "New Session",
+      //     }),
+      //     await PredefinedMenuItem.new({
+      //       item: "Separator"
+      //     }),
+      //     await MenuItem.new({
+      //       enabled: false,
+      //       text: "Close Project",
+      //     })
+      //   ]
+      // }),
+      await Submenu.new({
+        text: "Edit",
+        items: [
+          await PredefinedMenuItem.new({
+            item: "Undo",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Redo",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Separator",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Cut",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Copy",
+          }),
+          await PredefinedMenuItem.new({
+            item: "Paste",
+          }),
+          await PredefinedMenuItem.new({
+            item: "SelectAll",
+          }),
+        ],
+      }),
+    ],
+  })
+  menu.setAsAppMenu()
+}

+ 2 - 0
packages/tauri/src/updater.ts

@@ -2,6 +2,8 @@ import { check, DownloadEvent } from "@tauri-apps/plugin-updater"
 import { relaunch } from "@tauri-apps/plugin-process"
 import { ask, message } from "@tauri-apps/plugin-dialog"
 
+export const UPDATER_ENABLED = window.__OPENCODE__?.updaterEnabled ?? false
+
 export async function runUpdater(onDownloadEvent?: (progress: DownloadEvent) => void) {
   let update
   try {