跳到主要内容

视图、标签页与继承

视图是菜单中的一个界面。所有视图共用同一个外壳(标签栏、页脚),只有内容会变化。

声明视图​

在 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。对于当前视图,扩展会按以下顺序查找布局:

  1. 该视图的 frames 中针对该框架 id 的映射;
  2. 名为 <view id>_<frame id> 的布局,例如框架 content 和视图 island 对应 island_content;
  3. 沿 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,而无需改动标签栏。