provide ID to operation.container in applicable widgets

This commit is contained in:
Nick Senger 2023-02-09 21:16:12 -08:00 committed by Héctor Ramón Jiménez
parent 6a683b603d
commit 84a6038961
No known key found for this signature in database
GPG key ID: 140CC052C94F138E
5 changed files with 226 additions and 51 deletions

View file

@ -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
}
}