2个版本

使用旧的Rust 2015

0.70.1 2021年2月19日
0.70.0 2021年1月30日

#procedural中排名第480


4个crate中使用了(直接使用3个)

MIT/Apache

33KB
639行代码(不包括注释)

Carbide

crates.io docs.rs license

Carbide是一个处于实验阶段的Rust GUI框架。它旨在简单易用,简单布局小部件。它受到了创建桌面UI的当前尝试的启发,如SwiftUI、Flutter和Qt。

Carbide是早期仓库conrod的分支(conrod仍在开发和维护中)。自分支以来,大部分核心代码已更改,但一些常见结构仍将存在。

Carbide是尝试创建一个完全用Rust编写的简单易用的2D库。

该项目与其他尝试(druid、egui、iced等)的不同之处在于,它采用了SwiftUI布局的思维模式,同时也是一个保留模式框架。

示例

所有截图均在macOS上拍摄,但它们也已在Windows上进行了测试。

一个简单的计数器

点击按钮将增加数字。请注意,我们可以直接从整数状态创建文本。这将在未来变得有用。您也会注意到我们必须手动添加字体。在未来,我们将加载默认的操作系统字体,这将是一种添加自定义字体的方式。

按钮有悬停和按下效果,这是可定制的。您也可能注意到我们指定了从环境中的字体大小。这意味着我们选择了一个语义大小而不是绝对大小。字体大小将能够根据无障碍性要求而改变。按钮的颜色是蓝色,因为那是默认的强调颜色。 计数器应用程序

use carbide_controls::{capture, Button};
use carbide_core::draw::Dimension;
use carbide_core::prelude::*;
use carbide_core::text::FontFamily;
use carbide_core::window::TWindow;
use carbide_wgpu::{Application, Window};

fn main() {
  let mut application = Application::new();

  let family =
          FontFamily::new_from_paths("NotoSans", vec!["fonts/NotoSans/NotoSans-Regular.ttf"]);
  application.add_font_family(family);

  let counter = LocalState::new(0);

  let text = Text::new(counter.clone()).font_size(EnvironmentFontSize::LargeTitle);

  let button = Button::new("Increase counter")
          .on_click(capture!([counter], |_env: &mut Environment| {
            *counter = *counter + 1;
        }))
          .frame(200, 30);

  application.set_scene(Window::new(
    "My first counter",
    Dimension::new(235.0, 300.0),
    VStack::new(vec![text, button])
  ).close_application_on_window_close());

  application.launch()
}

材料

我们有几种材料可以用来为您的应用程序提供不同的深度感。从左边的UltraThick到右边的UltraThin,我们有这些材料。顶部一行是浅色主题,底部一行显示了深色主题的材料。 一个窗口,显示了应用于彩色背景矩形的不同材料 示例的代码可以在以下位置找到: 材料示例

形状

Carbide内置了一些不同的形状,如矩形、圆角矩形、胶囊、省略号等。它们还支持填充、描边、两者并用作其他项目的剪辑遮罩,如图片。星星的底部行是使用与html的Canvas2d类似的canvas元素构建的。 此图显示了carbide支持的不同形状。它还展示了如何使用canvas元素创建自己的形状的示例。 示例的代码可以在以下位置找到: 形状示例

简单的Hacker News客户端

我开始构建一个小的Hacker News客户端。目前,它支持使用Rust异步和Carbide的内置task!宏异步获取消息。我们支持async-std和Tokio,并且可以轻松添加更多。

它有一个可选择的列表,这是Carbide内置的,支持单选和多选。点击文章时,会显示文章的标题和链接。目前没有获取评论,因为我无法从他们的Firebase API中提取它们而不发送数百个请求。

计算器

一个简单的计算器。计算器的逻辑可能不是最花哨的,但Carbide定义的UI应该运行得相当不错。 示例的代码可以在以下位置找到: 计算器示例

文本编辑

一个展示文本编辑的短GIF。前两个编辑使用相同的状态,因此如果您编辑其中一个,它也会同步另一个。最后三个也是连接到相同的状态。

前两个文本字段连接到i128状态。这意味着它验证了文本字段中的当前字符串可以转换为i128,否则将显示错误。这意味着验证它不为空,不包含字母和其他符号,并且数字在i128可以包含的范围内。这一切都是现成的,只需提供一个i128状态即可。同样的方法也适用于f64和Rust中所有其他数字类型。目前没有本地化支持,但将很快添加。

最后两个文本字段被隐藏,这意味着您无法看到或从字段中获取数据。这对于输入密码很有用。您可以选择用作隐藏字符的字符。

文本字段支持大多数常用快捷键,如复制、粘贴、全选、选择单词等,但不支持撤销/重做。它还支持鼠标交互,如双击选择单词,三击全选,点击并拖动选择内容的一部分。

Carbide text input example

Carbide text input example 2

示例的代码可以在以下位置找到: 文本字段示例

文档

我已经开始记录项目的主体部分,并计划开始编写mdbook,但目前这还处于早期阶段。

开始使用最简单的方法是查看carbide_wgpu、carbide_controls和carbide crates中的示例。这些示例展示了各种项目和功能。虽然这不是理想的文档形式,但它应该能帮助你入门。

目标

我的目标是使其适用于从小型到中型应用。它完全使用rust编写,目标是你在开发高质量应用时不需要离开rust生态系统。

  • 简单布局 -- 通过实现从SwiftUI中常见的模式。这意味着我们没有比flexbox更复杂的布局。当然,可以通过自定义布局小部件来实现,但可能不会提供。

  • 简单实现自定义小部件 -- 通过使用rust proc macros为你生成大量样板代码。这意味着你不需要实现很多默认行为为适合的函数。

  • 渲染器和窗口独立 -- 通过在框架和底层层(如窗口处理和渲染)之间创建清晰的接口。

  • 平台无关 -- 通过提供多个平台的通用接口。目前还没有计划在移动设备上运行该框架,但已进行了一些实验。

  • 可访问性 -- 通过与即将到来的rust可访问性crates集成。看起来很有希望的AccessKit,但进展缓慢。

  • 本地化 -- 通过提供了解语言的小部件,并提供翻译的资产格式。我们正在考虑rust尝试的字体形状和连字,但它似乎还处于早期阶段。目前我正在考虑使用Fluent来指定翻译。看起来很有希望的https://github.com/kellpossible/cargo-i18n

非目标

这不是一个即时模式框架,也没有试图成为(例如,看egui、imgui或iced)。我们不想复制原生看起来的小部件...(待办事项)

当前状态

目前,该框架处于早期阶段,但大多数布局算法和基本小部件已经实现。通过扩展Conrod,我正在尝试将项目提升到更现代的标准,即2018年rust及其新功能。

反馈

如果你尝试了该框架,请随意打开一个问题,或提供有关其使用难易程度的任何反馈。目前,我是这个框架的唯一开发者,主要花我的业余时间为此做出贡献。

许可证

根据您的选择,许可为以下之一

任选其一。

贡献

除非你明确声明,否则你提交的任何有意包含在作品中的贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。

示例资产

依赖关系

~1.5MB
~35K SLoC