From 091a1c76e93d35beed5c391057ca5766894ba9a1 Mon Sep 17 00:00:00 2001 From: unanmed <1319491857@qq.com> Date: Sat, 14 Jun 2025 16:07:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20selectSave=20=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client-modules/src/render/ui/save.tsx | 49 ++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/packages-user/client-modules/src/render/ui/save.tsx b/packages-user/client-modules/src/render/ui/save.tsx index fc647d3..6e40e0a 100644 --- a/packages-user/client-modules/src/render/ui/save.tsx +++ b/packages-user/client-modules/src/render/ui/save.tsx @@ -1,6 +1,11 @@ import { ElementLocator, IWheelEvent } from '@motajs/render-core'; import { DefaultProps } from '@motajs/render-vue'; -import { SetupComponentOptions, UIComponentProps } from '@motajs/system-ui'; +import { + GameUI, + IUIMountable, + SetupComponentOptions, + UIComponentProps +} from '@motajs/system-ui'; import { defineComponent } from 'vue'; import { Page } from '../components'; import { useKey } from '../use'; @@ -12,6 +17,8 @@ export interface SaveProps extends UIComponentProps, DefaultProps { export type SaveEmits = { /** 点击存档时触发 */ emit: (index: number) => void; + /** 手动点击退出时触发 */ + exit: () => void; }; const saveProps = { @@ -42,3 +49,43 @@ export const Save = defineComponent( }, saveProps ); + +export const SaveUI = new GameUI('save', Save); + +/** + * 打开存读档界面并让用户选择一个存档。如果用户手动关闭了存档界面,返回 -1,否则返回用户选择的存档索引。 + * 参数参考 {@link SaveProps},事件不可自定义。 + * + * 使用示例: + * ```ts + * const index = await selectSave(props.controller, [0, 0, 416, 416]); + * if (index === -1) { + * // 如果用户未选择存档,而是关闭了存档。 + * } else { + * // 用户选择了一个存档。 + * } + * ``` + * @param controller 在哪个控制器上打开 + * @param loc 存读档界面的坐标 + * @param props 传递给存读档界面的参数 + * @returns + */ +export function selectSave( + controller: IUIMountable, + loc: ElementLocator, + props?: SaveProps +) { + return new Promise(res => { + const instance = controller.open(SaveUI, { + loc, + ...props, + onEmit: index => { + controller.close(instance); + res(index); + }, + onExit: () => { + res(-1); + } + }); + }); +}