diff options
Diffstat (limited to '')
| -rw-r--r-- | native/src/widget/button.rs | 53 | ||||
| -rw-r--r-- | native/src/widget/column.rs | 59 | ||||
| -rw-r--r-- | native/src/widget/container.rs | 53 | ||||
| -rw-r--r-- | native/src/widget/pane_grid.rs | 53 | ||||
| -rw-r--r-- | native/src/widget/row.rs | 59 | 
5 files changed, 226 insertions, 51 deletions
| diff --git a/native/src/widget/button.rs b/native/src/widget/button.rs index b4276317..d1537b10 100644 --- a/native/src/widget/button.rs +++ b/native/src/widget/button.rs @@ -8,7 +8,7 @@ use crate::overlay;  use crate::renderer;  use crate::touch;  use crate::widget::tree::{self, Tree}; -use crate::widget::Operation; +use crate::widget::{self, Operation};  use crate::{      Background, Clipboard, Color, Element, Layout, Length, Padding, Point,      Rectangle, Shell, Vector, Widget, @@ -56,6 +56,7 @@ where      Renderer: crate::Renderer,      Renderer::Theme: StyleSheet,  { +    id: Option<Id>,      content: Element<'a, Message, Renderer>,      on_press: Option<Message>,      width: Length, @@ -72,6 +73,7 @@ where      /// Creates a new [`Button`] with the given content.      pub fn new(content: impl Into<Element<'a, Message, Renderer>>) -> Self {          Button { +            id: None,              content: content.into(),              on_press: None,              width: Length::Shrink, @@ -81,6 +83,12 @@ where          }      } +    /// Sets the [`Id`] of the [`Button`]. +    pub fn id(mut self, id: Id) -> Self { +        self.id = Some(id); +        self +    } +      /// Sets the width of the [`Button`].      pub fn width(mut self, width: Length) -> Self {          self.width = width; @@ -172,14 +180,17 @@ where          renderer: &Renderer,          operation: &mut dyn Operation<Message>,      ) { -        operation.container(None, &mut |operation| { -            self.content.as_widget().operate( -                &mut tree.children[0], -                layout.children().next().unwrap(), -                renderer, -                operation, -            ); -        }); +        operation.container( +            self.id.as_ref().map(|id| &id.0), +            &mut |operation| { +                self.content.as_widget().operate( +                    &mut tree.children[0], +                    layout.children().next().unwrap(), +                    renderer, +                    operation, +                ); +            }, +        );      }      fn on_event( @@ -453,3 +464,27 @@ pub fn mouse_interaction(          mouse::Interaction::default()      }  } + +/// The identifier of a [`Button`]. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Id(widget::Id); + +impl Id { +    /// Creates a custom [`Id`]. +    pub fn new(id: impl Into<std::borrow::Cow<'static, str>>) -> Self { +        Self(widget::Id::new(id)) +    } + +    /// Creates a unique [`Id`]. +    /// +    /// This function produces a different [`Id`] every time it is called. +    pub fn unique() -> Self { +        Self(widget::Id::unique()) +    } +} + +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} diff --git a/native/src/widget/column.rs b/native/src/widget/column.rs index 5ad4d858..5cecd2b8 100644 --- a/native/src/widget/column.rs +++ b/native/src/widget/column.rs @@ -4,7 +4,7 @@ use crate::layout;  use crate::mouse;  use crate::overlay;  use crate::renderer; -use crate::widget::{Operation, Tree}; +use crate::widget::{self, Operation, Tree};  use crate::{      Alignment, Clipboard, Element, Layout, Length, Padding, Point, Rectangle,      Shell, Widget, @@ -13,6 +13,7 @@ use crate::{  /// A container that distributes its contents vertically.  #[allow(missing_debug_implementations)]  pub struct Column<'a, Message, Renderer> { +    id: Option<Id>,      spacing: u16,      padding: Padding,      width: Length, @@ -33,6 +34,7 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {          children: Vec<Element<'a, Message, Renderer>>,      ) -> Self {          Column { +            id: None,              spacing: 0,              padding: Padding::ZERO,              width: Length::Shrink, @@ -43,6 +45,12 @@ impl<'a, Message, Renderer> Column<'a, Message, Renderer> {          }      } +    /// Sets the [`Id`] of the [`Column`]. +    pub fn id(mut self, id: Id) -> Self { +        self.id = Some(id); +        self +    } +      /// Sets the vertical spacing _between_ elements.      ///      /// Custom margins per element do not exist in iced. You should use this @@ -148,17 +156,20 @@ where          renderer: &Renderer,          operation: &mut dyn Operation<Message>,      ) { -        operation.container(None, &mut |operation| { -            self.children -                .iter() -                .zip(&mut tree.children) -                .zip(layout.children()) -                .for_each(|((child, state), layout)| { -                    child -                        .as_widget() -                        .operate(state, layout, renderer, operation); -                }) -        }); +        operation.container( +            self.id.as_ref().map(|id| &id.0), +            &mut |operation| { +                self.children +                    .iter() +                    .zip(&mut tree.children) +                    .zip(layout.children()) +                    .for_each(|((child, state), layout)| { +                        child +                            .as_widget() +                            .operate(state, layout, renderer, operation); +                    }) +            }, +        );      }      fn on_event( @@ -262,3 +273,27 @@ where          Self::new(column)      }  } + +/// The identifier of a [`Column`]. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Id(widget::Id); + +impl Id { +    /// Creates a custom [`Id`]. +    pub fn new(id: impl Into<std::borrow::Cow<'static, str>>) -> Self { +        Self(widget::Id::new(id)) +    } + +    /// Creates a unique [`Id`]. +    /// +    /// This function produces a different [`Id`] every time it is called. +    pub fn unique() -> Self { +        Self(widget::Id::unique()) +    } +} + +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs index cdf1c859..c82b8be2 100644 --- a/native/src/widget/container.rs +++ b/native/src/widget/container.rs @@ -5,7 +5,7 @@ use crate::layout;  use crate::mouse;  use crate::overlay;  use crate::renderer; -use crate::widget::{Operation, Tree}; +use crate::widget::{self, Operation, Tree};  use crate::{      Background, Clipboard, Color, Element, Layout, Length, Padding, Point,      Rectangle, Shell, Widget, @@ -24,6 +24,7 @@ where      Renderer: crate::Renderer,      Renderer::Theme: StyleSheet,  { +    id: Option<Id>,      padding: Padding,      width: Length,      height: Length, @@ -46,6 +47,7 @@ where          T: Into<Element<'a, Message, Renderer>>,      {          Container { +            id: None,              padding: Padding::ZERO,              width: Length::Shrink,              height: Length::Shrink, @@ -58,6 +60,12 @@ where          }      } +    /// Sets the [`Id`] of the [`Container`]. +    pub fn id(mut self, id: Id) -> Self { +        self.id = Some(id); +        self +    } +      /// Sets the [`Padding`] of the [`Container`].      pub fn padding<P: Into<Padding>>(mut self, padding: P) -> Self {          self.padding = padding.into(); @@ -172,14 +180,17 @@ where          renderer: &Renderer,          operation: &mut dyn Operation<Message>,      ) { -        operation.container(None, &mut |operation| { -            self.content.as_widget().operate( -                &mut tree.children[0], -                layout.children().next().unwrap(), -                renderer, -                operation, -            ); -        }); +        operation.container( +            self.id.as_ref().map(|id| &id.0), +            &mut |operation| { +                self.content.as_widget().operate( +                    &mut tree.children[0], +                    layout.children().next().unwrap(), +                    renderer, +                    operation, +                ); +            }, +        );      }      fn on_event( @@ -333,3 +344,27 @@ pub fn draw_background<Renderer>(          );      }  } + +/// The identifier of a [`Container`]. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Id(widget::Id); + +impl Id { +    /// Creates a custom [`Id`]. +    pub fn new(id: impl Into<std::borrow::Cow<'static, str>>) -> Self { +        Self(widget::Id::new(id)) +    } + +    /// Creates a unique [`Id`]. +    /// +    /// This function produces a different [`Id`] every time it is called. +    pub fn unique() -> Self { +        Self(widget::Id::unique()) +    } +} + +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs index eb04c0ba..6a65754e 100644 --- a/native/src/widget/pane_grid.rs +++ b/native/src/widget/pane_grid.rs @@ -101,6 +101,7 @@ where      Renderer: crate::Renderer,      Renderer::Theme: StyleSheet + container::StyleSheet,  { +    id: Option<Id>,      contents: Contents<'a, Content<'a, Message, Renderer>>,      width: Length,      height: Length, @@ -147,6 +148,7 @@ where          };          Self { +            id: None,              contents,              width: Length::Fill,              height: Length::Fill, @@ -158,6 +160,12 @@ where          }      } +    /// Sets the [`Id`] of the [`PaneGrid`]. +    pub fn id(mut self, id: Id) -> Self { +        self.id = Some(id); +        self +    } +      /// Sets the width of the [`PaneGrid`].      pub fn width(mut self, width: Length) -> Self {          self.width = width; @@ -297,15 +305,18 @@ where          renderer: &Renderer,          operation: &mut dyn widget::Operation<Message>,      ) { -        operation.container(None, &mut |operation| { -            self.contents -                .iter() -                .zip(&mut tree.children) -                .zip(layout.children()) -                .for_each(|(((_pane, content), state), layout)| { -                    content.operate(state, layout, renderer, operation); -                }) -        }); +        operation.container( +            self.id.as_ref().map(|id| &id.0), +            &mut |operation| { +                self.contents +                    .iter() +                    .zip(&mut tree.children) +                    .zip(layout.children()) +                    .for_each(|(((_pane, content), state), layout)| { +                        content.operate(state, layout, renderer, operation); +                    }) +            }, +        );      }      fn on_event( @@ -996,3 +1007,27 @@ impl<'a, T> Contents<'a, T> {          matches!(self, Self::Maximized(..))      }  } + +/// The identifier of a [`PaneGrid`]. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Id(widget::Id); + +impl Id { +    /// Creates a custom [`Id`]. +    pub fn new(id: impl Into<std::borrow::Cow<'static, str>>) -> Self { +        Self(widget::Id::new(id)) +    } + +    /// Creates a unique [`Id`]. +    /// +    /// This function produces a different [`Id`] every time it is called. +    pub fn unique() -> Self { +        Self(widget::Id::unique()) +    } +} + +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} diff --git a/native/src/widget/row.rs b/native/src/widget/row.rs index 108e98e4..1ea670b0 100644 --- a/native/src/widget/row.rs +++ b/native/src/widget/row.rs @@ -4,7 +4,7 @@ use crate::layout::{self, Layout};  use crate::mouse;  use crate::overlay;  use crate::renderer; -use crate::widget::{Operation, Tree}; +use crate::widget::{self, Operation, Tree};  use crate::{      Alignment, Clipboard, Element, Length, Padding, Point, Rectangle, Shell,      Widget, @@ -13,6 +13,7 @@ use crate::{  /// A container that distributes its contents horizontally.  #[allow(missing_debug_implementations)]  pub struct Row<'a, Message, Renderer> { +    id: Option<Id>,      spacing: u16,      padding: Padding,      width: Length, @@ -32,6 +33,7 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {          children: Vec<Element<'a, Message, Renderer>>,      ) -> Self {          Row { +            id: None,              spacing: 0,              padding: Padding::ZERO,              width: Length::Shrink, @@ -41,6 +43,12 @@ impl<'a, Message, Renderer> Row<'a, Message, Renderer> {          }      } +    /// Sets the [`Id`] of the [`Row`]. +    pub fn id(mut self, id: Id) -> Self { +        self.id = Some(id); +        self +    } +      /// Sets the horizontal spacing _between_ elements.      ///      /// Custom margins per element do not exist in iced. You should use this @@ -137,17 +145,20 @@ where          renderer: &Renderer,          operation: &mut dyn Operation<Message>,      ) { -        operation.container(None, &mut |operation| { -            self.children -                .iter() -                .zip(&mut tree.children) -                .zip(layout.children()) -                .for_each(|((child, state), layout)| { -                    child -                        .as_widget() -                        .operate(state, layout, renderer, operation); -                }) -        }); +        operation.container( +            self.id.as_ref().map(|id| &id.0), +            &mut |operation| { +                self.children +                    .iter() +                    .zip(&mut tree.children) +                    .zip(layout.children()) +                    .for_each(|((child, state), layout)| { +                        child +                            .as_widget() +                            .operate(state, layout, renderer, operation); +                    }) +            }, +        );      }      fn on_event( @@ -251,3 +262,27 @@ where          Self::new(row)      }  } + +/// The identifier of a [`Row`]. +#[derive(Debug, Clone, PartialEq, Eq, Hash)] +pub struct Id(widget::Id); + +impl Id { +    /// Creates a custom [`Id`]. +    pub fn new(id: impl Into<std::borrow::Cow<'static, str>>) -> Self { +        Self(widget::Id::new(id)) +    } + +    /// Creates a unique [`Id`]. +    /// +    /// This function produces a different [`Id`] every time it is called. +    pub fn unique() -> Self { +        Self(widget::Id::unique()) +    } +} + +impl From<Id> for widget::Id { +    fn from(id: Id) -> Self { +        id.0 +    } +} | 
