【rust/egui】(八)使用panels给你的应用划分功能区块

这篇具有很好参考价值的文章主要介绍了【rust/egui】(八)使用panels给你的应用划分功能区块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说在前面

  • rust新手,egui没啥找到啥教程,这里自己记录下学习过程
  • 环境:windows11 22H2
  • rust版本:rustc 1.71.1
  • egui版本:0.22.0
  • eframe版本:0.22.0
  • 上一篇:这里

panel是啥

  • panel是ui上的一块区域,比如我们打开CSDN的markdown编辑器,它大致上可以划分成四(五)块 (当然实际实现上这四块区域可能不是并列的) ,那我们就可以用四个panel来实现它:

    • 最顶层的文章标题
    • 次顶层的菜单栏
    • 左侧的编辑区域
    • 右侧的预览区域
      【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端
  • panel有点类似于html中的div元素,但是功能上没有div那么强 (初步感觉哈)

使用方式

  • 在前面几节中,我们已经初步了解了panel的基本使用,这里我们来看一个综合的使用用例

  • 假设我们要实现vscode的布局,应该怎样去实现呢?先来看下vscode的功能区,当然还有一个在最上面的菜单栏
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

  • 现在我们来尝试实现一下 (可以直接在前面几节的template上进行)

    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::TopBottomPanel::top("Menu Bar").show(ctx, |ui| {
            ui.vertical_centered(|ui|{
                ui.heading("Menu Bar");
            });
        });
    
        egui::TopBottomPanel::bottom("Status Bar").show(ctx, |ui| {
            ui.vertical_centered(|ui|{
                ui.heading("Status Bar");
            });
        });
    
        egui::SidePanel::left("Activity Bar").show(ctx, |ui| {
            ui.horizontal_centered(|ui|{
                ui.label("Activity Bar");
            });
        });
    
        egui::SidePanel::left("Side Bar").show(ctx, |ui| {
            ui.horizontal_centered(|ui|{
                ui.label("Side Bar");
            });
        });
    
        egui::TopBottomPanel::bottom("Panel").show(ctx, |ui| {
            ui.vertical_centered(|ui|{
                ui.heading("Panel");
            });
        });
    
        egui::CentralPanel::default().show(ctx, |ui|{
            ui.vertical_centered(|ui|{
                ui.heading("Editor");
            });
        });
    }
    

    结果为:
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

  • 大致的区域划分是差不多的,但是各个区域的大小不太对,我们可以稍微调整下

    fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
        egui::TopBottomPanel::top("Menu Bar").show(ctx, |ui| {
            ui.vertical_centered(|ui| {
                ui.heading("Menu Bar");
            });
        });
    
        egui::TopBottomPanel::bottom("Status Bar").show(ctx, |ui| {
            ui.vertical_centered(|ui| {
                ui.heading("Status Bar");
            });
        });
    
        egui::SidePanel::left("Activity Bar")
            .max_width(40.0)
            .resizable(false)
            .show(ctx, |ui| ui.add(egui::Label::new("Activity Bar")));
    
        egui::SidePanel::left("Side Bar")
            .default_width(1000.0)
            .width_range(200.0..=2000.0)
            .resizable(true)
            .show(ctx, |ui| {
                ui.text_edit_singleline(&mut "hi");
            });
    
        egui::TopBottomPanel::bottom("Panel")
            .default_height(200.0)
            .resizable(false)
            .show(ctx, |ui| {
                ui.add(egui::TextEdit::multiline(&mut "Panel").desired_rows(10));
            });
    
        egui::CentralPanel::default().show(ctx, |ui| {
            ui.heading("Editor");
        });
    }
    

    其结果为:
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

    代码上,除了定义panel的宽高外,还添加了一些text_edit;这是因为panel的实际宽高是和其内部的元素相关的
    比如一个SidePanel,如果其内部仅有一个label,即使你设置了resizable属性,它的宽度也没法动态变化

    pub fn resizable(self, resizable: bool) -> Self

    • Can panel be resized by dragging the edge of it?
    • Default is true.
    • If you want your panel to be resizable you also need a widget in it that takes up more space as you resize it

window decorations

  • 对比vscode我们可以看到还有一点小不同:
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

  • vscode中的图标、菜单栏都是在一块的,而我们的demo app则是分成了两块

  • 如果我们想要和vscode一致应该怎样实现呢?

  • 首先将eframe的decorations去掉

    let mut native_options = eframe::NativeOptions::default();
    native_options.decorated = false;
    
    let ret = eframe::run_native(
        "demo app",
        native_options,
        Box::new(|cc| Box::new(demo_app::TemplateApp::new(cc))),
    );
    
  • 然后需要自己实现整个frame,具体可以参考这里,相对比较麻烦,其效果如图:
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

  • 感觉效果不太行,这里就不展开了文章来源地址https://www.toymoban.com/news/detail-705018.html

panel内部的区域划分

  • 在使用panel时,可能会遇到panel内部需要继续划分的情况,这个时候应该怎样处理呢?
    egui::SidePanel::left("Side Bar")
    	.default_width(1000.0)
        .width_range(200.0..=2000.0)
        .resizable(true)
        .show(ctx, |ui| {
            egui::TopBottomPanel::bottom("AB bottom").show_inside(ui, |ui| {
                ui.label("bottom");
            });
            ui.text_edit_singleline(&mut "Side Bar");
        });
    
    使用show_inside方法即可
    【rust/egui】(八)使用panels给你的应用划分功能区块,Rust,rust,开发语言,后端

参考

  • panel

到了这里,关于【rust/egui】(八)使用panels给你的应用划分功能区块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Rust图形界面:从零开始创建eGUi项目

    egui系列:初步 首先,用cargo创建一个新项目,并添加eframe 尽管默认创建的项目只实现了输出Hello world功能,但添加了eframe库,所以下载需要一点时间。 创建成功后,直接把下面的代码写入main.rs文件中,这些代码来自egui的hello_world示例。 然后运行cargo run,结果如下所示 在e

    2024年02月01日
    浏览(51)
  • [Rust GUI]eframe(egui框架)代码示例

    你可以使用egui的其他绑定,例如:egui-miniquad,bevy_egui,egui_sdl2_gl 等。 egui库相当于核心库,需要借助eframe框架写界面。 eframe使用egui_glow渲染,而egui_glow需要opengl2.0+。 1、访问微软官网下载生成工具 2、勾选这个 3、对比勾选细节 4、点击安装 5、安装完成 6、关闭 Visual Studio

    2024年02月08日
    浏览(39)
  • 【Rust日报】2023-02-14 Rust GUI 框架对比: Tauri vs Iced vs egui

    Rust GUI 框架对比: Tauri vs Iced vs egui Tauri:使用系统的 webview 来渲染 HTML/JS 的前端。你可以选择任何前端框架。后台是用Rust编写的,可以通过内置的方法与前台通信。 Iced: 受 Elm 启发的(响应式)GUI库。在桌面上使用 wgpu 进行渲染;实验性的web后端创建DOM进行渲染。所有代码

    2024年02月02日
    浏览(29)
  • 【rust/egui】(七)看看template的app.rs:Slider

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 滑块,如下图 定义: 我们可以通过 ui.add() 的方式进行添加: 其 new 方法的定义为: 参数 value 为可变借用类型,且使用 Numeric 特性进

    2024年02月10日
    浏览(34)
  • 【rust/egui】(六)看看template的app.rs:TextEdit

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 文本编辑框 其定义为: 用起来可能是个简单的东西,但是实际上很是复杂,首先我们来看看它的外观以及用法 在 app.rs 中,我们是通

    2024年02月11日
    浏览(47)
  • 【rust/egui】(三)看看template的app.rs:序列化、持久化存储

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 app.rs 中首先定义了我们的 TemplateApp 结构体 在定义 TemplateApp 时,我们让其继承了 serde::Deserialize, serde::Serialize 。 serde 是rust中用于序列

    2024年02月11日
    浏览(31)
  • 【rust/egui】(五)看看template的app.rs:SidePanel、CentralPanel以及heading

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 侧边栏,如下图 其定义为: 通过 right() 或 left() 方法生成: 方法实现与 TopBottomPanel::top() 类似: 生成时的默认属性值为: 我们可以将

    2024年02月11日
    浏览(32)
  • 【rust/egui】(四)看看template的app.rs:update以及组件TopBottomPanel&Button

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 update 实际上还是 eframe::App 的特征,并非 egui 的内容。其官方注解如下: update 函数会在需要重绘ui(或者其他)的时候被调用,一秒可能

    2024年02月11日
    浏览(38)
  • 【rust/egui】(二)看看template的main函数:日志输出以及eframe run_native

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 上一篇:这里 首先让我们看看 main.rs 中有些什么 在 eframe 中使用的日志库为 log 以及 env_logger ,其日志等级有5个: 我们可以在main函数中添加测试一

    2024年02月13日
    浏览(36)
  • 体验感极好,docker爱好者福音,1Panel服务器运维管理面板使用引导功能介绍

    目录 一.介绍 二.特点 1.服务器管理便捷高效 2.资源实时监控 3.日志管理 4.远程终端访问 5.防护性较强 6.功能强大 三.与1Panel交流讨论 1.官网主页 2.微信公众号 3.哔哩哔哩账户 四.获取1Panel 1.进入官网,已提供安装方式 2.按提示安装 3.部署完成后之后要查看入口和用户密码信息

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包