#macro-derive #egui #ui #data #create #bindings

enum2egui

enum2egui是一个Rust derive宏,可以从任意数据结构创建一组egui UI数据绑定。支持egui v0.28.1

14次发布

0.3.4 2024年8月1日
0.3.3 2024年8月1日
0.2.0 2024年2月26日
0.1.8 2024年1月4日
0.1.4 2023年8月10日

#305数据结构

Download history 19/week @ 2024-04-29 29/week @ 2024-05-06 15/week @ 2024-05-13 26/week @ 2024-05-20 9/week @ 2024-05-27 20/week @ 2024-06-03 25/week @ 2024-06-10 8/week @ 2024-06-17 30/week @ 2024-06-24 423/week @ 2024-07-29 15/week @ 2024-08-05 69/week @ 2024-08-12

507 每月下载量

MIT 许可证

14KB
171

enum2egui

github crates.io docs.rs

enum2egui 是一个Rust derive宏,可以从任意结构体和枚举创建egui UI。这对于生成可以在egui UI中修改和显示的数据绑定非常有用。

DefaultDisplay 是必需的。推荐使用 enum2str 在枚举上派生 Display

用法

将以下内容添加到您的 Cargo.toml

enum2egui = "0.3.4" # supports egui 0.28.1

示例

声明您的数据

use enum2egui::{Gui, GuiInspect};

#[derive(Gui, EnumStr, Debug, Clone, Default, serde::Deserialize, serde::Serialize, PartialEq)]
pub enum Color {
    #[default]
    Red,
    Green,

    #[enum2str("Custom")]
    Custom(u8, u8, u8),

    NamedCustom {
        red: u8,
        blue: u8,
        green: u8,
        metadata: Metadata,
    },

    #[enum2egui(skip)]
    SkippedGreen,

    #[enum2egui(skip)]
    #[enum2str("Skipped Custom")]
    SkippedCustom(u8, u8, u8),

}

#[derive(Gui, Clone, serde::Deserialize, serde::Serialize, Default)]
pub struct Data {
    string: String,
    i8: i8,
    i16: i16,
    i32: i32,
    i64: i64,
    bool: bool,
    u8: u8,
    u16: u16,
    u32: u32,
    f32: f32,
    f64: f64,
    nested_struct: SubData,
    unnamed_struct: TupleStruct,
    primary_color: Color,
    secondary_color: Color,
    optional: Option<SubData>,
}

#[derive(Gui, Clone, serde::Deserialize, serde::Serialize, PartialEq)]
pub struct TupleStruct(u8, u32, String, SubData);

impl Default for TupleStruct {
    fn default() -> Self {
        Self(3, 24, "Hello!".to_string(), SubData::default())
    }
}

#[derive(Gui, Clone, Default, serde::Deserialize, serde::Serialize, PartialEq, Debug)]
pub struct Metadata {
    message: String,
}

#[derive(Gui, Clone, Default, serde::Deserialize, serde::Serialize, PartialEq)]
pub struct SubData {
    value: String,
    number: u32,
}

然后使用 GuiInspect::ui(..)GuiInspect::ui_mut() 进行渲染。例如,使用 eframe

impl eframe::App for DemoApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        let Self { data } = self;

        egui::CentralPanel::default().show(ctx, |ui| {
            // Read-Only UI
            data.ui(ui):

            // Mutable UI
            data.ui_mut(ui);
        });
    }
}

image

依赖关系

~6–11MB
~117K SLoC