4 个版本 (2 个破坏性版本)

0.12.1 2024 年 2 月 22 日
0.12.0 2024 年 2 月 15 日
0.1.0 2023 年 7 月 28 日
0.0.1 2023 年 2 月 24 日

#835 in GUI

Download history 2802/week @ 2024-03-14 3834/week @ 2024-03-21 3356/week @ 2024-03-28 2975/week @ 2024-04-04 3720/week @ 2024-04-11 3595/week @ 2024-04-18 3491/week @ 2024-04-25 3136/week @ 2024-05-02 2629/week @ 2024-05-09 2939/week @ 2024-05-16 2856/week @ 2024-05-23 3568/week @ 2024-05-30 3150/week @ 2024-06-06 3294/week @ 2024-06-13 2921/week @ 2024-06-20 2474/week @ 2024-06-27

12,284 每月下载量
用于 53 个 Crates (5 个直接使用)

MIT 许可证

390KB
7K SLoC

Iced

Documentation Crates.io License Downloads Test Status Discourse Discord Server

一个专注于简单性和类型安全的跨平台 Rust GUI 库。灵感来源于 Elm

特性

Iced 目前是实验性软件。 查看路线图检查问题,并 随时贡献!

概述

Elm 架构 启发,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 月在这个 pull request 中实现的。最终,作为 一个无渲染器的 GUI 库 发布了第一个 alpha 版本。这个库没有提供渲染器,并在游戏库 ggez 上实现了当前的 tour 示例

从那时起,重点转向了提供一应俱全、面向最终用户的 GUI 库,同时保持 生态系统 模块化

The Iced Ecosystem

贡献 / 反馈

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

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

赞助商

Iced 的发展由 Kraken.com 的 Cryptowatch 团队赞助

依赖关系

~17–52MB
~855K SLoC