8个版本
新版本 0.2.5 | 2024年8月12日 |
---|---|
0.2.4 | 2024年7月22日 |
0.1.1 | 2024年7月1日 |
在#focus中排名65
每月下载530次
用于focusable
10KB
130 行
Crate Focusable
GitHub 仓库 · API 文档 · 示例 · 变更日志 · 贡献
用于管理应用程序中可聚焦元素的库。
状态:实验性 - 预期会有破坏性更改。
此crate实现了一种通用的焦点处理方法,适用于任何应用程序。这专门设计用于在Ratatui中添加可聚焦行为小部件,但不依赖于它。
文档可在docs.rs中找到。
用法
cargo add focusable
然后为您的类型实现或派生Focus
和FocusContainer
特性。
受iced_focus和rat-focus的启发。
示例
use focusable::{Focus, FocusContainer};
#[derive(Focus)]
struct Button {
is_focused: bool,
}
#[derive(Focus)]
struct TextBox {
is_focused: bool,
}
#[derive(Clone, Focus)]
struct Label;
#[derive(FocusContainer)]
struct App {
children: Vec<Box<dyn Focus>>,
}
let label = Box::new(Label);
assert!(!label.can_focus(), "Label should not be focusable");
let button = Box::new(Button { is_focused: false });
assert!(button.can_focus());
let text_box = Box::new(TextBox { is_focused: false });
assert!(text_box.can_focus());
let mut app = App {
children: vec![label.clone(), button, label, text_box],
};
app.focus_first();
assert!(app.children[1].is_focused()); // skip the first label
app.focus_next();
assert!(app.children[3].is_focused()); // skip the second label
许可证
版权所有 (c) 2024 Josh McKinney
本项目采用以下任一许可证:
- Apache License,版本 2.0 (LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确声明,否则您有意提交以包含在作品中的任何贡献,根据Apache-2.0许可证定义,将按上述方式双许可,不附加任何额外条款或条件。
请参阅 CONTRIBUTING.md.
依赖项
~0.6–1.1MB
~23K SLoC