20 个版本 (11 个重大更新)

0.12.1 2024 年 2 月 22 日
0.10.0 2023 年 7 月 28 日
0.8.0 2023 年 2 月 18 日
0.6.0 2022 年 12 月 7 日
0.0.0 2019 年 5 月 29 日

#21GUI

Download history 5417/week @ 2024-04-25 4856/week @ 2024-05-02 4310/week @ 2024-05-09 4705/week @ 2024-05-16 4584/week @ 2024-05-23 5401/week @ 2024-05-30 4474/week @ 2024-06-06 4707/week @ 2024-06-13 4591/week @ 2024-06-20 3919/week @ 2024-06-27 2649/week @ 2024-07-04 4052/week @ 2024-07-11 4843/week @ 2024-07-18 5042/week @ 2024-07-25 5171/week @ 2024-08-01 4997/week @ 2024-08-08

20,684 每月下载量
用于 108 个工具包 (100 个直接使用)

MIT 许可证

1.5MB
26K SLoC

Iced

Documentation Crates.io License Downloads Test Status Discourse Discord Server

Iced 是一个专注于简洁和类型安全的跨平台 GUI 库,受 Elm 启发。

功能

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

安装

iced 添加到您的 Cargo.toml 中的依赖项

iced = "0.12"

如果你的项目使用的是2021年之前的Rust版本,那么你还需要在[package]部分设置resolver = "2"

Iced运行速度快,master分支可能会包含破坏性变更!如果你想了解特定版本,请查看版本列表

概述

Iced受到Elm架构的启发,期望你将用户界面拆分为四个不同的概念

  • 状态 — 你的应用程序的状态
  • 消息 — 用户交互或你关心的有意义的事件
  • 视图逻辑 — 一种以小部件的形式显示你的状态的方式,这些小部件可能在用户交互时产生消息
  • 更新逻辑 — 一种响应消息并更新你的状态的方式

我们可以构建一些内容来了解这是如何工作的!假设我们想要一个简单的计数器,可以通过两个按钮进行增加和减少。

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

struct Counter {
    // The counter value
    value: i32,
}

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

#[derive(Debug, Clone, Copy)]
pub enum Message {
    IncrementPressed,
    DecrementPressed,
}

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

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
            // `IncrementPressed` message when pressed
            button("+").on_press(Message::IncrementPressed),

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

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

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

impl Counter {
    // ...

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

就是这样!我们刚刚编写了一个整个用户界面。Iced现在能够

  1. 获取我们的视图逻辑的结果,并布局其小部件。
  2. 处理来自系统的事件并为我们更新逻辑产生消息
  3. 绘制最终的用户界面。

浏览文档示例以了解更多信息!

实现细节

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

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

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

The Iced Ecosystem

贡献/反馈

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

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

赞助商

Iced的开发得到了Cryptowatch团队在Kraken.com的支持。

依赖项

~21–63MB
~1M SLoC