diff options
| author | 2021-05-19 07:14:26 -0700 | |
|---|---|---|
| committer | 2021-05-19 07:14:26 -0700 | |
| commit | ae484429d30a3360893d030a17e52caa4164a052 (patch) | |
| tree | 4bfe30d3b46c7e30170e0b495d9a4dd1a2a1825f | |
| parent | cf6af4c2560f5996bc533402ac3e4289c0c94702 (diff) | |
| parent | 3918257883dba3cf260bd9764cb7b34101c435e6 (diff) | |
| download | iced-ae484429d30a3360893d030a17e52caa4164a052.tar.gz iced-ae484429d30a3360893d030a17e52caa4164a052.tar.bz2 iced-ae484429d30a3360893d030a17e52caa4164a052.zip  | |
Merge branch 'hecrj:master' into upgrade-wgpu
| -rw-r--r-- | examples/scrollable/Cargo.toml | 2 | ||||
| -rw-r--r-- | examples/scrollable/src/main.rs | 41 | ||||
| -rw-r--r-- | graphics/src/widget/scrollable.rs | 10 | ||||
| -rw-r--r-- | graphics/src/window/compositor.rs | 5 | ||||
| -rw-r--r-- | native/src/widget/checkbox.rs | 14 | ||||
| -rw-r--r-- | native/src/widget/pick_list.rs | 2 | ||||
| -rw-r--r-- | native/src/widget/radio.rs | 26 | ||||
| -rw-r--r-- | rustfmt.toml | 1 | ||||
| -rw-r--r-- | src/lib.rs | 2 | ||||
| -rw-r--r-- | wgpu/src/image/vector.rs | 22 | ||||
| -rw-r--r-- | wgpu/src/settings.rs | 2 | ||||
| -rw-r--r-- | wgpu/src/window/compositor.rs | 23 | ||||
| -rw-r--r-- | winit/src/application.rs | 4 | 
13 files changed, 104 insertions, 50 deletions
diff --git a/examples/scrollable/Cargo.toml b/examples/scrollable/Cargo.toml index 12753fb6..08502458 100644 --- a/examples/scrollable/Cargo.toml +++ b/examples/scrollable/Cargo.toml @@ -6,4 +6,4 @@ edition = "2018"  publish = false  [dependencies] -iced = { path = "../.." } +iced = { path = "../..", features = ["debug"] } diff --git a/examples/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 8dd2e20c..a570f0f6 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -1,8 +1,8 @@  mod style;  use iced::{ -    scrollable, Column, Container, Element, Length, Radio, Row, Rule, Sandbox, -    Scrollable, Settings, Space, Text, +    button, scrollable, Button, Column, Container, Element, Length, Radio, Row, +    Rule, Sandbox, Scrollable, Settings, Space, Text,  };  pub fn main() -> iced::Result { @@ -63,12 +63,14 @@ impl Sandbox for ScrollableDemo {              variants                  .iter_mut()                  .map(|variant| { -                    let mut scrollable = Scrollable::new(&mut variant.state) -                        .padding(10) -                        .width(Length::Fill) -                        .height(Length::Fill) -                        .style(*theme) -                        .push(Text::new(variant.title)); +                    let mut scrollable = +                        Scrollable::new(&mut variant.scrollable) +                            .padding(10) +                            .spacing(10) +                            .width(Length::Fill) +                            .height(Length::Fill) +                            .style(*theme) +                            .push(Text::new(variant.title));                      if let Some(scrollbar_width) = variant.scrollbar_width {                          scrollable = scrollable @@ -108,6 +110,14 @@ impl Sandbox for ScrollableDemo {                          .push(Space::with_height(Length::Units(1200)))                          .push(Text::new("Middle"))                          .push(Space::with_height(Length::Units(1200))) +                        .push( +                            Button::new( +                                &mut variant.button, +                                Text::new("I am a button"), +                            ) +                            .width(Length::Fill) +                            .padding(10), +                        )                          .push(Text::new("The End."));                      Container::new(scrollable) @@ -142,7 +152,8 @@ impl Sandbox for ScrollableDemo {  /// A version of a scrollable  struct Variant {      title: &'static str, -    state: scrollable::State, +    scrollable: scrollable::State, +    button: button::State,      scrollbar_width: Option<u16>,      scrollbar_margin: Option<u16>,      scroller_width: Option<u16>, @@ -153,28 +164,32 @@ impl Variant {          vec![              Self {                  title: "Default Scrollbar", -                state: scrollable::State::new(), +                scrollable: scrollable::State::new(), +                button: button::State::new(),                  scrollbar_width: None,                  scrollbar_margin: None,                  scroller_width: None,              },              Self {                  title: "Slimmed & Margin", -                state: scrollable::State::new(), +                scrollable: scrollable::State::new(), +                button: button::State::new(),                  scrollbar_width: Some(4),                  scrollbar_margin: Some(3),                  scroller_width: Some(4),              },              Self {                  title: "Wide Scroller", -                state: scrollable::State::new(), +                scrollable: scrollable::State::new(), +                button: button::State::new(),                  scrollbar_width: Some(4),                  scrollbar_margin: None,                  scroller_width: Some(10),              },              Self {                  title: "Narrow Scroller", -                state: scrollable::State::new(), +                scrollable: scrollable::State::new(), +                button: button::State::new(),                  scrollbar_width: Some(10),                  scrollbar_margin: None,                  scroller_width: Some(4), diff --git a/graphics/src/widget/scrollable.rs b/graphics/src/widget/scrollable.rs index 57065ba2..2220e4b8 100644 --- a/graphics/src/widget/scrollable.rs +++ b/graphics/src/widget/scrollable.rs @@ -134,8 +134,16 @@ where                      Primitive::None                  }; +                let scroll = Primitive::Clip { +                    bounds, +                    offset: Vector::new(0, 0), +                    content: Box::new(Primitive::Group { +                        primitives: vec![scrollbar, scroller], +                    }), +                }; +                  Primitive::Group { -                    primitives: vec![clip, scrollbar, scroller], +                    primitives: vec![clip, scroll],                  }              } else {                  content diff --git a/graphics/src/window/compositor.rs b/graphics/src/window/compositor.rs index 0bc8cbc8..7d5d789b 100644 --- a/graphics/src/window/compositor.rs +++ b/graphics/src/window/compositor.rs @@ -17,7 +17,10 @@ pub trait Compositor: Sized {      type SwapChain;      /// Creates a new [`Compositor`]. -    fn new(settings: Self::Settings) -> Result<(Self, Self::Renderer), Error>; +    fn new<W: HasRawWindowHandle>( +        settings: Self::Settings, +        compatible_window: Option<&W>, +    ) -> Result<(Self, Self::Renderer), Error>;      /// Crates a new [`Surface`] for the given window.      /// diff --git a/native/src/widget/checkbox.rs b/native/src/widget/checkbox.rs index 6ce2e973..0f21c873 100644 --- a/native/src/widget/checkbox.rs +++ b/native/src/widget/checkbox.rs @@ -8,8 +8,8 @@ use crate::row;  use crate::text;  use crate::touch;  use crate::{ -    Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length, -    Point, Rectangle, Row, Text, VerticalAlignment, Widget, +    Align, Clipboard, Color, Element, Hasher, HorizontalAlignment, Layout, +    Length, Point, Rectangle, Row, Text, VerticalAlignment, Widget,  };  /// A box that can be checked. @@ -39,6 +39,7 @@ pub struct Checkbox<Message, Renderer: self::Renderer + text::Renderer> {      spacing: u16,      text_size: Option<u16>,      font: Renderer::Font, +    text_color: Option<Color>,      style: Renderer::Style,  } @@ -66,6 +67,7 @@ impl<Message, Renderer: self::Renderer + text::Renderer>              spacing: Renderer::DEFAULT_SPACING,              text_size: None,              font: Renderer::Font::default(), +            text_color: None,              style: Renderer::Style::default(),          }      } @@ -102,6 +104,12 @@ impl<Message, Renderer: self::Renderer + text::Renderer>          self      } +    /// Sets the text color of the [`Checkbox`] button. +    pub fn text_color(mut self, color: Color) -> Self { +        self.text_color = Some(color); +        self +    } +      /// Sets the style of the [`Checkbox`].      pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self {          self.style = style.into(); @@ -193,7 +201,7 @@ where              &self.label,              self.text_size.unwrap_or(renderer.default_size()),              self.font, -            None, +            self.text_color,              HorizontalAlignment::Left,              VerticalAlignment::Center,          ); diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs index 046d5779..b17d93a3 100644 --- a/native/src/widget/pick_list.rs +++ b/native/src/widget/pick_list.rs @@ -163,7 +163,7 @@ where                          let (width, _) = renderer.measure(                              &label,                              text_size, -                            Renderer::Font::default(), +                            self.font,                              Size::new(f32::INFINITY, f32::INFINITY),                          ); diff --git a/native/src/widget/radio.rs b/native/src/widget/radio.rs index 9482a9b1..dee82d1f 100644 --- a/native/src/widget/radio.rs +++ b/native/src/widget/radio.rs @@ -1,17 +1,17 @@  //! Create choices using radio buttons. +use std::hash::Hash; +  use crate::event::{self, Event}; -use crate::layout;  use crate::mouse;  use crate::row;  use crate::text;  use crate::touch; +use crate::{layout, Color};  use crate::{      Align, Clipboard, Element, Hasher, HorizontalAlignment, Layout, Length,      Point, Rectangle, Row, Text, VerticalAlignment, Widget,  }; -use std::hash::Hash; -  /// A circular button representing a choice.  ///  /// # Example @@ -47,6 +47,8 @@ pub struct Radio<Message, Renderer: self::Renderer + text::Renderer> {      size: u16,      spacing: u16,      text_size: Option<u16>, +    text_color: Option<Color>, +    font: Renderer::Font,      style: Renderer::Style,  } @@ -81,6 +83,8 @@ where              size: <Renderer as self::Renderer>::DEFAULT_SIZE,              spacing: Renderer::DEFAULT_SPACING, //15              text_size: None, +            text_color: None, +            font: Default::default(),              style: Renderer::Style::default(),          }      } @@ -109,6 +113,18 @@ where          self      } +    /// Sets the text color of the [`Radio`] button. +    pub fn text_color(mut self, color: Color) -> Self { +        self.text_color = Some(color); +        self +    } + +    /// Sets the text font of the [`Radio`] button. +    pub fn font(mut self, font: Renderer::Font) -> Self { +        self.font = font; +        self +    } +      /// Sets the style of the [`Radio`] button.      pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self {          self.style = style.into(); @@ -196,8 +212,8 @@ where              label_layout.bounds(),              &self.label,              self.text_size.unwrap_or(renderer.default_size()), -            Default::default(), -            None, +            self.font, +            self.text_color,              HorizontalAlignment::Left,              VerticalAlignment::Center,          ); diff --git a/rustfmt.toml b/rustfmt.toml index d979d317..fa50ab92 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -1 +1,2 @@  max_width=80 +edition="2018" @@ -30,7 +30,7 @@  //! [windowing shell]: https://github.com/hecrj/iced/tree/master/winit  //! [`dodrio`]: https://github.com/fitzgen/dodrio  //! [web runtime]: https://github.com/hecrj/iced/tree/master/web -//! [examples]: https://github.com/hecrj/iced/tree/0.2/examples +//! [examples]: https://github.com/hecrj/iced/tree/0.3/examples  //! [repository]: https://github.com/hecrj/iced  //!  //! # Overview diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs index ab0f67d0..8c7de617 100644 --- a/wgpu/src/image/vector.rs +++ b/wgpu/src/image/vector.rs @@ -1,7 +1,8 @@ -use crate::image::atlas::{self, Atlas};  use iced_native::svg;  use std::collections::{HashMap, HashSet}; +use crate::image::atlas::{self, Atlas}; +  pub enum Svg {      Loaded(usvg::Tree),      NotFound, @@ -111,26 +112,13 @@ impl Cache {                  let width = img.width();                  let height = img.height(); -                let mut rgba = img.take().into_iter(); - -                // TODO: Perform conversion in the GPU -                let bgra: Vec<u8> = std::iter::from_fn(move || { -                    use std::iter::once; - -                    let r = rgba.next()?; -                    let g = rgba.next()?; -                    let b = rgba.next()?; -                    let a = rgba.next()?; - -                    Some(once(b).chain(once(g)).chain(once(r)).chain(once(a))) -                }) -                .flatten() -                .collect(); +                let mut rgba = img.take(); +                rgba.chunks_exact_mut(4).for_each(|rgba| rgba.swap(0, 2));                  let allocation = texture_atlas.upload(                      width,                      height, -                    bytemuck::cast_slice(bgra.as_slice()), +                    bytemuck::cast_slice(rgba.as_slice()),                      device,                      encoder,                  )?; diff --git a/wgpu/src/settings.rs b/wgpu/src/settings.rs index abc404dc..6c97d895 100644 --- a/wgpu/src/settings.rs +++ b/wgpu/src/settings.rs @@ -47,6 +47,7 @@ impl Settings {      ///     - `dx11`      ///     - `gl`      ///     - `webgpu` +    ///     - `primary`      pub fn from_env() -> Self {          Settings {              internal_backend: backend_from_env() @@ -78,6 +79,7 @@ fn backend_from_env() -> Option<wgpu::BackendBit> {              "dx11" => wgpu::BackendBit::DX11,              "gl" => wgpu::BackendBit::GL,              "webgpu" => wgpu::BackendBit::BROWSER_WEBGPU, +            "primary" => wgpu::BackendBit::PRIMARY,              other => panic!("Unknown backend: {}", other),          }      }) diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index 6ff499af..9b65596f 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -21,9 +21,16 @@ impl Compositor {      /// Requests a new [`Compositor`] with the given [`Settings`].      ///      /// Returns `None` if no compatible graphics adapter could be found. -    pub async fn request(settings: Settings) -> Option<Self> { +    pub async fn request<W: HasRawWindowHandle>( +        settings: Settings, +        compatible_window: Option<&W>, +    ) -> Option<Self> {          let instance = wgpu::Instance::new(settings.internal_backend); +        #[allow(unsafe_code)] +        let compatible_surface = compatible_window +            .map(|window| unsafe { instance.create_surface(window) }); +          let adapter = instance              .request_adapter(&wgpu::RequestAdapterOptions {                  power_preference: if settings.antialiasing.is_none() { @@ -31,7 +38,7 @@ impl Compositor {                  } else {                      wgpu::PowerPreference::HighPerformance                  }, -                compatible_surface: None, +                compatible_surface: compatible_surface.as_ref(),              })              .await?; @@ -77,9 +84,15 @@ impl iced_graphics::window::Compositor for Compositor {      type Surface = wgpu::Surface;      type SwapChain = wgpu::SwapChain; -    fn new(settings: Self::Settings) -> Result<(Self, Renderer), Error> { -        let compositor = futures::executor::block_on(Self::request(settings)) -            .ok_or(Error::AdapterNotFound)?; +    fn new<W: HasRawWindowHandle>( +        settings: Self::Settings, +        compatible_window: Option<&W>, +    ) -> Result<(Self, Renderer), Error> { +        let compositor = futures::executor::block_on(Self::request( +            settings, +            compatible_window, +        )) +        .ok_or(Error::AdapterNotFound)?;          let backend = compositor.create_backend(); diff --git a/winit/src/application.rs b/winit/src/application.rs index 106d5218..b1d5f418 100644 --- a/winit/src/application.rs +++ b/winit/src/application.rs @@ -118,8 +118,6 @@ where      let mut debug = Debug::new();      debug.startup_started(); -    let (compositor, renderer) = C::new(compositor_settings)?; -      let event_loop = EventLoop::with_user_event();      let mut runtime = { @@ -150,6 +148,8 @@ where          .build(&event_loop)          .map_err(Error::WindowCreationFailed)?; +    let (compositor, renderer) = C::new(compositor_settings, Some(&window))?; +      let (mut sender, receiver) = mpsc::unbounded();      let mut instance = Box::pin(run_instance::<A, E, C>(  | 
