9 个版本 (重大变更)

0.6.1 2023 年 4 月 13 日
0.5.0 2023 年 2 月 18 日
0.3.0 2022 年 12 月 8 日
0.2.0 2022 年 11 月 10 日
0.0.1 2021 年 11 月 29 日

#1277GUI

Download history 90/week @ 2024-04-22 85/week @ 2024-04-29 21/week @ 2024-05-06 16/week @ 2024-05-13 33/week @ 2024-05-20 15/week @ 2024-05-27 33/week @ 2024-06-03 19/week @ 2024-06-10 63/week @ 2024-06-17 16/week @ 2024-06-24 2/week @ 2024-07-08 10/week @ 2024-07-15 15/week @ 2024-07-22 26/week @ 2024-07-29 13/week @ 2024-08-05

65 每月下载次数

MIT 许可证

580KB
15K SLoC

Iced

Documentation Crates.io License Downloads Test Status Discourse Discord Server

A 跨平台 GUI 库,专为 Rust 设计,注重简洁性和类型安全。受 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 月在 这个拉取请求 中实现的。最终,第一个 alpha 版本作为 一个渲染器无关的 GUI 库 发布。该库没有提供渲染器,并在游戏库 ggez 上实现了当前的 教程示例

从那时起,重点转向了提供一个包含电池、面向最终用户的 GUI 库,同时保持 生态系统 模块化。

The Iced Ecosystem

贡献/反馈

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

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

赞助商

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

依赖关系

~5–7.5MB
~146K SLoC