fix: electron menu handler(Redo, Undo, Copy) (#8466)

* fix(electron): menu undo & redo not working
* refactor(electron): use editMenu from electron src code
* chore(electron): add FIXME comments
* fix(electron): menu copy & cut not working
* remove: custom fn in menu cut
* fix: add accelerator to menu copy item
This commit is contained in:
situ2001
2023-02-16 17:26:31 +08:00
committed by GitHub
parent 56b2379ce4
commit 29da7386cb
2 changed files with 48 additions and 2 deletions

View File

@@ -228,7 +228,42 @@
(if mac?
{:role "close"}
{:role "quit"})]}
{:role "editMenu"}
{:role "editMenu"
;; https://github.com/electron/electron/blob/85f41d59aceabbdeee1fdec75770249c6335e73a/lib/browser/api/menu-item-roles.ts#L239-L276
:submenu (concat
[{:label "Undo"
:click (fn []
(let [browser-window ^js/BrowserWindow @*win
web-contents (.-webContents browser-window)]
(.send web-contents "invokeEditorHandler" "undo")))
:accelerator "CommandOrControl+Z"}
{:label "Redo"
:click (fn []
(let [browser-window ^js/BrowserWindow @*win
web-contents (.-webContents browser-window)]
(.send web-contents "invokeEditorHandler" "redo")))
:accelerator "Shift+CommandOrControl+Z"}
{:type "separator"}
{:role "cut"}
{:label "Copy"
:click (fn []
(let [browser-window ^js/BrowserWindow @*win
web-contents (.-webContents browser-window)]
(.send web-contents "invokeEditorHandler" "copy")))
:accelerator "CommandOrControl+C"}
{:role "paste"}]
(if mac?
[{:role "pasteAndMatchStyle"}
{:role "delete"}
{:role "selectAll"} ;; FIXME not work as expected
{:type "separator"}
{:label "Speech"
:submenu [{:role "startSpeaking"},
{:role "stopSpeaking"}]}]
[{:role "delete"}
{:type "separator"}
{:role "selectAll"}]))}
{:role "viewMenu"}
{:role "windowMenu"})
;; Windows has no about role

View File

@@ -12,6 +12,7 @@
[frontend.fs.watcher-handler :as watcher-handler]
[frontend.handler.editor :as editor-handler]
[frontend.handler.file-sync :as file-sync-handler]
[frontend.handler.history :as history]
[frontend.handler.notification :as notification]
[frontend.handler.repo :as repo-handler]
[frontend.handler.route :as route-handler]
@@ -181,7 +182,17 @@
(js/window.apis.on "syncAPIServerState"
(fn [^js data]
(state/set-state! :electron/server (bean/->clj data)))))
(state/set-state! :electron/server (bean/->clj data))))
(js/window.apis.on "invokeEditorHandler"
(fn [action]
(println "invokeEditorHandler with action:" action)
(case action
"undo" (history/undo! nil)
"redo" (history/redo! nil)
"copy" (editor-handler/shortcut-copy nil)
"cut" (editor-handler/shortcut-cut nil) ;; FIXME this handler relies on arg Event
))))
(defn listen!
[]