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 直接) 中使用

MIT/Apache

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_loston_gainedmatch_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