运行视图没有画面时自动补一次载入(进入项目/切项目的运行页空态)

- index.tsx:新增 autoRunPreviewProjectRef 记账,站在运行视图却没有可嵌入预览且可运行时自动补发一次 onPlay,同一个项目只补一次
- index.tsx:showRunView 先记账再发播放,避免点页签时被自动补发重复触发一次
- 用例:新增 runAutoLoadOnEnter(切项目自动补发一次、同项目不重复、点页签只发一次、有活体预览时不补发)
- 文档:PRD 顶栏条款、验收用例 S17 判据、decision-log 同步自动载入口径
This commit is contained in:
2026-10-04 15:56:41 +08:00
parent 0e75d132a7
commit 9eb537c6ff
5 changed files with 214 additions and 4 deletions
@@ -64,7 +64,7 @@
| 步骤 | 操作 | 期望结果 | 对应 PRD 条款 | 怎么判"过了" | 已知例外 / 未做项 |
| ---------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **S16** 版本切换 | 运行模块**右上角**版本选择器 → 切到另一版本 | 触发钮显示当前版本;切换后资源卡「当前使用」高亮与 **@ 面板「当前版本素材」同步更新**,并重载当前预览 | L165、L190、L324、L530;#309 C7 | `aria-label="当前版本:<label>"`、菜单 `role="listbox" aria-label="切换游戏版本"`、选项 `role="option" aria-selected`;`[data-used-by-current-version="true"]` 集合随切换变化 | **C7 只做记录层 + UI 层**;"历史版本独有资源集合被运行时按版本加载"需新增版本化资源解析机制,**本轮未实现**;版本卡卡面**不渲染**「项目修订 / 父版本」文字 |
| **S17** 播放 | 顶部「运行」页签(页签前带 ▶ 图标) | 切到运行视图并启动本地预览;**不再弹 `game.run_local` 二次确认**;预览占满中央可用区、无 iframe 滚动条 | L16、L71–72、L122、L493 | `data-resource-view-state` 变为 `undefined`;`await window.__TAURI__.core.invoke('get_local_game_preview_status',{projectPath})` → `status==='running'` 且有 `url`(形如 `http://127.0.0.1:<随机端口>/`) | 播放并进「运行」页签,**没有独立的「播放」按钮**:不可运行时(`runAvailable === false`)页签不置灰,点了既不切视图也不发播放请求,只出提示「首个可运行原型尚未完成,运行视图暂不可用」(与 PRD L165 表述不同,见 7.4) |
| **S17** 播放 | 顶部「运行」页签(页签前带 ▶ 图标) | 切到运行视图并启动本地预览;**不再弹 `game.run_local` 二次确认**;预览占满中央可用区、无 iframe 滚动条;**站在运行视图却没有画面时(例如从别的项目切过来)自动补发一次载入**,同一个项目不重复补发 | L16、L71–72、L122、L493 | `data-resource-view-state` 变为 `undefined`;`await window.__TAURI__.core.invoke('get_local_game_preview_status',{projectPath})` → `status==='running'` 且有 `url`(形如 `http://127.0.0.1:<随机端口>/`) | 播放并进「运行」页签,**没有独立的「播放」按钮**:不可运行时(`runAvailable === false`)页签不置灰,点了既不切视图也不发播放请求,只出提示「首个可运行原型尚未完成,运行视图暂不可用」(与 PRD L165 表述不同,见 7.4) |
| **S17a** 刷新运行画面 | 运行画面右下角「刷新运行画面」(全屏那一枚左边) | 重新载入游戏页面:游戏预览不是 vite dev 的实时刷新,改完代码要看到新一版只有重载页面这一条路(此前只能切到资源管理再切回来) | L134 | `iframe` 换成新 DOM 节点且 `src` 不变(跨域 iframe 里 `contentWindow.location.reload()` 会被浏览器挡掉,实现走 React `key` 换元素身份);点击同时向宿主确认一次预览还活着(`onPlay` 命中活体预览不重启服务)。没有活预览时**不渲染**这枚按钮 | 全屏里照旧可用(两枚按钮都在画面那一格内);只重载页面,不重跑构建 |
| **S18** 停止与退出收尾 | 聊天侧工程操作组点「停止预览」;或关闭客户端 | 预览停止、manifest `preview` 对齐 `stopped`(清 url/port);退出时也统一收尾 | L165 | 停止后 `get_local_game_preview_status` 非 running;`.agent/logs/preview.log` 追加 `stopped`;退出后重开同一项目应落回 `resource-overview` | 停止按钮**不在**运行视图工具栏,在工作台右侧工程操作组;退出失败会打 `preview.gui_exit.stop_failed` |