视图、标签页与继承
视图是菜单中的一个界面。所有视图共用同一个外壳(标签栏、页脚),只有内容会变化。
声明视图
在 views 中,为每个界面添加一个条目:
| 字段 | 作用 |
|---|---|
id | 供 gui:view 和各标签页使用。 |
name | 面包屑导航中使用的标签。缺省时回退为 id。 |
title | 此视图的标题。留空则保留菜单标题。支持 {breadcrumb}、{view} 和 {root}。 |
parentId | 父视图,用于面包屑导航,并让父视图的标签保持高亮。 |
frames | 从框架 id 到布局 id 的显式映射。 |
criteria, viewPermission | 未通过时,该视图无法访问,其标签页也会被隐藏。 |
activeStyle | 标签页在激活状态下的外观:glint、material、customModelData、nameFormat、loreSuffix。 |
在 Open GUI 上,defaultViewId 是最先打开的视图(为空时使用第一个声明的视图)。breadcrumbSeparator 是面包屑各段之间的 MiniMessage 文本,pushHistoryOnViewSwitch 则让 gui:back 在切换标签页后返回到上一个视图。
填充框架
在 frame 布局中,把某个框架的 layoutId 设为 @view。对于当前视图,扩展会按以下顺序查找布局:
- 该视图的
frames中针对该框架id的映射; - 名为
<view id>_<frame id>的布局,例如框架content和视图island对应island_content; - 沿
parentId链重复同样的两种查找。
没有解析到任何内容的框架保持为空。只有菜单的根布局(mainLayoutId)才会解析 @view 框架。
标签页
为标签物品设置 buttonPrefix 为 view:,并将 buttonType 设为视图的 id。点击它即可切换到该视图;当该视图或其任一子视图处于激活状态时,它会采用该视图的 activeStyle。无法访问的视图对应的标签页会被隐藏。
当请求的视图被隐藏时,会使用玩家可以访问的第一个视图。请求的视图不存在时,会被记录为 Unknown view。
继承菜单
baseMenuId 是模板 Open GUI 的条目 id。子菜单会继承其 layoutPool、views、mainLayoutId、defaultViewId 和 size,并且会沿继承链一直追溯到根,因此一个菜单可以继承某个领域模板,而该模板本身又继承全局外壳。子菜单中 id 相同的布局会替换被继承的布局,视图也是如此。storagePool 只从直接父级继承。子菜单上留空的 mainLayoutId 会使用父级的值。
请检查父级是否存在,合并后的池中是否存在每一个 layoutId,以及两个菜单是否互相继承。
实践建议
创建一个带有固定标签框架和一个 @view 内容框架的模板菜单,然后为每个领域创建一个子菜单,只覆盖内容布局。内容布局可以是 simple、scrollable 或 paginated,而无需改动标签栏。