druid-shell

Druid 工具包使用 Druid-shell 作为平台抽象应用程序 shell。Druid-shell 负责启动本机平台运行循环,监听事件,将它们转换为与平台无关的表示,并用它们调用用户提供的处理程序。

piet

Druid依赖 Piet 库进行绘图和文本布局。Piet 是一个具有多个后端的2D 图形抽象: Piet-direct2d、 Piet-coregraphy、 Piet-cairo、 Piet-web 和 Piet-svg 目前可用,并且计划使用 GPU 后端。在通过 Piet 对 Druid 平台的支持方面,macOS 使用 Piet-coregraph,Linux 和 OpenBSD 使用 Piet-cairo,Windows 使用 Piet-direct2d,web 使用 Piet-web。

use druid::kurbo::{BezPath, Point, Rect};
use druid::piet::Color;// Create an arbitrary bezier path
// (ctx.size() returns the size of the layout rect we're painting in)
let mut path = BezPath::new();
path.move_to(Point::ORIGIN);
path.quad_to((80.0, 90.0),(ctx.size().width, ctx.size().height),
);
// Create a color
let stroke_color = Color::rgb8(0x00, 0x80, 0x00);
// Stroke the path with thickness 1.0
ctx.stroke(path, &stroke_color, 1.0);// Rectangles: the path for practical people
let rect = Rect::from_origin_size((10., 10.), (100., 100.));
// Note the Color:rgba8 which includes an alpha channel (7F in this case)
let fill_color = Color::rgba8(0x00, 0x00, 0x00, 0x7F);
ctx.fill(rect, &fill_color);

widgets

Druid 中的 Widget (文本框、按钮、布局组件等)是实现 Widget 特性的对象。Trait 由关联数据的类型(T)参数化。所有 trait 方法(事件、生命周期、更新、绘制和布局)都提供了对这些数据的访问,并且在事件的情况下,引用是可变的,因此事件可以直接更新数据。

只要应用程序数据发生变化,框架就会使用 update 方法遍历小部件层次结构。

所有小部件 trait 方法都提供了相应的上下文(EventCtx、 LifeCycleCtx、 UpdateCtx、 LayoutCtx、 PaintCtx)。小部件可以通过调用上下文中的方法来请求事物并导致操作。

此外,所有 trait 方法都提供了一个环境 Env,其中包括当前主题参数(颜色、尺寸等)。

impl<T: Data> Widget<T> for Button<T> {fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {...}fn lifecycle(&mut self, ctx: &mut LifeCycleCtx, event: &LifeCycle, data: &T, env: &Env) {...}fn update(&mut self, ctx: &mut UpdateCtx, old_data: &T, data: &T, env: &Env) {...}fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &T, env: &Env) -> Size {...}fn paint(&mut self, ctx: &mut PaintCtx, data: &T, env: &Env) {...}
}

Druid 提供了许多基本的实用工具和布局小部件,并且很容易实现自己的小部件。您还可以将小部件组装成新的小部件:

fn build_widget() -> impl Widget<u32> {let mut col = Flex::column();for i in 0..30 {let button = Button::new(format!("Button {}", i).padding(5.0);col.add_child(button);}Scroll::new(col)
}

layout

Druid的布局协议是强烈的灵感来自扑动的盒子布局模型。在 Druid 中,小部件被传递一个 BoxConstraint,它为它们提供了布局的最小和最大大小。如果适用,小部件还负责为其子级计算适当的约束。

data

Druid 使用数据特征来表示值类型。这些值类型应该比较便宜,克隆起来也便宜。通常,可以使用派生为类型生成 Data impl。

#[derive(Clone, Data)]
struct AppState {which: bool,value: f64,
}

lens

Lens 数据类型提供了对更大数据结构的一部分的访问。和 Data 一样,这也可以派生出来。Derive lens 作为与字段同名的关联常数访问。

#[derive(Clone, Data, Lens)]
struct AppState {which: bool,value: f64,
}

要使用Lens,用 LensWrap (注意 CamelCase 到 Snake _ case 的转换)包装你的小部件:

LensWrap::new(WidgetThatExpectsf64::new(), AppState::value);

或者,用于结构、元组和可转位容器的Lens可以根据需要用Lens宏来构造:

LensWrap::new(WidgetThatExpectsf64::new(), lens!(AppState, value));

关注公众号:

rust druid概念相关推荐

  1. Rust笔记1 rust基本概念

    变量和可变性 rust中声明变量是不可变的,比如: let x = 5; x = 6; // 报错 如果使用可变的,则需要添加mut关键字: let mut x = 5; x = 6; // 正常执行 ...

  2. Rust基础概念之数据类型

    Time: 20190921 数据类型概览 Rust是一种静态语言,也是一门强类型语言.每个值都对应着一个特定的类型. 编译器知道数据类型后,就知道该类型对应的确定的操作.本篇主要关注两种特定类型: ...

  3. Rust基础概念之函数

    Time: 20190921 函数在Rust中是无处不在的,到现在为止,看了很多main函数,这个是程序的入口.fn表示函数声明. Rust中的编程风格是蛇形命名法,即都采用小写字母,单词之间用下划线 ...

  4. 三万字 | 2021 年 Rust 行业调研报告

    作者 | 张汉东       责编 | 欧阳姝黎 文前 Rust 语言是一门通用系统级编程语言,无GC且能保证内存安全.并发安全和高性能而著称.自2008年开始由 Graydon Hoare 私人研发 ...

  5. Rust 学习总结(2)—— 2021 年 Rust 行业调研报告

    前言 Rust 语言是一门通用系统级编程语言,无GC且能保证内存安全.并发安全和高性能而著称.自2008年开始由 Graydon Hoare 私人研发,2009年得到 Mozilla 赞助,2010年 ...

  6. rust编程之道 pdf_深挖一篇嵌入式内核论文之后,我发现 Rust 正在悄悄改变世界...

    之前看到了 TockOS(Rust实现的实时操作系统)团队在2015年写过的论文:https://www.tockos.org/assets/papers/tock-plos2015.pdf 在论文里 ...

  7. 彷徨编程十几年,终于盯上 Rust

    现有的编程语言非常多,我们都习惯了要在性能.表达力和内存安全之间取舍,直到 Rust 横空出世. 对于 Rust 这个新语言,很多人可能都听过,但是没用过.实际上,早从 16 年起,Rust 已经连续 ...

  8. Rust布道者张汉东倾授,入门Rust初学者都要攻破哪些难点?

    摘要:Rust语言学习曲线过于陡峭?初学者看懂这张思维导图,快速入门. Rust语言这两年的热度大家有目共睹,作为一个有着突破性变革意义的语言,其光鲜背后也有诸多质疑,对于想要在系统编程语言上更上一层 ...

  9. RUST语言的编程范式

    总是有很多很多人来问我对Rust语言怎么看的问题,在各种地方被at,其实,我不是很想表达我的想法.因为在不同的角度,你会看到不同的东西.编程语言这个东西,老实说很难评价,在学术上来说,Lisp就是很好 ...

最新文章

  1. 对未标记为可安全执行的脚本_Script Debugger for Mac(脚本调试软件)
  2. 实用ISA Server 2006之一: 简介
  3. 谷歌研究发现优秀的团队必须具备这五个关键特质
  4. oracle启动时报错ORA-00845 MEMORY_TARGET not supported on this system
  5. java TreeSet去重与排序入门
  6. 创建单IP的×××网络
  7. 【PLC】NB触摸屏开发入门
  8. 一文速学-时间序列分析算法之加权移动平均法详解+Python代码实现
  9. SIM800系列模块GSM/GPRS建立TCP连接到远端服务器过程——新浪博客迁移
  10. 计算机找不到 bitlocker,win7找不到bitlocker怎么解决?-在win7中查找bitlocker驱动器加密的方法 - 河东软件园...
  11. 深度多模态子空间聚类网络+代码实现
  12. Android,翻转卡片动画,实现翻转卡片的动画效果
  13. 周年更名,元宇宙产业委再上新台阶
  14. idea连接mysql数据库下载驱动失败
  15. QQ音乐播放器部分笔记
  16. 【源码分享】java多用户B2B2C商城源码带WAP手机端源码
  17. 流水不腐,户枢不蠹。运动多些。
  18. 使用PYNQ-Z2开发板(1):准备工作
  19. wps excel每3列设置一列颜色
  20. C++、VC++、MFC网页自动注册、登陆、发帖、留言,QQ注册、QQ申请器源码、注册邮箱源码、自动发帖源码...

热门文章

  1. image watch
  2. Linux驱动开发1:驱动开发与裸机开发的区别
  3. iOS --- 把汉字转化成拼音 Swift
  4. 使用开源项目【Banner】实现轮播图效果(带小圆点)
  5. 学习总结(《智能计算系统》第一章)
  6. Content Security Polic (网页安全政策,缩写 CSP)
  7. Android 基本适配器BaseAdapter
  8. 抖音链接被封杀?一行代码实现网页直接跳转抖音
  9. CSDN Markdown 语法
  10. GUI编程基础学习(四)——常见几何图形的绘制