Skip to content

Commit ac35baa

Browse files
committed
feat (core): 拆分菜单为独立控制
1 parent 946efdd commit ac35baa

5 files changed

Lines changed: 123 additions & 24 deletions

File tree

src-tauri/src/setup/menu.rs

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,16 @@
1+
use super::menus;
2+
13
use tauri::{
2-
AppHandle, Emitter,
3-
menu::{Menu, MenuBuilder, MenuItemBuilder, PredefinedMenuItem, SubmenuBuilder},
4+
AppHandle,
5+
menu::{Menu, MenuBuilder},
46
};
57

68
pub fn create_menu(app: &AppHandle) -> tauri::Result<Menu<tauri::Wry>> {
7-
let about_item = MenuItemBuilder::new("关于 CodeForge")
8-
.id("about")
9-
.build(app)?;
10-
119
// 应用菜单
12-
let app_submenu = SubmenuBuilder::new(app, "CodeForge")
13-
.item(&about_item)
14-
.build()?;
10+
let app_submenu = menus::app::create_app_submenu(app)?;
1511

1612
// 编辑菜单
17-
let edit_submenu = SubmenuBuilder::new(app, "编辑")
18-
.item(&PredefinedMenuItem::undo(app, Option::from("撤销"))?)
19-
.item(&PredefinedMenuItem::redo(app, Option::from("重做"))?)
20-
.separator()
21-
.item(&PredefinedMenuItem::cut(app, Option::from("剪切"))?)
22-
.item(&PredefinedMenuItem::copy(app, Option::from("复制"))?)
23-
.item(&PredefinedMenuItem::paste(app, Option::from("粘贴"))?)
24-
.separator()
25-
.item(&PredefinedMenuItem::select_all(app, Option::from("全选"))?)
26-
.build()?;
13+
let edit_submenu = menus::edit::create_edit_submenu(app)?;
2714

2815
let menu = MenuBuilder::new(app)
2916
.items(&[&app_submenu, &edit_submenu])
@@ -33,10 +20,8 @@ pub fn create_menu(app: &AppHandle) -> tauri::Result<Menu<tauri::Wry>> {
3320
}
3421

3522
pub fn setup_menu_handler(app: &AppHandle) {
36-
app.on_menu_event(move |app, event| match event.id().as_ref() {
37-
"about" => {
38-
let _event = app.emit("show-about", ());
39-
}
40-
_ => {}
23+
app.on_menu_event(move |app, event| {
24+
menus::app::handle_app_menu_event(app, event.id().as_ref());
25+
menus::edit::handle_edit_menu_event(app, event.id().as_ref());
4126
});
4227
}

src-tauri/src/setup/menus/app.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use tauri::{
2+
AppHandle, Emitter,
3+
menu::{MenuItemBuilder, Submenu, SubmenuBuilder},
4+
};
5+
6+
pub fn create_app_submenu(app: &AppHandle) -> tauri::Result<Submenu<tauri::Wry>> {
7+
let about_item = MenuItemBuilder::new("关于 CodeForge")
8+
.id("about")
9+
.build(app)?;
10+
11+
let quit_item = MenuItemBuilder::new("退出 CodeForge")
12+
.id("quit")
13+
.accelerator("CmdOrCtrl+Q")
14+
.build(app)?;
15+
16+
let app_submenu = SubmenuBuilder::new(app, "CodeForge")
17+
.item(&about_item)
18+
.separator()
19+
.item(&quit_item)
20+
.build()?;
21+
22+
Ok(app_submenu)
23+
}
24+
25+
pub fn handle_app_menu_event(app: &AppHandle, event_id: &str) {
26+
match event_id {
27+
"about" => {
28+
let _event = app.emit("show-about", ());
29+
}
30+
"quit" => {
31+
app.exit(0);
32+
}
33+
_ => {}
34+
}
35+
}

src-tauri/src/setup/menus/edit.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
use tauri::{
2+
AppHandle, Manager,
3+
menu::{MenuItemBuilder, Submenu, SubmenuBuilder},
4+
};
5+
6+
pub fn create_edit_submenu(app: &AppHandle) -> tauri::Result<Submenu<tauri::Wry>> {
7+
let undo_item = MenuItemBuilder::new("撤销")
8+
.id("undo")
9+
.accelerator("CmdOrCtrl+Z")
10+
.build(app)?;
11+
12+
let redo_item = MenuItemBuilder::new("重做")
13+
.id("redo")
14+
.accelerator("CmdOrCtrl+Shift+Z")
15+
.build(app)?;
16+
17+
let cut_item = MenuItemBuilder::new("剪切")
18+
.id("cut")
19+
.accelerator("CmdOrCtrl+X")
20+
.build(app)?;
21+
22+
let copy_item = MenuItemBuilder::new("复制")
23+
.id("copy")
24+
.accelerator("CmdOrCtrl+C")
25+
.build(app)?;
26+
27+
let paste_item = MenuItemBuilder::new("粘贴")
28+
.id("paste")
29+
.accelerator("CmdOrCtrl+V")
30+
.build(app)?;
31+
32+
let select_all_item = MenuItemBuilder::new("全选")
33+
.id("select_all")
34+
.accelerator("CmdOrCtrl+A")
35+
.build(app)?;
36+
37+
let edit_submenu = SubmenuBuilder::new(app, "编辑")
38+
.item(&undo_item)
39+
.item(&redo_item)
40+
.separator()
41+
.item(&cut_item)
42+
.item(&copy_item)
43+
.item(&paste_item)
44+
.separator()
45+
.item(&select_all_item)
46+
.build()?;
47+
48+
Ok(edit_submenu)
49+
}
50+
51+
pub fn handle_edit_menu_event(app: &AppHandle, event_id: &str) {
52+
let binding = app.webview_windows();
53+
let webview = binding.values().next().unwrap();
54+
55+
match event_id {
56+
"undo" => {
57+
webview.eval("document.execCommand('undo')").ok();
58+
}
59+
"redo" => {
60+
webview.eval("document.execCommand('redo')").ok();
61+
}
62+
"cut" => {
63+
webview.eval("document.execCommand('cut')").ok();
64+
}
65+
"copy" => {
66+
webview.eval("document.execCommand('copy')").ok();
67+
}
68+
"paste" => {
69+
webview.eval("document.execCommand('paste')").ok();
70+
}
71+
"select_all" => {
72+
webview.eval("document.execCommand('selectAll')").ok();
73+
}
74+
_ => {}
75+
}
76+
}

src-tauri/src/setup/menus/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
pub mod app;
2+
pub mod edit;

src-tauri/src/setup/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pub mod app;
22
pub mod menu;
3+
pub mod menus;

0 commit comments

Comments
 (0)