【rust/egui】(十)使用painter绘制一些图形—connections

这篇具有很好参考价值的文章主要介绍了【rust/egui】(十)使用painter绘制一些图形—connections。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说在前面

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

绘制连接

  • 在上一节我们使用painter绘制了一个可以拖拽的小方块,现在我们来用painter将两个小方块连接起来,类似这种:
    【rust/egui】(十)使用painter绘制一些图形—connections,Rust,rust,开发语言,后端
  • 首先我们需要在我们的方块上添加一个连接点,这是为了区分方块本体和连接点之间的拖拽事件:
    let port_rect = egui::Rect::from_center_size(body_rect.min, egui::vec2(10.0, 10.0));
    let port_resp = ui.allocate_rect(port_rect, egui::Sense::click_and_drag());
    ui.painter()
    	.circle(port_rect.center(), 5.0, egui::Color32::BLUE, egui::Stroke::NONE);
    
    结果如下:
    【rust/egui】(十)使用painter绘制一些图形—connections,Rust,rust,开发语言,后端
  • 上述代码同时返回了拖拽事件,然后我们就需要对拖拽事件进行处理,进而在连接点与鼠标光标之间绘制一条线,以下是绘制函数:
    fn draw_connection(painter: &egui::Painter, src_pos: egui::Pos2, dst_pos: egui::Pos2, color: egui::Color32) {
        let connection_stroke = egui::Stroke { width: 5.0, color };
    
        let control_scale = ((dst_pos.x - src_pos.x) / 2.0).max(30.0);
        let src_control = src_pos + egui::Vec2::X * control_scale;
        let dst_control = dst_pos - egui::Vec2::X * control_scale;
    
    	// 贝塞尔曲线
        let bezier = egui::epaint::CubicBezierShape::from_points_stroke(
            [src_pos, src_control, dst_control, dst_pos],
            false,
            egui::Color32::TRANSPARENT,
            connection_stroke,
        );
    
        painter.add(bezier);
    }
    
  • 所以我们的目标是确定connection起点终点,起点自然是方块的连接点,终点则是光标的位置:
    let cursor_pos = ui
    	.ctx()
        .input(|i| i.pointer.hover_pos().unwrap_or(egui::Pos2::ZERO));
    
  • 同时,这个connection只有在我们开始拖拽,以及拖拽过程中才会有:
    if port_resp.drag_started() {
    	self.in_drag_port = true;
    } else if port_resp.drag_released() {
    	self.in_drag_port = false;
    }
    
    if self.in_drag_port {
    	draw_connection(ui.painter(), cursor_pos,port_rect.center(),  egui::Color32::BROWN);
    }
    
  • 最终的结果如下
    【rust/egui】(十)使用painter绘制一些图形—connections,Rust,rust,开发语言,后端

建立连接

  • 如果有多个方块,那我们就可以将方块连接起来,这里为了简化,我们将另一个方块只保留连接点:
    let fix_port_rect =
    	egui::Rect::from_center_size(egui::pos2(500.0, 500.0), egui::vec2(10.0, 10.0));
    ui.painter().circle(
    	fix_port_rect.center(),
        5.0,
        egui::Color32::GRAY,
        egui::Stroke::NONE,
    );
    
    【rust/egui】(十)使用painter绘制一些图形—connections,Rust,rust,开发语言,后端
  • 然后,我们需要在将connection的终点接近固定点后,将连接状态记录下来,这样就可以在之后的update中,通过这个连接状态把connection绘制出来
    if port_resp.drag_started() {
    	self.in_drag_port = true;
    	// 方块连接点拖拽开始时将连接取消
        self.connected = false;
    } else if port_resp.drag_released() {
        self.in_drag_port = false;
    	// 如果光标足够接近固定点时,建立连接,记录状态
        self.connected = if let Some(pointer_pos) = ui.ctx().pointer_hover_pos() {
        	fix_port_rect.center().distance(pointer_pos) < 10.0
        } else {
        	false
        };
    }
    
    // 如果建立了连接 直接绘制
    if self.connected {
    	draw_connection(
            ui.painter(),
            fix_port_rect.center(),
            port_rect.center(),
            egui::Color32::BROWN,
        );
    }
    
    结果如下
    【rust/egui】(十)使用painter绘制一些图形—connections,Rust,rust,开发语言,后端

参考

  • egui_node_graph

文章来源地址https://www.toymoban.com/news/detail-709091.html

到了这里,关于【rust/egui】(十)使用painter绘制一些图形—connections的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【rust/egui】(一)从编译运行template开始

    rust新手,egui没啥找到啥教程,这里自己记录下学习过程 环境:windows11 22H2 rust版本:rustc 1.71.1 egui版本:0.22.0 eframe版本:0.22.0 rust windows安装参考:这里 本文默认读者已安装相关环境(git、vscode等) egui github demo online 关于 immediate mode wikipedia microsoft learn 先 clone 下这个项目(也可

    2024年02月13日
    浏览(36)
  • 【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日
    浏览(35)
  • 【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日
    浏览(54)
  • 【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日
    浏览(38)
  • 【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日
    浏览(41)
  • 【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日
    浏览(39)
  • 【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日
    浏览(45)
  • 使用MFC绘制一些简单图形

    目录 一、画直线 更改画笔样式 二、使用画刷画一个矩形 透明矩形 自定义颜色填充矩形 自定义图形填充矩形 四、实现一个画笔 五、画扇形 六、画椭圆 七、画圆 八、输出文本     画一条直线需要一个起点和一个终点,当鼠标按下时记录为起点坐标,鼠标弹起时记录为终点

    2024年02月07日
    浏览(52)
  • 【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日
    浏览(42)
  • 30天拿下Rust之图形编程

    概述         Rust语言以其卓越的安全性、性能和可靠性赢得了广大开发者的青睐,逐渐在系统编程、网络服务、游戏开发等领域崭露头角。随着Rust生态的日益繁荣,图形编程领域也涌现出一批优秀的框架和库,使得用Rust进行高效、安全的图形应用开发成为可能。 图形库

    2024年04月17日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包