#egui #back-end #winit #windowing #input #user #ui

egui_window_winit

使用 Winit 的 egui 窗口后端

2 个不稳定版本

0.4.0 2023 年 6 月 3 日
0.3.0 2022 年 9 月 13 日
0.2.0 2022 年 9 月 8 日
0.1.0 2022 年 8 月 25 日

#60 in #winit

MIT 许可证

53KB
735

项目已放弃

我最近不太感兴趣即时模式的 GUI,所以不得不停止投入时间在这个项目上。如果你想要,可以把它分叉。

checkmate

Egui 工具包

支持 egui 的 crate

Egui 是一个小的 UI 库,你可以将其嵌入到你的 App 中。它需要 App 提供如鼠标/键盘等输入。一旦它处理完输入,egui 就会提供你需要在显示上绘制的很多数据。

egui_backend 是一个 crate,它将输入需求抽象为 WindowBackend trait,并将输出绘图内容抽象为 GfxBackend。这允许你为 winit、glfw、wgpu、vulkan 等特定库实现这些 trait。任何用户都可以轻松地重用这些后端。

大多数 App 开发者只需要关注实现 UserApp trait 并选择他们想要使用的后端。如果你不使用高级功能,你只需用几行代码就可以交换后端。

// This is the user struct where we can store any data we want along with the window and gfx backends.
pub struct App {
    pub frame_count: usize,
    pub egui_context: egui::Context,
    pub glow_backend: GlowBackend,
    pub glfw_backend: GlfwBackend,
}
// we need to implement this trait for our struct
impl UserApp for App {
    // we can make it generic, but didn't want to complicate the example.
    type UserGfxBackend = GlowBackend;
    type UserWindowBackend = GlfwBackend;
    // The function which is used by some default fn impl of this trait
    // allows us access to window/gfx backends mutably at the same time
    fn get_all(
        &mut self,
    ) -> (
        &mut Self::UserWindowBackend,
        &mut Self::UserGfxBackend,
        &egui::Context,
    ) {
        (
            &mut self.glfw_backend,
            &mut self.glow_backend,
            &self.egui_context,
        )
    }
    // here, you put your gui code, which will be run every frame.
    fn gui_run(&mut self) {
        let egui_context = self.egui_context.clone();
        egui::Window::new("egui window").show(&egui_context, |ui| {
            ui.label(format!("frame number: {}", self.frame_count));
        });
    }
}

pub fn fake_main() {
    // create window backend with default config. here you can set initial flags like transparency or selecting opengl vs vulkan etc..
    let mut glfw_backend = GlfwBackend::new(Default::default(), BackendConfig::default());
    // creating gfx backend. It uses Window backend to load things like fn pointers or window handle for swapchain etc.. behind the scenes.
    let glow_backend = GlowBackend::new(&mut glfw_backend, Default::default());
    // initialize app state
    let app = App {
    frame_count: 0,
    egui_context: Default::default(),
    glow_backend,
    glfw_backend,
    };
    // enter event loop. Now, the `gui_run` method from trait impl will be called every frame. read docs for more info
    <App as UserApp>::UserWindowBackend::run_event_loop(app);
}

依赖关系

~7–19MB
~247K SLoC