iced-yoda/README.md

230 lines
8 KiB
Markdown
Raw Normal View History

2021-08-27 17:04:29 +07:00
<div align="center">
<img src="docs/logo.svg" width="140px" />
# Iced
2021-08-27 17:04:29 +07:00
[![Documentation](https://docs.rs/iced/badge.svg)][documentation]
2020-04-02 17:08:28 +02:00
[![Crates.io](https://img.shields.io/crates/v/iced.svg)](https://crates.io/crates/iced)
[![License](https://img.shields.io/crates/l/iced.svg)](https://github.com/iced-rs/iced/blob/master/LICENSE)
[![Downloads](https://img.shields.io/crates/d/iced.svg)](https://crates.io/crates/iced)
2023-01-02 20:42:14 +01:00
[![Test Status](https://img.shields.io/github/actions/workflow/status/iced-rs/iced/test.yml?branch=master&event=push&label=test)](https://github.com/iced-rs/iced/actions)
2023-11-29 01:06:58 +01:00
[![Discourse](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fdiscourse.iced.rs%2Fsite%2Fstatistics.json&query=%24.users_count&suffix=%20users&label=discourse&color=5e7ce2)](https://discourse.iced.rs/)
[![Discord Server](https://img.shields.io/discord/628993209984614400?label=&labelColor=6A7EC2&logo=discord&logoColor=ffffff&color=7389D8)](https://discord.gg/3xZJ65GAhd)
2019-08-25 05:22:17 +02:00
A cross-platform GUI library for Rust focused on simplicity and type-safety.
2019-08-28 06:45:39 +02:00
Inspired by [Elm].
2019-07-27 23:49:19 +02:00
<a href="https://iced.rs/examples/todos.mp4">
<img src="https://iced.rs/examples/todos.gif" width="275px">
2021-08-27 17:04:29 +07:00
</a>
<a href="https://iced.rs/examples/tour.mp4">
<img src="https://iced.rs/examples/tour.gif" width="273px">
2021-08-27 17:04:29 +07:00
</a>
2019-11-20 06:17:54 +01:00
</div>
2019-07-27 23:49:19 +02:00
## Features
* Simple, easy-to-use, batteries-included API
* Type-safe, reactive programming model
2024-02-15 03:29:30 +01:00
* [Cross-platform support] (Windows, macOS, Linux, and the Web)
* Responsive layout
* Built-in widgets (including [text inputs], [scrollables], and more!)
* Custom widget support (create your own!)
* [Debug overlay with performance metrics]
* First-class support for async actions (use futures!)
* [Modular ecosystem] split into reusable parts:
* A [renderer-agnostic native runtime] enabling integration with existing systems
2023-05-11 15:50:35 +02:00
* Two [built-in renderers] leveraging [`wgpu`] and [`tiny-skia`]
* [`iced_wgpu`] supporting Vulkan, Metal and DX12
2023-05-11 15:50:35 +02:00
* [`iced_tiny_skia`] offering a software alternative as a fallback
* A [windowing shell]
* A [web runtime] leveraging the DOM
__Iced is currently experimental software.__ [Take a look at the roadmap],
[check out the issues], and [feel free to contribute!]
[Cross-platform support]: https://raw.githubusercontent.com/iced-rs/iced/master/docs/images/todos_desktop.jpg
[text inputs]: https://iced.rs/examples/text_input.mp4
[scrollables]: https://iced.rs/examples/scrollable.mp4
[Debug overlay with performance metrics]: https://iced.rs/examples/debug.mp4
[Modular ecosystem]: ECOSYSTEM.md
[renderer-agnostic native runtime]: runtime/
[`wgpu`]: https://github.com/gfx-rs/wgpu
2023-05-11 15:50:35 +02:00
[`tiny-skia`]: https://github.com/RazrFalcon/tiny-skia
[`iced_wgpu`]: wgpu/
2023-05-11 15:50:35 +02:00
[`iced_tiny_skia`]: tiny_skia/
[built-in renderers]: ECOSYSTEM.md#Renderers
[windowing shell]: winit/
[`dodrio`]: https://github.com/fitzgen/dodrio
[web runtime]: https://github.com/iced-rs/iced_web
[Take a look at the roadmap]: ROADMAP.md
[check out the issues]: https://github.com/iced-rs/iced/issues
2019-09-04 12:18:55 +02:00
[feel free to contribute!]: #contributing--feedback
2019-08-25 05:22:17 +02:00
## Installation
2019-07-27 23:49:19 +02:00
Add `iced` as a dependency in your `Cargo.toml`:
```toml
2024-02-15 03:29:30 +01:00
iced = "0.12"
2019-07-27 23:49:19 +02:00
```
2022-05-09 17:19:45 +08:00
If your project is using a Rust edition older than 2021, then you will need to
set `resolver = "2"` in the `[package]` section as well.
__Iced moves fast and the `master` branch can contain breaking changes!__ If
2019-07-27 23:49:19 +02:00
you want to learn about a specific release, check out [the release list].
[the release list]: https://github.com/iced-rs/iced/releases
2019-07-27 23:49:19 +02:00
## Overview
Inspired by [The Elm Architecture], Iced expects you to split user interfaces
2019-08-25 19:53:04 +02:00
into four different concepts:
2019-08-25 05:22:17 +02:00
* __State__ — the state of your application
* __Messages__ — user interactions or meaningful events that you care
2019-08-25 05:22:17 +02:00
about
* __View logic__ — a way to display your __state__ as widgets that
2019-08-25 05:22:17 +02:00
may produce __messages__ on user interaction
* __Update logic__ — a way to react to __messages__ and update your
2019-08-25 05:22:17 +02:00
__state__
2019-08-26 04:08:27 +02:00
We can build something to see how this works! Let's say we want a simple counter
that can be incremented and decremented using two buttons.
2019-08-25 05:22:17 +02:00
We start by modelling the __state__ of our application:
2019-07-27 23:49:19 +02:00
```rust
2024-03-16 05:33:47 +01:00
#[derive(Default)]
2019-07-27 23:49:19 +02:00
struct Counter {
value: i32,
}
2019-08-25 05:22:17 +02:00
```
2019-08-28 06:56:10 +02:00
Next, we need to define the possible user interactions of our counter:
the button presses. These interactions are our __messages__:
2019-07-27 23:49:19 +02:00
2019-08-25 05:22:17 +02:00
```rust
2019-07-27 23:49:19 +02:00
#[derive(Debug, Clone, Copy)]
pub enum Message {
2024-03-16 05:33:47 +01:00
Increment,
Decrement,
2019-07-27 23:49:19 +02:00
}
2019-08-25 05:22:17 +02:00
```
2019-07-27 23:49:19 +02:00
2019-08-28 06:56:10 +02:00
Now, let's show the actual counter by putting it all together in our
__view logic__:
2019-08-25 05:22:17 +02:00
```rust
use iced::widget::{button, column, text, Column};
2019-07-27 23:49:19 +02:00
2019-08-25 05:22:17 +02:00
impl Counter {
pub fn view(&self) -> Column<Message> {
2019-08-25 05:22:17 +02:00
// We use a column: a simple vertical layout
column![
// The increment button. We tell it to produce an
2024-03-16 05:33:47 +01:00
// `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
2024-03-16 05:33:47 +01:00
// `Decrement` message when pressed
button("-").on_press(Message::Decrement),
]
2019-07-27 23:49:19 +02:00
}
}
```
2019-07-28 13:31:38 +02:00
2019-08-28 06:56:10 +02:00
Finally, we need to be able to react to any produced __messages__ and change our
2019-08-25 05:22:17 +02:00
__state__ accordingly in our __update logic__:
```rust
impl Counter {
// ...
pub fn update(&mut self, message: Message) {
2019-08-25 05:22:17 +02:00
match message {
2024-03-16 17:13:49 +01:00
Message::Increment => {
2019-08-25 05:22:17 +02:00
self.value += 1;
}
2024-03-16 17:13:49 +01:00
Message::Decrement => {
2019-08-25 05:22:17 +02:00
self.value -= 1;
}
}
}
}
```
2024-03-16 05:33:47 +01:00
And that's everything! We just wrote a whole user interface. Let's run it:
```rust
fn main() -> iced::Result {
iced::run("A cool counter", Counter::update, Counter::view)
}
```
Iced will automatically:
2019-08-25 05:22:17 +02:00
2019-08-28 06:45:39 +02:00
1. Take the result of our __view logic__ and layout its widgets.
2019-08-26 04:08:27 +02:00
1. Process events from our system and produce __messages__ for our
__update logic__.
1. Draw the resulting user interface.
2019-08-25 05:22:17 +02:00
2024-03-18 19:15:06 +01:00
Read the [book], the [documentation], and the [examples] to learn more!
2019-07-28 13:31:38 +02:00
## Implementation details
Iced was originally born as an attempt at bringing the simplicity of [Elm] and
2019-08-27 03:24:04 +02:00
[The Elm Architecture] into [Coffee], a 2D game engine I am working on.
2019-08-25 05:22:17 +02:00
2020-12-15 11:25:15 +01:00
The core of the library was implemented during May 2019 in [this pull request].
[The first alpha version] was eventually released as
[a renderer-agnostic GUI library]. The library did not provide a renderer and
implemented the current [tour example] on top of [`ggez`], a game library.
Since then, the focus has shifted towards providing a batteries-included,
2020-11-26 06:43:29 +01:00
end-user-oriented GUI library, while keeping [the ecosystem] modular:
<p align="center">
<a href="ECOSYSTEM.md">
<img alt="The Iced Ecosystem" src="docs/graphs/ecosystem.png" width="80%">
</a>
</p>
[this pull request]: https://github.com/hecrj/coffee/pull/35
[The first alpha version]: https://github.com/iced-rs/iced/tree/0.1.0-alpha
[a renderer-agnostic GUI library]: https://www.reddit.com/r/rust/comments/czzjnv/iced_a_rendereragnostic_gui_library_focused_on/
[tour example]: examples/README.md#tour
[`ggez`]: https://github.com/ggez/ggez
[the ecosystem]: ECOSYSTEM.md
2019-07-28 13:31:38 +02:00
2019-08-25 05:22:17 +02:00
## Contributing / Feedback
Contributions are greatly appreciated! If you want to contribute, please
read our [contributing guidelines] for more details.
2019-08-25 05:22:17 +02:00
Feedback is also welcome! You can create a new topic in [our Discourse forum] or
come chat to [our Discord server].
2019-08-25 05:22:17 +02:00
2019-11-21 07:43:21 +01:00
## Sponsors
The development of Iced is sponsored by the [Cryptowatch] team at [Kraken.com]
2019-11-21 07:43:21 +01:00
2024-03-18 19:15:06 +01:00
[book]: https://book.iced.rs/
2020-04-02 17:08:28 +02:00
[documentation]: https://docs.rs/iced/
[examples]: https://github.com/iced-rs/iced/tree/master/examples
[Coffee]: https://github.com/hecrj/coffee
[Elm]: https://elm-lang.org/
[The Elm Architecture]: https://guide.elm-lang.org/architecture/
[the current issues]: https://github.com/iced-rs/iced/issues
[contributing guidelines]: https://github.com/iced-rs/iced/blob/master/CONTRIBUTING.md
[our Discourse forum]: https://discourse.iced.rs/
[our Discord server]: https://discord.gg/3xZJ65GAhd
2019-11-21 07:43:21 +01:00
[Cryptowatch]: https://cryptowat.ch/charts
[Kraken.com]: https://kraken.com/