diff options
Diffstat (limited to '')
55 files changed, 308 insertions, 720 deletions
diff --git a/examples/README.md b/examples/README.md index 74cf145b..111e8910 100644 --- a/examples/README.md +++ b/examples/README.md @@ -93,8 +93,7 @@ A bunch of simpler examples exist:  - [`download_progress`](download_progress), a basic application that asynchronously downloads a dummy file of 100 MB and tracks the download progress.  - [`events`](events), a log of native events displayed using a conditional `Subscription`.  - [`geometry`](geometry), a custom widget showcasing how to draw geometry with the `Mesh2D` primitive in [`iced_wgpu`](../wgpu). -- [`integration_opengl`](integration_opengl), a demonstration of how to integrate Iced in an existing OpenGL application. -- [`integration_wgpu`](integration_wgpu), a demonstration of how to integrate Iced in an existing [`wgpu`] application. +- [`integration`](integration), a demonstration of how to integrate Iced in an existing [`wgpu`] application.  - [`pane_grid`](pane_grid), a grid of panes that can be split, resized, and reorganized.  - [`pick_list`](pick_list), a dropdown list of selectable options.  - [`pokedex`](pokedex), an application that displays a random Pokédex entry (sprite included!) by using the [PokéAPI]. diff --git a/examples/arc/src/main.rs b/examples/arc/src/main.rs index 7b6ea0e1..80ad0b5b 100644 --- a/examples/arc/src/main.rs +++ b/examples/arc/src/main.rs @@ -5,8 +5,8 @@ use iced::widget::canvas::{      self, stroke, Cache, Canvas, Cursor, Geometry, Path, Stroke,  };  use iced::{ -    Application, Command, Element, Length, Point, Rectangle, Settings, -    Subscription, Theme, +    Application, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Subscription, Theme,  };  pub fn main() -> iced::Result { @@ -75,11 +75,12 @@ impl<Message> canvas::Program<Message> for Arc {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let geometry = self.cache.draw(bounds.size(), |frame| { +        let geometry = self.cache.draw(renderer, bounds.size(), |frame| {              let palette = theme.palette();              let center = frame.center(); diff --git a/examples/bezier_tool/src/main.rs b/examples/bezier_tool/src/main.rs index 7c3916d4..f1c83a16 100644 --- a/examples/bezier_tool/src/main.rs +++ b/examples/bezier_tool/src/main.rs @@ -64,7 +64,7 @@ mod bezier {      use iced::widget::canvas::{          self, Canvas, Cursor, Frame, Geometry, Path, Stroke,      }; -    use iced::{Element, Length, Point, Rectangle, Theme}; +    use iced::{Element, Length, Point, Rectangle, Renderer, Theme};      #[derive(Default)]      pub struct State { @@ -152,22 +152,26 @@ mod bezier {          fn draw(              &self,              state: &Self::State, +            renderer: &Renderer,              _theme: &Theme,              bounds: Rectangle,              cursor: Cursor,          ) -> Vec<Geometry> { -            let content = -                self.state.cache.draw(bounds.size(), |frame: &mut Frame| { +            let content = self.state.cache.draw( +                renderer, +                bounds.size(), +                |frame: &mut Frame| {                      Curve::draw_all(self.curves, frame);                      frame.stroke(                          &Path::rectangle(Point::ORIGIN, frame.size()),                          Stroke::default().with_width(2.0),                      ); -                }); +                }, +            );              if let Some(pending) = state { -                let pending_curve = pending.draw(bounds, cursor); +                let pending_curve = pending.draw(renderer, bounds, cursor);                  vec![content, pending_curve]              } else { @@ -216,8 +220,13 @@ mod bezier {      }      impl Pending { -        fn draw(&self, bounds: Rectangle, cursor: Cursor) -> Geometry { -            let mut frame = Frame::new(bounds.size()); +        fn draw( +            &self, +            renderer: &Renderer, +            bounds: Rectangle, +            cursor: Cursor, +        ) -> Geometry { +            let mut frame = Frame::new(renderer, bounds.size());              if let Some(cursor_position) = cursor.position_in(&bounds) {                  match *self { diff --git a/examples/checkbox/fonts/icons.ttf b/examples/checkbox/fonts/icons.ttf Binary files differindex a2046844..82f28481 100644 --- a/examples/checkbox/fonts/icons.ttf +++ b/examples/checkbox/fonts/icons.ttf diff --git a/examples/checkbox/src/main.rs b/examples/checkbox/src/main.rs index 09950bb8..ef61a974 100644 --- a/examples/checkbox/src/main.rs +++ b/examples/checkbox/src/main.rs @@ -1,10 +1,9 @@ -use iced::widget::{checkbox, column, container}; -use iced::{Element, Font, Length, Sandbox, Settings}; +use iced::executor; +use iced::font::{self, Font}; +use iced::widget::{checkbox, column, container, text}; +use iced::{Application, Command, Element, Length, Settings, Theme}; -const ICON_FONT: Font = Font::External { -    name: "Icons", -    bytes: include_bytes!("../fonts/icons.ttf"), -}; +const ICON_FONT: Font = Font::with_name("icons");  pub fn main() -> iced::Result {      Example::run(Settings::default()) @@ -20,24 +19,35 @@ struct Example {  enum Message {      DefaultChecked(bool),      CustomChecked(bool), +    FontLoaded(Result<(), font::Error>),  } -impl Sandbox for Example { +impl Application for Example {      type Message = Message; +    type Flags = (); +    type Executor = executor::Default; +    type Theme = Theme; -    fn new() -> Self { -        Default::default() +    fn new(_flags: Self::Flags) -> (Self, Command<Message>) { +        ( +            Self::default(), +            font::load(include_bytes!("../fonts/icons.ttf").as_ref()) +                .map(Message::FontLoaded), +        )      }      fn title(&self) -> String {          String::from("Checkbox - Iced")      } -    fn update(&mut self, message: Message) { +    fn update(&mut self, message: Message) -> Command<Message> {          match message {              Message::DefaultChecked(value) => self.default_checkbox = value,              Message::CustomChecked(value) => self.custom_checkbox = value, +            Message::FontLoaded(_) => (),          } + +        Command::none()      }      fn view(&self) -> Element<Message> { @@ -49,6 +59,8 @@ impl Sandbox for Example {                      font: ICON_FONT,                      code_point: '\u{e901}',                      size: None, +                    line_height: text::LineHeight::Relative(1.0), +                    shaping: text::Shaping::Basic,                  });          let content = column![default_checkbox, custom_checkbox].spacing(22); diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index a389c54f..6425e2da 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -4,8 +4,8 @@ use iced::widget::canvas::{  };  use iced::widget::{canvas, container};  use iced::{ -    Application, Color, Command, Element, Length, Point, Rectangle, Settings, -    Subscription, Theme, Vector, +    Application, Color, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Subscription, Theme, Vector,  };  pub fn main() -> iced::Result { @@ -83,17 +83,18 @@ impl Application for Clock {      }  } -impl<Message> canvas::Program<Message> for Clock { +impl<Message> canvas::Program<Message, Renderer> for Clock {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let clock = self.clock.draw(bounds.size(), |frame| { +        let clock = self.clock.draw(renderer, bounds.size(), |frame| {              let center = frame.center();              let radius = frame.width().min(frame.height()) / 2.0; diff --git a/examples/color_palette/src/main.rs b/examples/color_palette/src/main.rs index a2df36c2..5c4304ee 100644 --- a/examples/color_palette/src/main.rs +++ b/examples/color_palette/src/main.rs @@ -1,8 +1,8 @@  use iced::widget::canvas::{self, Canvas, Cursor, Frame, Geometry, Path};  use iced::widget::{column, row, text, Slider};  use iced::{ -    alignment, Alignment, Color, Element, Length, Point, Rectangle, Sandbox, -    Settings, Size, Vector, +    alignment, Alignment, Color, Element, Length, Point, Rectangle, Renderer, +    Sandbox, Settings, Size, Vector,  };  use palette::{self, convert::FromColor, Hsl, Srgb};  use std::marker::PhantomData; @@ -243,11 +243,12 @@ impl<Message> canvas::Program<Message> for Theme {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &iced::Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let theme = self.canvas_cache.draw(bounds.size(), |frame| { +        let theme = self.canvas_cache.draw(renderer, bounds.size(), |frame| {              self.draw(frame);          }); diff --git a/examples/component/Cargo.toml b/examples/component/Cargo.toml index dd435201..9db1e6b4 100644 --- a/examples/component/Cargo.toml +++ b/examples/component/Cargo.toml @@ -6,6 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../..", features = ["debug"] } -iced_native = { path = "../../native" } -iced_lazy = { path = "../../lazy" } +iced = { path = "../..", features = ["debug", "lazy"] } diff --git a/examples/component/src/main.rs b/examples/component/src/main.rs index 21c2747c..010321a9 100644 --- a/examples/component/src/main.rs +++ b/examples/component/src/main.rs @@ -47,9 +47,8 @@ impl Sandbox for Component {  mod numeric_input {      use iced::alignment::{self, Alignment}; -    use iced::widget::{self, button, row, text, text_input}; -    use iced::{Element, Length}; -    use iced_lazy::{self, Component}; +    use iced::widget::{button, component, row, text, text_input, Component}; +    use iced::{Element, Length, Renderer};      pub struct NumericInput<Message> {          value: Option<u32>, @@ -82,13 +81,7 @@ mod numeric_input {          }      } -    impl<Message, Renderer> Component<Message, Renderer> for NumericInput<Message> -    where -        Renderer: iced_native::text::Renderer + 'static, -        Renderer::Theme: widget::button::StyleSheet -            + widget::text_input::StyleSheet -            + widget::text::StyleSheet, -    { +    impl<Message> Component<Message, Renderer> for NumericInput<Message> {          type State = ();          type Event = Event; @@ -152,17 +145,12 @@ mod numeric_input {          }      } -    impl<'a, Message, Renderer> From<NumericInput<Message>> -        for Element<'a, Message, Renderer> +    impl<'a, Message> From<NumericInput<Message>> for Element<'a, Message, Renderer>      where          Message: 'a, -        Renderer: 'static + iced_native::text::Renderer, -        Renderer::Theme: widget::button::StyleSheet -            + widget::text_input::StyleSheet -            + widget::text::StyleSheet,      {          fn from(numeric_input: NumericInput<Message>) -> Self { -            iced_lazy::component(numeric_input) +            component(numeric_input)          }      }  } diff --git a/examples/custom_quad/Cargo.toml b/examples/custom_quad/Cargo.toml index 39154786..f097c2dd 100644 --- a/examples/custom_quad/Cargo.toml +++ b/examples/custom_quad/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../.." } -iced_native = { path = "../../native" } +iced = { path = "../..", features = ["advanced"] } diff --git a/examples/custom_quad/src/main.rs b/examples/custom_quad/src/main.rs index 6509887c..b07f42ce 100644 --- a/examples/custom_quad/src/main.rs +++ b/examples/custom_quad/src/main.rs @@ -1,9 +1,9 @@  //! This example showcases a drawing a quad.  mod quad { -    use iced_native::layout::{self, Layout}; -    use iced_native::renderer; -    use iced_native::widget::{self, Widget}; -    use iced_native::{Color, Element, Length, Point, Rectangle, Size}; +    use iced::advanced::layout::{self, Layout}; +    use iced::advanced::renderer; +    use iced::advanced::widget::{self, Widget}; +    use iced::{Color, Element, Length, Point, Rectangle, Size};      pub struct CustomQuad {          size: f32, diff --git a/examples/custom_widget/Cargo.toml b/examples/custom_widget/Cargo.toml index 067aab4a..dda0efe8 100644 --- a/examples/custom_widget/Cargo.toml +++ b/examples/custom_widget/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../.." } -iced_native = { path = "../../native" } +iced = { path = "../..", features = ["advanced"] } diff --git a/examples/custom_widget/src/main.rs b/examples/custom_widget/src/main.rs index f6bb3b1e..7854548c 100644 --- a/examples/custom_widget/src/main.rs +++ b/examples/custom_widget/src/main.rs @@ -9,10 +9,10 @@ mod circle {      // Of course, you can choose to make the implementation renderer-agnostic,      // if you wish to, by creating your own `Renderer` trait, which could be      // implemented by `iced_wgpu` and other renderers. -    use iced_native::layout::{self, Layout}; -    use iced_native::renderer; -    use iced_native::widget::{self, Widget}; -    use iced_native::{Color, Element, Length, Point, Rectangle, Size}; +    use iced::advanced::layout::{self, Layout}; +    use iced::advanced::renderer; +    use iced::advanced::widget::{self, Widget}; +    use iced::{Color, Element, Length, Point, Rectangle, Size};      pub struct Circle {          radius: f32, diff --git a/examples/download_progress/Cargo.toml b/examples/download_progress/Cargo.toml index f38679ea..212832f4 100644 --- a/examples/download_progress/Cargo.toml +++ b/examples/download_progress/Cargo.toml @@ -7,8 +7,6 @@ publish = false  [dependencies]  iced = { path = "../..", features = ["tokio"] } -iced_native = { path = "../../native" } -iced_futures = { path = "../../futures" }  [dependencies.reqwest]  version = "0.11" diff --git a/examples/download_progress/src/download.rs b/examples/download_progress/src/download.rs index cd7647e8..3b11cb76 100644 --- a/examples/download_progress/src/download.rs +++ b/examples/download_progress/src/download.rs @@ -1,4 +1,4 @@ -use iced_native::subscription; +use iced::subscription;  use std::hash::Hash; diff --git a/examples/events/Cargo.toml b/examples/events/Cargo.toml index 8c56e471..15ffc0af 100644 --- a/examples/events/Cargo.toml +++ b/examples/events/Cargo.toml @@ -7,4 +7,3 @@ publish = false  [dependencies]  iced = { path = "../..", features = ["debug"] } -iced_native = { path = "../../native" } diff --git a/examples/events/src/main.rs b/examples/events/src/main.rs index 1b97018e..7f3a5e1d 100644 --- a/examples/events/src/main.rs +++ b/examples/events/src/main.rs @@ -1,12 +1,13 @@  use iced::alignment;  use iced::executor; +use iced::subscription;  use iced::widget::{button, checkbox, container, text, Column};  use iced::window; +use iced::Event;  use iced::{      Alignment, Application, Command, Element, Length, Settings, Subscription,      Theme,  }; -use iced_native::Event;  pub fn main() -> iced::Result {      Events::run(Settings { @@ -17,13 +18,13 @@ pub fn main() -> iced::Result {  #[derive(Debug, Default)]  struct Events { -    last: Vec<iced_native::Event>, +    last: Vec<Event>,      enabled: bool,  }  #[derive(Debug, Clone)]  enum Message { -    EventOccurred(iced_native::Event), +    EventOccurred(Event),      Toggled(bool),      Exit,  } @@ -70,7 +71,7 @@ impl Application for Events {      }      fn subscription(&self) -> Subscription<Message> { -        iced_native::subscription::events().map(Message::EventOccurred) +        subscription::events().map(Message::EventOccurred)      }      fn view(&self) -> Element<Message> { diff --git a/examples/game_of_life/src/main.rs b/examples/game_of_life/src/main.rs index ed911160..eab8908b 100644 --- a/examples/game_of_life/src/main.rs +++ b/examples/game_of_life/src/main.rs @@ -145,7 +145,7 @@ impl Application for GameOfLife {              self.grid                  .view()                  .map(move |message| Message::Grid(message, version)), -            controls +            controls,          ];          container(content) @@ -211,8 +211,8 @@ mod grid {          Cache, Canvas, Cursor, Frame, Geometry, Path, Text,      };      use iced::{ -        alignment, mouse, Color, Element, Length, Point, Rectangle, Size, -        Theme, Vector, +        alignment, mouse, Color, Element, Length, Point, Rectangle, Renderer, +        Size, Theme, Vector,      };      use rustc_hash::{FxHashMap, FxHashSet};      use std::future::Future; @@ -536,13 +536,14 @@ mod grid {          fn draw(              &self,              _interaction: &Interaction, +            renderer: &Renderer,              _theme: &Theme,              bounds: Rectangle,              cursor: Cursor,          ) -> Vec<Geometry> {              let center = Vector::new(bounds.width / 2.0, bounds.height / 2.0); -            let life = self.life_cache.draw(bounds.size(), |frame| { +            let life = self.life_cache.draw(renderer, bounds.size(), |frame| {                  let background = Path::rectangle(Point::ORIGIN, frame.size());                  frame.fill(&background, Color::from_rgb8(0x40, 0x44, 0x4B)); @@ -565,7 +566,7 @@ mod grid {              });              let overlay = { -                let mut frame = Frame::new(bounds.size()); +                let mut frame = Frame::new(renderer, bounds.size());                  let hovered_cell =                      cursor.position_in(&bounds).map(|position| { @@ -626,38 +627,40 @@ mod grid {              if self.scaling < 0.2 || !self.show_lines {                  vec![life, overlay]              } else { -                let grid = self.grid_cache.draw(bounds.size(), |frame| { -                    frame.translate(center); -                    frame.scale(self.scaling); -                    frame.translate(self.translation); -                    frame.scale(Cell::SIZE as f32); - -                    let region = self.visible_region(frame.size()); -                    let rows = region.rows(); -                    let columns = region.columns(); -                    let (total_rows, total_columns) = -                        (rows.clone().count(), columns.clone().count()); -                    let width = 2.0 / Cell::SIZE as f32; -                    let color = Color::from_rgb8(70, 74, 83); - -                    frame.translate(Vector::new(-width / 2.0, -width / 2.0)); +                let grid = +                    self.grid_cache.draw(renderer, bounds.size(), |frame| { +                        frame.translate(center); +                        frame.scale(self.scaling); +                        frame.translate(self.translation); +                        frame.scale(Cell::SIZE as f32); -                    for row in region.rows() { -                        frame.fill_rectangle( -                            Point::new(*columns.start() as f32, row as f32), -                            Size::new(total_columns as f32, width), -                            color, -                        ); -                    } +                        let region = self.visible_region(frame.size()); +                        let rows = region.rows(); +                        let columns = region.columns(); +                        let (total_rows, total_columns) = +                            (rows.clone().count(), columns.clone().count()); +                        let width = 2.0 / Cell::SIZE as f32; +                        let color = Color::from_rgb8(70, 74, 83); + +                        frame +                            .translate(Vector::new(-width / 2.0, -width / 2.0)); + +                        for row in region.rows() { +                            frame.fill_rectangle( +                                Point::new(*columns.start() as f32, row as f32), +                                Size::new(total_columns as f32, width), +                                color, +                            ); +                        } -                    for column in region.columns() { -                        frame.fill_rectangle( -                            Point::new(column as f32, *rows.start() as f32), -                            Size::new(width, total_rows as f32), -                            color, -                        ); -                    } -                }); +                        for column in region.columns() { +                            frame.fill_rectangle( +                                Point::new(column as f32, *rows.start() as f32), +                                Size::new(width, total_rows as f32), +                                color, +                            ); +                        } +                    });                  vec![life, grid, overlay]              } diff --git a/examples/geometry/Cargo.toml b/examples/geometry/Cargo.toml index 22ede0e0..79fe52d5 100644 --- a/examples/geometry/Cargo.toml +++ b/examples/geometry/Cargo.toml @@ -6,6 +6,5 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../.." } -iced_native = { path = "../../native" } +iced = { path = "../..", features = ["advanced"] }  iced_graphics = { path = "../../graphics" } diff --git a/examples/geometry/src/main.rs b/examples/geometry/src/main.rs index 9bacce7f..5cb41184 100644 --- a/examples/geometry/src/main.rs +++ b/examples/geometry/src/main.rs @@ -1,23 +1,13 @@  //! This example showcases a simple native custom widget that renders using  //! arbitrary low-level geometry.  mod rainbow { -    // For now, to implement a custom native widget you will need to add -    // `iced_native` and `iced_wgpu` to your dependencies. -    // -    // Then, you simply need to define your widget type and implement the -    // `iced_native::Widget` trait with the `iced_wgpu::Renderer`. -    // -    // Of course, you can choose to make the implementation renderer-agnostic, -    // if you wish to, by creating your own `Renderer` trait, which could be -    // implemented by `iced_wgpu` and other renderers. -    use iced_graphics::renderer::{self, Renderer}; -    use iced_graphics::triangle::ColoredVertex2D; -    use iced_graphics::{Backend, Primitive}; - -    use iced_native::layout; -    use iced_native::widget::{self, Widget}; -    use iced_native::{ -        Element, Layout, Length, Point, Rectangle, Size, Vector, +    use iced_graphics::primitive::{ColoredVertex2D, Primitive}; + +    use iced::advanced::layout::{self, Layout}; +    use iced::advanced::renderer; +    use iced::advanced::widget::{self, Widget}; +    use iced::{ +        Element, Length, Point, Rectangle, Renderer, Size, Theme, Vector,      };      #[derive(Debug, Clone, Copy, Default)] @@ -27,10 +17,7 @@ mod rainbow {          Rainbow      } -    impl<Message, B, T> Widget<Message, Renderer<B, T>> for Rainbow -    where -        B: Backend, -    { +    impl<Message> Widget<Message, Renderer> for Rainbow {          fn width(&self) -> Length {              Length::Fill          } @@ -41,7 +28,7 @@ mod rainbow {          fn layout(              &self, -            _renderer: &Renderer<B, T>, +            _renderer: &Renderer,              limits: &layout::Limits,          ) -> layout::Node {              let size = limits.width(Length::Fill).resolve(Size::ZERO); @@ -52,15 +39,15 @@ mod rainbow {          fn draw(              &self,              _tree: &widget::Tree, -            renderer: &mut Renderer<B, T>, -            _theme: &T, +            renderer: &mut Renderer, +            _theme: &Theme,              _style: &renderer::Style,              layout: Layout<'_>,              cursor_position: Point,              _viewport: &Rectangle,          ) { -            use iced_graphics::triangle::Mesh2D; -            use iced_native::Renderer as _; +            use iced::advanced::Renderer as _; +            use iced_graphics::primitive::Mesh2D;              let b = layout.bounds(); @@ -151,10 +138,7 @@ mod rainbow {          }      } -    impl<'a, Message, B, T> From<Rainbow> for Element<'a, Message, Renderer<B, T>> -    where -        B: Backend, -    { +    impl<'a, Message> From<Rainbow> for Element<'a, Message, Renderer> {          fn from(rainbow: Rainbow) -> Self {              Self::new(rainbow)          } diff --git a/examples/integration_wgpu/.gitignore b/examples/integration/.gitignore index e188dc28..e188dc28 100644 --- a/examples/integration_wgpu/.gitignore +++ b/examples/integration/.gitignore diff --git a/examples/integration_wgpu/Cargo.toml b/examples/integration/Cargo.toml index c0e4fd81..22914742 100644 --- a/examples/integration_wgpu/Cargo.toml +++ b/examples/integration/Cargo.toml @@ -1,5 +1,5 @@  [package] -name = "integration_wgpu" +name = "integration"  version = "0.1.0"  authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]  edition = "2021" @@ -7,7 +7,9 @@ publish = false  [dependencies]  iced_winit = { path = "../../winit" } -iced_wgpu = { path = "../../wgpu", features = ["webgl"] } +iced_wgpu = { path = "../../wgpu" } +iced_widget = { path = "../../widget" } +iced_renderer = { path = "../../renderer", features = ["wgpu"] }  env_logger = "0.10"  [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/examples/integration_wgpu/README.md b/examples/integration/README.md index ece9ba1e..ece9ba1e 100644 --- a/examples/integration_wgpu/README.md +++ b/examples/integration/README.md diff --git a/examples/integration_wgpu/index.html b/examples/integration/index.html index 461e67a4..920bc4a0 100644 --- a/examples/integration_wgpu/index.html +++ b/examples/integration/index.html @@ -8,8 +8,8 @@      <h1>integration_wgpu</h1>      <canvas id="iced_canvas"></canvas>      <script type="module"> -      import init from "./integration_wgpu.js"; -      init('./integration_wgpu_bg.wasm'); +      import init from "./integration.js"; +      init('./integration_bg.wasm');      </script>      <style>        body { diff --git a/examples/integration_wgpu/src/controls.rs b/examples/integration/src/controls.rs index 42623b15..14e53ede 100644 --- a/examples/integration_wgpu/src/controls.rs +++ b/examples/integration/src/controls.rs @@ -1,6 +1,8 @@  use iced_wgpu::Renderer; -use iced_winit::widget::{slider, text_input, Column, Row, Text}; -use iced_winit::{Alignment, Color, Command, Element, Length, Program}; +use iced_widget::{slider, text_input, Column, Row, Text}; +use iced_winit::core::{Alignment, Color, Element, Length}; +use iced_winit::runtime::{Command, Program}; +use iced_winit::style::Theme;  pub struct Controls {      background_color: Color, @@ -27,7 +29,7 @@ impl Controls {  }  impl Program for Controls { -    type Renderer = Renderer; +    type Renderer = Renderer<Theme>;      type Message = Message;      fn update(&mut self, message: Message) -> Command<Message> { @@ -43,7 +45,7 @@ impl Program for Controls {          Command::none()      } -    fn view(&self) -> Element<Message, Renderer> { +    fn view(&self) -> Element<Message, Renderer<Theme>> {          let background_color = self.background_color;          let text = &self.text; diff --git a/examples/integration_wgpu/src/main.rs b/examples/integration/src/main.rs index 15901db8..c935aca7 100644 --- a/examples/integration_wgpu/src/main.rs +++ b/examples/integration/src/main.rs @@ -4,11 +4,14 @@ mod scene;  use controls::Controls;  use scene::Scene; -use iced_wgpu::{wgpu, Backend, Renderer, Settings, Viewport}; -use iced_winit::{ -    conversion, futures, program, renderer, winit, Clipboard, Color, Debug, -    Size, -}; +use iced_wgpu::graphics::Viewport; +use iced_wgpu::{wgpu, Backend, Renderer, Settings}; +use iced_winit::core::renderer; +use iced_winit::core::{Color, Size}; +use iced_winit::runtime::program; +use iced_winit::runtime::Debug; +use iced_winit::style::Theme; +use iced_winit::{conversion, futures, winit, Clipboard};  use winit::{      dpi::PhysicalPosition, @@ -34,7 +37,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {              .and_then(|win| win.document())              .and_then(|doc| doc.get_element_by_id("iced_canvas"))              .and_then(|element| element.dyn_into::<HtmlCanvasElement>().ok()) -            .expect("Canvas with id `iced_canvas` is missing") +            .expect("Get canvas element")      };      #[cfg(not(target_arch = "wasm32"))]      env_logger::init(); @@ -74,47 +77,49 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {      });      let surface = unsafe { instance.create_surface(&window) }?; -    let (format, (device, queue)) = futures::executor::block_on(async { -        let adapter = wgpu::util::initialize_adapter_from_env_or_default( -            &instance, -            backend, -            Some(&surface), -        ) -        .await -        .expect("No suitable GPU adapters found on the system!"); - -        let adapter_features = adapter.features(); - -        #[cfg(target_arch = "wasm32")] -        let needed_limits = wgpu::Limits::downlevel_webgl2_defaults() -            .using_resolution(adapter.limits()); - -        #[cfg(not(target_arch = "wasm32"))] -        let needed_limits = wgpu::Limits::default(); - -        let capabilities = surface.get_capabilities(&adapter); - -        ( -            capabilities -                .formats -                .iter() -                .copied() -                .find(wgpu::TextureFormat::is_srgb) -                .or_else(|| capabilities.formats.first().copied()) -                .expect("Get preferred format"), -            adapter -                .request_device( -                    &wgpu::DeviceDescriptor { -                        label: None, -                        features: adapter_features & wgpu::Features::default(), -                        limits: needed_limits, -                    }, -                    None, -                ) -                .await -                .expect("Request device"), -        ) -    }); +    let (format, (device, queue)) = +        futures::futures::executor::block_on(async { +            let adapter = wgpu::util::initialize_adapter_from_env_or_default( +                &instance, +                backend, +                Some(&surface), +            ) +            .await +            .expect("Create adapter"); + +            let adapter_features = adapter.features(); + +            #[cfg(target_arch = "wasm32")] +            let needed_limits = wgpu::Limits::downlevel_webgl2_defaults() +                .using_resolution(adapter.limits()); + +            #[cfg(not(target_arch = "wasm32"))] +            let needed_limits = wgpu::Limits::default(); + +            let capabilities = surface.get_capabilities(&adapter); + +            ( +                capabilities +                    .formats +                    .iter() +                    .copied() +                    .find(wgpu::TextureFormat::is_srgb) +                    .or_else(|| capabilities.formats.first().copied()) +                    .expect("Get preferred format"), +                adapter +                    .request_device( +                        &wgpu::DeviceDescriptor { +                            label: None, +                            features: adapter_features +                                & wgpu::Features::default(), +                            limits: needed_limits, +                        }, +                        None, +                    ) +                    .await +                    .expect("Request device"), +            ) +        });      surface.configure(          &device, @@ -131,17 +136,18 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {      let mut resized = false; -    // Initialize staging belt -    let mut staging_belt = wgpu::util::StagingBelt::new(5 * 1024); -      // Initialize scene and GUI controls      let scene = Scene::new(&device, format);      let controls = Controls::new();      // Initialize iced      let mut debug = Debug::new(); -    let mut renderer = -        Renderer::new(Backend::new(&device, Settings::default(), format)); +    let mut renderer = Renderer::new(Backend::new( +        &device, +        &queue, +        Settings::default(), +        format, +    ));      let mut state = program::State::new(          controls, @@ -193,7 +199,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                              viewport.scale_factor(),                          ),                          &mut renderer, -                        &iced_wgpu::Theme::Dark, +                        &Theme::Dark,                          &renderer::Style { text_color: Color::WHITE },                          &mut clipboard,                          &mut debug, @@ -221,7 +227,7 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                              height: size.height,                              present_mode: wgpu::PresentMode::AutoVsync,                              alpha_mode: wgpu::CompositeAlphaMode::Auto, -                            view_formats: vec![] +                            view_formats: vec![],                          },                      ); @@ -254,8 +260,9 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                          renderer.with_primitives(|backend, primitive| {                              backend.present(                                  &device, -                                &mut staging_belt, +                                &queue,                                  &mut encoder, +                                None,                                  &view,                                  primitive,                                  &viewport, @@ -264,7 +271,6 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                          });                          // Then we submit the work -                        staging_belt.finish();                          queue.submit(Some(encoder.finish()));                          frame.present(); @@ -274,10 +280,6 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {                                   state.mouse_interaction(),                               ),                           ); - -                        // And recall staging buffers -                        staging_belt.recall(); -                      }                      Err(error) => match error {                          wgpu::SurfaceError::OutOfMemory => { diff --git a/examples/integration_wgpu/src/scene.rs b/examples/integration/src/scene.rs index 3e41fbda..90c7efbf 100644 --- a/examples/integration_wgpu/src/scene.rs +++ b/examples/integration/src/scene.rs @@ -1,5 +1,5 @@  use iced_wgpu::wgpu; -use iced_winit::Color; +use iced_winit::core::Color;  pub struct Scene {      pipeline: wgpu::RenderPipeline, diff --git a/examples/integration_wgpu/src/shader/frag.wgsl b/examples/integration/src/shader/frag.wgsl index cf27bb56..cf27bb56 100644 --- a/examples/integration_wgpu/src/shader/frag.wgsl +++ b/examples/integration/src/shader/frag.wgsl diff --git a/examples/integration_wgpu/src/shader/vert.wgsl b/examples/integration/src/shader/vert.wgsl index e353e6ba..e353e6ba 100644 --- a/examples/integration_wgpu/src/shader/vert.wgsl +++ b/examples/integration/src/shader/vert.wgsl diff --git a/examples/integration_opengl/Cargo.toml b/examples/integration_opengl/Cargo.toml deleted file mode 100644 index 6dac999c..00000000 --- a/examples/integration_opengl/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "integration_opengl" -version = "0.1.0" -authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"] -edition = "2021" -publish = false - -[dependencies] -iced_glutin = { path = "../../glutin" } -iced_glow = { path = "../../glow" } -iced_winit = { path = "../../winit" } -env_logger = "0.8" diff --git a/examples/integration_opengl/README.md b/examples/integration_opengl/README.md deleted file mode 100644 index b7c2c074..00000000 --- a/examples/integration_opengl/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## OpenGL integration - -A demonstration of how to integrate Iced in an existing graphical OpenGL application. - -The __[`main`]__ file contains all the code of the example. - -<div align="center"> -  <a href="https://imgbox.com/9P9ETcod" target="_blank"><img src="https://images2.imgbox.com/2a/51/9P9ETcod_o.gif" alt="image host"/></a> -</div> - -You can run it with `cargo run`: -``` -cargo run --package integration_opengl -``` - -[`main`]: src/main.rs diff --git a/examples/integration_opengl/src/controls.rs b/examples/integration_opengl/src/controls.rs deleted file mode 100644 index c3648f44..00000000 --- a/examples/integration_opengl/src/controls.rs +++ /dev/null @@ -1,101 +0,0 @@ -use iced_glow::Renderer; -use iced_glutin::widget::Slider; -use iced_glutin::widget::{Column, Row, Text}; -use iced_glutin::{Alignment, Color, Command, Element, Length, Program}; - -pub struct Controls { -    background_color: Color, -} - -#[derive(Debug, Clone)] -pub enum Message { -    BackgroundColorChanged(Color), -} - -impl Controls { -    pub fn new() -> Controls { -        Controls { -            background_color: Color::BLACK, -        } -    } - -    pub fn background_color(&self) -> Color { -        self.background_color -    } -} - -impl Program for Controls { -    type Renderer = Renderer; -    type Message = Message; - -    fn update(&mut self, message: Message) -> Command<Message> { -        match message { -            Message::BackgroundColorChanged(color) => { -                self.background_color = color; -            } -        } - -        Command::none() -    } - -    fn view(&self) -> Element<Message, Renderer> { -        let background_color = self.background_color; - -        let sliders = Row::new() -            .width(500) -            .spacing(20) -            .push( -                Slider::new(0.0..=1.0, background_color.r, move |r| { -                    Message::BackgroundColorChanged(Color { -                        r, -                        ..background_color -                    }) -                }) -                .step(0.01), -            ) -            .push( -                Slider::new(0.0..=1.0, background_color.g, move |g| { -                    Message::BackgroundColorChanged(Color { -                        g, -                        ..background_color -                    }) -                }) -                .step(0.01), -            ) -            .push( -                Slider::new(0.0..=1.0, background_color.b, move |b| { -                    Message::BackgroundColorChanged(Color { -                        b, -                        ..background_color -                    }) -                }) -                .step(0.01), -            ); - -        Row::new() -            .width(Length::Fill) -            .height(Length::Fill) -            .align_items(Alignment::End) -            .push( -                Column::new() -                    .width(Length::Fill) -                    .align_items(Alignment::End) -                    .push( -                        Column::new() -                            .padding(10) -                            .spacing(10) -                            .push( -                                Text::new("Background color") -                                    .style(Color::WHITE), -                            ) -                            .push(sliders) -                            .push( -                                Text::new(format!("{background_color:?}")) -                                    .size(14) -                                    .style(Color::WHITE), -                            ), -                    ), -            ) -            .into() -    } -} diff --git a/examples/integration_opengl/src/main.rs b/examples/integration_opengl/src/main.rs deleted file mode 100644 index f161c8a0..00000000 --- a/examples/integration_opengl/src/main.rs +++ /dev/null @@ -1,187 +0,0 @@ -mod controls; -mod scene; - -use controls::Controls; -use scene::Scene; - -use glow::*; -use glutin::dpi::PhysicalPosition; -use glutin::event::{Event, ModifiersState, WindowEvent}; -use glutin::event_loop::ControlFlow; -use iced_glow::glow; -use iced_glow::{Backend, Renderer, Settings, Viewport}; -use iced_glutin::conversion; -use iced_glutin::glutin; -use iced_glutin::renderer; -use iced_glutin::{program, Clipboard, Color, Debug, Size}; - -pub fn main() { -    env_logger::init(); -    let (gl, event_loop, windowed_context, shader_version) = { -        let el = glutin::event_loop::EventLoop::new(); - -        let wb = glutin::window::WindowBuilder::new() -            .with_title("OpenGL integration example") -            .with_inner_size(glutin::dpi::LogicalSize::new(1024.0, 768.0)); - -        let windowed_context = glutin::ContextBuilder::new() -            .with_vsync(true) -            .build_windowed(wb, &el) -            .unwrap(); - -        unsafe { -            let windowed_context = windowed_context.make_current().unwrap(); - -            let gl = glow::Context::from_loader_function(|s| { -                windowed_context.get_proc_address(s) as *const _ -            }); - -            // Enable auto-conversion from/to sRGB -            gl.enable(glow::FRAMEBUFFER_SRGB); - -            // Enable alpha blending -            gl.enable(glow::BLEND); -            gl.blend_func(glow::SRC_ALPHA, glow::ONE_MINUS_SRC_ALPHA); - -            // Disable multisampling by default -            gl.disable(glow::MULTISAMPLE); - -            (gl, el, windowed_context, "#version 410") -        } -    }; - -    let physical_size = windowed_context.window().inner_size(); -    let mut viewport = Viewport::with_physical_size( -        Size::new(physical_size.width, physical_size.height), -        windowed_context.window().scale_factor(), -    ); - -    let mut cursor_position = PhysicalPosition::new(-1.0, -1.0); -    let mut modifiers = ModifiersState::default(); -    let mut clipboard = Clipboard::connect(windowed_context.window()); - -    let mut renderer = Renderer::new(Backend::new(&gl, Settings::default())); - -    let mut debug = Debug::new(); - -    let controls = Controls::new(); -    let mut state = program::State::new( -        controls, -        viewport.logical_size(), -        &mut renderer, -        &mut debug, -    ); -    let mut resized = false; - -    let scene = Scene::new(&gl, shader_version); - -    event_loop.run(move |event, _, control_flow| { -        *control_flow = ControlFlow::Wait; - -        match event { -            Event::WindowEvent { event, .. } => { -                match event { -                    WindowEvent::CursorMoved { position, .. } => { -                        cursor_position = position; -                    } -                    WindowEvent::ModifiersChanged(new_modifiers) => { -                        modifiers = new_modifiers; -                    } -                    WindowEvent::Resized(physical_size) => { -                        viewport = Viewport::with_physical_size( -                            Size::new( -                                physical_size.width, -                                physical_size.height, -                            ), -                            windowed_context.window().scale_factor(), -                        ); - -                        resized = true; -                    } -                    WindowEvent::CloseRequested => { -                        scene.cleanup(&gl); -                        *control_flow = ControlFlow::Exit -                    } -                    _ => (), -                } - -                // Map window event to iced event -                if let Some(event) = iced_winit::conversion::window_event( -                    &event, -                    windowed_context.window().scale_factor(), -                    modifiers, -                ) { -                    state.queue_event(event); -                } -            } -            Event::MainEventsCleared => { -                // If there are events pending -                if !state.is_queue_empty() { -                    // We update iced -                    let _ = state.update( -                        viewport.logical_size(), -                        conversion::cursor_position( -                            cursor_position, -                            viewport.scale_factor(), -                        ), -                        &mut renderer, -                        &iced_glow::Theme::Dark, -                        &renderer::Style { -                            text_color: Color::WHITE, -                        }, -                        &mut clipboard, -                        &mut debug, -                    ); - -                    // and request a redraw -                    windowed_context.window().request_redraw(); -                } -            } -            Event::RedrawRequested(_) => { -                if resized { -                    let size = windowed_context.window().inner_size(); - -                    unsafe { -                        gl.viewport( -                            0, -                            0, -                            size.width as i32, -                            size.height as i32, -                        ); -                    } - -                    resized = false; -                } - -                let program = state.program(); -                { -                    // We clear the frame -                    scene.clear(&gl, program.background_color()); - -                    // Draw the scene -                    scene.draw(&gl); -                } - -                // And then iced on top -                renderer.with_primitives(|backend, primitive| { -                    backend.present( -                        &gl, -                        primitive, -                        &viewport, -                        &debug.overlay(), -                    ); -                }); - -                // Update the mouse cursor -                windowed_context.window().set_cursor_icon( -                    iced_winit::conversion::mouse_interaction( -                        state.mouse_interaction(), -                    ), -                ); - -                windowed_context.swap_buffers().unwrap(); -            } -            _ => (), -        } -    }); -} diff --git a/examples/integration_opengl/src/scene.rs b/examples/integration_opengl/src/scene.rs deleted file mode 100644 index c1d05b65..00000000 --- a/examples/integration_opengl/src/scene.rs +++ /dev/null @@ -1,102 +0,0 @@ -use glow::*; -use iced_glow::glow; -use iced_glow::Color; - -pub struct Scene { -    program: glow::Program, -    vertex_array: glow::VertexArray, -} - -impl Scene { -    pub fn new(gl: &glow::Context, shader_version: &str) -> Self { -        unsafe { -            let vertex_array = gl -                .create_vertex_array() -                .expect("Cannot create vertex array"); -            gl.bind_vertex_array(Some(vertex_array)); - -            let program = gl.create_program().expect("Cannot create program"); - -            let (vertex_shader_source, fragment_shader_source) = ( -                r#"const vec2 verts[3] = vec2[3]( -                    vec2(0.5f, 1.0f), -                    vec2(0.0f, 0.0f), -                    vec2(1.0f, 0.0f) -                ); -                out vec2 vert; -                void main() { -                    vert = verts[gl_VertexID]; -                    gl_Position = vec4(vert - 0.5, 0.0, 1.0); -                }"#, -                r#"precision highp float; -                in vec2 vert; -                out vec4 color; -                void main() { -                    color = vec4(vert, 0.5, 1.0); -                }"#, -            ); - -            let shader_sources = [ -                (glow::VERTEX_SHADER, vertex_shader_source), -                (glow::FRAGMENT_SHADER, fragment_shader_source), -            ]; - -            let mut shaders = Vec::with_capacity(shader_sources.len()); - -            for (shader_type, shader_source) in shader_sources.iter() { -                let shader = gl -                    .create_shader(*shader_type) -                    .expect("Cannot create shader"); -                gl.shader_source( -                    shader, -                    &format!("{shader_version}\n{shader_source}"), -                ); -                gl.compile_shader(shader); -                if !gl.get_shader_compile_status(shader) { -                    panic!("{}", gl.get_shader_info_log(shader)); -                } -                gl.attach_shader(program, shader); -                shaders.push(shader); -            } - -            gl.link_program(program); -            if !gl.get_program_link_status(program) { -                panic!("{}", gl.get_program_info_log(program)); -            } - -            for shader in shaders { -                gl.detach_shader(program, shader); -                gl.delete_shader(shader); -            } - -            gl.use_program(Some(program)); -            Self { -                program, -                vertex_array, -            } -        } -    } - -    pub fn clear(&self, gl: &glow::Context, background_color: Color) { -        let [r, g, b, a] = background_color.into_linear(); -        unsafe { -            gl.clear_color(r, g, b, a); -            gl.clear(glow::COLOR_BUFFER_BIT); -        } -    } - -    pub fn draw(&self, gl: &glow::Context) { -        unsafe { -            gl.bind_vertex_array(Some(self.vertex_array)); -            gl.use_program(Some(self.program)); -            gl.draw_arrays(glow::TRIANGLES, 0, 3); -        } -    } - -    pub fn cleanup(&self, gl: &glow::Context) { -        unsafe { -            gl.delete_program(self.program); -            gl.delete_vertex_array(self.vertex_array); -        } -    } -} diff --git a/examples/lazy/Cargo.toml b/examples/lazy/Cargo.toml index 79255c25..e03e89a9 100644 --- a/examples/lazy/Cargo.toml +++ b/examples/lazy/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../..", features = ["debug"] } -iced_lazy = { path = "../../lazy" } +iced = { path = "../..", features = ["debug", "lazy"] } diff --git a/examples/lazy/src/main.rs b/examples/lazy/src/main.rs index 55b13bcf..c6baa6a1 100644 --- a/examples/lazy/src/main.rs +++ b/examples/lazy/src/main.rs @@ -1,10 +1,9 @@  use iced::theme;  use iced::widget::{ -    button, column, horizontal_space, pick_list, row, scrollable, text, +    button, column, horizontal_space, lazy, pick_list, row, scrollable, text,      text_input,  };  use iced::{Element, Length, Sandbox, Settings}; -use iced_lazy::lazy;  use std::collections::HashSet;  use std::hash::Hash; diff --git a/examples/modal/Cargo.toml b/examples/modal/Cargo.toml index 8770acac..3ac61e6a 100644 --- a/examples/modal/Cargo.toml +++ b/examples/modal/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../..", features = [] } -iced_native = { path = "../../native" } +iced = { path = "../..", features = ["advanced"] } diff --git a/examples/modal/src/main.rs b/examples/modal/src/main.rs index 49038475..f48afb69 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -176,12 +176,15 @@ impl App {  }  mod modal { -    use iced_native::alignment::Alignment; -    use iced_native::widget::{self, Tree}; -    use iced_native::{ -        event, layout, mouse, overlay, renderer, Clipboard, Color, Element, -        Event, Layout, Length, Point, Rectangle, Shell, Size, Widget, -    }; +    use iced::advanced::layout::{self, Layout}; +    use iced::advanced::overlay; +    use iced::advanced::renderer; +    use iced::advanced::widget::{self, Widget}; +    use iced::advanced::{self, Clipboard, Shell}; +    use iced::alignment::Alignment; +    use iced::event; +    use iced::mouse; +    use iced::{Color, Element, Event, Length, Point, Rectangle, Size};      /// A widget that centers a modal element over some base element      pub struct Modal<'a, Message, Renderer> { @@ -216,14 +219,17 @@ mod modal {      impl<'a, Message, Renderer> Widget<Message, Renderer>          for Modal<'a, Message, Renderer>      where -        Renderer: iced_native::Renderer, +        Renderer: advanced::Renderer,          Message: Clone,      { -        fn children(&self) -> Vec<Tree> { -            vec![Tree::new(&self.base), Tree::new(&self.modal)] +        fn children(&self) -> Vec<widget::Tree> { +            vec![ +                widget::Tree::new(&self.base), +                widget::Tree::new(&self.modal), +            ]          } -        fn diff(&self, tree: &mut Tree) { +        fn diff(&self, tree: &mut widget::Tree) {              tree.diff_children(&[&self.base, &self.modal]);          } @@ -245,7 +251,7 @@ mod modal {          fn on_event(              &mut self, -            state: &mut Tree, +            state: &mut widget::Tree,              event: Event,              layout: Layout<'_>,              cursor_position: Point, @@ -266,9 +272,9 @@ mod modal {          fn draw(              &self, -            state: &Tree, +            state: &widget::Tree,              renderer: &mut Renderer, -            theme: &<Renderer as iced_native::Renderer>::Theme, +            theme: &<Renderer as advanced::Renderer>::Theme,              style: &renderer::Style,              layout: Layout<'_>,              cursor_position: Point, @@ -287,7 +293,7 @@ mod modal {          fn overlay<'b>(              &'b mut self, -            state: &'b mut Tree, +            state: &'b mut widget::Tree,              layout: Layout<'_>,              _renderer: &Renderer,          ) -> Option<overlay::Element<'b, Message, Renderer>> { @@ -304,7 +310,7 @@ mod modal {          fn mouse_interaction(              &self, -            state: &Tree, +            state: &widget::Tree,              layout: Layout<'_>,              cursor_position: Point,              viewport: &Rectangle, @@ -321,7 +327,7 @@ mod modal {          fn operate(              &self, -            state: &mut Tree, +            state: &mut widget::Tree,              layout: Layout<'_>,              renderer: &Renderer,              operation: &mut dyn widget::Operation<Message>, @@ -337,7 +343,7 @@ mod modal {      struct Overlay<'a, 'b, Message, Renderer> {          content: &'b mut Element<'a, Message, Renderer>, -        tree: &'b mut Tree, +        tree: &'b mut widget::Tree,          size: Size,          on_blur: Option<Message>,      } @@ -345,7 +351,7 @@ mod modal {      impl<'a, 'b, Message, Renderer> overlay::Overlay<Message, Renderer>          for Overlay<'a, 'b, Message, Renderer>      where -        Renderer: iced_native::Renderer, +        Renderer: advanced::Renderer,          Message: Clone,      {          fn layout( @@ -467,7 +473,7 @@ mod modal {      impl<'a, Message, Renderer> From<Modal<'a, Message, Renderer>>          for Element<'a, Message, Renderer>      where -        Renderer: 'a + iced_native::Renderer, +        Renderer: 'a + advanced::Renderer,          Message: 'a + Clone,      {          fn from(modal: Modal<'a, Message, Renderer>) -> Self { diff --git a/examples/modern_art/src/main.rs b/examples/modern_art/src/main.rs index 28ed3e21..a43a2b2b 100644 --- a/examples/modern_art/src/main.rs +++ b/examples/modern_art/src/main.rs @@ -55,17 +55,18 @@ impl Application for ModernArt {      }  } -impl<Message> canvas::Program<Message> for ModernArt { +impl<Message> canvas::Program<Message, Renderer> for ModernArt {      type State = ();      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let geometry = self.cache.draw(bounds.size(), |frame| { +        let geometry = self.cache.draw(renderer, bounds.size(), |frame| {              let num_squares = thread_rng().gen_range(0..1200);              let mut i = 0; diff --git a/examples/multitouch/src/main.rs b/examples/multitouch/src/main.rs index f5faae0f..7df6c929 100644 --- a/examples/multitouch/src/main.rs +++ b/examples/multitouch/src/main.rs @@ -6,7 +6,7 @@ use iced::widget::canvas::stroke::{self, Stroke};  use iced::widget::canvas::{self, Canvas, Cursor, Geometry};  use iced::{      executor, touch, window, Application, Color, Command, Element, Length, -    Point, Rectangle, Settings, Subscription, Theme, +    Point, Rectangle, Renderer, Settings, Subscription, Theme,  };  use std::collections::HashMap; @@ -95,7 +95,7 @@ impl Application for Multitouch {      }  } -impl canvas::Program<Message> for State { +impl canvas::Program<Message, Renderer> for State {      type State = ();      fn update( @@ -125,11 +125,12 @@ impl canvas::Program<Message> for State {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<Geometry> { -        let fingerweb = self.cache.draw(bounds.size(), |frame| { +        let fingerweb = self.cache.draw(renderer, bounds.size(), |frame| {              if self.fingers.len() < 2 {                  return;              } diff --git a/examples/pane_grid/Cargo.toml b/examples/pane_grid/Cargo.toml index dfd6dfa9..4c0bf072 100644 --- a/examples/pane_grid/Cargo.toml +++ b/examples/pane_grid/Cargo.toml @@ -6,6 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../..", features = ["debug"] } -iced_native = { path = "../../native" } -iced_lazy = { path = "../../lazy" } +iced = { path = "../..", features = ["debug", "lazy"] } diff --git a/examples/pane_grid/src/main.rs b/examples/pane_grid/src/main.rs index c9f1376c..dfb80853 100644 --- a/examples/pane_grid/src/main.rs +++ b/examples/pane_grid/src/main.rs @@ -1,14 +1,16 @@  use iced::alignment::{self, Alignment}; +use iced::event::{self, Event};  use iced::executor;  use iced::keyboard; +use iced::subscription;  use iced::theme::{self, Theme};  use iced::widget::pane_grid::{self, PaneGrid}; -use iced::widget::{button, column, container, row, scrollable, text}; +use iced::widget::{ +    button, column, container, responsive, row, scrollable, text, +};  use iced::{      Application, Color, Command, Element, Length, Settings, Size, Subscription,  }; -use iced_lazy::responsive; -use iced_native::{event, subscription, Event};  pub fn main() -> iced::Result {      Example::run(Settings::default()) diff --git a/examples/sierpinski_triangle/src/main.rs b/examples/sierpinski_triangle/src/main.rs index 1d25d171..4faac6d6 100644 --- a/examples/sierpinski_triangle/src/main.rs +++ b/examples/sierpinski_triangle/src/main.rs @@ -5,8 +5,8 @@ use iced::widget::canvas::event::{self, Event};  use iced::widget::canvas::{self, Canvas};  use iced::widget::{column, row, slider, text};  use iced::{ -    Application, Color, Command, Length, Point, Rectangle, Settings, Size, -    Theme, +    Application, Color, Command, Length, Point, Rectangle, Renderer, Settings, +    Size, Theme,  };  use rand::Rng; @@ -134,11 +134,12 @@ impl canvas::Program<Message> for SierpinskiGraph {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: canvas::Cursor,      ) -> Vec<canvas::Geometry> { -        let geom = self.cache.draw(bounds.size(), |frame| { +        let geom = self.cache.draw(renderer, bounds.size(), |frame| {              frame.stroke(                  &canvas::Path::rectangle(Point::ORIGIN, frame.size()),                  canvas::Stroke::default(), diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 9a4ee754..f2606feb 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -15,8 +15,8 @@ use iced::widget::canvas::stroke::{self, Stroke};  use iced::widget::canvas::{Cursor, Path};  use iced::window;  use iced::{ -    Application, Color, Command, Element, Length, Point, Rectangle, Settings, -    Size, Subscription, Vector, +    Application, Color, Command, Element, Length, Point, Rectangle, Renderer, +    Settings, Size, Subscription, Vector,  };  use std::time::Instant; @@ -156,24 +156,26 @@ impl<Message> canvas::Program<Message> for State {      fn draw(          &self,          _state: &Self::State, +        renderer: &Renderer,          _theme: &Theme,          bounds: Rectangle,          _cursor: Cursor,      ) -> Vec<canvas::Geometry> {          use std::f32::consts::PI; -        let background = self.space_cache.draw(bounds.size(), |frame| { -            let stars = Path::new(|path| { -                for (p, size) in &self.stars { -                    path.rectangle(*p, Size::new(*size, *size)); -                } -            }); +        let background = +            self.space_cache.draw(renderer, bounds.size(), |frame| { +                let stars = Path::new(|path| { +                    for (p, size) in &self.stars { +                        path.rectangle(*p, Size::new(*size, *size)); +                    } +                }); -            frame.translate(frame.center() - Point::ORIGIN); -            frame.fill(&stars, Color::WHITE); -        }); +                frame.translate(frame.center() - Point::ORIGIN); +                frame.fill(&stars, Color::WHITE); +            }); -        let system = self.system_cache.draw(bounds.size(), |frame| { +        let system = self.system_cache.draw(renderer, bounds.size(), |frame| {              let center = frame.center();              let sun = Path::circle(center, Self::SUN_RADIUS); diff --git a/examples/toast/Cargo.toml b/examples/toast/Cargo.toml index f1f986aa..f703572c 100644 --- a/examples/toast/Cargo.toml +++ b/examples/toast/Cargo.toml @@ -6,5 +6,4 @@ edition = "2021"  publish = false  [dependencies] -iced = { path = "../..", features = [] } -iced_native = { path = "../../native" } +iced = { path = "../..", features = ["advanced"] } diff --git a/examples/toast/src/main.rs b/examples/toast/src/main.rs index b4b4e007..9d859258 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -178,17 +178,23 @@ mod toast {      use std::fmt;      use std::time::{Duration, Instant}; +    use iced::advanced; +    use iced::advanced::layout::{self, Layout}; +    use iced::advanced::overlay; +    use iced::advanced::renderer; +    use iced::advanced::widget::{self, Operation, Tree}; +    use iced::advanced::{Clipboard, Shell, Widget}; +    use iced::event::{self, Event}; +    use iced::mouse;      use iced::theme;      use iced::widget::{          button, column, container, horizontal_rule, horizontal_space, row, text,      }; +    use iced::window;      use iced::{          Alignment, Element, Length, Point, Rectangle, Renderer, Size, Theme,          Vector,      }; -    use iced_native::widget::{tree, Operation, Tree}; -    use iced_native::{event, layout, mouse, overlay, renderer, window}; -    use iced_native::{Clipboard, Event, Layout, Shell, Widget};      pub const DEFAULT_TIMEOUT: u64 = 5; @@ -326,13 +332,13 @@ mod toast {              self.content.as_widget().layout(renderer, limits)          } -        fn tag(&self) -> tree::Tag { +        fn tag(&self) -> widget::tree::Tag {              struct Marker(Vec<Instant>); -            iced_native::widget::tree::Tag::of::<Marker>() +            widget::tree::Tag::of::<Marker>()          } -        fn state(&self) -> tree::State { -            iced_native::widget::tree::State::new(Vec::<Option<Instant>>::new()) +        fn state(&self) -> widget::tree::State { +            widget::tree::State::new(Vec::<Option<Instant>>::new())          }          fn children(&self) -> Vec<Tree> { @@ -586,7 +592,7 @@ mod toast {          fn draw(              &self,              renderer: &mut Renderer, -            theme: &<Renderer as iced_native::Renderer>::Theme, +            theme: &<Renderer as advanced::Renderer>::Theme,              style: &renderer::Style,              layout: Layout<'_>,              cursor_position: Point, @@ -615,7 +621,7 @@ mod toast {              &mut self,              layout: Layout<'_>,              renderer: &Renderer, -            operation: &mut dyn iced_native::widget::Operation<Message>, +            operation: &mut dyn widget::Operation<Message>,          ) {              operation.container(None, &mut |operation| {                  self.toasts diff --git a/examples/todos/fonts/icons.ttf b/examples/todos/fonts/icons.ttf Binary files differindex 4498299d..7b65fd36 100644 --- a/examples/todos/fonts/icons.ttf +++ b/examples/todos/fonts/icons.ttf diff --git a/examples/todos/src/main.rs b/examples/todos/src/main.rs index 99cdb8f9..6ad7b4fb 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -1,5 +1,6 @@  use iced::alignment::{self, Alignment};  use iced::event::{self, Event}; +use iced::font::{self, Font};  use iced::keyboard::{self, KeyCode, Modifiers};  use iced::subscription;  use iced::theme::{self, Theme}; @@ -9,7 +10,7 @@ use iced::widget::{  };  use iced::window;  use iced::{Application, Element}; -use iced::{Color, Command, Font, Length, Settings, Subscription}; +use iced::{Color, Command, Length, Settings, Subscription};  use once_cell::sync::Lazy;  use serde::{Deserialize, Serialize}; @@ -44,6 +45,7 @@ struct State {  #[derive(Debug, Clone)]  enum Message {      Loaded(Result<SavedState, LoadError>), +    FontLoaded(Result<(), font::Error>),      Saved(Result<(), SaveError>),      InputChanged(String),      CreateTask, @@ -62,7 +64,11 @@ impl Application for Todos {      fn new(_flags: ()) -> (Todos, Command<Message>) {          (              Todos::Loading, -            Command::perform(SavedState::load(), Message::Loaded), +            Command::batch(vec![ +                font::load(include_bytes!("../fonts/icons.ttf").as_slice()) +                    .map(Message::FontLoaded), +                Command::perform(SavedState::load(), Message::Loaded), +            ]),          )      } @@ -358,7 +364,8 @@ impl Task {                      self.completed,                      TaskMessage::Completed,                  ) -                .width(Length::Fill); +                .width(Length::Fill) +                .text_shaping(text::Shaping::Advanced);                  row![                      checkbox, @@ -381,10 +388,14 @@ impl Task {                  row![                      text_input, -                    button(row![delete_icon(), "Delete"].spacing(10)) -                        .on_press(TaskMessage::Delete) -                        .padding(10) -                        .style(theme::Button::Destructive) +                    button( +                        row![delete_icon(), "Delete"] +                            .spacing(10) +                            .align_items(Alignment::Center) +                    ) +                    .on_press(TaskMessage::Delete) +                    .padding(10) +                    .style(theme::Button::Destructive)                  ]                  .spacing(20)                  .align_items(Alignment::Center) @@ -398,7 +409,7 @@ fn view_controls(tasks: &[Task], current_filter: Filter) -> Element<Message> {      let tasks_left = tasks.iter().filter(|task| !task.completed).count();      let filter_button = |label, filter, current_filter| { -        let label = text(label).size(16); +        let label = text(label);          let button = button(label).style(if filter == current_filter {              theme::Button::Primary @@ -415,8 +426,7 @@ fn view_controls(tasks: &[Task], current_filter: Filter) -> Element<Message> {              tasks_left,              if tasks_left == 1 { "task" } else { "tasks" }          )) -        .width(Length::Fill) -        .size(16), +        .width(Length::Fill),          row![              filter_button("All", Filter::All, current_filter),              filter_button("Active", Filter::Active, current_filter), @@ -477,17 +487,13 @@ fn empty_message(message: &str) -> Element<'_, Message> {  }  // Fonts -const ICONS: Font = Font::External { -    name: "Icons", -    bytes: include_bytes!("../../todos/fonts/icons.ttf"), -}; +const ICONS: Font = Font::with_name("Iced-Todos-Icons");  fn icon(unicode: char) -> Text<'static> {      text(unicode.to_string())          .font(ICONS)          .width(20)          .horizontal_alignment(alignment::Horizontal::Center) -        .size(20)  }  fn edit_icon() -> Text<'static> { diff --git a/examples/tour/fonts/icons.ttf b/examples/tour/fonts/icons.ttf Binary files differdeleted file mode 100644 index bfe8a24b..00000000 --- a/examples/tour/fonts/icons.ttf +++ /dev/null diff --git a/examples/tour/src/main.rs b/examples/tour/src/main.rs index 16ee19c0..9c38ad0e 100644 --- a/examples/tour/src/main.rs +++ b/examples/tour/src/main.rs @@ -565,11 +565,6 @@ impl<'a> Step {          is_secure: bool,          is_showing_icon: bool,      ) -> Column<'a, StepMessage> { -        const ICON_FONT: Font = Font::External { -            name: "Icons", -            bytes: include_bytes!("../fonts/icons.ttf"), -        }; -          let mut text_input = text_input("Type something to continue...", value)              .on_input(StepMessage::InputChanged)              .padding(10) @@ -577,9 +572,9 @@ impl<'a> Step {          if is_showing_icon {              text_input = text_input.icon(text_input::Icon { -                font: ICON_FONT, -                code_point: '\u{E900}', -                size: Some(35.0), +                font: Font::default(), +                code_point: '🚀', +                size: Some(28.0),                  spacing: 10.0,                  side: text_input::Side::Right,              }); diff --git a/examples/url_handler/Cargo.toml b/examples/url_handler/Cargo.toml index 63c7ec27..4dcff92d 100644 --- a/examples/url_handler/Cargo.toml +++ b/examples/url_handler/Cargo.toml @@ -7,4 +7,3 @@ publish = false  [dependencies]  iced = { path = "../.." } -iced_native = { path = "../../native" } diff --git a/examples/url_handler/src/main.rs b/examples/url_handler/src/main.rs index 3257b519..f63fa06a 100644 --- a/examples/url_handler/src/main.rs +++ b/examples/url_handler/src/main.rs @@ -1,12 +1,10 @@ +use iced::event::{Event, MacOS, PlatformSpecific};  use iced::executor; +use iced::subscription;  use iced::widget::{container, text};  use iced::{      Application, Command, Element, Length, Settings, Subscription, Theme,  }; -use iced_native::{ -    event::{MacOS, PlatformSpecific}, -    Event, -};  pub fn main() -> iced::Result {      App::run(Settings::default()) @@ -19,7 +17,7 @@ struct App {  #[derive(Debug, Clone)]  enum Message { -    EventOccurred(iced_native::Event), +    EventOccurred(Event),  }  impl Application for App { @@ -52,7 +50,7 @@ impl Application for App {      }      fn subscription(&self) -> Subscription<Message> { -        iced_native::subscription::events().map(Message::EventOccurred) +        subscription::events().map(Message::EventOccurred)      }      fn view(&self) -> Element<Message> { diff --git a/examples/websocket/Cargo.toml b/examples/websocket/Cargo.toml index c25f067b..03b240c6 100644 --- a/examples/websocket/Cargo.toml +++ b/examples/websocket/Cargo.toml @@ -7,8 +7,6 @@ publish = false  [dependencies]  iced = { path = "../..", features = ["tokio", "debug"] } -iced_native = { path = "../../native" } -iced_futures = { path = "../../futures" }  once_cell = "1.15"  [dependencies.async-tungstenite] diff --git a/examples/websocket/src/echo.rs b/examples/websocket/src/echo.rs index f9807172..281ed4bd 100644 --- a/examples/websocket/src/echo.rs +++ b/examples/websocket/src/echo.rs @@ -1,7 +1,7 @@  pub mod server; -use iced_futures::futures; -use iced_native::subscription::{self, Subscription}; +use iced::futures; +use iced::subscription::{self, Subscription};  use futures::channel::mpsc;  use futures::sink::SinkExt; diff --git a/examples/websocket/src/echo/server.rs b/examples/websocket/src/echo/server.rs index dd234984..168a635e 100644 --- a/examples/websocket/src/echo/server.rs +++ b/examples/websocket/src/echo/server.rs @@ -1,4 +1,4 @@ -use iced_futures::futures; +use iced::futures;  use futures::channel::mpsc;  use futures::{SinkExt, StreamExt};  | 
