84

0

Iced

GUI

受 Elm 启发的 Rust 的跨平台 GUI 库

Iced

文档 板条箱.io 执照 下载 测试状态 不和谐服务器

Rust 的跨平台 GUI 库,专注于简单性和类型安全。灵感来自elm

特征

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

安装

添加 iced为您的依赖项 Cargo.toml

iced = "0.4"

如果您的项目使用的是 2021 年以前的 Rust 版本,那么您还需要 resolver = "2"在该 [package]部分中进行设置。

iced的移动速度很快,master分支可以包含重大变化! 如果您想了解特定版本,请查看版本列表

概述

The Elm Architecture 的启发,Iced 希望您将用户界面拆分为四个不同的概念:

  • 状态 ——你的应用程序的状态
  • 消息 ——您关心的用户交互或有意义的事件
  • 查看逻辑 ——一种将您的状态显示为小部件的方法,该小部件可能会在用户交互时产生消息
  • 更新逻辑 ——一种对消息做出反应并更新你的 状态的方法

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

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

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;
            }
        }
    }
}

这就是一切!我们只是写了一个完整的用户界面。冰镇现在能够:

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

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

实施细节

Iced 最初是为了将Elm和 Elm Architecture的简单性引入到Coffee中而诞生的,Coffee是我正在开发的 2D 游戏引擎。

该库的核心于 2019 年 5 月在此拉取请求中实施。 第一个 alpha 版本最终作为 与渲染器无关的 GUI 库发布。该库没有提供渲染器,而是在游戏库之上实现了当前的游览示例。ggez

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

冰冻生态系统

故障排除

GraphicsAdapterNotFound

This occurs when the selected built-in renderer is not able to create a context.

这通常会在iced_wgpu用作没有支持硬件(需要 Vulkan、Metal 或 DX12)的渲染器时发生。在这种情况下,您可以尝试使用 iced_glow渲染器:

首先,检查它是否适用于

cargo run --features iced/glow --package game_of_life

然后在你的项目中使用它

iced = { version = "0.4", default-features = false, features = ["glow"] }

注意: 您有可能拥有至少支持 OpenGL 2.1 或 OpenGL ES 2.0 的硬件,但如果您不支持,那么现在没有软件回退,因此这意味着您的硬件不支持 Iced。

贡献/反馈

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

也欢迎反馈!你可以打开一个问题,或者,如果你想谈谈,可以来我们的Discord 服务器聊天。此外,您可以通过Rust 社区 Discord #games-and-graphics的频道和 #gui-and-ui频道找到我(以及一群很棒的人)。我去那里。lone_scientist#9554