diff options
| author | 2023-03-09 19:05:38 +0100 | |
|---|---|---|
| committer | 2023-03-09 19:05:38 +0100 | |
| commit | caf2836b1b15bff6e8a2ea72441d67f297eb8707 (patch) | |
| tree | 0ffa0d1d604780999892b88de85ee93e3ed7d539 /widget/src | |
| parent | 11b2c3bbe31a43e73a61b9bd9f022233f302ae27 (diff) | |
| parent | 424ac8177309440bbd8efe0dd9f7622cb10807ce (diff) | |
| download | iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.tar.gz iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.tar.bz2 iced-caf2836b1b15bff6e8a2ea72441d67f297eb8707.zip | |
Merge pull request #1748 from iced-rs/feature/software-renderer
Software renderer, runtime renderer fallback, and core consolidation
Diffstat (limited to '')
| -rw-r--r-- | widget/src/button.rs (renamed from native/src/widget/button.rs) | 36 | ||||
| -rw-r--r-- | widget/src/canvas.rs (renamed from graphics/src/widget/canvas.rs) | 132 | ||||
| -rw-r--r-- | widget/src/canvas/cursor.rs (renamed from graphics/src/widget/canvas/cursor.rs) | 2 | ||||
| -rw-r--r-- | widget/src/canvas/event.rs (renamed from graphics/src/widget/canvas/event.rs) | 8 | ||||
| -rw-r--r-- | widget/src/canvas/program.rs (renamed from graphics/src/widget/canvas/program.rs) | 31 | ||||
| -rw-r--r-- | widget/src/checkbox.rs (renamed from native/src/widget/checkbox.rs) | 38 | ||||
| -rw-r--r-- | widget/src/column.rs (renamed from native/src/widget/column.rs) | 20 | ||||
| -rw-r--r-- | widget/src/container.rs (renamed from native/src/widget/container.rs) | 28 | ||||
| -rw-r--r-- | widget/src/helpers.rs | 362 | ||||
| -rw-r--r-- | widget/src/image.rs (renamed from native/src/widget/image.rs) | 17 | ||||
| -rw-r--r-- | widget/src/image/viewer.rs (renamed from native/src/widget/image/viewer.rs) | 14 | ||||
| -rw-r--r-- | widget/src/lazy.rs (renamed from lazy/src/lazy.rs) | 47 | ||||
| -rw-r--r-- | widget/src/lazy/cache.rs (renamed from lazy/src/cache.rs) | 4 | ||||
| -rw-r--r-- | widget/src/lazy/component.rs (renamed from lazy/src/component.rs) | 32 | ||||
| -rw-r--r-- | widget/src/lazy/helpers.rs (renamed from lazy/src/lib.rs) | 37 | ||||
| -rw-r--r-- | widget/src/lazy/responsive.rs (renamed from lazy/src/responsive.rs) | 40 | ||||
| -rw-r--r-- | widget/src/lib.rs | 122 | ||||
| -rw-r--r-- | widget/src/overlay.rs | 1 | ||||
| -rw-r--r-- | widget/src/overlay/menu.rs (renamed from native/src/overlay/menu.rs) | 34 | ||||
| -rw-r--r-- | widget/src/pane_grid.rs (renamed from native/src/widget/pane_grid.rs) | 42 | ||||
| -rw-r--r-- | widget/src/pane_grid/axis.rs (renamed from native/src/widget/pane_grid/axis.rs) | 2 | ||||
| -rw-r--r-- | widget/src/pane_grid/configuration.rs (renamed from native/src/widget/pane_grid/configuration.rs) | 2 | ||||
| -rw-r--r-- | widget/src/pane_grid/content.rs (renamed from native/src/widget/pane_grid/content.rs) | 30 | ||||
| -rw-r--r-- | widget/src/pane_grid/direction.rs (renamed from native/src/widget/pane_grid/direction.rs) | 0 | ||||
| -rw-r--r-- | widget/src/pane_grid/draggable.rs (renamed from native/src/widget/pane_grid/draggable.rs) | 2 | ||||
| -rw-r--r-- | widget/src/pane_grid/node.rs (renamed from native/src/widget/pane_grid/node.rs) | 4 | ||||
| -rw-r--r-- | widget/src/pane_grid/pane.rs (renamed from native/src/widget/pane_grid/pane.rs) | 0 | ||||
| -rw-r--r-- | widget/src/pane_grid/split.rs (renamed from native/src/widget/pane_grid/split.rs) | 0 | ||||
| -rw-r--r-- | widget/src/pane_grid/state.rs (renamed from native/src/widget/pane_grid/state.rs) | 6 | ||||
| -rw-r--r-- | widget/src/pane_grid/title_bar.rs (renamed from native/src/widget/pane_grid/title_bar.rs) | 24 | ||||
| -rw-r--r-- | widget/src/pick_list.rs (renamed from native/src/widget/pick_list.rs) | 33 | ||||
| -rw-r--r-- | widget/src/progress_bar.rs (renamed from native/src/widget/progress_bar.rs) | 26 | ||||
| -rw-r--r-- | widget/src/qr_code.rs (renamed from graphics/src/widget/qr_code.rs) | 100 | ||||
| -rw-r--r-- | widget/src/radio.rs (renamed from native/src/widget/radio.rs) | 33 | ||||
| -rw-r--r-- | widget/src/row.rs (renamed from native/src/widget/row.rs) | 20 | ||||
| -rw-r--r-- | widget/src/rule.rs (renamed from native/src/widget/rule.rs) | 20 | ||||
| -rw-r--r-- | widget/src/scrollable.rs (renamed from native/src/widget/scrollable.rs) | 168 | ||||
| -rw-r--r-- | widget/src/slider.rs (renamed from native/src/widget/slider.rs) | 34 | ||||
| -rw-r--r-- | widget/src/space.rs (renamed from native/src/widget/space.rs) | 13 | ||||
| -rw-r--r-- | widget/src/svg.rs (renamed from native/src/widget/svg.rs) | 14 | ||||
| -rw-r--r-- | widget/src/text.rs | 4 | ||||
| -rw-r--r-- | widget/src/text_input.rs (renamed from native/src/widget/text_input.rs) | 41 | ||||
| -rw-r--r-- | widget/src/text_input/cursor.rs (renamed from native/src/widget/text_input/cursor.rs) | 2 | ||||
| -rw-r--r-- | widget/src/text_input/editor.rs (renamed from native/src/widget/text_input/editor.rs) | 2 | ||||
| -rw-r--r-- | widget/src/text_input/value.rs (renamed from native/src/widget/text_input/value.rs) | 0 | ||||
| -rw-r--r-- | widget/src/toggler.rs (renamed from native/src/widget/toggler.rs) | 32 | ||||
| -rw-r--r-- | widget/src/tooltip.rs (renamed from native/src/widget/tooltip.rs) | 37 | ||||
| -rw-r--r-- | widget/src/vertical_slider.rs (renamed from native/src/widget/vertical_slider.rs) | 39 | 
48 files changed, 1099 insertions, 636 deletions
| diff --git a/native/src/widget/button.rs b/widget/src/button.rs index 39387173..7eee69cb 100644 --- a/native/src/widget/button.rs +++ b/widget/src/button.rs @@ -1,15 +1,15 @@  //! Allow your users to perform actions by pressing a button.  //!  //! A [`Button`] has some local [`State`]. -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::touch; -use crate::widget::tree::{self, Tree}; -use crate::widget::Operation; -use crate::{ +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::touch; +use crate::core::widget::tree::{self, Tree}; +use crate::core::widget::Operation; +use crate::core::{      Background, Clipboard, Color, Element, Layout, Length, Padding, Point,      Rectangle, Shell, Vector, Widget,  }; @@ -18,9 +18,9 @@ pub use iced_style::button::{Appearance, StyleSheet};  /// A generic widget that produces a message when pressed.  /// -/// ``` +/// ```no_run  /// # type Button<'a, Message> = -/// #     iced_native::widget::Button<'a, Message, iced_native::renderer::Null>; +/// #     iced_widget::Button<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// #[derive(Clone)]  /// enum Message { @@ -35,7 +35,7 @@ pub use iced_style::button::{Appearance, StyleSheet};  ///  /// ```  /// # type Button<'a, Message> = -/// #     iced_native::widget::Button<'a, Message, iced_native::renderer::Null>; +/// #     iced_widget::Button<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// #[derive(Clone)]  /// enum Message { @@ -51,9 +51,9 @@ pub use iced_style::button::{Appearance, StyleSheet};  /// }  /// ```  #[allow(missing_debug_implementations)] -pub struct Button<'a, Message, Renderer> +pub struct Button<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      content: Element<'a, Message, Renderer>, @@ -66,7 +66,7 @@ where  impl<'a, Message, Renderer> Button<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// Creates a new [`Button`] with the given content. @@ -121,7 +121,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Button<'a, Message, Renderer>  where      Message: 'a + Clone, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag { @@ -279,7 +279,7 @@ impl<'a, Message, Renderer> From<Button<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: Clone + 'a, -    Renderer: crate::Renderer + 'a, +    Renderer: crate::core::Renderer + 'a,      Renderer::Theme: StyleSheet,  {      fn from(button: Button<'a, Message, Renderer>) -> Self { @@ -355,7 +355,7 @@ pub fn update<'a, Message: Clone>(  }  /// Draws a [`Button`]. -pub fn draw<'a, Renderer: crate::Renderer>( +pub fn draw<'a, Renderer: crate::core::Renderer>(      renderer: &mut Renderer,      bounds: Rectangle,      cursor_position: Point, diff --git a/graphics/src/widget/canvas.rs b/widget/src/canvas.rs index a8d050f5..171c4534 100644 --- a/graphics/src/widget/canvas.rs +++ b/widget/src/canvas.rs @@ -1,43 +1,24 @@  //! Draw 2D graphics for your users. -//! -//! A [`Canvas`] widget can be used to draw different kinds of 2D shapes in a -//! [`Frame`]. It can be used for animation, data visualization, game graphics, -//! and more!  pub mod event; -pub mod fill; -pub mod path; -pub mod stroke; -mod cache;  mod cursor; -mod frame; -mod geometry;  mod program; -mod style; -mod text; -pub use crate::gradient::{self, Gradient}; -pub use cache::Cache;  pub use cursor::Cursor;  pub use event::Event; -pub use fill::{Fill, FillRule}; -pub use frame::Frame; -pub use geometry::Geometry; -pub use path::Path;  pub use program::Program; -pub use stroke::{LineCap, LineDash, LineJoin, Stroke}; -pub use style::Style; -pub use text::Text; -use crate::{Backend, Primitive, Renderer}; +pub use crate::graphics::geometry::*; +pub use crate::renderer::geometry::*; -use iced_native::layout::{self, Layout}; -use iced_native::mouse; -use iced_native::renderer; -use iced_native::widget::tree::{self, Tree}; -use iced_native::{ -    Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector, Widget, -}; +use crate::core; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{Clipboard, Element, Shell, Widget}; +use crate::core::{Length, Point, Rectangle, Size, Vector}; +use crate::graphics::geometry;  use std::marker::PhantomData; @@ -47,15 +28,11 @@ use std::marker::PhantomData;  /// If you want to get a quick overview, here's how we can draw a simple circle:  ///  /// ```no_run -/// # mod iced { -/// #     pub mod widget { -/// #         pub use iced_graphics::widget::canvas; -/// #     } -/// #     pub use iced_native::{Color, Rectangle, Theme}; -/// # } -/// use iced::widget::canvas::{self, Canvas, Cursor, Fill, Frame, Geometry, Path, Program}; -/// use iced::{Color, Rectangle, Theme}; -/// +/// # use iced_widget::canvas::{self, Canvas, Cursor, Fill, Frame, Geometry, Path, Program}; +/// # use iced_widget::core::{Color, Rectangle}; +/// # use iced_widget::style::Theme; +/// # +/// # pub type Renderer = iced_widget::renderer::Renderer<Theme>;  /// // First, we define the data we need for drawing  /// #[derive(Debug)]  /// struct Circle { @@ -66,9 +43,9 @@ use std::marker::PhantomData;  /// impl Program<()> for Circle {  ///     type State = ();  /// -///     fn draw(&self, _state: &(), _theme: &Theme, bounds: Rectangle, _cursor: Cursor) -> Vec<Geometry>{ +///     fn draw(&self, _state: &(), renderer: &Renderer, _theme: &Theme, bounds: Rectangle, _cursor: Cursor) -> Vec<Geometry>{  ///         // We prepare a new `Frame` -///         let mut frame = Frame::new(bounds.size()); +///         let mut frame = Frame::new(renderer, bounds.size());  ///  ///         // We create a `Path` representing a simple circle  ///         let circle = Path::circle(frame.center(), self.radius); @@ -85,20 +62,22 @@ use std::marker::PhantomData;  /// let canvas = Canvas::new(Circle { radius: 50.0 });  /// ```  #[derive(Debug)] -pub struct Canvas<Message, Theme, P> +pub struct Canvas<P, Message, Renderer = crate::Renderer>  where -    P: Program<Message, Theme>, +    Renderer: geometry::Renderer, +    P: Program<Message, Renderer>,  {      width: Length,      height: Length,      program: P,      message_: PhantomData<Message>, -    theme_: PhantomData<Theme>, +    theme_: PhantomData<Renderer>,  } -impl<Message, Theme, P> Canvas<Message, Theme, P> +impl<P, Message, Renderer> Canvas<P, Message, Renderer>  where -    P: Program<Message, Theme>, +    Renderer: geometry::Renderer, +    P: Program<Message, Renderer>,  {      const DEFAULT_SIZE: f32 = 100.0; @@ -126,10 +105,11 @@ where      }  } -impl<Message, P, B, T> Widget<Message, Renderer<B, T>> for Canvas<Message, T, P> +impl<P, Message, Renderer> Widget<Message, Renderer> +    for Canvas<P, Message, Renderer>  where -    P: Program<Message, T>, -    B: Backend, +    Renderer: geometry::Renderer, +    P: Program<Message, Renderer>,  {      fn tag(&self) -> tree::Tag {          struct Tag<T>(T); @@ -150,7 +130,7 @@ where      fn layout(          &self, -        _renderer: &Renderer<B, T>, +        _renderer: &Renderer,          limits: &layout::Limits,      ) -> layout::Node {          let limits = limits.width(self.width).height(self.height); @@ -162,23 +142,19 @@ where      fn on_event(          &mut self,          tree: &mut Tree, -        event: iced_native::Event, +        event: core::Event,          layout: Layout<'_>,          cursor_position: Point, -        _renderer: &Renderer<B, T>, +        _renderer: &Renderer,          _clipboard: &mut dyn Clipboard,          shell: &mut Shell<'_, Message>,      ) -> event::Status {          let bounds = layout.bounds();          let canvas_event = match event { -            iced_native::Event::Mouse(mouse_event) => { -                Some(Event::Mouse(mouse_event)) -            } -            iced_native::Event::Touch(touch_event) => { -                Some(Event::Touch(touch_event)) -            } -            iced_native::Event::Keyboard(keyboard_event) => { +            core::Event::Mouse(mouse_event) => Some(Event::Mouse(mouse_event)), +            core::Event::Touch(touch_event) => Some(Event::Touch(touch_event)), +            core::Event::Keyboard(keyboard_event) => {                  Some(Event::Keyboard(keyboard_event))              }              _ => None, @@ -208,7 +184,7 @@ where          layout: Layout<'_>,          cursor_position: Point,          _viewport: &Rectangle, -        _renderer: &Renderer<B, T>, +        _renderer: &Renderer,      ) -> mouse::Interaction {          let bounds = layout.bounds();          let cursor = Cursor::from_window_position(cursor_position); @@ -220,49 +196,43 @@ where      fn draw(          &self,          tree: &Tree, -        renderer: &mut Renderer<B, T>, -        theme: &T, +        renderer: &mut Renderer, +        theme: &Renderer::Theme,          _style: &renderer::Style,          layout: Layout<'_>,          cursor_position: Point,          _viewport: &Rectangle,      ) { -        use iced_native::Renderer as _; -          let bounds = layout.bounds();          if bounds.width < 1.0 || bounds.height < 1.0 {              return;          } -        let translation = Vector::new(bounds.x, bounds.y);          let cursor = Cursor::from_window_position(cursor_position);          let state = tree.state.downcast_ref::<P::State>(); -        renderer.with_translation(translation, |renderer| { -            renderer.draw_primitive(Primitive::Group { -                primitives: self -                    .program -                    .draw(state, theme, bounds, cursor) -                    .into_iter() -                    .map(Geometry::into_primitive) -                    .collect(), -            }); -        }); +        renderer.with_translation( +            Vector::new(bounds.x, bounds.y), +            |renderer| { +                renderer.draw( +                    self.program.draw(state, renderer, theme, bounds, cursor), +                ); +            }, +        );      }  } -impl<'a, Message, P, B, T> From<Canvas<Message, T, P>> -    for Element<'a, Message, Renderer<B, T>> +impl<'a, P, Message, Renderer> From<Canvas<P, Message, Renderer>> +    for Element<'a, Message, Renderer>  where      Message: 'a, -    P: Program<Message, T> + 'a, -    B: Backend, -    T: 'a, +    Renderer: 'a + geometry::Renderer, +    P: Program<Message, Renderer> + 'a,  {      fn from( -        canvas: Canvas<Message, T, P>, -    ) -> Element<'a, Message, Renderer<B, T>> { +        canvas: Canvas<P, Message, Renderer>, +    ) -> Element<'a, Message, Renderer> {          Element::new(canvas)      }  } diff --git a/graphics/src/widget/canvas/cursor.rs b/widget/src/canvas/cursor.rs index 9588d129..5a65e9a7 100644 --- a/graphics/src/widget/canvas/cursor.rs +++ b/widget/src/canvas/cursor.rs @@ -1,4 +1,4 @@ -use iced_native::{Point, Rectangle}; +use crate::core::{Point, Rectangle};  /// The mouse cursor state.  #[derive(Debug, Clone, Copy, PartialEq)] diff --git a/graphics/src/widget/canvas/event.rs b/widget/src/canvas/event.rs index 7c733a4d..4508c184 100644 --- a/graphics/src/widget/canvas/event.rs +++ b/widget/src/canvas/event.rs @@ -1,9 +1,9 @@  //! Handle events of a canvas. -use iced_native::keyboard; -use iced_native::mouse; -use iced_native::touch; +use crate::core::keyboard; +use crate::core::mouse; +use crate::core::touch; -pub use iced_native::event::Status; +pub use crate::core::event::Status;  /// A [`Canvas`] event.  /// diff --git a/graphics/src/widget/canvas/program.rs b/widget/src/canvas/program.rs index 656dbfa6..efb33c56 100644 --- a/graphics/src/widget/canvas/program.rs +++ b/widget/src/canvas/program.rs @@ -1,7 +1,8 @@ -use crate::widget::canvas::event::{self, Event}; -use crate::widget::canvas::mouse; -use crate::widget::canvas::{Cursor, Geometry}; -use crate::Rectangle; +use crate::canvas::event::{self, Event}; +use crate::canvas::mouse; +use crate::canvas::Cursor; +use crate::core::Rectangle; +use crate::graphics::geometry;  /// The state and logic of a [`Canvas`].  /// @@ -9,7 +10,10 @@ use crate::Rectangle;  /// application.  ///  /// [`Canvas`]: crate::widget::Canvas -pub trait Program<Message, Theme = iced_native::Theme> { +pub trait Program<Message, Renderer = crate::Renderer> +where +    Renderer: geometry::Renderer, +{      /// The internal state mutated by the [`Program`].      type State: Default + 'static; @@ -44,10 +48,11 @@ pub trait Program<Message, Theme = iced_native::Theme> {      fn draw(          &self,          state: &Self::State, -        theme: &Theme, +        renderer: &Renderer, +        theme: &Renderer::Theme,          bounds: Rectangle,          cursor: Cursor, -    ) -> Vec<Geometry>; +    ) -> Vec<Renderer::Geometry>;      /// Returns the current mouse interaction of the [`Program`].      /// @@ -65,9 +70,10 @@ pub trait Program<Message, Theme = iced_native::Theme> {      }  } -impl<Message, Theme, T> Program<Message, Theme> for &T +impl<Message, Renderer, T> Program<Message, Renderer> for &T  where -    T: Program<Message, Theme>, +    Renderer: geometry::Renderer, +    T: Program<Message, Renderer>,  {      type State = T::State; @@ -84,11 +90,12 @@ where      fn draw(          &self,          state: &Self::State, -        theme: &Theme, +        renderer: &Renderer, +        theme: &Renderer::Theme,          bounds: Rectangle,          cursor: Cursor, -    ) -> Vec<Geometry> { -        T::draw(self, state, theme, bounds, cursor) +    ) -> Vec<Renderer::Geometry> { +        T::draw(self, state, renderer, theme, bounds, cursor)      }      fn mouse_interaction( diff --git a/native/src/widget/checkbox.rs b/widget/src/checkbox.rs index cd8b9c6b..d1f886c6 100644 --- a/native/src/widget/checkbox.rs +++ b/widget/src/checkbox.rs @@ -1,16 +1,17 @@  //! Show toggle controls using checkboxes. -use crate::alignment; -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::text; -use crate::touch; -use crate::widget::{self, Row, Text, Tree}; -use crate::{ +use crate::core::alignment; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::text; +use crate::core::touch; +use crate::core::widget::Tree; +use crate::core::{      Alignment, Clipboard, Element, Layout, Length, Pixels, Point, Rectangle,      Shell, Widget,  }; +use crate::{Row, Text};  pub use iced_style::checkbox::{Appearance, StyleSheet}; @@ -29,8 +30,9 @@ pub struct Icon<Font> {  ///  /// # Example  /// -/// ``` -/// # type Checkbox<'a, Message> = iced_native::widget::Checkbox<'a, Message, iced_native::renderer::Null>; +/// ```no_run +/// # type Checkbox<'a, Message> = +/// #     iced_widget::Checkbox<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// pub enum Message {  ///     CheckboxToggled(bool), @@ -43,10 +45,10 @@ pub struct Icon<Font> {  ///  ///   #[allow(missing_debug_implementations)] -pub struct Checkbox<'a, Message, Renderer> +pub struct Checkbox<'a, Message, Renderer = crate::Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      is_checked: bool,      on_toggle: Box<dyn Fn(bool) -> Message + 'a>, @@ -63,7 +65,7 @@ where  impl<'a, Message, Renderer> Checkbox<'a, Message, Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      /// The default size of a [`Checkbox`].      const DEFAULT_SIZE: f32 = 20.0; @@ -153,7 +155,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Checkbox<'a, Message, Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn width(&self) -> Length {          self.width @@ -289,14 +291,14 @@ where          {              let label_layout = children.next().unwrap(); -            widget::text::draw( +            crate::text::draw(                  renderer,                  style,                  label_layout,                  &self.label,                  self.text_size,                  self.font, -                widget::text::Appearance { +                crate::text::Appearance {                      color: custom_style.text_color,                  },                  alignment::Horizontal::Left, @@ -311,7 +313,7 @@ impl<'a, Message, Renderer> From<Checkbox<'a, Message, Renderer>>  where      Message: 'a,      Renderer: 'a + text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn from(          checkbox: Checkbox<'a, Message, Renderer>, diff --git a/native/src/widget/column.rs b/widget/src/column.rs index ebe579d5..8f363ec6 100644 --- a/native/src/widget/column.rs +++ b/widget/src/column.rs @@ -1,18 +1,18 @@  //! Distribute content vertically. -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::widget::{Operation, Tree}; -use crate::{ +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::{Operation, Tree}; +use crate::core::{      Alignment, Clipboard, Element, Layout, Length, Padding, Pixels, Point,      Rectangle, Shell, Widget,  };  /// A container that distributes its contents vertically.  #[allow(missing_debug_implementations)] -pub struct Column<'a, Message, Renderer> { +pub struct Column<'a, Message, Renderer = crate::Renderer> {      spacing: f32,      padding: Padding,      width: Length, @@ -102,7 +102,7 @@ impl<'a, Message, Renderer> Default for Column<'a, Message, Renderer> {  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Column<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,  {      fn children(&self) -> Vec<Tree> {          self.children.iter().map(Tree::new).collect() @@ -256,7 +256,7 @@ impl<'a, Message, Renderer> From<Column<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: crate::Renderer + 'a, +    Renderer: crate::core::Renderer + 'a,  {      fn from(column: Column<'a, Message, Renderer>) -> Self {          Self::new(column) diff --git a/native/src/widget/container.rs b/widget/src/container.rs index b77bf50d..9d932772 100644 --- a/native/src/widget/container.rs +++ b/widget/src/container.rs @@ -1,12 +1,12 @@  //! Decorate content and apply alignment. -use crate::alignment::{self, Alignment}; -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::widget::{self, Operation, Tree}; -use crate::{ +use crate::core::alignment::{self, Alignment}; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::{self, Operation, Tree}; +use crate::core::{      Background, Clipboard, Color, Element, Layout, Length, Padding, Pixels,      Point, Rectangle, Shell, Widget,  }; @@ -17,9 +17,9 @@ pub use iced_style::container::{Appearance, StyleSheet};  ///  /// It is normally used for alignment purposes.  #[allow(missing_debug_implementations)] -pub struct Container<'a, Message, Renderer> +pub struct Container<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      id: Option<Id>, @@ -36,7 +36,7 @@ where  impl<'a, Message, Renderer> Container<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// Creates an empty [`Container`]. @@ -131,7 +131,7 @@ where  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Container<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn children(&self) -> Vec<Tree> { @@ -276,7 +276,7 @@ impl<'a, Message, Renderer> From<Container<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from( @@ -326,7 +326,7 @@ pub fn draw_background<Renderer>(      appearance: &Appearance,      bounds: Rectangle,  ) where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,  {      if appearance.background.is_some() || appearance.border_width > 0.0 {          renderer.fill_quad( diff --git a/widget/src/helpers.rs b/widget/src/helpers.rs new file mode 100644 index 00000000..a43e7248 --- /dev/null +++ b/widget/src/helpers.rs @@ -0,0 +1,362 @@ +//! Helper functions to create pure widgets. +use crate::button::{self, Button}; +use crate::checkbox::{self, Checkbox}; +use crate::container::{self, Container}; +use crate::core; +use crate::core::widget::operation; +use crate::core::{Element, Length, Pixels}; +use crate::overlay; +use crate::pick_list::{self, PickList}; +use crate::progress_bar::{self, ProgressBar}; +use crate::radio::{self, Radio}; +use crate::rule::{self, Rule}; +use crate::runtime::Command; +use crate::scrollable::{self, Scrollable}; +use crate::slider::{self, Slider}; +use crate::text::{self, Text}; +use crate::text_input::{self, TextInput}; +use crate::toggler::{self, Toggler}; +use crate::tooltip::{self, Tooltip}; +use crate::{Column, Row, Space, VerticalSlider}; + +use std::borrow::Cow; +use std::ops::RangeInclusive; + +/// Creates a [`Column`] with the given children. +/// +/// [`Column`]: widget::Column +#[macro_export] +macro_rules! column { +    () => ( +        $crate::Column::new() +    ); +    ($($x:expr),+ $(,)?) => ( +        $crate::Column::with_children(vec![$($crate::core::Element::from($x)),+]) +    ); +} + +/// Creates a [`Row`] with the given children. +/// +/// [`Row`]: widget::Row +#[macro_export] +macro_rules! row { +    () => ( +        $crate::Row::new() +    ); +    ($($x:expr),+ $(,)?) => ( +        $crate::Row::with_children(vec![$($crate::core::Element::from($x)),+]) +    ); +} + +/// Creates a new [`Container`] with the provided content. +/// +/// [`Container`]: widget::Container +pub fn container<'a, Message, Renderer>( +    content: impl Into<Element<'a, Message, Renderer>>, +) -> Container<'a, Message, Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: container::StyleSheet, +{ +    Container::new(content) +} + +/// Creates a new [`Column`] with the given children. +/// +/// [`Column`]: widget::Column +pub fn column<Message, Renderer>( +    children: Vec<Element<'_, Message, Renderer>>, +) -> Column<'_, Message, Renderer> { +    Column::with_children(children) +} + +/// Creates a new [`Row`] with the given children. +/// +/// [`Row`]: widget::Row +pub fn row<Message, Renderer>( +    children: Vec<Element<'_, Message, Renderer>>, +) -> Row<'_, Message, Renderer> { +    Row::with_children(children) +} + +/// Creates a new [`Scrollable`] with the provided content. +/// +/// [`Scrollable`]: widget::Scrollable +pub fn scrollable<'a, Message, Renderer>( +    content: impl Into<Element<'a, Message, Renderer>>, +) -> Scrollable<'a, Message, Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: scrollable::StyleSheet, +{ +    Scrollable::new(content) +} + +/// Creates a new [`Button`] with the provided content. +/// +/// [`Button`]: widget::Button +pub fn button<'a, Message, Renderer>( +    content: impl Into<Element<'a, Message, Renderer>>, +) -> Button<'a, Message, Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: button::StyleSheet, +    <Renderer::Theme as button::StyleSheet>::Style: Default, +{ +    Button::new(content) +} + +/// Creates a new [`Tooltip`] with the provided content, tooltip text, and [`tooltip::Position`]. +/// +/// [`Tooltip`]: widget::Tooltip +/// [`tooltip::Position`]: widget::tooltip::Position +pub fn tooltip<'a, Message, Renderer>( +    content: impl Into<Element<'a, Message, Renderer>>, +    tooltip: impl ToString, +    position: tooltip::Position, +) -> crate::Tooltip<'a, Message, Renderer> +where +    Renderer: core::text::Renderer, +    Renderer::Theme: container::StyleSheet + text::StyleSheet, +{ +    Tooltip::new(content, tooltip.to_string(), position) +} + +/// Creates a new [`Text`] widget with the provided content. +/// +/// [`Text`]: widget::Text +pub fn text<'a, Renderer>(text: impl ToString) -> Text<'a, Renderer> +where +    Renderer: core::text::Renderer, +    Renderer::Theme: text::StyleSheet, +{ +    Text::new(text.to_string()) +} + +/// Creates a new [`Checkbox`]. +/// +/// [`Checkbox`]: widget::Checkbox +pub fn checkbox<'a, Message, Renderer>( +    label: impl Into<String>, +    is_checked: bool, +    f: impl Fn(bool) -> Message + 'a, +) -> Checkbox<'a, Message, Renderer> +where +    Renderer: core::text::Renderer, +    Renderer::Theme: checkbox::StyleSheet + text::StyleSheet, +{ +    Checkbox::new(label, is_checked, f) +} + +/// Creates a new [`Radio`]. +/// +/// [`Radio`]: widget::Radio +pub fn radio<Message, Renderer, V>( +    label: impl Into<String>, +    value: V, +    selected: Option<V>, +    on_click: impl FnOnce(V) -> Message, +) -> Radio<Message, Renderer> +where +    Message: Clone, +    Renderer: core::text::Renderer, +    Renderer::Theme: radio::StyleSheet, +    V: Copy + Eq, +{ +    Radio::new(value, label, selected, on_click) +} + +/// Creates a new [`Toggler`]. +/// +/// [`Toggler`]: widget::Toggler +pub fn toggler<'a, Message, Renderer>( +    label: impl Into<Option<String>>, +    is_checked: bool, +    f: impl Fn(bool) -> Message + 'a, +) -> Toggler<'a, Message, Renderer> +where +    Renderer: core::text::Renderer, +    Renderer::Theme: toggler::StyleSheet, +{ +    Toggler::new(label, is_checked, f) +} + +/// Creates a new [`TextInput`]. +/// +/// [`TextInput`]: widget::TextInput +pub fn text_input<'a, Message, Renderer>( +    placeholder: &str, +    value: &str, +    on_change: impl Fn(String) -> Message + 'a, +) -> TextInput<'a, Message, Renderer> +where +    Message: Clone, +    Renderer: core::text::Renderer, +    Renderer::Theme: text_input::StyleSheet, +{ +    TextInput::new(placeholder, value, on_change) +} + +/// Creates a new [`Slider`]. +/// +/// [`Slider`]: widget::Slider +pub fn slider<'a, T, Message, Renderer>( +    range: std::ops::RangeInclusive<T>, +    value: T, +    on_change: impl Fn(T) -> Message + 'a, +) -> Slider<'a, T, Message, Renderer> +where +    T: Copy + From<u8> + std::cmp::PartialOrd, +    Message: Clone, +    Renderer: core::Renderer, +    Renderer::Theme: slider::StyleSheet, +{ +    Slider::new(range, value, on_change) +} + +/// Creates a new [`VerticalSlider`]. +/// +/// [`VerticalSlider`]: widget::VerticalSlider +pub fn vertical_slider<'a, T, Message, Renderer>( +    range: std::ops::RangeInclusive<T>, +    value: T, +    on_change: impl Fn(T) -> Message + 'a, +) -> VerticalSlider<'a, T, Message, Renderer> +where +    T: Copy + From<u8> + std::cmp::PartialOrd, +    Message: Clone, +    Renderer: core::Renderer, +    Renderer::Theme: slider::StyleSheet, +{ +    VerticalSlider::new(range, value, on_change) +} + +/// Creates a new [`PickList`]. +/// +/// [`PickList`]: widget::PickList +pub fn pick_list<'a, Message, Renderer, T>( +    options: impl Into<Cow<'a, [T]>>, +    selected: Option<T>, +    on_selected: impl Fn(T) -> Message + 'a, +) -> PickList<'a, T, Message, Renderer> +where +    T: ToString + Eq + 'static, +    [T]: ToOwned<Owned = Vec<T>>, +    Renderer: core::text::Renderer, +    Renderer::Theme: pick_list::StyleSheet +        + scrollable::StyleSheet +        + overlay::menu::StyleSheet +        + container::StyleSheet, +    <Renderer::Theme as overlay::menu::StyleSheet>::Style: +        From<<Renderer::Theme as pick_list::StyleSheet>::Style>, +{ +    PickList::new(options, selected, on_selected) +} + +/// Creates a new horizontal [`Space`] with the given [`Length`]. +/// +/// [`Space`]: widget::Space +pub fn horizontal_space(width: impl Into<Length>) -> Space { +    Space::with_width(width) +} + +/// Creates a new vertical [`Space`] with the given [`Length`]. +/// +/// [`Space`]: widget::Space +pub fn vertical_space(height: impl Into<Length>) -> Space { +    Space::with_height(height) +} + +/// Creates a horizontal [`Rule`] with the given height. +/// +/// [`Rule`]: widget::Rule +pub fn horizontal_rule<Renderer>(height: impl Into<Pixels>) -> Rule<Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: rule::StyleSheet, +{ +    Rule::horizontal(height) +} + +/// Creates a vertical [`Rule`] with the given width. +/// +/// [`Rule`]: widget::Rule +pub fn vertical_rule<Renderer>(width: impl Into<Pixels>) -> Rule<Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: rule::StyleSheet, +{ +    Rule::vertical(width) +} + +/// Creates a new [`ProgressBar`]. +/// +/// It expects: +///   * an inclusive range of possible values, and +///   * the current value of the [`ProgressBar`]. +/// +/// [`ProgressBar`]: widget::ProgressBar +pub fn progress_bar<Renderer>( +    range: RangeInclusive<f32>, +    value: f32, +) -> ProgressBar<Renderer> +where +    Renderer: core::Renderer, +    Renderer::Theme: progress_bar::StyleSheet, +{ +    ProgressBar::new(range, value) +} + +/// Creates a new [`Image`]. +/// +/// [`Image`]: widget::Image +#[cfg(feature = "image")] +#[cfg_attr(docsrs, doc(cfg(feature = "image")))] +pub fn image<Handle>(handle: impl Into<Handle>) -> crate::Image<Handle> { +    crate::Image::new(handle.into()) +} + +/// Creates a new [`Svg`] widget from the given [`Handle`]. +/// +/// [`Svg`]: widget::Svg +/// [`Handle`]: widget::svg::Handle +#[cfg(feature = "svg")] +#[cfg_attr(docsrs, doc(cfg(feature = "svg")))] +pub fn svg<Renderer>( +    handle: impl Into<core::svg::Handle>, +) -> crate::Svg<Renderer> +where +    Renderer: core::svg::Renderer, +    Renderer::Theme: crate::svg::StyleSheet, +{ +    crate::Svg::new(handle) +} + +/// Creates a new [`Canvas`]. +#[cfg(feature = "canvas")] +#[cfg_attr(docsrs, doc(cfg(feature = "canvas")))] +pub fn canvas<P, Message, Renderer>( +    program: P, +) -> crate::Canvas<P, Message, Renderer> +where +    Renderer: crate::graphics::geometry::Renderer, +    P: crate::canvas::Program<Message, Renderer>, +{ +    crate::Canvas::new(program) +} + +/// Focuses the previous focusable widget. +pub fn focus_previous<Message>() -> Command<Message> +where +    Message: 'static, +{ +    Command::widget(operation::focusable::focus_previous()) +} + +/// Focuses the next focusable widget. +pub fn focus_next<Message>() -> Command<Message> +where +    Message: 'static, +{ +    Command::widget(operation::focusable::focus_next()) +} diff --git a/native/src/widget/image.rs b/widget/src/image.rs index 73257a74..abcb6ef2 100644 --- a/native/src/widget/image.rs +++ b/widget/src/image.rs @@ -2,16 +2,18 @@  pub mod viewer;  pub use viewer::Viewer; -use crate::image; -use crate::layout; -use crate::renderer; -use crate::widget::Tree; -use crate::{ +use crate::core::image; +use crate::core::layout; +use crate::core::renderer; +use crate::core::widget::Tree; +use crate::core::{      ContentFit, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,  };  use std::hash::Hash; +pub use image::Handle; +  /// Creates a new [`Viewer`] with the given image `Handle`.  pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> {      Viewer::new(handle) @@ -21,9 +23,8 @@ pub fn viewer<Handle>(handle: Handle) -> Viewer<Handle> {  ///  /// # Example  /// -/// ``` -/// # use iced_native::widget::Image; -/// # use iced_native::image; +/// ```no_run +/// # use iced_widget::image::{self, Image};  /// #  /// let image = Image::<image::Handle>::new("resources/ferris.png");  /// ``` diff --git a/native/src/widget/image/viewer.rs b/widget/src/image/viewer.rs index 1f8d5d7a..0d60d818 100644 --- a/native/src/widget/image/viewer.rs +++ b/widget/src/image/viewer.rs @@ -1,11 +1,11 @@  //! Zoom and pan on an image. -use crate::event::{self, Event}; -use crate::image; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::widget::tree::{self, Tree}; -use crate::{ +use crate::core::event::{self, Event}; +use crate::core::image; +use crate::core::layout; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{      Clipboard, Element, Layout, Length, Pixels, Point, Rectangle, Shell, Size,      Vector, Widget,  }; diff --git a/lazy/src/lazy.rs b/widget/src/lazy.rs index 5e909a49..b08ed8cb 100644 --- a/lazy/src/lazy.rs +++ b/widget/src/lazy.rs @@ -1,12 +1,25 @@ -use iced_native::event; -use iced_native::layout::{self, Layout}; -use iced_native::mouse; -use iced_native::overlay; -use iced_native::renderer; -use iced_native::widget::tree::{self, Tree}; -use iced_native::widget::{self, Widget}; -use iced_native::Element; -use iced_native::{Clipboard, Hasher, Length, Point, Rectangle, Shell, Size}; +#![allow(clippy::await_holding_refcell_ref, clippy::type_complexity)] +pub(crate) mod helpers; + +pub mod component; +pub mod responsive; + +pub use component::Component; +pub use responsive::Responsive; + +mod cache; + +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::tree::{self, Tree}; +use crate::core::widget::{self, Widget}; +use crate::core::Element; +use crate::core::{ +    self, Clipboard, Hasher, Length, Point, Rectangle, Shell, Size, +};  use ouroboros::self_referencing;  use std::cell::RefCell; @@ -41,7 +54,7 @@ where      fn with_element<T>(          &self, -        f: impl FnOnce(&Element<Message, Renderer>) -> T, +        f: impl FnOnce(&Element<'_, Message, Renderer>) -> T,      ) -> T {          f(self              .element @@ -55,7 +68,7 @@ where      fn with_element_mut<T>(          &self, -        f: impl FnOnce(&mut Element<Message, Renderer>) -> T, +        f: impl FnOnce(&mut Element<'_, Message, Renderer>) -> T,      ) -> T {          f(self              .element @@ -79,7 +92,7 @@ where      View: Into<Element<'static, Message, Renderer>> + 'static,      Dependency: Hash + 'a,      Message: 'static, -    Renderer: iced_native::Renderer + 'static, +    Renderer: core::Renderer + 'static,  {      fn tag(&self) -> tree::Tag {          struct Tag<T>(T); @@ -163,7 +176,7 @@ where      fn on_event(          &mut self,          tree: &mut Tree, -        event: iced_native::Event, +        event: Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer, @@ -304,7 +317,7 @@ impl<'a, Message, Renderer> Overlay<'a, Message, Renderer> {  impl<'a, Message, Renderer> overlay::Overlay<Message, Renderer>      for Overlay<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      fn layout(          &self, @@ -353,7 +366,7 @@ where      fn on_event(          &mut self, -        event: iced_native::Event, +        event: Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer, @@ -370,7 +383,7 @@ where                  shell,              )          }) -        .unwrap_or(iced_native::event::Status::Ignored) +        .unwrap_or(event::Status::Ignored)      }      fn is_over(&self, layout: Layout<'_>, cursor_position: Point) -> bool { @@ -386,7 +399,7 @@ impl<'a, Message, Renderer, Dependency, View>      for Element<'a, Message, Renderer>  where      View: Into<Element<'static, Message, Renderer>> + 'static, -    Renderer: iced_native::Renderer + 'static, +    Renderer: core::Renderer + 'static,      Message: 'static,      Dependency: Hash + 'a,  { diff --git a/lazy/src/cache.rs b/widget/src/lazy/cache.rs index 5b4a39f6..e7b87614 100644 --- a/lazy/src/cache.rs +++ b/widget/src/lazy/cache.rs @@ -1,5 +1,5 @@ -use iced_native::overlay; -use iced_native::Element; +use crate::core::overlay; +use crate::core::Element;  use ouroboros::self_referencing; diff --git a/lazy/src/component.rs b/widget/src/lazy/component.rs index b23da9f7..0b8070af 100644 --- a/lazy/src/component.rs +++ b/widget/src/lazy/component.rs @@ -1,13 +1,13 @@  //! Build and reuse custom widgets using The Elm Architecture. -use iced_native::event; -use iced_native::layout::{self, Layout}; -use iced_native::mouse; -use iced_native::overlay; -use iced_native::renderer; -use iced_native::widget; -use iced_native::widget::tree::{self, Tree}; -use iced_native::{ -    Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget, +use crate::core::event; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{ +    self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget,  };  use ouroboros::self_referencing; @@ -67,7 +67,7 @@ where      C: Component<Message, Renderer> + 'a,      C::State: 'static,      Message: 'a, -    Renderer: iced_native::Renderer + 'a, +    Renderer: core::Renderer + 'a,  {      Element::new(Instance {          state: RefCell::new(Some( @@ -159,7 +159,7 @@ impl<'a, Message, Renderer, Event, S> Widget<Message, Renderer>      for Instance<'a, Message, Renderer, Event, S>  where      S: 'static + Default, -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      fn tag(&self) -> tree::Tag {          struct Tag<T>(T); @@ -203,7 +203,7 @@ where      fn on_event(          &mut self,          tree: &mut Tree, -        event: iced_native::Event, +        event: core::Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer, @@ -447,7 +447,7 @@ impl<'a, 'b, Message, Renderer, Event, S>  impl<'a, 'b, Message, Renderer, Event, S> overlay::Overlay<Message, Renderer>      for OverlayInstance<'a, 'b, Message, Renderer, Event, S>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,      S: 'static + Default,  {      fn layout( @@ -497,13 +497,13 @@ where      fn on_event(          &mut self, -        event: iced_native::Event, +        event: core::Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer,          clipboard: &mut dyn Clipboard,          shell: &mut Shell<'_, Message>, -    ) -> iced_native::event::Status { +    ) -> event::Status {          let mut local_messages = Vec::new();          let mut local_shell = Shell::new(&mut local_messages); @@ -518,7 +518,7 @@ where                      &mut local_shell,                  )              }) -            .unwrap_or(iced_native::event::Status::Ignored); +            .unwrap_or(event::Status::Ignored);          local_shell.revalidate_layout(|| shell.invalidate_layout()); diff --git a/lazy/src/lib.rs b/widget/src/lazy/helpers.rs index 41a28773..be60bb78 100644 --- a/lazy/src/lib.rs +++ b/widget/src/lazy/helpers.rs @@ -1,34 +1,7 @@ -#![doc( -    html_logo_url = "https://raw.githubusercontent.com/iced-rs/iced/9ab6923e943f784985e9ef9ca28b10278297225d/docs/logo.svg" -)] -#![deny( -    missing_debug_implementations, -    unused_results, -    clippy::extra_unused_lifetimes, -    clippy::from_over_into, -    clippy::needless_borrow, -    clippy::new_without_default, -    clippy::useless_conversion -)] -#![forbid(unsafe_code)] -#![allow( -    clippy::await_holding_refcell_ref, -    clippy::inherent_to_string, -    clippy::type_complexity -)] -#![cfg_attr(docsrs, feature(doc_cfg))] -mod lazy; +use crate::core::{self, Element, Size}; +use crate::lazy::component::{self, Component}; +use crate::lazy::{Lazy, Responsive}; -pub mod component; -pub mod responsive; - -pub use component::Component; -pub use lazy::Lazy; -pub use responsive::Responsive; - -mod cache; - -use iced_native::{Element, Size};  use std::hash::Hash;  pub fn lazy<'a, Message, Renderer, Dependency, View>( @@ -51,7 +24,7 @@ where      C: Component<Message, Renderer> + 'a,      C::State: 'static,      Message: 'a, -    Renderer: iced_native::Renderer + 'a, +    Renderer: core::Renderer + 'a,  {      component::view(component)  } @@ -60,7 +33,7 @@ pub fn responsive<'a, Message, Renderer>(      f: impl Fn(Size) -> Element<'a, Message, Renderer> + 'a,  ) -> Responsive<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      Responsive::new(f)  } diff --git a/lazy/src/responsive.rs b/widget/src/lazy/responsive.rs index 57c07de1..7b2fc37c 100644 --- a/lazy/src/responsive.rs +++ b/widget/src/lazy/responsive.rs @@ -1,13 +1,14 @@ -use iced_native::event; -use iced_native::layout::{self, Layout}; -use iced_native::mouse; -use iced_native::overlay; -use iced_native::renderer; -use iced_native::widget::tree::{self, Tree}; -use iced_native::widget::{self, horizontal_space}; -use iced_native::{ -    Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget, +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{ +    self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Widget,  }; +use crate::horizontal_space;  use ouroboros::self_referencing;  use std::cell::{RefCell, RefMut}; @@ -19,14 +20,14 @@ use std::ops::Deref;  /// A [`Responsive`] widget will always try to fill all the available space of  /// its parent.  #[allow(missing_debug_implementations)] -pub struct Responsive<'a, Message, Renderer> { +pub struct Responsive<'a, Message, Renderer = crate::Renderer> {      view: Box<dyn Fn(Size) -> Element<'a, Message, Renderer> + 'a>,      content: RefCell<Content<'a, Message, Renderer>>,  }  impl<'a, Message, Renderer> Responsive<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      /// Creates a new [`Responsive`] widget with a closure that produces its      /// contents. @@ -56,7 +57,7 @@ struct Content<'a, Message, Renderer> {  impl<'a, Message, Renderer> Content<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      fn update(          &mut self, @@ -114,7 +115,7 @@ struct State {  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Responsive<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      fn tag(&self) -> tree::Tag {          tree::Tag::of::<State>() @@ -168,7 +169,7 @@ where      fn on_event(          &mut self,          tree: &mut Tree, -        event: iced_native::Event, +        event: Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer, @@ -271,7 +272,8 @@ where              content: self.content.borrow_mut(),              tree: state.tree.borrow_mut(),              types: PhantomData, -            overlay_builder: |content: &mut RefMut<Content<_, _>>, tree| { +            overlay_builder: |content: &mut RefMut<'_, Content<'_, _, _>>, +                              tree| {                  content.update(                      tree,                      renderer, @@ -309,7 +311,7 @@ where  impl<'a, Message, Renderer> From<Responsive<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where -    Renderer: iced_native::Renderer + 'a, +    Renderer: core::Renderer + 'a,      Message: 'a,  {      fn from(responsive: Responsive<'a, Message, Renderer>) -> Self { @@ -347,7 +349,7 @@ impl<'a, 'b, Message, Renderer> Overlay<'a, 'b, Message, Renderer> {  impl<'a, 'b, Message, Renderer> overlay::Overlay<Message, Renderer>      for Overlay<'a, 'b, Message, Renderer>  where -    Renderer: iced_native::Renderer, +    Renderer: core::Renderer,  {      fn layout(          &self, @@ -396,7 +398,7 @@ where      fn on_event(          &mut self, -        event: iced_native::Event, +        event: Event,          layout: Layout<'_>,          cursor_position: Point,          renderer: &Renderer, @@ -413,7 +415,7 @@ where                  shell,              )          }) -        .unwrap_or(iced_native::event::Status::Ignored) +        .unwrap_or(event::Status::Ignored)      }      fn is_over(&self, layout: Layout<'_>, cursor_position: Point) -> bool { diff --git a/widget/src/lib.rs b/widget/src/lib.rs new file mode 100644 index 00000000..a3e7c8bc --- /dev/null +++ b/widget/src/lib.rs @@ -0,0 +1,122 @@ +//! Use the built-in widgets or create your own. +#![doc( +    html_logo_url = "https://raw.githubusercontent.com/iced-rs/iced/9ab6923e943f784985e9ef9ca28b10278297225d/docs/logo.svg" +)] +#![deny( +    missing_debug_implementations, +    //missing_docs, +    unused_results, +    clippy::extra_unused_lifetimes, +    clippy::from_over_into, +    clippy::needless_borrow, +    clippy::new_without_default, +    clippy::useless_conversion +)] +#![forbid(unsafe_code, rust_2018_idioms)] +#![allow(clippy::inherent_to_string, clippy::type_complexity)] +pub use iced_renderer as renderer; +pub use iced_renderer::graphics; +pub use iced_runtime as runtime; +pub use iced_runtime::core; +pub use iced_style as style; + +mod column; +mod row; + +pub mod button; +pub mod checkbox; +pub mod container; +pub mod overlay; +pub mod pane_grid; +pub mod pick_list; +pub mod progress_bar; +pub mod radio; +pub mod rule; +pub mod scrollable; +pub mod slider; +pub mod space; +pub mod text; +pub mod text_input; +pub mod toggler; +pub mod tooltip; +pub mod vertical_slider; + +mod helpers; + +pub use helpers::*; + +#[cfg(feature = "lazy")] +mod lazy; + +#[cfg(feature = "lazy")] +pub use crate::lazy::{Component, Lazy, Responsive}; + +#[cfg(feature = "lazy")] +pub use crate::lazy::helpers::*; + +#[doc(no_inline)] +pub use button::Button; +#[doc(no_inline)] +pub use checkbox::Checkbox; +#[doc(no_inline)] +pub use column::Column; +#[doc(no_inline)] +pub use container::Container; +#[doc(no_inline)] +pub use pane_grid::PaneGrid; +#[doc(no_inline)] +pub use pick_list::PickList; +#[doc(no_inline)] +pub use progress_bar::ProgressBar; +#[doc(no_inline)] +pub use radio::Radio; +#[doc(no_inline)] +pub use row::Row; +#[doc(no_inline)] +pub use rule::Rule; +#[doc(no_inline)] +pub use scrollable::Scrollable; +#[doc(no_inline)] +pub use slider::Slider; +#[doc(no_inline)] +pub use space::Space; +#[doc(no_inline)] +pub use text::Text; +#[doc(no_inline)] +pub use text_input::TextInput; +#[doc(no_inline)] +pub use toggler::Toggler; +#[doc(no_inline)] +pub use tooltip::Tooltip; +#[doc(no_inline)] +pub use vertical_slider::VerticalSlider; + +#[cfg(feature = "svg")] +pub mod svg; + +#[cfg(feature = "svg")] +#[doc(no_inline)] +pub use svg::Svg; + +#[cfg(feature = "image")] +pub mod image; + +#[cfg(feature = "image")] +#[doc(no_inline)] +pub use image::Image; + +#[cfg(feature = "canvas")] +pub mod canvas; + +#[cfg(feature = "canvas")] +#[doc(no_inline)] +pub use canvas::Canvas; + +#[cfg(feature = "qr_code")] +pub mod qr_code; + +#[cfg(feature = "qr_code")] +#[doc(no_inline)] +pub use qr_code::QRCode; + +type Renderer<Theme = style::Theme> = renderer::Renderer<Theme>; diff --git a/widget/src/overlay.rs b/widget/src/overlay.rs new file mode 100644 index 00000000..b9a0e3e0 --- /dev/null +++ b/widget/src/overlay.rs @@ -0,0 +1 @@ +pub mod menu; diff --git a/native/src/overlay/menu.rs b/widget/src/overlay/menu.rs index bd58a122..c322c8ba 100644 --- a/native/src/overlay/menu.rs +++ b/widget/src/overlay/menu.rs @@ -1,25 +1,25 @@  //! Build and show dropdown menus. -use crate::alignment; -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::text::{self, Text}; -use crate::touch; -use crate::widget::container::{self, Container}; -use crate::widget::scrollable::{self, Scrollable}; -use crate::widget::Tree; -use crate::{ -    Clipboard, Color, Element, Layout, Length, Padding, Pixels, Point, -    Rectangle, Shell, Size, Vector, Widget, +use crate::container::{self, Container}; +use crate::core::alignment; +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::text::{self, Text}; +use crate::core::touch; +use crate::core::widget::Tree; +use crate::core::{ +    Clipboard, Color, Length, Padding, Pixels, Point, Rectangle, Size, Vector,  }; +use crate::core::{Element, Shell, Widget}; +use crate::scrollable::{self, Scrollable};  pub use iced_style::menu::{Appearance, StyleSheet};  /// A list of selectable options.  #[allow(missing_debug_implementations)] -pub struct Menu<'a, T, Renderer> +pub struct Menu<'a, T, Renderer = crate::Renderer>  where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -137,7 +137,7 @@ impl Default for State {  struct Overlay<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  {      state: &'a mut Tree, @@ -193,7 +193,7 @@ where      }  } -impl<'a, Message, Renderer> crate::Overlay<Message, Renderer> +impl<'a, Message, Renderer> crate::core::Overlay<Message, Renderer>      for Overlay<'a, Message, Renderer>  where      Renderer: text::Renderer, diff --git a/native/src/widget/pane_grid.rs b/widget/src/pane_grid.rs index bcb17ebd..257c0144 100644 --- a/native/src/widget/pane_grid.rs +++ b/widget/src/pane_grid.rs @@ -30,18 +30,18 @@ pub use split::Split;  pub use state::State;  pub use title_bar::TitleBar; -pub use iced_style::pane_grid::{Line, StyleSheet}; - -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay::{self, Group}; -use crate::renderer; -use crate::touch; -use crate::widget; -use crate::widget::container; -use crate::widget::tree::{self, Tree}; -use crate::{ +pub use crate::style::pane_grid::{Line, StyleSheet}; + +use crate::container; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay::{self, Group}; +use crate::core::renderer; +use crate::core::touch; +use crate::core::widget; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{      Clipboard, Color, Element, Layout, Length, Pixels, Point, Rectangle, Shell,      Size, Vector, Widget,  }; @@ -67,11 +67,11 @@ use crate::{  ///  /// ## Example  /// -/// ``` -/// # use iced_native::widget::{pane_grid, text}; +/// ```no_run +/// # use iced_widget::{pane_grid, text};  /// #  /// # type PaneGrid<'a, Message> = -/// #     iced_native::widget::PaneGrid<'a, Message, iced_native::renderer::Null>; +/// #     iced_widget::PaneGrid<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// enum PaneState {  ///     SomePane, @@ -96,9 +96,9 @@ use crate::{  ///     .on_resize(10, Message::PaneResized);  /// ```  #[allow(missing_debug_implementations)] -pub struct PaneGrid<'a, Message, Renderer> +pub struct PaneGrid<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  {      contents: Contents<'a, Content<'a, Message, Renderer>>, @@ -113,7 +113,7 @@ where  impl<'a, Message, Renderer> PaneGrid<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  {      /// Creates a [`PaneGrid`] with the given [`State`] and view function. @@ -232,7 +232,7 @@ where  impl<'a, Message, Renderer> Widget<Message, Renderer>      for PaneGrid<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  {      fn tag(&self) -> tree::Tag { @@ -468,7 +468,7 @@ impl<'a, Message, Renderer> From<PaneGrid<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  {      fn from( @@ -755,7 +755,7 @@ pub fn draw<Renderer, T>(          &Rectangle,      ),  ) where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      let picked_pane = action.picked_pane(); diff --git a/native/src/widget/pane_grid/axis.rs b/widget/src/pane_grid/axis.rs index 02bde064..a3049230 100644 --- a/native/src/widget/pane_grid/axis.rs +++ b/widget/src/pane_grid/axis.rs @@ -1,4 +1,4 @@ -use crate::Rectangle; +use crate::core::Rectangle;  /// A fixed reference line for the measurement of coordinates.  #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] diff --git a/native/src/widget/pane_grid/configuration.rs b/widget/src/pane_grid/configuration.rs index 7d68fb46..ddbc3bc2 100644 --- a/native/src/widget/pane_grid/configuration.rs +++ b/widget/src/pane_grid/configuration.rs @@ -1,4 +1,4 @@ -use crate::widget::pane_grid::Axis; +use crate::pane_grid::Axis;  /// The arrangement of a [`PaneGrid`].  /// diff --git a/native/src/widget/pane_grid/content.rs b/widget/src/pane_grid/content.rs index c9b0df07..035ef05b 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/widget/src/pane_grid/content.rs @@ -1,20 +1,20 @@ -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::widget::container; -use crate::widget::pane_grid::{Draggable, TitleBar}; -use crate::widget::{self, Tree}; -use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; +use crate::container; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::{self, Tree}; +use crate::core::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size}; +use crate::pane_grid::{Draggable, TitleBar};  /// The content of a [`Pane`].  ///  /// [`Pane`]: crate::widget::pane_grid::Pane  #[allow(missing_debug_implementations)] -pub struct Content<'a, Message, Renderer> +pub struct Content<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      title_bar: Option<TitleBar<'a, Message, Renderer>>, @@ -24,7 +24,7 @@ where  impl<'a, Message, Renderer> Content<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      /// Creates a new [`Content`] with the provided body. @@ -57,7 +57,7 @@ where  impl<'a, Message, Renderer> Content<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      pub(super) fn state(&self) -> Tree { @@ -342,7 +342,7 @@ where  impl<'a, Message, Renderer> Draggable for &Content<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      fn can_be_dragged_at( @@ -364,7 +364,7 @@ where  impl<'a, T, Message, Renderer> From<T> for Content<'a, Message, Renderer>  where      T: Into<Element<'a, Message, Renderer>>, -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      fn from(element: T) -> Self { diff --git a/native/src/widget/pane_grid/direction.rs b/widget/src/pane_grid/direction.rs index b31a8737..b31a8737 100644 --- a/native/src/widget/pane_grid/direction.rs +++ b/widget/src/pane_grid/direction.rs diff --git a/native/src/widget/pane_grid/draggable.rs b/widget/src/pane_grid/draggable.rs index 6044871d..a9274dad 100644 --- a/native/src/widget/pane_grid/draggable.rs +++ b/widget/src/pane_grid/draggable.rs @@ -1,4 +1,4 @@ -use crate::{Layout, Point}; +use crate::core::{Layout, Point};  /// A pane that can be dragged.  pub trait Draggable { diff --git a/native/src/widget/pane_grid/node.rs b/widget/src/pane_grid/node.rs index cc304b96..3976acd8 100644 --- a/native/src/widget/pane_grid/node.rs +++ b/widget/src/pane_grid/node.rs @@ -1,5 +1,5 @@ -use crate::widget::pane_grid::{Axis, Pane, Split}; -use crate::{Rectangle, Size}; +use crate::core::{Rectangle, Size}; +use crate::pane_grid::{Axis, Pane, Split};  use std::collections::BTreeMap; diff --git a/native/src/widget/pane_grid/pane.rs b/widget/src/pane_grid/pane.rs index d6fbab83..d6fbab83 100644 --- a/native/src/widget/pane_grid/pane.rs +++ b/widget/src/pane_grid/pane.rs diff --git a/native/src/widget/pane_grid/split.rs b/widget/src/pane_grid/split.rs index 8132272a..8132272a 100644 --- a/native/src/widget/pane_grid/split.rs +++ b/widget/src/pane_grid/split.rs diff --git a/native/src/widget/pane_grid/state.rs b/widget/src/pane_grid/state.rs index c4ae0a0e..a6e2ec7f 100644 --- a/native/src/widget/pane_grid/state.rs +++ b/widget/src/pane_grid/state.rs @@ -1,10 +1,8 @@  //! The state of a [`PaneGrid`].  //!  //! [`PaneGrid`]: crate::widget::PaneGrid -use crate::widget::pane_grid::{ -    Axis, Configuration, Direction, Node, Pane, Split, -}; -use crate::{Point, Size}; +use crate::core::{Point, Size}; +use crate::pane_grid::{Axis, Configuration, Direction, Node, Pane, Split};  use std::collections::HashMap; diff --git a/native/src/widget/pane_grid/title_bar.rs b/widget/src/pane_grid/title_bar.rs index 107078ef..2129937b 100644 --- a/native/src/widget/pane_grid/title_bar.rs +++ b/widget/src/pane_grid/title_bar.rs @@ -1,11 +1,11 @@ -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::widget::container; -use crate::widget::{self, Tree}; -use crate::{ +use crate::container; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::{self, Tree}; +use crate::core::{      Clipboard, Element, Layout, Padding, Point, Rectangle, Shell, Size,  }; @@ -13,9 +13,9 @@ use crate::{  ///  /// [`Pane`]: crate::widget::pane_grid::Pane  #[allow(missing_debug_implementations)] -pub struct TitleBar<'a, Message, Renderer> +pub struct TitleBar<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      content: Element<'a, Message, Renderer>, @@ -27,7 +27,7 @@ where  impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      /// Creates a new [`TitleBar`] with the given content. @@ -84,7 +84,7 @@ where  impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: container::StyleSheet,  {      pub(super) fn state(&self) -> Tree { diff --git a/native/src/widget/pick_list.rs b/widget/src/pick_list.rs index 8ff82f3b..cd23cdd2 100644 --- a/native/src/widget/pick_list.rs +++ b/widget/src/pick_list.rs @@ -1,28 +1,29 @@  //! Display a dropdown list of selectable values. -use crate::alignment; -use crate::event::{self, Event}; -use crate::keyboard; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::overlay::menu::{self, Menu}; -use crate::renderer; -use crate::text::{self, Text}; -use crate::touch; -use crate::widget::container; -use crate::widget::scrollable; -use crate::widget::tree::{self, Tree}; -use crate::{ +use crate::container; +use crate::core::alignment; +use crate::core::event::{self, Event}; +use crate::core::keyboard; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::text::{self, Text}; +use crate::core::touch; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{      Clipboard, Element, Layout, Length, Padding, Pixels, Point, Rectangle,      Shell, Size, Widget,  }; +use crate::overlay::menu::{self, Menu}; +use crate::scrollable; +  use std::borrow::Cow; -pub use iced_style::pick_list::{Appearance, StyleSheet}; +pub use crate::style::pick_list::{Appearance, StyleSheet};  /// A widget for selecting a single value from a list of options.  #[allow(missing_debug_implementations)] -pub struct PickList<'a, T, Message, Renderer> +pub struct PickList<'a, T, Message, Renderer = crate::Renderer>  where      [T]: ToOwned<Owned = Vec<T>>,      Renderer: text::Renderer, diff --git a/native/src/widget/progress_bar.rs b/widget/src/progress_bar.rs index dd46fa76..ef0d87d5 100644 --- a/native/src/widget/progress_bar.rs +++ b/widget/src/progress_bar.rs @@ -1,8 +1,10 @@  //! Provide progress feedback to your users. -use crate::layout; -use crate::renderer; -use crate::widget::Tree; -use crate::{Color, Element, Layout, Length, Point, Rectangle, Size, Widget}; +use crate::core::layout; +use crate::core::renderer; +use crate::core::widget::Tree; +use crate::core::{ +    Color, Element, Layout, Length, Point, Rectangle, Size, Widget, +};  use std::ops::RangeInclusive; @@ -11,8 +13,10 @@ pub use iced_style::progress_bar::{Appearance, StyleSheet};  /// A bar that displays progress.  ///  /// # Example -/// ``` -/// # type ProgressBar = iced_native::widget::ProgressBar<iced_native::renderer::Null>; +/// ```no_run +/// # type ProgressBar = +/// #     iced_widget::ProgressBar<iced_widget::renderer::Renderer<iced_widget::style::Theme>>; +/// #  /// let value = 50.0;  ///  /// ProgressBar::new(0.0..=100.0, value); @@ -20,9 +24,9 @@ pub use iced_style::progress_bar::{Appearance, StyleSheet};  ///  ///   #[allow(missing_debug_implementations)] -pub struct ProgressBar<Renderer> +pub struct ProgressBar<Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      range: RangeInclusive<f32>, @@ -34,7 +38,7 @@ where  impl<Renderer> ProgressBar<Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// The default height of a [`ProgressBar`]. @@ -79,7 +83,7 @@ where  impl<Message, Renderer> Widget<Message, Renderer> for ProgressBar<Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn width(&self) -> Length { @@ -157,7 +161,7 @@ impl<'a, Message, Renderer> From<ProgressBar<Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from( diff --git a/graphics/src/widget/qr_code.rs b/widget/src/qr_code.rs index 12ce5b1f..7709125f 100644 --- a/graphics/src/widget/qr_code.rs +++ b/widget/src/qr_code.rs @@ -1,13 +1,12 @@  //! Encode and display information in a QR code. -use crate::renderer::{self, Renderer}; -use crate::widget::canvas; -use crate::Backend; - -use iced_native::layout; -use iced_native::widget::Tree; -use iced_native::{ +use crate::canvas; +use crate::core::layout; +use crate::core::renderer::{self, Renderer as _}; +use crate::core::widget::Tree; +use crate::core::{      Color, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,  }; +use crate::Renderer;  use thiserror::Error;  const DEFAULT_CELL_SIZE: u16 = 4; @@ -48,10 +47,7 @@ impl<'a> QRCode<'a> {      }  } -impl<'a, Message, B, T> Widget<Message, Renderer<B, T>> for QRCode<'a> -where -    B: Backend, -{ +impl<'a, Message, Theme> Widget<Message, Renderer<Theme>> for QRCode<'a> {      fn width(&self) -> Length {          Length::Shrink      } @@ -62,7 +58,7 @@ where      fn layout(          &self, -        _renderer: &Renderer<B, T>, +        _renderer: &Renderer<Theme>,          _limits: &layout::Limits,      ) -> layout::Node {          let side_length = (self.state.width + 2 * QUIET_ZONE) as f32 @@ -74,63 +70,63 @@ where      fn draw(          &self,          _state: &Tree, -        renderer: &mut Renderer<B, T>, -        _theme: &T, +        renderer: &mut Renderer<Theme>, +        _theme: &Theme,          _style: &renderer::Style,          layout: Layout<'_>,          _cursor_position: Point,          _viewport: &Rectangle,      ) { -        use iced_native::Renderer as _; -          let bounds = layout.bounds();          let side_length = self.state.width + 2 * QUIET_ZONE;          // Reuse cache if possible -        let geometry = self.state.cache.draw(bounds.size(), |frame| { -            // Scale units to cell size -            frame.scale(f32::from(self.cell_size)); - -            // Draw background -            frame.fill_rectangle( -                Point::ORIGIN, -                Size::new(side_length as f32, side_length as f32), -                self.light, -            ); - -            // Avoid drawing on the quiet zone -            frame.translate(Vector::new(QUIET_ZONE as f32, QUIET_ZONE as f32)); - -            // Draw contents -            self.state -                .contents -                .iter() -                .enumerate() -                .filter(|(_, value)| **value == qrcode::Color::Dark) -                .for_each(|(index, _)| { -                    let row = index / self.state.width; -                    let column = index % self.state.width; - -                    frame.fill_rectangle( -                        Point::new(column as f32, row as f32), -                        Size::UNIT, -                        self.dark, -                    ); -                }); -        }); +        let geometry = +            self.state.cache.draw(renderer, bounds.size(), |frame| { +                // Scale units to cell size +                frame.scale(f32::from(self.cell_size)); + +                // Draw background +                frame.fill_rectangle( +                    Point::ORIGIN, +                    Size::new(side_length as f32, side_length as f32), +                    self.light, +                ); + +                // Avoid drawing on the quiet zone +                frame.translate(Vector::new( +                    QUIET_ZONE as f32, +                    QUIET_ZONE as f32, +                )); + +                // Draw contents +                self.state +                    .contents +                    .iter() +                    .enumerate() +                    .filter(|(_, value)| **value == qrcode::Color::Dark) +                    .for_each(|(index, _)| { +                        let row = index / self.state.width; +                        let column = index % self.state.width; + +                        frame.fill_rectangle( +                            Point::new(column as f32, row as f32), +                            Size::UNIT, +                            self.dark, +                        ); +                    }); +            });          let translation = Vector::new(bounds.x, bounds.y);          renderer.with_translation(translation, |renderer| { -            renderer.draw_primitive(geometry.into_primitive()); +            renderer.draw_primitive(geometry.0);          });      }  } -impl<'a, Message, B, T> From<QRCode<'a>> -    for Element<'a, Message, Renderer<B, T>> -where -    B: Backend, +impl<'a, Message, Theme> From<QRCode<'a>> +    for Element<'a, Message, Renderer<Theme>>  {      fn from(qr_code: QRCode<'a>) -> Self {          Self::new(qr_code) diff --git a/native/src/widget/radio.rs b/widget/src/radio.rs index 5f60eaef..c2b6b017 100644 --- a/native/src/widget/radio.rs +++ b/widget/src/radio.rs @@ -1,25 +1,26 @@  //! Create choices using radio buttons. -use crate::alignment; -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::text; -use crate::touch; -use crate::widget::{self, Row, Text, Tree}; -use crate::{ +use crate::core::alignment; +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::text; +use crate::core::touch; +use crate::core::widget::Tree; +use crate::core::{      Alignment, Clipboard, Color, Element, Layout, Length, Pixels, Point,      Rectangle, Shell, Widget,  }; +use crate::{Row, Text};  pub use iced_style::radio::{Appearance, StyleSheet};  /// A circular button representing a choice.  ///  /// # Example -/// ``` +/// ```no_run  /// # type Radio<Message> = -/// #     iced_native::widget::Radio<Message, iced_native::renderer::Null>; +/// #     iced_widget::Radio<Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// #[derive(Debug, Clone, Copy, PartialEq, Eq)]  /// pub enum Choice { @@ -41,7 +42,7 @@ pub use iced_style::radio::{Appearance, StyleSheet};  ///  ///   #[allow(missing_debug_implementations)] -pub struct Radio<Message, Renderer> +pub struct Radio<Message, Renderer = crate::Renderer>  where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -144,7 +145,7 @@ impl<Message, Renderer> Widget<Message, Renderer> for Radio<Message, Renderer>  where      Message: Clone,      Renderer: text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn width(&self) -> Length {          self.width @@ -269,14 +270,14 @@ where          {              let label_layout = children.next().unwrap(); -            widget::text::draw( +            crate::text::draw(                  renderer,                  style,                  label_layout,                  &self.label,                  self.text_size,                  self.font, -                widget::text::Appearance { +                crate::text::Appearance {                      color: custom_style.text_color,                  },                  alignment::Horizontal::Left, @@ -291,7 +292,7 @@ impl<'a, Message, Renderer> From<Radio<Message, Renderer>>  where      Message: 'a + Clone,      Renderer: 'a + text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn from(radio: Radio<Message, Renderer>) -> Element<'a, Message, Renderer> {          Element::new(radio) diff --git a/native/src/widget/row.rs b/widget/src/row.rs index 286c1c2d..3ce363f8 100644 --- a/native/src/widget/row.rs +++ b/widget/src/row.rs @@ -1,18 +1,18 @@  //! Distribute content horizontally. -use crate::event::{self, Event}; -use crate::layout::{self, Layout}; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::widget::{Operation, Tree}; -use crate::{ +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::widget::{Operation, Tree}; +use crate::core::{      Alignment, Clipboard, Element, Length, Padding, Pixels, Point, Rectangle,      Shell, Widget,  };  /// A container that distributes its contents horizontally.  #[allow(missing_debug_implementations)] -pub struct Row<'a, Message, Renderer> { +pub struct Row<'a, Message, Renderer = crate::Renderer> {      spacing: f32,      padding: Padding,      width: Length, @@ -94,7 +94,7 @@ impl<'a, Message, Renderer> Default for Row<'a, Message, Renderer> {  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Row<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,  {      fn children(&self) -> Vec<Tree> {          self.children.iter().map(Tree::new).collect() @@ -245,7 +245,7 @@ impl<'a, Message, Renderer> From<Row<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: crate::Renderer + 'a, +    Renderer: crate::core::Renderer + 'a,  {      fn from(row: Row<'a, Message, Renderer>) -> Self {          Self::new(row) diff --git a/native/src/widget/rule.rs b/widget/src/rule.rs index 1ab6a0d3..3749d7ce 100644 --- a/native/src/widget/rule.rs +++ b/widget/src/rule.rs @@ -1,18 +1,18 @@  //! Display a horizontal or vertical rule for dividing content. -use crate::layout; -use crate::renderer; -use crate::widget::Tree; -use crate::{ +use crate::core::layout; +use crate::core::renderer; +use crate::core::widget::Tree; +use crate::core::{      Color, Element, Layout, Length, Pixels, Point, Rectangle, Size, Widget,  }; -pub use iced_style::rule::{Appearance, FillMode, StyleSheet}; +pub use crate::style::rule::{Appearance, FillMode, StyleSheet};  /// Display a horizontal or vertical rule for dividing content.  #[allow(missing_debug_implementations)] -pub struct Rule<Renderer> +pub struct Rule<Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      width: Length, @@ -23,7 +23,7 @@ where  impl<Renderer> Rule<Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// Creates a horizontal [`Rule`] with the given height. @@ -58,7 +58,7 @@ where  impl<Message, Renderer> Widget<Message, Renderer> for Rule<Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn width(&self) -> Length { @@ -138,7 +138,7 @@ impl<'a, Message, Renderer> From<Rule<Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from(rule: Rule<Renderer>) -> Element<'a, Message, Renderer> { diff --git a/native/src/widget/scrollable.rs b/widget/src/scrollable.rs index c1df8c39..5a7481f7 100644 --- a/native/src/widget/scrollable.rs +++ b/widget/src/scrollable.rs @@ -1,35 +1,29 @@  //! Navigate an endless amount of content with a scrollbar. -use crate::event::{self, Event}; -use crate::keyboard; -use crate::layout; -use crate::mouse; -use crate::overlay; -use crate::renderer; -use crate::touch; -use crate::widget; -use crate::widget::operation::{self, Operation}; -use crate::widget::tree::{self, Tree}; -use crate::{ -    Background, Clipboard, Color, Command, Element, Layout, Length, Pixels, -    Point, Rectangle, Shell, Size, Vector, Widget, +use crate::core::event::{self, Event}; +use crate::core::keyboard; +use crate::core::layout; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::touch; +use crate::core::widget; +use crate::core::widget::operation::{self, Operation}; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{ +    Background, Clipboard, Color, Element, Layout, Length, Pixels, Point, +    Rectangle, Shell, Size, Vector, Widget,  }; +use crate::runtime::Command; -pub use iced_style::scrollable::StyleSheet; +pub use crate::style::scrollable::{Scrollbar, Scroller, StyleSheet};  pub use operation::scrollable::RelativeOffset; -pub mod style { -    //! The styles of a [`Scrollable`]. -    //! -    //! [`Scrollable`]: crate::widget::Scrollable -    pub use iced_style::scrollable::{Scrollbar, Scroller}; -} -  /// A widget that can vertically display an infinite amount of content with a  /// scrollbar.  #[allow(missing_debug_implementations)] -pub struct Scrollable<'a, Message, Renderer> +pub struct Scrollable<'a, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      id: Option<Id>, @@ -43,7 +37,7 @@ where  impl<'a, Message, Renderer> Scrollable<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// Creates a new [`Scrollable`]. @@ -153,7 +147,7 @@ impl Properties {  impl<'a, Message, Renderer> Widget<Message, Renderer>      for Scrollable<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag { @@ -345,7 +339,7 @@ impl<'a, Message, Renderer> From<Scrollable<'a, Message, Renderer>>      for Element<'a, Message, Renderer>  where      Message: 'a, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from( @@ -763,7 +757,7 @@ pub fn draw<Renderer>(      style: &<Renderer::Theme as StyleSheet>::Style,      draw_content: impl FnOnce(&mut Renderer, Layout<'_>, Point, &Rectangle),  ) where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      let bounds = layout.bounds(); @@ -809,8 +803,8 @@ pub fn draw<Renderer>(          let draw_scrollbar =              |renderer: &mut Renderer, -             style: style::Scrollbar, -             scrollbar: &Scrollbar| { +             style: Scrollbar, +             scrollbar: &internals::Scrollbar| {                  //track                  if style.background.is_some()                      || (style.border_color != Color::TRANSPARENT @@ -1068,8 +1062,8 @@ impl State {  #[derive(Debug)]  /// State of both [`Scrollbar`]s.  struct Scrollbars { -    y: Option<Scrollbar>, -    x: Option<Scrollbar>, +    y: Option<internals::Scrollbar>, +    x: Option<internals::Scrollbar>,  }  impl Scrollbars { @@ -1139,10 +1133,10 @@ impl Scrollbars {                  height: scroller_height,              }; -            Some(Scrollbar { +            Some(internals::Scrollbar {                  total_bounds: total_scrollbar_bounds,                  bounds: scrollbar_bounds, -                scroller: Scroller { +                scroller: internals::Scroller {                      bounds: scroller_bounds,                  },              }) @@ -1199,10 +1193,10 @@ impl Scrollbars {                  height: scroller_width,              }; -            Some(Scrollbar { +            Some(internals::Scrollbar {                  total_bounds: total_scrollbar_bounds,                  bounds: scrollbar_bounds, -                scroller: Scroller { +                scroller: internals::Scroller {                      bounds: scroller_bounds,                  },              }) @@ -1264,64 +1258,68 @@ impl Scrollbars {      }  } -/// The scrollbar of a [`Scrollable`]. -#[derive(Debug, Copy, Clone)] -struct Scrollbar { -    /// The total bounds of the [`Scrollbar`], including the scrollbar, the scroller, -    /// and the scrollbar margin. -    total_bounds: Rectangle, +pub(super) mod internals { +    use crate::core::{Point, Rectangle}; -    /// The bounds of just the [`Scrollbar`]. -    bounds: Rectangle, +    /// The scrollbar of a [`Scrollable`]. +    #[derive(Debug, Copy, Clone)] +    pub struct Scrollbar { +        /// The total bounds of the [`Scrollbar`], including the scrollbar, the scroller, +        /// and the scrollbar margin. +        pub total_bounds: Rectangle, -    /// The state of this scrollbar's [`Scroller`]. -    scroller: Scroller, -} +        /// The bounds of just the [`Scrollbar`]. +        pub bounds: Rectangle, -impl Scrollbar { -    /// Returns whether the mouse is over the scrollbar or not. -    fn is_mouse_over(&self, cursor_position: Point) -> bool { -        self.total_bounds.contains(cursor_position) +        /// The state of this scrollbar's [`Scroller`]. +        pub scroller: Scroller,      } -    /// Returns the y-axis scrolled percentage from the cursor position. -    fn scroll_percentage_y( -        &self, -        grabbed_at: f32, -        cursor_position: Point, -    ) -> f32 { -        if cursor_position.x < 0.0 && cursor_position.y < 0.0 { -            // cursor position is unavailable! Set to either end or beginning of scrollbar depending -            // on where the thumb currently is in the track -            (self.scroller.bounds.y / self.total_bounds.height).round() -        } else { -            (cursor_position.y -                - self.bounds.y -                - self.scroller.bounds.height * grabbed_at) -                / (self.bounds.height - self.scroller.bounds.height) +    impl Scrollbar { +        /// Returns whether the mouse is over the scrollbar or not. +        pub fn is_mouse_over(&self, cursor_position: Point) -> bool { +            self.total_bounds.contains(cursor_position)          } -    } -    /// Returns the x-axis scrolled percentage from the cursor position. -    fn scroll_percentage_x( -        &self, -        grabbed_at: f32, -        cursor_position: Point, -    ) -> f32 { -        if cursor_position.x < 0.0 && cursor_position.y < 0.0 { -            (self.scroller.bounds.x / self.total_bounds.width).round() -        } else { -            (cursor_position.x -                - self.bounds.x -                - self.scroller.bounds.width * grabbed_at) -                / (self.bounds.width - self.scroller.bounds.width) +        /// Returns the y-axis scrolled percentage from the cursor position. +        pub fn scroll_percentage_y( +            &self, +            grabbed_at: f32, +            cursor_position: Point, +        ) -> f32 { +            if cursor_position.x < 0.0 && cursor_position.y < 0.0 { +                // cursor position is unavailable! Set to either end or beginning of scrollbar depending +                // on where the thumb currently is in the track +                (self.scroller.bounds.y / self.total_bounds.height).round() +            } else { +                (cursor_position.y +                    - self.bounds.y +                    - self.scroller.bounds.height * grabbed_at) +                    / (self.bounds.height - self.scroller.bounds.height) +            } +        } + +        /// Returns the x-axis scrolled percentage from the cursor position. +        pub fn scroll_percentage_x( +            &self, +            grabbed_at: f32, +            cursor_position: Point, +        ) -> f32 { +            if cursor_position.x < 0.0 && cursor_position.y < 0.0 { +                (self.scroller.bounds.x / self.total_bounds.width).round() +            } else { +                (cursor_position.x +                    - self.bounds.x +                    - self.scroller.bounds.width * grabbed_at) +                    / (self.bounds.width - self.scroller.bounds.width) +            }          }      } -} -/// The handle of a [`Scrollbar`]. -#[derive(Debug, Clone, Copy)] -struct Scroller { -    /// The bounds of the [`Scroller`]. -    bounds: Rectangle, +    /// The handle of a [`Scrollbar`]. +    #[derive(Debug, Clone, Copy)] +    pub struct Scroller { +        /// The bounds of the [`Scroller`]. +        pub bounds: Rectangle, +    }  } diff --git a/native/src/widget/slider.rs b/widget/src/slider.rs index d3715b1c..e1153d2d 100644 --- a/native/src/widget/slider.rs +++ b/widget/src/slider.rs @@ -1,13 +1,13 @@  //! Display an interactive selector of a single value from a range of values.  //!  //! A [`Slider`] has some local [`State`]. -use crate::event::{self, Event}; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::touch; -use crate::widget::tree::{self, Tree}; -use crate::{ +use crate::core::event::{self, Event}; +use crate::core::layout; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::touch; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{      Background, Clipboard, Color, Element, Layout, Length, Pixels, Point,      Rectangle, Shell, Size, Widget,  }; @@ -25,11 +25,9 @@ pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet};  /// to 1 unit.  ///  /// # Example -/// ``` -/// # use iced_native::widget::slider; -/// # use iced_native::renderer::Null; -/// # -/// # type Slider<'a, T, Message> = slider::Slider<'a, T, Message, Null>; +/// ```no_run +/// # type Slider<'a, T, Message> = +/// #     iced_widget::Slider<'a, Message, T, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// #[derive(Clone)]  /// pub enum Message { @@ -43,9 +41,9 @@ pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet};  ///  ///   #[allow(missing_debug_implementations)] -pub struct Slider<'a, T, Message, Renderer> +pub struct Slider<'a, T, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      range: RangeInclusive<T>, @@ -62,7 +60,7 @@ impl<'a, T, Message, Renderer> Slider<'a, T, Message, Renderer>  where      T: Copy + From<u8> + std::cmp::PartialOrd,      Message: Clone, -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      /// The default height of a [`Slider`]. @@ -148,7 +146,7 @@ impl<'a, T, Message, Renderer> Widget<Message, Renderer>  where      T: Copy + Into<f64> + num_traits::FromPrimitive,      Message: Clone, -    Renderer: crate::Renderer, +    Renderer: crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag { @@ -245,7 +243,7 @@ impl<'a, T, Message, Renderer> From<Slider<'a, T, Message, Renderer>>  where      T: 'a + Copy + Into<f64> + num_traits::FromPrimitive,      Message: 'a + Clone, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + crate::core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from( @@ -354,7 +352,7 @@ pub fn draw<T, R>(      style: &<R::Theme as StyleSheet>::Style,  ) where      T: Into<f64> + Copy, -    R: crate::Renderer, +    R: crate::core::Renderer,      R::Theme: StyleSheet,  {      let bounds = layout.bounds(); diff --git a/native/src/widget/space.rs b/widget/src/space.rs index a6fc977e..e1e09d5a 100644 --- a/native/src/widget/space.rs +++ b/widget/src/space.rs @@ -1,8 +1,9 @@  //! Distribute content vertically. -use crate::layout; -use crate::renderer; -use crate::widget::Tree; -use crate::{Element, Layout, Length, Point, Rectangle, Size, Widget}; +use crate::core; +use crate::core::layout; +use crate::core::renderer; +use crate::core::widget::Tree; +use crate::core::{Element, Layout, Length, Point, Rectangle, Size, Widget};  /// An amount of empty space.  /// @@ -41,7 +42,7 @@ impl Space {  impl<Message, Renderer> Widget<Message, Renderer> for Space  where -    Renderer: crate::Renderer, +    Renderer: core::Renderer,  {      fn width(&self) -> Length {          self.width @@ -76,7 +77,7 @@ where  impl<'a, Message, Renderer> From<Space> for Element<'a, Message, Renderer>  where -    Renderer: crate::Renderer, +    Renderer: core::Renderer,      Message: 'a,  {      fn from(space: Space) -> Element<'a, Message, Renderer> { diff --git a/native/src/widget/svg.rs b/widget/src/svg.rs index f5ed0a6c..89017fcf 100644 --- a/native/src/widget/svg.rs +++ b/widget/src/svg.rs @@ -1,15 +1,15 @@  //! Display vector graphics in your application. -use crate::layout; -use crate::renderer; -use crate::svg; -use crate::widget::Tree; -use crate::{ +use crate::core::layout; +use crate::core::renderer; +use crate::core::svg; +use crate::core::widget::Tree; +use crate::core::{      ContentFit, Element, Layout, Length, Point, Rectangle, Size, Vector, Widget,  };  use std::path::PathBuf; -pub use iced_style::svg::{Appearance, StyleSheet}; +pub use crate::style::svg::{Appearance, StyleSheet};  pub use svg::Handle;  /// A vector graphics image. @@ -19,7 +19,7 @@ pub use svg::Handle;  /// [`Svg`] images can have a considerable rendering cost when resized,  /// specially when they are complex.  #[allow(missing_debug_implementations)] -pub struct Svg<Renderer> +pub struct Svg<Renderer = crate::Renderer>  where      Renderer: svg::Renderer,      Renderer::Theme: StyleSheet, diff --git a/widget/src/text.rs b/widget/src/text.rs new file mode 100644 index 00000000..04c31edc --- /dev/null +++ b/widget/src/text.rs @@ -0,0 +1,4 @@ +pub use crate::core::widget::text::*; + +pub type Text<'a, Renderer = crate::Renderer> = +    crate::core::widget::Text<'a, Renderer>; diff --git a/native/src/widget/text_input.rs b/widget/src/text_input.rs index 65a9bd3b..d066109a 100644 --- a/native/src/widget/text_input.rs +++ b/widget/src/text_input.rs @@ -11,31 +11,34 @@ pub use value::Value;  use editor::Editor; -use crate::alignment; -use crate::event::{self, Event}; -use crate::keyboard; -use crate::layout; -use crate::mouse::{self, click}; -use crate::renderer; -use crate::text::{self, Text}; -use crate::time::{Duration, Instant}; -use crate::touch; -use crate::widget; -use crate::widget::operation::{self, Operation}; -use crate::widget::tree::{self, Tree}; -use crate::window; -use crate::{ -    Clipboard, Color, Command, Element, Layout, Length, Padding, Pixels, Point, +use crate::core::alignment; +use crate::core::event::{self, Event}; +use crate::core::keyboard; +use crate::core::layout; +use crate::core::mouse::{self, click}; +use crate::core::renderer; +use crate::core::text::{self, Text}; +use crate::core::time::{Duration, Instant}; +use crate::core::touch; +use crate::core::widget; +use crate::core::widget::operation::{self, Operation}; +use crate::core::widget::tree::{self, Tree}; +use crate::core::window; +use crate::core::{ +    Clipboard, Color, Element, Layout, Length, Padding, Pixels, Point,      Rectangle, Shell, Size, Vector, Widget,  }; +use crate::runtime::Command;  pub use iced_style::text_input::{Appearance, StyleSheet};  /// A field that can be filled with text.  ///  /// # Example -/// ``` -/// # pub type TextInput<'a, Message> = iced_native::widget::TextInput<'a, Message, iced_native::renderer::Null>; +/// ```no_run +/// # pub type TextInput<'a, Message> = +/// #     iced_widget::TextInput<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>; +/// #  /// #[derive(Debug, Clone)]  /// enum Message {  ///     TextInputChanged(String), @@ -52,7 +55,7 @@ pub use iced_style::text_input::{Appearance, StyleSheet};  /// ```  ///   #[allow(missing_debug_implementations)] -pub struct TextInput<'a, Message, Renderer> +pub struct TextInput<'a, Message, Renderer = crate::Renderer>  where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -1109,7 +1112,7 @@ impl operation::TextInput for State {  }  mod platform { -    use crate::keyboard; +    use crate::core::keyboard;      pub fn is_jump_modifier_pressed(modifiers: keyboard::Modifiers) -> bool {          if cfg!(target_os = "macos") { diff --git a/native/src/widget/text_input/cursor.rs b/widget/src/text_input/cursor.rs index 4f3b159b..9680dfd7 100644 --- a/native/src/widget/text_input/cursor.rs +++ b/widget/src/text_input/cursor.rs @@ -1,5 +1,5 @@  //! Track the cursor of a text input. -use crate::widget::text_input::Value; +use crate::text_input::Value;  /// The cursor of a text input.  #[derive(Debug, Copy, Clone)] diff --git a/native/src/widget/text_input/editor.rs b/widget/src/text_input/editor.rs index d53fa8d9..f1fd641f 100644 --- a/native/src/widget/text_input/editor.rs +++ b/widget/src/text_input/editor.rs @@ -1,4 +1,4 @@ -use crate::widget::text_input::{Cursor, Value}; +use crate::text_input::{Cursor, Value};  pub struct Editor<'a> {      value: &'a mut Value, diff --git a/native/src/widget/text_input/value.rs b/widget/src/text_input/value.rs index cf4da562..cf4da562 100644 --- a/native/src/widget/text_input/value.rs +++ b/widget/src/text_input/value.rs diff --git a/native/src/widget/toggler.rs b/widget/src/toggler.rs index d9c80ebe..713a9c30 100644 --- a/native/src/widget/toggler.rs +++ b/widget/src/toggler.rs @@ -1,24 +1,26 @@  //! Show toggle controls using togglers. -use crate::alignment; -use crate::event; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::text; -use crate::widget::{self, Row, Text, Tree}; -use crate::{ +use crate::core::alignment; +use crate::core::event; +use crate::core::layout; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::text; +use crate::core::widget::Tree; +use crate::core::{      Alignment, Clipboard, Element, Event, Layout, Length, Pixels, Point,      Rectangle, Shell, Widget,  }; +use crate::{Row, Text}; -pub use iced_style::toggler::{Appearance, StyleSheet}; +pub use crate::style::toggler::{Appearance, StyleSheet};  /// A toggler widget.  ///  /// # Example  /// -/// ``` -/// # type Toggler<'a, Message> = iced_native::widget::Toggler<'a, Message, iced_native::renderer::Null>; +/// ```no_run +/// # type Toggler<'a, Message> = +/// #     iced_widget::Toggler<'a, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// pub enum Message {  ///     TogglerToggled(bool), @@ -29,7 +31,7 @@ pub use iced_style::toggler::{Appearance, StyleSheet};  /// Toggler::new(String::from("Toggle me!"), is_toggled, |b| Message::TogglerToggled(b));  /// ```  #[allow(missing_debug_implementations)] -pub struct Toggler<'a, Message, Renderer> +pub struct Toggler<'a, Message, Renderer = crate::Renderer>  where      Renderer: text::Renderer,      Renderer::Theme: StyleSheet, @@ -136,7 +138,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Toggler<'a, Message, Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn width(&self) -> Length {          self.width @@ -237,7 +239,7 @@ where          if let Some(label) = &self.label {              let label_layout = children.next().unwrap(); -            crate::widget::text::draw( +            crate::text::draw(                  renderer,                  style,                  label_layout, @@ -314,7 +316,7 @@ impl<'a, Message, Renderer> From<Toggler<'a, Message, Renderer>>  where      Message: 'a,      Renderer: 'a + text::Renderer, -    Renderer::Theme: StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: StyleSheet + crate::text::StyleSheet,  {      fn from(          toggler: Toggler<'a, Message, Renderer>, diff --git a/native/src/widget/tooltip.rs b/widget/src/tooltip.rs index 2a24c055..084650d1 100644 --- a/native/src/widget/tooltip.rs +++ b/widget/src/tooltip.rs @@ -1,26 +1,27 @@  //! Display a widget over another. -use crate::event; -use crate::layout; -use crate::mouse; -use crate::renderer; -use crate::text; -use crate::widget; -use crate::widget::container; -use crate::widget::overlay; -use crate::widget::{Text, Tree}; -use crate::{ -    Clipboard, Element, Event, Layout, Length, Padding, Pixels, Point, -    Rectangle, Shell, Size, Vector, Widget, +use crate::container; +use crate::core; +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::overlay; +use crate::core::renderer; +use crate::core::text; +use crate::core::widget::Tree; +use crate::core::{ +    Clipboard, Element, Length, Padding, Pixels, Point, Rectangle, Shell, Size, +    Vector, Widget,  }; +use crate::Text;  use std::borrow::Cow;  /// An element to display a widget over another.  #[allow(missing_debug_implementations)] -pub struct Tooltip<'a, Message, Renderer: text::Renderer> +pub struct Tooltip<'a, Message, Renderer = crate::Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: container::StyleSheet + crate::text::StyleSheet,  {      content: Element<'a, Message, Renderer>,      tooltip: Text<'a, Renderer>, @@ -34,7 +35,7 @@ where  impl<'a, Message, Renderer> Tooltip<'a, Message, Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: container::StyleSheet + crate::text::StyleSheet,  {      /// The default padding of a [`Tooltip`] drawn by this renderer.      const DEFAULT_PADDING: f32 = 5.0; @@ -104,7 +105,7 @@ impl<'a, Message, Renderer> Widget<Message, Renderer>      for Tooltip<'a, Message, Renderer>  where      Renderer: text::Renderer, -    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: container::StyleSheet + crate::text::StyleSheet,  {      fn children(&self) -> Vec<Tree> {          vec![Tree::new(&self.content)] @@ -239,7 +240,7 @@ impl<'a, Message, Renderer> From<Tooltip<'a, Message, Renderer>>  where      Message: 'a,      Renderer: 'a + text::Renderer, -    Renderer::Theme: container::StyleSheet + widget::text::StyleSheet, +    Renderer::Theme: container::StyleSheet + crate::text::StyleSheet,  {      fn from(          tooltip: Tooltip<'a, Message, Renderer>, @@ -285,7 +286,7 @@ pub fn draw<Renderer>(          &Rectangle,      ),  ) where -    Renderer: crate::Renderer, +    Renderer: core::Renderer,      Renderer::Theme: container::StyleSheet,  {      use container::StyleSheet; diff --git a/native/src/widget/vertical_slider.rs b/widget/src/vertical_slider.rs index f1687e38..62dc997f 100644 --- a/native/src/widget/vertical_slider.rs +++ b/widget/src/vertical_slider.rs @@ -3,13 +3,18 @@  //! A [`VerticalSlider`] has some local [`State`].  use std::ops::RangeInclusive; -pub use iced_style::slider::{Appearance, Handle, HandleShape, StyleSheet}; - -use crate::event::{self, Event}; -use crate::widget::tree::{self, Tree}; -use crate::{ -    layout, mouse, renderer, touch, Background, Clipboard, Color, Element, -    Layout, Length, Pixels, Point, Rectangle, Shell, Size, Widget, +pub use crate::style::slider::{Appearance, Handle, HandleShape, StyleSheet}; + +use crate::core; +use crate::core::event::{self, Event}; +use crate::core::layout::{self, Layout}; +use crate::core::mouse; +use crate::core::renderer; +use crate::core::touch; +use crate::core::widget::tree::{self, Tree}; +use crate::core::{ +    Background, Clipboard, Color, Element, Length, Pixels, Point, Rectangle, +    Shell, Size, Widget,  };  /// An vertical bar and a handle that selects a single value from a range of @@ -21,11 +26,9 @@ use crate::{  /// to 1 unit.  ///  /// # Example -/// ``` -/// # use iced_native::widget::vertical_slider; -/// # use iced_native::renderer::Null; -/// # -/// # type VerticalSlider<'a, T, Message> = vertical_slider::VerticalSlider<'a, T, Message, Null>; +/// ```no_run +/// # type VerticalSlider<'a, T, Message> = +/// #     iced_widget::VerticalSlider<'a, T, Message, iced_widget::renderer::Renderer<iced_widget::style::Theme>>;  /// #  /// #[derive(Clone)]  /// pub enum Message { @@ -37,9 +40,9 @@ use crate::{  /// VerticalSlider::new(0.0..=100.0, value, Message::SliderChanged);  /// ```  #[allow(missing_debug_implementations)] -pub struct VerticalSlider<'a, T, Message, Renderer> +pub struct VerticalSlider<'a, T, Message, Renderer = crate::Renderer>  where -    Renderer: crate::Renderer, +    Renderer: core::Renderer,      Renderer::Theme: StyleSheet,  {      range: RangeInclusive<T>, @@ -56,7 +59,7 @@ impl<'a, T, Message, Renderer> VerticalSlider<'a, T, Message, Renderer>  where      T: Copy + From<u8> + std::cmp::PartialOrd,      Message: Clone, -    Renderer: crate::Renderer, +    Renderer: core::Renderer,      Renderer::Theme: StyleSheet,  {      /// The default width of a [`VerticalSlider`]. @@ -142,7 +145,7 @@ impl<'a, T, Message, Renderer> Widget<Message, Renderer>  where      T: Copy + Into<f64> + num_traits::FromPrimitive,      Message: Clone, -    Renderer: crate::Renderer, +    Renderer: core::Renderer,      Renderer::Theme: StyleSheet,  {      fn tag(&self) -> tree::Tag { @@ -239,7 +242,7 @@ impl<'a, T, Message, Renderer> From<VerticalSlider<'a, T, Message, Renderer>>  where      T: 'a + Copy + Into<f64> + num_traits::FromPrimitive,      Message: 'a + Clone, -    Renderer: 'a + crate::Renderer, +    Renderer: 'a + core::Renderer,      Renderer::Theme: StyleSheet,  {      fn from( @@ -349,7 +352,7 @@ pub fn draw<T, R>(      style: &<R::Theme as StyleSheet>::Style,  ) where      T: Into<f64> + Copy, -    R: crate::Renderer, +    R: core::Renderer,      R::Theme: StyleSheet,  {      let bounds = layout.bounds(); | 
