4 个版本

0.2.2 2022 年 5 月 31 日
0.2.1 2022 年 5 月 4 日
0.2.0 2022 年 5 月 2 日
0.1.0 2022 年 3 月 14 日

#1285 in GUI

Download history 72/week @ 2024-03-11 79/week @ 2024-03-18 63/week @ 2024-03-25 110/week @ 2024-04-01 79/week @ 2024-04-08 83/week @ 2024-04-15 94/week @ 2024-04-22 65/week @ 2024-04-29 70/week @ 2024-05-06 87/week @ 2024-05-13 63/week @ 2024-05-20 65/week @ 2024-05-27 60/week @ 2024-06-03 46/week @ 2024-06-10 65/week @ 2024-06-17 61/week @ 2024-06-24

244 个月下载量

MIT 许可证

775KB
20K SLoC

Iced

Documentation Crates.io License Downloads Test Status Discourse Discord Server

A cross-platform GUI library for Rust focused on simplicity and type-safety. Inspired by Elm.

功能

Iced 目前是实验性软件。 查看路线图查看问题欢迎贡献!

概述

受到 The Elm Architecture 的启发,Iced 预期您将用户界面分割成四个不同的概念

  • 状态 — 您应用程序的状态
  • 消息 — 用户交互或有意义的您关心的事件
  • 视图逻辑 — 一种将您的 状态 显示为可能产生 消息 的控件的显示方式
  • 更新逻辑 — 一种响应 消息 并更新您的 状态 的方法

我们可以构建一些东西来查看它是如何工作的!假设我们想要一个简单的计数器,可以使用两个按钮进行增加和减少。

我们首先对应用程序的 状态 进行建模

#[derive(Default)]
struct Counter {
    value: i32,
}

接下来,我们需要定义计数器的可能用户交互:按钮点击。这些交互是我们的 消息

#[derive(Debug, Clone, Copy)]
pub enum Message {
    Increment,
    Decrement,
}

现在,让我们通过在 视图逻辑 中将所有内容组合起来来展示实际的计数器

use iced::widget::{button, column, text, Column};

impl Counter {
    pub fn view(&self) -> Column<Message> {
        // We use a column: a simple vertical layout
        column![
            // The increment button. We tell it to produce an
            // `Increment` message when pressed
            button("+").on_press(Message::Increment),

            // We show the value of the counter here
            text(self.value).size(50),

            // The decrement button. We tell it to produce a
            // `Decrement` message when pressed
            button("-").on_press(Message::Decrement),
        ]
    }
}

最后,我们需要能够对产生的任何 消息 做出反应,并相应地在我们的 更新逻辑 中更改我们的 状态

impl Counter {
    // ...

    pub fn update(&mut self, message: Message) {
        match message {
            Message::Increment => {
                self.value += 1;
            }
            Message::Decrement => {
                self.value -= 1;
            }
        }
    }
}

这就是全部内容!我们刚刚编写了一个整个用户界面。让我们运行它

fn main() -> iced::Result {
    iced::run("A cool counter", Counter::update, Counter::view)
}

Iced 会自动

  1. 将我们的 视图逻辑 的结果取出并布局其小部件。
  2. 处理系统事件并为我们的 更新逻辑 生成 消息
  3. 绘制结果用户界面。

阅读书籍文档示例以获取更多信息!

实现细节

Iced 最初是尝试将 ElmElm 架构 的简洁性带到 Coffee 中,这是一个我正在开发的 2D 游戏引擎。

库的核心是在 2019 年 5 月在这个 拉取请求 中实现的。最初作为 一个渲染无关的 GUI 库 发布的 第一个 alpha 版本。该库不提供渲染器,并在游戏库 ggez 的基础上实现了当前的 示例

从那时起,重点已经转向提供电池组齐全、面向最终用户的 GUI 库,同时保持 生态系统 模块化

The Iced Ecosystem

贡献/反馈

我们非常欢迎贡献!如果您想做出贡献,请阅读我们的贡献指南以获取更多详细信息。

也欢迎反馈!您可以在我们的Discourse 论坛中创建一个新主题,或加入我们的 Discord 服务器聊天。

赞助商

Iced 的发展得到了Cryptowatch 团队 Kraken.com 的赞助

依赖关系

~1.8–4MB
~69K SLoC