From 84a6038961a5ebd1366ae8c6ba9e44be07d37f16 Mon Sep 17 00:00:00 2001 From: Nick Senger Date: Thu, 9 Feb 2023 21:16:12 -0800 Subject: provide ID to operation.container in applicable widgets --- native/src/widget/button.rs | 53 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 9 deletions(-) (limited to 'native/src/widget/button.rs') 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, content: Element<'a, Message, Renderer>, on_press: Option, width: Length, @@ -72,6 +73,7 @@ where /// Creates a new [`Button`] with the given content. pub fn new(content: impl Into>) -> 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, ) { - 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>) -> 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 for widget::Id { + fn from(id: Id) -> Self { + id.0 + } +} -- cgit