🚸 子窗口添加外部打开菜单项

This commit is contained in:
BTMuli
2025-05-20 16:22:28 +08:00
parent d8e14b14de
commit b757c4a432
2 changed files with 27 additions and 7 deletions

View File

@@ -1,6 +1,6 @@
//! @file src/client/menu.rs
//! @desc 客户端菜单模块,负责操作米游社客户端菜单
//! @since Beta v0.7.4
//! @since Beta v0.7.6
use crate::client::utils;
use tauri::menu::{Menu, MenuBuilder, MenuEvent, MenuItemBuilder, Submenu, SubmenuBuilder};
@@ -33,11 +33,14 @@ fn create_utils_menu(app: AppHandle) -> Submenu<Wry> {
MenuItemBuilder::with_id("remove_overlay", "移除遮罩").build(&app).unwrap();
let rotate_window_submenu =
MenuItemBuilder::with_id("rotate_window", "旋转窗口").build(&app).unwrap();
let open_with_webview_submenu =
MenuItemBuilder::with_id("open_with_webview", "外部打开").build(&app).unwrap();
let utils_menu = SubmenuBuilder::new(&app, "工具")
.item(&retry_bridge_submenu)
.item(&mock_touch_submenu)
.item(&remove_overlay_submenu)
.item(&rotate_window_submenu)
.item(&open_with_webview_submenu)
.build()
.expect("failed to create utils_menu");
utils_menu
@@ -68,6 +71,7 @@ pub fn handle_menu_event(window: &Window, event: MenuEvent) {
"mock_touch" => handle_menu_mock_touch(window),
"remove_overlay" => handle_menu_remove_overlay(window),
"rotate_window" => handle_menu_rotate_window(window),
"open_with_webview" => handle_menu_open_with_webview(window),
_ => {}
}
}
@@ -197,3 +201,20 @@ fn handle_menu_rotate_window(app_handle: &Window) {
window.center().unwrap();
window.set_focus().unwrap();
}
// 处理使用 WebView 打开菜单
fn handle_menu_open_with_webview(app_handle: &Window) {
let window = app_handle.get_webview_window("mhy_client");
let execute_js = r#"
javascript:(async function(){
const url = window.location.href;
const arg = {
method: 'teyvat_open_webview',
payload: url,
}
await window.__TAURI__.event.emit('post_mhy_client',JSON.stringify(arg));
})()"#;
if window.is_some() {
window.unwrap().eval(execute_js).ok().unwrap();
}
}

View File

@@ -1,7 +1,7 @@
/**
* @file utils/TGClient.ts
* @desc 负责米游社客户端的 callback 处理
* @since Beta v0.7.3
* @since Beta v0.7.6
*/
import showSnackbar from "@comp/func/snackbar.js";
@@ -242,7 +242,7 @@ class Client {
/**
* @func handleCustomCallback
* @since Beta v0.5.0
* @since Beta v0.7.6
* @desc 处理自定义的 callback
* @param {TGApp.Plugins.JSBridge.Arg<any>} arg - 事件参数
* @returns {Promise<void>} - 返回值
@@ -264,10 +264,6 @@ class Client {
await this.loadJSBridge();
break;
}
case "teyvat_sign_in": {
await event.emit("config_user_sign", arg.payload);
break;
}
case "teyvat_touch": {
const executeJS = `javascript:(() => {
// 鼠标移动监听
@@ -349,6 +345,9 @@ class Client {
await core.invoke("execute_js", { label: "mhy_client", js: executeJS });
break;
}
case "teyvat_open_webview":
window.open(arg.payload);
break;
default:
console.warn(`[customCallback] ${arg.method}`);
}