#ratatui #event-loop #input #input-event

rat-salsa

ratatui 小部件和 crossterm 事件循环

3 个不稳定版本

0.22.2 2024 年 7 月 3 日
0.21.2 2024 年 6 月 15 日
0.21.0 2024 年 6 月 10 日

命令行界面 中排名第 756

Download history 104/week @ 2024-06-04 268/week @ 2024-06-11 14/week @ 2024-06-18 113/week @ 2024-07-02 5/week @ 2024-07-09

每月下载量 177

MIT/Apache

50KB
954 行(不包括注释)

rat-salsa

ratatui 和 crossterm 的应用程序事件循环。

配套 Crates

rat-salsa 仅涵盖事件循环和应用构建。

还有更多

  • rat-widget 小部件库。+focus-handling +scrolling +ratatui 包装器
    • 按钮
    • 日历
    • 日期输入,数字输入
    • 文本输入
    • 带有掩码的文本输入
    • 文本区域
    • 菜单行
    • 表格
    • ... 更多即将到来 ...
  • rat-scrolled 小部件滚动,状态小部件。视口。
    • 滚动小部件 + 支持特性
    • Widget/StatefulWidget -> View 和 Viewport 小部件 --> 由 rat-widget 重新导出
  • rat-input 没有附加 focus-handling 和滚动特性的小部件的基础实现。应与任何现有的 ratatui 应用兼容。可以连接到您自己的 focus-handling。小部件在有用的情况下具有内置的滚动,只是缺少来自 rat-scrolled 的 trait 实现。-> 由 rat-widget 包装并重新导出
  • rat-ftable 表格实现,与 ratatui 表格的 API 几乎兼容。
    • 添加了 TableData 和 TableDataIter 特性,允许它只渲染可见单元格。单个单元格的渲染完全由这些特性完成,因此您可以渲染任何内容。已经尝试过使用 1,000,000 行,并且工作得很好。它还支持在有些限制的情况下渲染无限迭代器。
    • 可插入的选择模型。内置的有 NoSelection、RowSelection、RowSetSelection 和 CellSelection。
    • 目前,它具有按列横向滚动。计划扩展到按字符滚动。
    • 还有一个 FEditTable 小部件,它支持表格数据的内联编辑。
  • rat-focus 定义了 rat-widget 中使用的焦点处理原语。
    • 可以从子小部件/容器等小部件收集数据。
    • 可以支持具有集体焦点状态的 widget 组。
    • 很容易添加到现有小部件:向您的状态添加 FocusFlag 并实现 HasFocusFlag 特性。
    • 丢失和获得标志用于逻辑。
  • rat-event 定义了上述所有中使用的原始事件处理。
    • 围绕 HandleEvent<EventType, Qualifier, Outcome> 构建。
      • 对任何类型的事件都开放
      • 限定符可以是许多东西
        • 允许使用类型状态模式,为此预定义的类型有 FocusKeyMouseOnly,但其他库定义了自己的(DoubleClick, EditKeys, ReadOnly)
        • 如果需要,应用程序可以覆盖每个小部件的键绑定。
        • 如果需要,可以作为上下文参数使用。
      • 事件处理的结果是开放的,允许小部件返回它们需要的内容。
    • 存在一个非常基本的类型 Outcome
      • NotUsed - 事件未被识别。
      • Unchanged - 事件被识别,但没有变化。
      • Changed - 事件被识别,状态已更改。请重绘。鼓励其他结果类型提供与此类型的转换。这样可以让用户的生活更轻松,因为一切只是通过 .into() 就可以完成 :)
    • 一个控制流宏 flow!,允许在找到责任小部件后立即中断事件处理。
  • rat-salsa 通过对 run_tui() 的单次函数调用实现事件循环。
    • 定义了 AppWidget 和 AppEvents 特性,以反映 Widget/StatefulWidget 和 HandleEvent,并添加了应用程序上下文。
    • 计时器支持和后台任务

run-tui

此函数运行事件循环。

  • app - 处理整个应用程序的主要 AppWidget。
  • global - 全局状态内容。在这里放置您的配置、主题、日志、数据库连接等。
  • state - 应用程序小部件的初始状态。
  • cfg - 对事件循环的一些调整。

轮询所有事件源并确保每个源都享有平等的时间共享,如果其中之一开始泛滥。默认源是计时器、Crossterm 和任务结果。您可以将自己的添加到 cfg。

控制

事件处理的结果类型

  • Continue - 轮询下一个事件。
  • Break - 对主循环没有作用,但可以与 flow_ok! 一起使用以提前从事件处理中退出。
  • Repaint - 渲染应用程序。
  • Action - 调用动作处理器。
  • Quit - 退出应用程序。

在函数返回后立即处理事件的结果,在轮询新事件之前。这样,一个动作可以触发另一个动作,该动作可以触发重绘,而无需其他事件介入。

如果您需要从事件处理中返回多个结果,可以将它们传递给 AppContext/RenderContext::queue()。队列中的事件按顺序处理,事件处理器的返回值最后。如果返回了错误,队列中发送的所有内容都将执行。

AppWidget 和 AppEvents

AppWidget 是基于 StatefulWidget 设计的。

此外,它还获得

  • ctx - RenderContext

AppEvents 将当前支持的事件处理器打包在一起。

  • init - 在应用程序启动时调用,在第一次重绘之前。
  • timer - 应用程序计时器
  • crossterm - crossterm 事件。
  • action - 应用程序提供的动作。
  • error - 错误处理

每个都获得一些事件和一个 AppContext。

AppContext 和 RenderContext

AppContext 和 RenderContext 不相同,后者包含渲染特定信息,在一般情况下不可用。

AppContext 包含

  • 字段 g 用于全局状态数据。

  • add_timer(),remove_timer()

  • spawn() - 运行给定的闭包并返回一个与工作线程共享以支持基本取消支持的 Arc<Mutex<bool>>

  • queue() - 将事件处理额外的结果入队。

      Remark: The main reason for this is focus-handling.
              When handling the click to focus a widget, the same
              click event should interact with the widget. This gives
              two results from event-handling. The focus change wants
              a Control::Repaint, and the widget might have its own 
              ideas. So now you queue() the focus result and go on
              with event-handling. 
    

RenderContext 包含

  • 字段 g 用于全局状态数据。
  • timeout - 当重绘由重绘定时器触发时,这是发生的超时。
  • 帧计数器
  • 帧区域
  • 显示光标的光标位置。

示例

这里没有示例,因为这会太多。示例目录包含 minimal.rs 和 showcase.rs。

依赖项

~15–22MB
~205K SLoC