2个版本
0.4.0 | 2024年1月21日 |
---|---|
0.4.0-rc.0 | 2024年1月20日 |
#1482 在 Rust模式
用于 2 crate
16KB
219 行
whiskers-widgets
是 vsvg 项目 的一部分。
这是什么?
这个crate实现了whiskers crate用于显示草图参数UI的UI小部件机制。
lib.rs
:
概述
此crate实现了whiskers crate用于显示草图参数UI的UI小部件机制。主入口点是trait@Widget
trait以及定义在whiskers-derive
中的相关宏。
此crate独立于主crate,以便其他crate(包括vsvg
crate)可以为它们自己的类型实现trait@Widget
trait。
实现Widget
trait
对于每种支持的草图参数类型T
,必须存在一个实现Widget<T>
并且已通过register_widget_ui!
宏注册的小部件类型。此模块包含支持此机制所需的特性和宏,以及基本类型的widget。
例如,让我们考虑prim@bool
类型
#[derive(Default)]
pub struct BoolWidget;
impl whiskers_widgets::Widget<bool> for BoolWidget {
fn ui(&self, ui: &mut egui::Ui, label: &str, value: &mut bool) -> egui::Response {
ui.horizontal(|_| {});
ui.checkbox(value, label)
}
}
whiskers_widgets::register_widget_ui!(bool, BoolWidget);
BoolWidget
类型实现了 Widget<bool>
特性,该特性要求使用 Widget::ui
方法,并且使用 crate::register_widget_ui!
宏进行注册。注意,Widget::ui
方法在 2 列的 egui::Grid
上下文中调用,因此它必须包含正好两个顶级 UI 调用,其中第一个通常是标签,第二个是实际的交互式小部件。在复选框的情况下,标签已经内嵌在 UI 小部件中,我们留出第一列空白。
BoolWidget
类型由 crate
包提供,但可以使用相同的模式为自定义类型实现自定义小部件。
配置小部件
许多小部件支持额外的配置选项,可以使用 whiskers_derive::Sketch
宏的 #[param(...)]
属性来设置。这是通过在类型上使用构建器模式来完成的。例如,这里是一个 NumericWidget
的摘录,它支持 f64
和 i32
等数值类型。
# use egui::emath::Numeric;
# use core::f64;
#[derive(Default)]
pub struct NumericWidget<T: Numeric> {
step: Option<T>,
slider: bool,
/* ... */
}
impl<T: Numeric> NumericWidget<T> {
pub fn step(mut self, step: T) -> Self {
self.step = Some(step);
self
}
pub fn slider(mut self, slider: bool) -> Self {
self.slider = slider;
self
}
}
impl<T: Numeric> whiskers_widgets::Widget<T> for NumericWidget<T> {
/* ... */
# fn ui(&self, ui: &mut egui::Ui, label: &str, value: &mut T) -> bool { todo!(); }
}
whiskers_widgets::register_widget_ui!(f64, NumericWidget<f64>);
/* ... */
# fn main() {}
现在让我们考虑一个假设的草图
#[sketch_app]
#[derive(Default)]
struct MySketch {
#[param(slider, step = 0.1)]
irregularity: f64,
}
基于 #[param(...)]
属性,whiskers_derive::Sketch
自动生成相应的构建器模式调用。
whiskers_widgets::NumericWidget::<f64>::default().slider(true).step(0.1);
请注意,当没有为某个键(如这里的 slider
)提供值时,假定布尔值为 true
。
依赖关系
~6–11MB
~112K SLoC