#widgets #ui #sketch #whiskers #egui #parameters #traits

whiskers-widgets

whiskers的动态UI子系统

2个版本

0.4.0 2024年1月21日
0.4.0-rc.02024年1月20日

#1482Rust模式


用于 2 crate

MIT 许可证

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 的摘录,它支持 f64i32 等数值类型。

# 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