搜索列表
完成聊天关键词输入、筛选、清除、分页与固定导航状态的组合。
做完会得到什么
两行菜单,上排九格展示指南,十条数据分成两页;下排固定保留上一页、搜索和下一页。左键搜索后转到聊天输入,成功返回筛选结果;右键清空,取消则全新打开全部列表。
图示状态完整列表 · 第 1 页
搜索
左键输入关键词
右键清除筛选
窗口槽位 13窗口坐标 4x1面板局部坐标 4x1字符 S
查看完整列表、搜索“说明”的结果,以及无匹配结果的状态。
1. 保存示例
下载 search-demo.yml并放入 plugins/Invero/workspace/;或把下方唯一一份完整配置保存为同名文件。
menu:
title: '&8指南搜索'
rows: 2
min-interact-interval: 600
panels:
- layout:
- ' '
- '<###S###>'
generator:
source: custom
filter: 'any [ ctx without keyword check &element_title has &keyword ]'
elements:
- title: '服务器规则'
- title: '常用命令'
- title: '玩法说明'
- title: '世界介绍'
- title: '物品说明'
- title: '活动日历'
- title: '商店指南'
- title: '领地说明'
- title: '组队说明'
- title: '联系管理'
output:
material: BOOK
name: '&f{{&element_title}}'
action: "mmsg '&a已选择:{{&element_title}}'"
icons:
'#':
material: GRAY_STAINED_GLASS_PANE
name: ' '
'<':
material: GRAY_STAINED_GLASS_PANE
name: '&7上一页'
sub:
- if: 'not page isFirst'
material: ARROW
name: '&f上一页'
action: |-
page previous
icon by '<' refresh
icon by '>' refresh
'>':
material: GRAY_STAINED_GLASS_PANE
name: '&7下一页'
sub:
- if: 'not page isLast'
material: ARROW
name: '&f下一页'
action: |-
page next
icon by '<' refresh
icon by '>' refresh
S:
material: NAME_TAG
name: '&e搜索'
lore:
- '&7左键输入关键词'
- '&7右键清除筛选'
sub:
- if: 'ctx has keyword'
name: '&e搜索:{{&keyword}}'
action:
left:
catch: keyword
cancel:
- cancel
- exit
reopen: true
beforeInput: "mmsg '&e输入关键词;输入 cancel 返回全部列表'"
afterInput: "mmsg '&a搜索词:{{&keyword}}'"
onCancel: 'menu open search-demo'
right: |-
ctx del keyword
regenerate
icon by '<' refresh
icon by '>' refresh
icon by 'S' refresh2. 沿着数据走一遍
配置中有三个需要配合的位置:
panels → 第一个面板 → generator.filter:没有keyword时保留全部元素;有值时,仅保留标题包含关键词的元素。标题来自同级generator.elements,用元素变量element_title读取。icons.S.action.left:catch: keyword保存聊天答案;成功后reopen: true携带关键词重开原菜单,让生成器按新词筛选。onCancel单独menu open search-demo,因此不携带旧筛选。icons.S.action.right:删除会话关键词,regenerate应用原始筛选并回第一页,然后刷新<、>、S三个固定按钮。这里不重新获取外部数据,只重建已有十条元素的显示。
过滤表达式中的通用 any、check 与按钮条件中的 not 只在 TabooLib Kether 列表查询,它们不是额外注册的 Invero 根语句。要替换搜索数据,修改 generator.elements 的 title,不要另外复制整份菜单。
3. 打开并完成操作
/invero menu reload
/invero menu open search-demo| 操作 | 预期可见结果 |
|---|---|
| 初次打开 | 上排显示前九项;上一页为灰色,下一页为箭头 |
| 下一页,再上一页 | 第二页只有“联系管理”;两端导航同步改变可用状态,返回时恢复前九项 |
| 左键搜索,聊天输入“说明” | 返回玩法、物品、领地、组队四项;搜索名显示“搜索:说明”,两端都为灰色 |
| 右键搜索 | 删除关键词,恢复十项并回第一页,按钮名恢复“搜索” |
| 输入没有匹配的词 | 重开后上排为空,固定搜索和清除仍可操作 |
输入 cancel 或 exit | 取消当前输入,用新会话返回未筛选的十项 |
示例的点击间隔是 600 毫秒;regenerate 自己也有 500 毫秒限制,因此不要连续快速点击来判断刷新是否有效。
4. 为什么要单独刷新导航
page next / page previous 只翻列表页,按钮子状态不会自动跟着重新选择。两个箭头的动作在翻页后分别 icon by '<' refresh、icon by '>' refresh,保证边界显示正确;清除筛选时额外刷新 S。
不要把这些语句统一改成 icons refresh:生成器会回第一页,固定导航也不是逐个刷新的同一条路径。这个示例只有一个生成器。改成多面板时,翻页要核对所选上下文;regenerate 取同级第一个生成器,不能只加一条 panel select 就假定会独立筛选第二个生成器。
Last updated on