diff options
Diffstat (limited to '')
41 files changed, 270 insertions, 252 deletions
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/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 c407bb06..09e5e4a2 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; @@ -127,7 +120,8 @@ mod numeric_input {                          .horizontal_alignment(alignment::Horizontal::Center)                          .vertical_alignment(alignment::Vertical::Center),                  ) -                .width(50) +                .width(40) +                .height(40)                  .on_press(on_press)              }; @@ -145,23 +139,18 @@ mod numeric_input {                  .padding(10),                  button("+", Event::IncrementPressed),              ] -            .align_items(Alignment::Fill) +            .align_items(Alignment::Center)              .spacing(10)              .into()          }      } -    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 39dd843f..5ff951b3 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/Cargo.toml b/examples/integration/Cargo.toml index 200306aa..f6863cd3 100644 --- a/examples/integration/Cargo.toml +++ b/examples/integration/Cargo.toml @@ -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", "tiny-skia"] }  env_logger = "0.8"  [target.'cfg(target_arch = "wasm32")'.dependencies] diff --git a/examples/integration/src/controls.rs b/examples/integration/src/controls.rs index 533cb6e2..5849f730 100644 --- a/examples/integration/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/src/main.rs b/examples/integration/src/main.rs index a7a90ced..9707eda7 100644 --- a/examples/integration/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, @@ -73,43 +76,45 @@ pub fn main() {      let instance = wgpu::Instance::new(backend);      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(); - -        ( -            surface -                .get_supported_formats(&adapter) -                .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("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(); + +            ( +                surface +                    .get_supported_formats(&adapter) +                    .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, @@ -188,7 +193,7 @@ pub fn main() {                              viewport.scale_factor(),                          ),                          &mut renderer, -                        &iced_wgpu::Theme::Dark, +                        &Theme::Dark,                          &renderer::Style { text_color: Color::WHITE },                          &mut clipboard,                          &mut debug, diff --git a/examples/integration/src/scene.rs b/examples/integration/src/scene.rs index 3e41fbda..90c7efbf 100644 --- a/examples/integration/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/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 6512106f..e1cdaefe 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 54555684..214ec97e 100644 --- a/examples/modal/src/main.rs +++ b/examples/modal/src/main.rs @@ -178,12 +178,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> { @@ -218,14 +221,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]);          } @@ -247,7 +253,7 @@ mod modal {          fn on_event(              &mut self, -            state: &mut Tree, +            state: &mut widget::Tree,              event: Event,              layout: Layout<'_>,              cursor_position: Point, @@ -268,9 +274,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, @@ -289,7 +295,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>> { @@ -306,7 +312,7 @@ mod modal {          fn mouse_interaction(              &self, -            state: &Tree, +            state: &widget::Tree,              layout: Layout<'_>,              cursor_position: Point,              viewport: &Rectangle, @@ -323,7 +329,7 @@ mod modal {          fn operate(              &self, -            state: &mut Tree, +            state: &mut widget::Tree,              layout: Layout<'_>,              renderer: &Renderer,              operation: &mut dyn widget::Operation<Message>, @@ -339,7 +345,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>,      } @@ -347,7 +353,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( @@ -469,7 +475,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/scrollable/src/main.rs b/examples/scrollable/src/main.rs index 7c858961..a3ade54f 100644 --- a/examples/scrollable/src/main.rs +++ b/examples/scrollable/src/main.rs @@ -254,7 +254,6 @@ impl Application for ScrollableDemo {                              scroll_to_beginning_button(),                              vertical_space(40),                          ] -                        .align_items(Alignment::Fill)                          .spacing(40),                          horizontal_space(1200),                          text("Horizontal - End!"), 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 e74b3ee6..78fb9de1 100644 --- a/examples/toast/src/main.rs +++ b/examples/toast/src/main.rs @@ -176,17 +176,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; @@ -324,13 +330,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> { @@ -584,7 +590,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, @@ -613,7 +619,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/src/main.rs b/examples/todos/src/main.rs index 5df4e968..1cc18eca 100644 --- a/examples/todos/src/main.rs +++ b/examples/todos/src/main.rs @@ -1,7 +1,7 @@  use iced::alignment::{self, Alignment};  use iced::event::{self, Event};  use iced::font::{self, Font}; -use iced::keyboard; +use iced::keyboard::{self, KeyCode, Modifiers};  use iced::subscription;  use iced::theme::{self, Theme};  use iced::widget::{ @@ -52,6 +52,7 @@ enum Message {      FilterChanged(Filter),      TaskMessage(usize, TaskMessage),      TabPressed { shift: bool }, +    ToggleFullscreen(window::Mode),  }  impl Application for Todos { @@ -162,6 +163,9 @@ impl Application for Todos {                              widget::focus_next()                          }                      } +                    Message::ToggleFullscreen(mode) => { +                        window::change_mode(mode) +                    }                      _ => Command::none(),                  }; @@ -272,6 +276,21 @@ impl Application for Todos {              ) => Some(Message::TabPressed {                  shift: modifiers.shift(),              }), +            ( +                Event::Keyboard(keyboard::Event::KeyPressed { +                    key_code, +                    modifiers: Modifiers::SHIFT, +                }), +                event::Status::Ignored, +            ) => match key_code { +                KeyCode::Up => { +                    Some(Message::ToggleFullscreen(window::Mode::Fullscreen)) +                } +                KeyCode::Down => { +                    Some(Message::ToggleFullscreen(window::Mode::Windowed)) +                } +                _ => None, +            },              _ => None,          })      } 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 e74768a6..122c20db 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}; diff --git a/examples/websocket/src/main.rs b/examples/websocket/src/main.rs index ccd9c815..e617b8ce 100644 --- a/examples/websocket/src/main.rs +++ b/examples/websocket/src/main.rs @@ -146,7 +146,9 @@ impl Application for WebSocket {                  }              } -            row![input, button].spacing(10).align_items(Alignment::Fill) +            row![input, button] +                .spacing(10) +                .align_items(Alignment::Center)          };          column![message_log, new_message_input]  | 
