8 个版本
0.10.5 | 2024年7月3日 |
---|---|
0.10.4 | 2024年6月24日 |
0.10.0 | 2024年5月30日 |
0.9.1 | 2024年5月29日 |
#765 在 命令行界面 中
每月 23 次下载
在 6 个 crate(3 直接) 中使用
52KB
869 行
焦点处理
此 crate 通过为每个小部件的状态添加 FocusFlag 来工作。
Focus 用于收集 FocusFlag 列表。它只按小部件导航的顺序持有 FocusFlag 的引用。它总是重新构建,这样任何与状态相关的顺序/小部件集的变化都可以简单地编码。
Focus::next()/Focus::prev() 执行实际导航。它们更改活动 FocusFlag。此外,还有用于更改 focus-lost 和 focus-gained 的字段。
小部件应为其状态实现 HasFocusFlag,这使得编码更容易。
事件处理
事件处理为 crossterm 实现,仅使用 Tab/Backtab。
Focus 为事件处理实现了 HandleEvent。
如果您愿意,也可以使用函数 handle_focus()
。
这些函数在有关焦点更改的任何内容更改时返回 Outcome::Changed。
鼠标
当然存在鼠标支持。
特质 HasFocusFlag 有两种方法来支持这一点
-
area() - 返回应响应用户点击的 widget 区域。
-
z_areas() - 扩展 area()。Widgets 可以返回多个 ZRect 以进行鼠标交互,并且每个 ZRect 都有一个额外的 z-index 来处理重叠区域。这些可能发生在 widget 想要在其他 widget 上渲染弹出/覆盖层时。
此方法默认返回空值,这对大多数 widget 来说已经足够好。
如果使用 z_areas,则 area 必须返回所有 Rect 的并集。Area 用作快速过滤器,z_areas 用作详细信息。
宏
有宏 on_lost、on_gained 和 match_focus,它们简化了 focus-flags 的使用,提供了类似于 match 的语法。
组合
也支持组合小部件。
使用 Focus::new_container()
创建容器中的小部件列表。这需要一个额外的 FocusFlag,用于生成每个小部件的 FocusFlag 摘要。这样,容器小部件就能回答“我的小部件中是否有获得焦点?”的问题。容器也可以有自己的区域。如果容器区域被点击但不是某个特定的小部件,容器中的第一个小部件将获得焦点。
Lost/Gained 也可以应用于整个容器。
特性 HasFocus 表示存在这种行为。Focus 有一个 add_container()
方法来实现这一点。
There is a lighter version of a container too.
`Focus::new_grp()` creates a list of widgets, but without a container
area.
Focus 也可以处理递归容器。
HasFocusFlag
除了前面提到的方法之外,还有
- navigable() - 小部件可以表示它不能通过键盘导航访问。
- is_focused(), lost_focus(), gained_focus() - 这些在编写应用程序时很有用。
依赖关系
~6–12MB
~120K SLoC