desktop-menu.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. export type DesktopMenuPlatform = "macos" | "windows"
  2. export type DesktopMenuAction =
  3. | "app.checkForUpdates"
  4. | "app.relaunch"
  5. | "edit.undo"
  6. | "edit.redo"
  7. | "edit.cut"
  8. | "edit.copy"
  9. | "edit.paste"
  10. | "edit.delete"
  11. | "edit.selectAll"
  12. | "view.reload"
  13. | "view.toggleDevTools"
  14. | "view.resetZoom"
  15. | "view.zoomIn"
  16. | "view.zoomOut"
  17. | "view.toggleFullscreen"
  18. | "window.new"
  19. | "window.close"
  20. | "window.minimize"
  21. | "window.toggleMaximize"
  22. export type DesktopMenuRole =
  23. | "about"
  24. | "close"
  25. | "copy"
  26. | "cut"
  27. | "hide"
  28. | "hideOthers"
  29. | "paste"
  30. | "quit"
  31. | "redo"
  32. | "reload"
  33. | "resetZoom"
  34. | "selectAll"
  35. | "toggleDevTools"
  36. | "togglefullscreen"
  37. | "undo"
  38. | "unhide"
  39. | "windowMenu"
  40. | "zoomIn"
  41. | "zoomOut"
  42. export type DesktopMenuItem = {
  43. type: "item"
  44. label?: string
  45. command?: string
  46. action?: DesktopMenuAction
  47. role?: DesktopMenuRole
  48. href?: string
  49. accelerator?: Partial<Record<DesktopMenuPlatform, string>>
  50. enabled?: "updater"
  51. platforms?: DesktopMenuPlatform[]
  52. }
  53. export type DesktopMenuSeparator = {
  54. type: "separator"
  55. platforms?: DesktopMenuPlatform[]
  56. }
  57. export type DesktopMenuEntry = DesktopMenuItem | DesktopMenuSeparator
  58. export type DesktopMenu = {
  59. id: string
  60. label: string
  61. role?: DesktopMenuRole
  62. items?: DesktopMenuEntry[]
  63. platforms?: DesktopMenuPlatform[]
  64. }
  65. export const DESKTOP_MENU: DesktopMenu[] = [
  66. {
  67. id: "app",
  68. label: "OpenCode",
  69. platforms: ["macos"],
  70. items: [
  71. { type: "item", role: "about" },
  72. { type: "item", label: "Check for Updates...", action: "app.checkForUpdates", enabled: "updater" },
  73. { type: "item", label: "Settings", command: "settings.open", accelerator: { macos: "Cmd+," } },
  74. { type: "item", label: "Reload Webview", action: "view.reload" },
  75. { type: "item", label: "Restart", action: "app.relaunch" },
  76. { type: "item", label: "Export Logs...", command: "logs.export" },
  77. { type: "separator" },
  78. { type: "item", role: "hide" },
  79. { type: "item", role: "hideOthers" },
  80. { type: "item", role: "unhide" },
  81. { type: "separator" },
  82. { type: "item", role: "quit" },
  83. ],
  84. },
  85. {
  86. id: "file",
  87. label: "File",
  88. items: [
  89. {
  90. type: "item",
  91. label: "New Session",
  92. command: "session.new",
  93. accelerator: { macos: "Shift+Cmd+S" },
  94. },
  95. { type: "item", label: "Open Project...", command: "project.open", accelerator: { macos: "Cmd+O" } },
  96. {
  97. type: "item",
  98. label: "Settings",
  99. command: "settings.open",
  100. accelerator: { windows: "Ctrl+," },
  101. platforms: ["windows"],
  102. },
  103. {
  104. type: "item",
  105. label: "New Window",
  106. action: "window.new",
  107. accelerator: { macos: "Cmd+Shift+N", windows: "Ctrl+Shift+N" },
  108. },
  109. { type: "separator" },
  110. { type: "item", label: "Close Window", action: "window.close", role: "close" },
  111. ],
  112. },
  113. {
  114. id: "edit",
  115. label: "Edit",
  116. items: [
  117. { type: "item", label: "Undo", action: "edit.undo", role: "undo", accelerator: { windows: "Ctrl+Z" } },
  118. { type: "item", label: "Redo", action: "edit.redo", role: "redo", accelerator: { windows: "Ctrl+Y" } },
  119. { type: "separator" },
  120. { type: "item", label: "Cut", action: "edit.cut", role: "cut", accelerator: { windows: "Ctrl+X" } },
  121. { type: "item", label: "Copy", action: "edit.copy", role: "copy", accelerator: { windows: "Ctrl+C" } },
  122. { type: "item", label: "Paste", action: "edit.paste", role: "paste", accelerator: { windows: "Ctrl+V" } },
  123. { type: "item", label: "Delete", action: "edit.delete" },
  124. {
  125. type: "item",
  126. label: "Select All",
  127. action: "edit.selectAll",
  128. role: "selectAll",
  129. accelerator: { windows: "Ctrl+A" },
  130. },
  131. ],
  132. },
  133. {
  134. id: "view",
  135. label: "View",
  136. items: [
  137. { type: "item", label: "Toggle Sidebar", command: "sidebar.toggle" },
  138. { type: "item", label: "Toggle Terminal", command: "terminal.toggle", accelerator: { macos: "Ctrl+`" } },
  139. { type: "item", label: "Toggle File Tree", command: "fileTree.toggle" },
  140. { type: "separator" },
  141. { type: "item", label: "Reload", action: "view.reload", role: "reload" },
  142. { type: "item", label: "Toggle Developer Tools", action: "view.toggleDevTools", role: "toggleDevTools" },
  143. { type: "separator" },
  144. {
  145. type: "item",
  146. label: "Actual Size",
  147. action: "view.resetZoom",
  148. role: "resetZoom",
  149. accelerator: { windows: "Ctrl+0" },
  150. },
  151. { type: "item", label: "Zoom In", action: "view.zoomIn", role: "zoomIn", accelerator: { windows: "Ctrl++" } },
  152. { type: "item", label: "Zoom Out", action: "view.zoomOut", role: "zoomOut", accelerator: { windows: "Ctrl+-" } },
  153. { type: "separator" },
  154. { type: "item", label: "Toggle Full Screen", action: "view.toggleFullscreen", role: "togglefullscreen" },
  155. ],
  156. },
  157. {
  158. id: "go",
  159. label: "Go",
  160. items: [
  161. { type: "item", label: "Back", command: "common.goBack", accelerator: { macos: "Cmd+[" } },
  162. { type: "item", label: "Forward", command: "common.goForward", accelerator: { macos: "Cmd+]" } },
  163. { type: "separator" },
  164. { type: "item", label: "Previous Session", command: "session.previous", accelerator: { macos: "Option+Up" } },
  165. { type: "item", label: "Next Session", command: "session.next", accelerator: { macos: "Option+Down" } },
  166. { type: "separator" },
  167. {
  168. type: "item",
  169. label: "Previous Project",
  170. command: "project.previous",
  171. accelerator: { macos: "Cmd+Option+Up" },
  172. },
  173. {
  174. type: "item",
  175. label: "Next Project",
  176. command: "project.next",
  177. accelerator: { macos: "Cmd+Option+Down" },
  178. },
  179. ],
  180. },
  181. {
  182. id: "window",
  183. label: "Window",
  184. role: "windowMenu",
  185. items: [
  186. { type: "item", label: "Minimize", action: "window.minimize" },
  187. { type: "item", label: "Maximize", action: "window.toggleMaximize" },
  188. { type: "separator" },
  189. { type: "item", label: "Close Window", action: "window.close" },
  190. ],
  191. },
  192. {
  193. id: "help",
  194. label: "Help",
  195. items: [
  196. { type: "item", label: "OpenCode Documentation", href: "https://opencode.ai/docs" },
  197. { type: "item", label: "Support Forum", href: "https://discord.com/invite/opencode" },
  198. { type: "item", label: "Export Logs...", command: "logs.export" },
  199. { type: "separator" },
  200. {
  201. type: "item",
  202. label: "Share Feedback",
  203. href: "https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml",
  204. },
  205. {
  206. type: "item",
  207. label: "Report a Bug",
  208. href: "https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml",
  209. },
  210. ],
  211. },
  212. ]
  213. export function desktopMenuVisible(item: { platforms?: DesktopMenuPlatform[] }, platform: DesktopMenuPlatform) {
  214. return !item.platforms || item.platforms.includes(platform)
  215. }