3 个不稳定版本
0.22.2 | 2024 年 7 月 3 日 |
---|---|
0.21.2 | 2024 年 6 月 15 日 |
0.21.0 | 2024 年 6 月 10 日 |
在 命令行界面 中排名第 756
每月下载量 177 次
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>
构建。- 对任何类型的事件都开放
- 限定符可以是许多东西
- 允许使用类型状态模式,为此预定义的类型有
FocusKey
和MouseOnly
,但其他库定义了自己的(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