summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-29 07:34:14 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-04-29 07:34:14 +0200
commit61c707fe044e7abc035f1a35697757f55f955417 (patch)
treed5c99fe78400bb51b2d97ebb9145e897e5f4473a
parentdc51080328caa12d2b1fc02febc72cab70bb9f50 (diff)
parente0aa89cee764eebb1cb06f0b0653f82b337620ea (diff)
downloadiced-61c707fe044e7abc035f1a35697757f55f955417.tar.gz
iced-61c707fe044e7abc035f1a35697757f55f955417.tar.bz2
iced-61c707fe044e7abc035f1a35697757f55f955417.zip
Merge branch 'master' into feature/canvas-interaction
-rw-r--r--.github/workflows/test.yml2
-rw-r--r--ROADMAP.md2
-rw-r--r--core/src/font.rs6
-rw-r--r--futures/Cargo.toml2
-rw-r--r--futures/src/command.rs52
-rw-r--r--native/Cargo.toml2
-rw-r--r--native/src/element.rs24
-rw-r--r--native/src/renderer/null.rs2
-rw-r--r--native/src/widget/checkbox.rs4
-rw-r--r--native/src/widget/image.rs4
-rw-r--r--native/src/widget/radio.rs4
-rw-r--r--native/src/widget/text.rs39
-rw-r--r--src/widget.rs4
-rw-r--r--wgpu/Cargo.toml2
-rw-r--r--wgpu/src/renderer.rs24
-rw-r--r--wgpu/src/renderer/widget/text.rs2
-rw-r--r--wgpu/src/widget.rs4
-rw-r--r--wgpu/src/widget/text.rs7
18 files changed, 147 insertions, 39 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 520d8da9..9e73d3d3 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -29,3 +29,5 @@ jobs:
run: cargo check --package iced --target wasm32-unknown-unknown
- name: Check compilation of `tour` example
run: cargo build --package tour --target wasm32-unknown-unknown
+ - name: Check compilation of `pokedex` example
+ run: cargo build --package pokedex --target wasm32-unknown-unknown
diff --git a/ROADMAP.md b/ROADMAP.md
index db0c6625..c47c08ff 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -13,7 +13,7 @@ Once a step is completed, it is collapsed and added to this list:
* [x] Scrollables / Clippables ([#24])
* [x] Text input widget ([#25])
* [x] TodoMVC example ([#26])
- * [x] Async actions ([#27])
+ * [x] Async actions ([#28])
* [x] Custom layout engine ([#52])
* [x] Event subscriptions ([#122])
* [x] Custom styling ([#146])
diff --git a/core/src/font.rs b/core/src/font.rs
index be49c825..3f9ad2b5 100644
--- a/core/src/font.rs
+++ b/core/src/font.rs
@@ -16,3 +16,9 @@ pub enum Font {
bytes: &'static [u8],
},
}
+
+impl Default for Font {
+ fn default() -> Font {
+ Font::Default
+ }
+}
diff --git a/futures/Cargo.toml b/futures/Cargo.toml
index e0815d9d..f0e2a104 100644
--- a/futures/Cargo.toml
+++ b/futures/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "iced_futures"
-version = "0.1.1"
+version = "0.1.2"
authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
edition = "2018"
description = "Commands, subscriptions, and runtimes for Iced"
diff --git a/futures/src/command.rs b/futures/src/command.rs
index d4f99b82..063e9b68 100644
--- a/futures/src/command.rs
+++ b/futures/src/command.rs
@@ -27,6 +27,7 @@ impl<T> Command<T> {
/// Creates a [`Command`] that performs the action of the given future.
///
/// [`Command`]: struct.Command.html
+ #[cfg(not(target_arch = "wasm32"))]
pub fn perform<A>(
future: impl Future<Output = T> + 'static + Send,
f: impl Fn(T) -> A + 'static + Send,
@@ -36,9 +37,23 @@ impl<T> Command<T> {
}
}
+ /// Creates a [`Command`] that performs the action of the given future.
+ ///
+ /// [`Command`]: struct.Command.html
+ #[cfg(target_arch = "wasm32")]
+ pub fn perform<A>(
+ future: impl Future<Output = T> + 'static,
+ f: impl Fn(T) -> A + 'static + Send,
+ ) -> Command<A> {
+ Command {
+ futures: vec![Box::pin(future.map(f))],
+ }
+ }
+
/// Applies a transformation to the result of a [`Command`].
///
/// [`Command`]: struct.Command.html
+ #[cfg(not(target_arch = "wasm32"))]
pub fn map<A>(
mut self,
f: impl Fn(T) -> A + 'static + Send + Sync,
@@ -62,6 +77,30 @@ impl<T> Command<T> {
}
}
+ /// Applies a transformation to the result of a [`Command`].
+ ///
+ /// [`Command`]: struct.Command.html
+ #[cfg(target_arch = "wasm32")]
+ pub fn map<A>(mut self, f: impl Fn(T) -> A + 'static) -> Command<A>
+ where
+ T: 'static,
+ {
+ let f = std::rc::Rc::new(f);
+
+ Command {
+ futures: self
+ .futures
+ .drain(..)
+ .map(|future| {
+ let f = f.clone();
+
+ Box::pin(future.map(move |result| f(result)))
+ as BoxFuture<A>
+ })
+ .collect(),
+ }
+ }
+
/// Creates a [`Command`] that performs the actions of all the given
/// commands.
///
@@ -85,6 +124,7 @@ impl<T> Command<T> {
}
}
+#[cfg(not(target_arch = "wasm32"))]
impl<T, A> From<A> for Command<T>
where
A: Future<Output = T> + 'static + Send,
@@ -96,6 +136,18 @@ where
}
}
+#[cfg(target_arch = "wasm32")]
+impl<T, A> From<A> for Command<T>
+where
+ A: Future<Output = T> + 'static,
+{
+ fn from(future: A) -> Self {
+ Self {
+ futures: vec![future.boxed_local()],
+ }
+ }
+}
+
impl<T> std::fmt::Debug for Command<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Command").finish()
diff --git a/native/Cargo.toml b/native/Cargo.toml
index ca58d75c..7e9c2a5a 100644
--- a/native/Cargo.toml
+++ b/native/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "iced_native"
-version = "0.2.1"
+version = "0.2.2"
authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
edition = "2018"
description = "A renderer-agnostic library for native GUIs"
diff --git a/native/src/element.rs b/native/src/element.rs
index 4e7c7fc6..73e39012 100644
--- a/native/src/element.rs
+++ b/native/src/element.rs
@@ -81,7 +81,7 @@ where
///
/// ```
/// # mod counter {
- /// # use iced_native::{text, Text};
+ /// # type Text = iced_native::Text<iced_native::renderer::Null>;
/// #
/// # #[derive(Debug, Clone, Copy)]
/// # pub enum Message {}
@@ -227,6 +227,28 @@ where
self.widget.layout(renderer, limits)
}
+ /// Processes a runtime [`Event`].
+ ///
+ /// [`Event`]: enum.Event.html
+ pub fn on_event(
+ &mut self,
+ event: Event,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ messages: &mut Vec<Message>,
+ renderer: &Renderer,
+ clipboard: Option<&dyn Clipboard>,
+ ) {
+ self.widget.on_event(
+ event,
+ layout,
+ cursor_position,
+ messages,
+ renderer,
+ clipboard,
+ );
+ }
+
/// Draws the [`Element`] and its children using the given [`Layout`].
///
/// [`Element`]: struct.Element.html
diff --git a/native/src/renderer/null.rs b/native/src/renderer/null.rs
index 9033a7da..2c7babdb 100644
--- a/native/src/renderer/null.rs
+++ b/native/src/renderer/null.rs
@@ -47,6 +47,8 @@ impl row::Renderer for Null {
}
impl text::Renderer for Null {
+ type Font = Font;
+
const DEFAULT_SIZE: u16 = 20;
fn measure(
diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs
index d611993f..4d167df7 100644
--- a/native/src/widget/checkbox.rs
+++ b/native/src/widget/checkbox.rs
@@ -3,7 +3,7 @@ use std::hash::Hash;
use crate::{
input::{mouse, ButtonState},
- layout, row, text, Align, Clipboard, Element, Event, Font, Hasher,
+ layout, row, text, Align, Clipboard, Element, Event, Hasher,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text,
VerticalAlignment, Widget,
};
@@ -186,7 +186,7 @@ where
label_layout.bounds(),
&self.label,
self.text_size,
- Font::Default,
+ Default::default(),
None,
HorizontalAlignment::Left,
VerticalAlignment::Center,
diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs
index 6bd0fd68..132f249d 100644
--- a/native/src/widget/image.rs
+++ b/native/src/widget/image.rs
@@ -123,6 +123,8 @@ pub struct Handle {
impl Handle {
/// Creates an image [`Handle`] pointing to the image of the given path.
///
+ /// Makes an educated guess about the image format by examining the data in the file.
+ ///
/// [`Handle`]: struct.Handle.html
pub fn from_path<T: Into<PathBuf>>(path: T) -> Handle {
Self::from_data(Data::Path(path.into()))
@@ -145,6 +147,8 @@ impl Handle {
/// Creates an image [`Handle`] containing the image data directly.
///
+ /// Makes an educated guess about the image format by examining the given data.
+ ///
/// This is useful if you already have your image loaded in-memory, maybe
/// because you downloaded or generated it procedurally.
///
diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs
index 0ec621bf..a13d86a0 100644
--- a/native/src/widget/radio.rs
+++ b/native/src/widget/radio.rs
@@ -1,7 +1,7 @@
//! Create choices using radio buttons.
use crate::{
input::{mouse, ButtonState},
- layout, row, text, Align, Clipboard, Element, Event, Font, Hasher,
+ layout, row, text, Align, Clipboard, Element, Event, Hasher,
HorizontalAlignment, Layout, Length, Point, Rectangle, Row, Text,
VerticalAlignment, Widget,
};
@@ -155,7 +155,7 @@ where
label_layout.bounds(),
&self.label,
<Renderer as text::Renderer>::DEFAULT_SIZE,
- Font::Default,
+ Default::default(),
None,
HorizontalAlignment::Left,
VerticalAlignment::Center,
diff --git a/native/src/widget/text.rs b/native/src/widget/text.rs
index dc7c33ec..d60aa468 100644
--- a/native/src/widget/text.rs
+++ b/native/src/widget/text.rs
@@ -1,7 +1,7 @@
//! Write some text for your users to read.
use crate::{
- layout, Color, Element, Font, Hasher, HorizontalAlignment, Layout, Length,
- Point, Rectangle, Size, VerticalAlignment, Widget,
+ layout, Color, Element, Hasher, HorizontalAlignment, Layout, Length, Point,
+ Rectangle, Size, VerticalAlignment, Widget,
};
use std::hash::Hash;
@@ -11,7 +11,7 @@ use std::hash::Hash;
/// # Example
///
/// ```
-/// # use iced_native::Text;
+/// # type Text = iced_native::Text<iced_native::renderer::Null>;
/// #
/// Text::new("I <3 iced!")
/// .color([0.0, 0.0, 1.0])
@@ -20,18 +20,18 @@ use std::hash::Hash;
///
/// ![Text drawn by `iced_wgpu`](https://github.com/hecrj/iced/blob/7760618fb112074bc40b148944521f312152012a/docs/images/text.png?raw=true)
#[derive(Debug, Clone)]
-pub struct Text {
+pub struct Text<Renderer: self::Renderer> {
content: String,
size: Option<u16>,
color: Option<Color>,
- font: Font,
+ font: Renderer::Font,
width: Length,
height: Length,
horizontal_alignment: HorizontalAlignment,
vertical_alignment: VerticalAlignment,
}
-impl Text {
+impl<Renderer: self::Renderer> Text<Renderer> {
/// Create a new fragment of [`Text`] with the given contents.
///
/// [`Text`]: struct.Text.html
@@ -40,7 +40,7 @@ impl Text {
content: label.into(),
size: None,
color: None,
- font: Font::Default,
+ font: Default::default(),
width: Length::Shrink,
height: Length::Shrink,
horizontal_alignment: HorizontalAlignment::Left,
@@ -69,8 +69,8 @@ impl Text {
///
/// [`Text`]: struct.Text.html
/// [`Font`]: ../../struct.Font.html
- pub fn font(mut self, font: Font) -> Self {
- self.font = font;
+ pub fn font(mut self, font: impl Into<Renderer::Font>) -> Self {
+ self.font = font.into();
self
}
@@ -112,7 +112,7 @@ impl Text {
}
}
-impl<Message, Renderer> Widget<Message, Renderer> for Text
+impl<Message, Renderer> Widget<Message, Renderer> for Text<Renderer>
where
Renderer: self::Renderer,
{
@@ -163,7 +163,8 @@ where
}
fn hash_layout(&self, state: &mut Hasher) {
- std::any::TypeId::of::<Text>().hash(state);
+ struct Marker;
+ std::any::TypeId::of::<Marker>().hash(state);
self.content.hash(state);
self.size.hash(state);
@@ -181,6 +182,11 @@ where
/// [renderer]: ../../renderer/index.html
/// [`UserInterface`]: ../../struct.UserInterface.html
pub trait Renderer: crate::Renderer {
+ /// The font type used for [`Text`].
+ ///
+ /// [`Text`]: struct.Text.html
+ type Font: Default + Copy;
+
/// The default size of [`Text`].
///
/// [`Text`]: struct.Text.html
@@ -194,7 +200,7 @@ pub trait Renderer: crate::Renderer {
&self,
content: &str,
size: u16,
- font: Font,
+ font: Self::Font,
bounds: Size,
) -> (f32, f32);
@@ -217,18 +223,19 @@ pub trait Renderer: crate::Renderer {
bounds: Rectangle,
content: &str,
size: u16,
- font: Font,
+ font: Self::Font,
color: Option<Color>,
horizontal_alignment: HorizontalAlignment,
vertical_alignment: VerticalAlignment,
) -> Self::Output;
}
-impl<'a, Message, Renderer> From<Text> for Element<'a, Message, Renderer>
+impl<'a, Message, Renderer> From<Text<Renderer>>
+ for Element<'a, Message, Renderer>
where
- Renderer: self::Renderer,
+ Renderer: self::Renderer + 'a,
{
- fn from(text: Text) -> Element<'a, Message, Renderer> {
+ fn from(text: Text<Renderer>) -> Element<'a, Message, Renderer> {
Element::new(text)
}
}
diff --git a/src/widget.rs b/src/widget.rs
index 03e3192b..e33a6b2c 100644
--- a/src/widget.rs
+++ b/src/widget.rs
@@ -20,7 +20,7 @@
mod platform {
pub use iced_wgpu::widget::{
button, checkbox, container, pane_grid, progress_bar, radio,
- scrollable, slider, text_input,
+ scrollable, slider, text_input, Text,
};
#[cfg(feature = "canvas")]
@@ -39,7 +39,7 @@ mod platform {
pub use iced_winit::svg::{Handle, Svg};
}
- pub use iced_winit::{Space, Text};
+ pub use iced_winit::Space;
#[doc(no_inline)]
pub use {
diff --git a/wgpu/Cargo.toml b/wgpu/Cargo.toml
index 0794b970..00f18472 100644
--- a/wgpu/Cargo.toml
+++ b/wgpu/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "iced_wgpu"
-version = "0.2.1"
+version = "0.2.2"
authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
edition = "2018"
description = "A wgpu renderer for Iced"
diff --git a/wgpu/src/renderer.rs b/wgpu/src/renderer.rs
index 5c38ce61..dccd0d82 100644
--- a/wgpu/src/renderer.rs
+++ b/wgpu/src/renderer.rs
@@ -355,6 +355,18 @@ impl Renderer {
) {
let bounds = layer.bounds * scale_factor;
+ if !layer.quads.is_empty() {
+ self.quad_pipeline.draw(
+ device,
+ encoder,
+ &layer.quads,
+ transformation,
+ scale_factor,
+ bounds,
+ target,
+ );
+ }
+
if !layer.meshes.is_empty() {
let scaled = transformation
* Transformation::scale(scale_factor, scale_factor);
@@ -371,18 +383,6 @@ impl Renderer {
);
}
- if !layer.quads.is_empty() {
- self.quad_pipeline.draw(
- device,
- encoder,
- &layer.quads,
- transformation,
- scale_factor,
- bounds,
- target,
- );
- }
-
#[cfg(any(feature = "image", feature = "svg"))]
{
if !layer.images.is_empty() {
diff --git a/wgpu/src/renderer/widget/text.rs b/wgpu/src/renderer/widget/text.rs
index 3cf32426..4a4ecef4 100644
--- a/wgpu/src/renderer/widget/text.rs
+++ b/wgpu/src/renderer/widget/text.rs
@@ -7,6 +7,8 @@ use iced_native::{
use std::f32;
impl text::Renderer for Renderer {
+ type Font = Font;
+
const DEFAULT_SIZE: u16 = 20;
fn measure(
diff --git a/wgpu/src/widget.rs b/wgpu/src/widget.rs
index c3a47dff..32ccad17 100644
--- a/wgpu/src/widget.rs
+++ b/wgpu/src/widget.rs
@@ -17,6 +17,8 @@ pub mod scrollable;
pub mod slider;
pub mod text_input;
+mod text;
+
#[doc(no_inline)]
pub use button::Button;
#[doc(no_inline)]
@@ -36,6 +38,8 @@ pub use slider::Slider;
#[doc(no_inline)]
pub use text_input::TextInput;
+pub use text::Text;
+
#[cfg(feature = "canvas")]
#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))]
pub mod canvas;
diff --git a/wgpu/src/widget/text.rs b/wgpu/src/widget/text.rs
new file mode 100644
index 00000000..1053ea97
--- /dev/null
+++ b/wgpu/src/widget/text.rs
@@ -0,0 +1,7 @@
+//! Write some text for your users to read.
+use crate::Renderer;
+
+/// A paragraph of text.
+///
+/// This is an alias of an `iced_native` text with an `iced_wgpu::Renderer`.
+pub type Text = iced_native::Text<Renderer>;