From 108d85ac883a2f8eb8b1271b74e8facc23102268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9ctor=20Ram=C3=B3n=20Jim=C3=A9nez?= Date: Mon, 21 Oct 2019 01:59:17 +0200 Subject: [PATCH] Add `ROADMAP` --- ROADMAP.md | 287 ++++++++++++++++++++++++++++++++++++++++++ docs/crates_graph.dot | 12 ++ docs/crates_graph.png | Bin 0 -> 40251 bytes 3 files changed, 299 insertions(+) create mode 100644 ROADMAP.md create mode 100644 docs/crates_graph.dot create mode 100644 docs/crates_graph.png diff --git a/ROADMAP.md b/ROADMAP.md new file mode 100644 index 00000000..10404c85 --- /dev/null +++ b/ROADMAP.md @@ -0,0 +1,287 @@ +# Roadmap +This document describes the current state of Iced and some of the most important next steps we should take before it can become a production-ready GUI library. + +## Context +Before we get into the actual roadmap, let's quickly review what is the current state of the library. + +### Users + +Iced is meant to be used by 2 different types of users: + +- __End-users__. They should be able to: + - get started quickly, + - have many widgets available, + - keep things simple, + - and build applications that are __maintainable__ and __performant__. +- __GUI toolkit developers / Ecosystem contributors__. They should be able to: + - build new kinds of widgets, + - implement custom runtimes, + - integrate existing runtimes in their own system (like game engines), + - and create their own custom renderers. + +### Current state +Iced consists of different crates which offer different layers of abstractions for our users. This modular architecture helps us keep implementation details hidden and decoupled, which should allow us to rewrite or change strategies in the future. + +![Crates graph](docs/crates_graph.png) + +#### `iced_core` + +`iced_core` holds most of the reusable types of the public API. For instance, common widgets (like `Column`, `Row`, `Button`...) and basic data types (`Point`, `Rectangle`, `Length`...). + +This crate is meant to be a starting point for an Iced runtime. + +#### `iced_native` +`iced_native` takes `iced_core` and builds a native runtime on top of it, featuring: +- A flexbox-based layout engine, powered by [`stretch`] +- Event handling for all the built-in widgets +- A renderer-agnostic API + +To achieve this, it introduces a bunch of reusable interfaces: +- A `Widget` trait, which is used to implement new widgets: from layout requirements to event and drawing logic. +- A bunch of `Renderer` traits, meant to keep the crate renderer-agnostic. +- A `Windowed` trait, which can be implemented by graphical renderers that target _windows_. Window-based runtimes can use this trait to stay renderer-agnostic. + +[`stretch`]: https://github.com/vislyhq/stretch + +#### `iced_web` +`iced_web` takes `iced_core` and builds a WebAssembly runtime on top. It achieves this by introducing a `Widget` trait that can be used to produce VDOM nodes. + +The crate is a quite simple abstraction layer over [`dodrio`]. + +[`dodrio`]: https://github.com/fitzgen/dodrio + +#### `iced_wgpu` +`iced_wgpu` is a [`wgpu`] renderer for `iced_native`. It is meant to become the default renderer of Iced in native platforms. + +[`wgpu`] supports most modern graphics backends: Vulkan, Metal, DX11, and DX12 (OpenGL and WebGL are still WIP). Additionally, it will support the incoming [WebGPU API]. + +Currently, `iced_wgpu` only supports a couple of primitives: +- Text, which is rendered using [`wgpu_glyph`]. +- Quads or rectangles, with rounded borders and a solid background color. + +[`wgpu`]: https://github.com/gfx-rs/wgpu-rs +[WebGPU API]: https://gpuweb.github.io/gpuweb/ +[`wgpu_glyph`]: https://github.com/hecrj/wgpu_glyph + +#### `iced_winit` +`iced_winit` offers some convenient abstractions on top of `iced_native` to quickstart development when using [`winit`]. + +It exposes a renderer-agnostic `Application` trait that can be implemented and then run with a simple call. The use of this trait is optional. A `conversion` module is provided for users that decide to implement a custom event loop. + +[`winit`]: https://github.com/rust-windowing/winit + +#### `iced` +Finally, `iced` unifies everything into a simple abstraction to create cross-platform applications: + +- On native, it uses `iced_winit` and `iced_wgpu`. +- On web, it uses `iced_web`. + +This is the crate meant to be used by __end-users__. + + +## Next steps +This section describes some important features that should be implemented before Iced can be considered production-ready (before a 1.0 release). + +Most of the work related to these features needs to happen in the `iced_native` path of the ecosystem, as the web already supports many of them. + +### Scrollables / Clippables +Content that can take a (practically) infinite amount of space and can be viewed using a scrollbar. This is a very basic feature. + +The end-user API could look like this: + +```rust +Column::new() + .push(content) + .scroll(&mut self.scroll_state); +``` + +The challenge here is __composability__. Nested scrollables should work as expected. + +When it comes to `iced_native`, we may need to add the concept of _event propagation_, so mouse wheel events can be captured by the inner-most scrollable and stop propagation. + +When it comes to `iced_wgpu`, we should be able to use scissoring and transformations. [`wgpu`] has a [`RenderPass::set_scissor_rect`] that should work nicely. + +The main issue here will be [`wgpu_glyph`], which is used currently to render text primitives. [`wgpu_glyph`] is powered by [`glyph-brush`], which caches glyphs to render text very fast. However, the current cache model does not seem to be composable (i.e. once you issue a draw call the cache is purged). We will need to change it (and potentially contribute) to accomodate for this use case. + +[`RenderPass::set_scissor_rect`]: https://docs.rs/wgpu/0.3.0/src/wgpu/lib.rs.html#1246-1248 +[`glyph-brush`]: https://github.com/alexheretic/glyph-brush + +### Text input widget +A widget where the user can type raw text and passwords. + +This widget will have a quite complex event logic, potentially coupled with text rendering. Some examples are: +- Text cursor positioning based on a mouse click +- Text selection +- Clipboard interaction (copy & paste) +- Text editing shortcuts (go to start, go to end, etc.) + +It also needs scrollable / clippable text support, as the introduced text may not fit the input and scrolling based on the text cursor will need to be implemented. + +Additionally, the text cursor should blink at a regular interval, which can be considered an _animation_. + +I think we should start simple here, and build a text widget with the most basic functionality: click to focus and type to fill. We can improve the implementation with time as the library matures. + +The end-user API could look like this: + +```rust +pub enum Message { + TextChanged(String), +} + +let text_input = text_input::State::new(); +let text = "Hello"; + +TextInput::new(&mut text_input, &text, Message::TextChanged); +``` + +### TodoMVC example +Once we have scrollables support and a text widget, we could build a [TodoMVC] example. It seems to be a very simple example and could showcase the API quite well. + +We could also consider releasing a `0.1.0` version at this point and share it as a milestone on different social platforms. + +[TodoMVC]: http://todomvc.com/ + +### Async actions +Most applications need to perform work in the background, without freezing the UI while they work. The current architecture can be easily extended to achieve this. + +We can let users return an asynchronous action (i.e. a future) producing a `Message` in `Application::update`. The runtime will spawn each returned action in a thread pool and, once it finishes, feed the produced message back to `update`. This is also how [Elm] does it. + +When it comes to implementing this, [`winit`] already supports user-specific events that can be sent from another thread. Accomodating `iced_winit` for this functionality should not be too complicated. + +[Elm]: https://elm-lang.org/ + +Here is an example of how the end-user API could look: + +```rust +impl Application for WeatherReport { + fn update(&mut self, message: Message) -> Command { + match message { + Message::Refresh => { + self.state = State::Loading; + + Command::from_future( + Weather::request(self.location), + Message::ReportReceived, + ) + } + Message::ReportReceived(Ok(report)) => { + self.state = State::Show(report); + + Command::none() + }, + Message::ReportReceived(Err(error)) => { + self.state = State::Error(error); + + Command::none() + } + } + } +} +``` + +### Event subscriptions +Besides performing async actions on demand, most applications also need to listen to events passively. An example of this could be a WebSocket connection, where messages can come in at any time. + +The idea here is to also follow [Elm]'s footsteps. We can add a method `subscriptions(&self) -> Subscription` to `Application` and keep the subscriptions alive in the runtime. + +The challenge here is designing the public API of subscriptions, so users can build their own, and _subscription diffing_, or basically detecting when a subscription is added/changed/removed. For this, we can take a look at the source code of [Elm] for inspiration. + +### Layers +Currently, Iced assumes widgets cannot be laid out on top of each other. We should implement support for multiple layers of widgets. + +This is a necessary feature to implement many kind of interactables, like dropdown menus, select fields, etc. + +`iced_native` will need to group widgets to perform layouting and process some events first for widgets positioned on top. + +`iced_wgpu` will also need to process the scene graph and sort draw calls based on the different layers. + +### Multi-window support +Open and control multiple windows at runtime. + +I think this could be achieved by implementing an additional trait in `iced_winit` similar to `Application` but with a slightly different `view` method, allowing users to control what is shown in each window. + +This approach should also allow us to perform custom optimizations for this particular use case. + +### Animations +Allow widgets to request a redraw at a specific time. + +This is a necessary feature to render loading spinners, a blinking text cursor, GIF images, etc. + +[`winit`] allows controlling the event loop in a flexible way. We may be able to use [`ControlFlow::WaitUntil`](https://docs.rs/winit/0.20.0-alpha3/winit/event_loop/enum.ControlFlow.html#variant.WaitUntil) for this purpose. + +### Canvas widget +A widget to draw freely in 2D or 3D. It could be used to draw charts, implement a Paint clone, a CAD application, etc. + +As a first approach, we could expose the underlying renderer directly here, and couple this widget with it ([`wgpu`] for now). Once [`wgpu`] gets WebGL or WebGPU support, this widget will be able to run on web too. The renderer primitive could be a simple texture that the widget draws to. + +In the long run, we could expose a renderer-agnostic abstraction to perform the drawing. + +### Text shaping and font fallback +[`wgpu_glyph`] uses [`glyph-brush`], which in turn uses [`rusttype`]. While the current implementation is able to layout text quite nicely, it does not perform any [text shaping]. + +[Text shaping] with font fallback is a necessary feature for any serious GUI toolkit. It unlocks support to truly localize your application, supporting many different scripts. + +The only available library that does a great job at shaping is [HarfBuzz], which is implemented in C++. [`skribo`] seems to be a nice [HarfBuzz] wrapper for Rust. + +This feature will probably imply rewriting [`wgpu_glyph`] entirely, as caching will be more complicated and the API will probably need to ask for more data. + +[`rusttype`]: https://github.com/redox-os/rusttype +[text shaping]: https://en.wikipedia.org/wiki/Complex_text_layout +[HarfBuzz]: https://github.com/harfbuzz/harfbuzz +[`skribo`]: https://github.com/linebender/skribo + +### Grid layout and text layout +Currently, `iced_native` only supports flexbox items. For instance, it is not possible to create a grid of items or make text float around an image. + +We will need to enhance the layouting engine to support different strategies and improve the way we measure text to lay it out in a more flexible way. + + +## Ideas that may be worth exploring + +### Reuse existing 2D renderers +While I believe [`wgpu`] has a great future ahead of it, implementing `iced_wgpu` and making it performant will definitely be a challenge. + +We should keep an eye on existing 2D graphic libraries, like [`piet`] or [`pathfinder`], and give them a try once/if they mature a bit more. + +The good news here is that most of Iced is renderer-agnostic, so changing the rendering strategy, if we deem it worth it, should be really easy. Also, a 2D graphics library will expose a higher-level API than [`wgpu`], so implementing a new renderer on top of it should be fairly straightforward. + +[`piet`]: https://github.com/linebender/piet +[`pathfinder`]: https://github.com/servo/pathfinder + +### Remove explicit state handling and lifetimes +Currently, `iced_native` forces users to provide the local state of each widget. While this could be considered a really pure form of describing a GUI, it makes some optimizations harder because of the borrow checker. + +The current borrow checker is not able to detect a drop was performed before reassigning a value to a mutable variable. Thus, keeping the generated widgets in `Application::view` alive between iterations of the event loop is not possible, which forces us to call this method quite often. `unsafe` could be used to workaround this, but it would feel fishy. + +We could take a different approach, and keep some kind of state tree decoupled from the actual widget definitions. This would force us to perform diffing of nodes, as the widgets will represent the desired state and not the whole state. + +Once the state lifetime of widgets is removed, we could keep them alive between iterations and even make `Application::view` take a non-mutable reference. This would also improve the end-user API, as it will not be necessary to constantly provide mutable state to widgets. + +### Improve style definitions +As of now, each widget defines its own styling options with methods, following the builder pattern. + +A unified way of defining and reusing styles would be great. I am not proposing something like CSS, we should try to stay as type-safe and intuitive as possible. + +I think [`elm-ui`] could serve as an inspiration. + +[`elm-ui`]: https://www.youtube.com/watch?v=Ie-gqwSHQr0 + +### Try a different font rasterizer +[`wgpu_glyph`] depends indirectly on [`rusttype`]. We may be able to gain performance by using a different font rasterizer. [`fontdue`], for instance, has reported noticeable speedups. + +[`fontdue`]: https://github.com/mooman219/fontdue + +### Connect `iced_web` with `web-view` +It may be interesting to try to connect `iced_web` with [`web-view`]. It would give users a feature-complete renderer for free, and applications would still be leaner than with Electron. + +[`web-view`]: https://github.com/Boscop/web-view + +### Implement a lazy widget +Once we remove state lifetimes from widgets, we should be able to implement a widget storing a function that generates additional widgets. The runtime would then be able to control when to call this function and cache the generated widgets while some given value does not change. + +This could be very useful to build very performant user interfaces with a lot of different items. + +[Elm does it very well!](https://guide.elm-lang.org/optimization/lazy.html) + +### Build a custom layout engine +It may be possible to build an optimized layout engine only for `iced_native` if it turns out that there are some flexbox features we end up not using. diff --git a/docs/crates_graph.dot b/docs/crates_graph.dot new file mode 100644 index 00000000..85e375d0 --- /dev/null +++ b/docs/crates_graph.dot @@ -0,0 +1,12 @@ +digraph G { + "iced_core" -> "iced_native" + "iced_core" -> "iced_web" + "iced_native" -> "iced_wgpu" + "iced_native" -> "iced_winit" + "iced_web" -> "iced" + "iced_wgpu" -> "iced" + "iced_winit" -> "iced" + + node[shape=box]; + "iced" -> "cross-platform application" +} diff --git a/docs/crates_graph.png b/docs/crates_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..d598c1dd15a6801adb50e48b8f1a957210a91680 GIT binary patch literal 40251 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 AK>z>% literal 0 HcmV?d00001