Skip to content
iPlugin

搜索列表

完成聊天关键词输入、筛选、清除、分页与固定导航状态的组合。

做完会得到什么

两行菜单,上排九格展示指南,十条数据分成两页;下排固定保留上一页、搜索和下一页。左键搜索后转到聊天输入,成功返回筛选结果;右键清空,取消则全新打开全部列表。

search-demo.yml配置效果示意 · 非游戏截图
图示状态完整列表 · 第 1 页
窗口槽位 13窗口坐标 4x1面板局部坐标 4x1字符 S

查看完整列表、搜索“说明”的结果,以及无匹配结果的状态。

1. 保存示例

下载 search-demo.yml并放入 plugins/Invero/workspace/;或把下方唯一一份完整配置保存为同名文件。

plugins/Invero/workspace/search-demo.yml
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' refresh

2. 沿着数据走一遍

配置中有三个需要配合的位置:

  1. panels → 第一个面板 → generator.filter:没有 keyword 时保留全部元素;有值时,仅保留标题包含关键词的元素。标题来自同级 generator.elements,用元素变量 element_title 读取。
  2. icons.S.action.left:catch: keyword 保存聊天答案;成功后 reopen: true 携带关键词重开原菜单,让生成器按新词筛选。onCancel 单独 menu open search-demo,因此不携带旧筛选。
  3. 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