4 个版本

0.1.3 2024 年 5 月 31 日
0.1.2 2024 年 5 月 31 日
0.1.1 2024 年 5 月 31 日
0.1.0 2024 年 5 月 31 日

#641GUI

每月 39 次下载

MIT 许可证

35KB

egui_xml

github Latest Version Documentation License


egui_xml 是一个强大的 Rust crate,旨在通过提供一个方便的宏从 XML 文件加载用户界面布局来增强 egui 库。这个 crate 通过允许开发者以结构化和可读的 XML 格式定义复杂布局,简化了 UI 开发过程。

主要功能

  • 基于 XML 的布局定义:以清晰和结构化的 XML 格式定义您的 UI 布局,使其更容易可视化和管理复杂界面。
  • 动态值插入:使用简单的语法无缝地将动态值和条件插入到您的 XML 布局中。
  • 使用来自 egui_extras 的 StripBuilder:利用自定义面板和条带有效地组织您的 UI 元素,支持相对、精确、初始和剩余尺寸。
  • load_layout_file 宏:从文件加载布局

示例用法

以下是一个示例,展示如何使用 egui_xml crate 定义 UI 布局

use eframe::egui;
use egui::{Rounding, Ui};
use egui_xml::load_layout;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions {
        ..Default::default()
    };
    eframe::run_native(
        "My egui App",
        options,
        Box::new(|_cc| Box::<MyApp>::new(MyApp)),
    )
}

struct MyApp;

fn color_background(ui: &mut Ui, color: egui::Color32) {
    ui.painter()
        .rect_filled(ui.available_rect_before_wrap(), Rounding::same(5.0), color);
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default().show(ctx, |ui| {
            load_layout!(
                <Strip direction="west">
                    <Panel size="relative" value="0.3">
                        color_background(ui, egui::Color32::from_rgb(0, 0, 255));
                    </Panel>
                    <Panel size="remainder">
                        <Strip direction="north">
                            <Panel size="relative" value="0.3">
                                color_background(ui, egui::Color32::from_rgb(0, 255, 255));
                            </Panel>
                            <Panel size="remainder">
                                color_background(ui, egui::Color32::from_rgb(255, 0, 255));
                            </Panel>
                        </Strip>
                    </Panel>
                </Strip>
            );
        });
    }
}

展开

use eframe::egui;
use egui::{Rounding, Ui};
use egui_xml::load_layout;

fn main() -> Result<(), eframe::Error> {
    let options = eframe::NativeOptions {
        ..Default::default()
    };
    eframe::run_native("My egui App", options, Box::new(|_cc| Box::<MyApp>::new(MyApp)))
}

struct MyApp;

fn color_background(ui: &mut Ui, color: egui::Color32) {
    ui.painter()
        .rect_filled(ui.available_rect_before_wrap(), Rounding::same(5.0), color);
}

impl eframe::App for MyApp {
    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::CentralPanel::default()
            .show(
                ctx,
                |ui| {
                    let mut macro_strip_builder = egui_extras::StripBuilder::new(ui);
                    macro_strip_builder = macro_strip_builder
                        .size(egui_extras::Size::relative(0.3));
                    macro_strip_builder = macro_strip_builder
                        .size(egui_extras::Size::remainder());
                    let macro_strip_response = macro_strip_builder
                        .horizontal(|mut strip| {
                            strip
                                .cell(|ui| {
                                    color_background(ui, egui::Color32::from_rgb(0, 0, 255));
                                });
                            strip
                                .cell(|ui| {
                                    let mut macro_strip_builder = egui_extras::StripBuilder::new(
                                        ui,
                                    );
                                    macro_strip_builder = macro_strip_builder
                                        .size(egui_extras::Size::relative(0.3));
                                    macro_strip_builder = macro_strip_builder
                                        .size(egui_extras::Size::remainder());
                                    let macro_strip_response = macro_strip_builder
                                        .vertical(|mut strip| {
                                            strip
                                                .cell(|ui| {
                                                    color_background(ui, egui::Color32::from_rgb(0, 255, 255));
                                                });
                                            strip
                                                .cell(|ui| {
                                                    color_background(ui, egui::Color32::from_rgb(255, 0, 255));
                                                });
                                        });
                                });
                        });
                },
            );
    }
}

在这个示例中,load_layout! 宏接收一个创建 UI StripBuilder 代码的 XML 字符串。可以直接将动态值和条件注入到 XML 中,从而实现灵活和动态的 UI 创建过程。入门指南

要开始使用 egui_xml,将 crate 添加到您的 Cargo.toml

[dependencies]
egui_xml = "0.1"
egui = "0.27"

然后,您可以在 eframe 应用程序中使用 load_layout! 宏开始定义您的 UI 布局。

结论

egui_xml 是一个优秀的工具,可以帮助开发者有效地利用 XML 创建和管理 egui 用户界面。它动态处理值和条件的能力使其成为在 Rust 中构建丰富、响应式 UI 的多功能选择。

依赖关系

~7–12MB
~139K SLoC