13 个版本 (8 个破坏性更新)

0.12.0 2024年2月15日
0.7.0 2023年7月28日
0.6.0 2023年2月18日
0.5.1 2022年11月10日
0.0.0 2020年1月19日

#1037GUI

Download history 5315/week @ 2024-04-30 4233/week @ 2024-05-07 4588/week @ 2024-05-14 4832/week @ 2024-05-21 5181/week @ 2024-05-28 4645/week @ 2024-06-04 4539/week @ 2024-06-11 4640/week @ 2024-06-18 4505/week @ 2024-06-25 2321/week @ 2024-07-02 3906/week @ 2024-07-09 4379/week @ 2024-07-16 4956/week @ 2024-07-23 5397/week @ 2024-07-30 5581/week @ 2024-08-06 5692/week @ 2024-08-13

每月下载量 22,259
134 库中使用 (直接使用 24)

MIT 许可证

280KB
6K SLoC

Iced

Documentation Crates.io License Downloads Test Status Discourse Discord Server

一个专注于简洁和类型安全的跨平台 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 最初是尝试将 Elm 和 Elm 架构的简单性引入到 Coffee,一个我正在开发的 2D 游戏引擎中。

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

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

The Iced Ecosystem

贡献/反馈

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

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

赞助商

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


lib.rs:

受 Elm 启发的异步任务,用于 GUI 编程。

The foundations of the Iced ecosystem

依赖关系

~5–17MB
~280K SLoC