summaryrefslogtreecommitdiffstats
path: root/native/src/widget/container.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/widget/container.rs')
-rw-r--r--native/src/widget/container.rs77
1 files changed, 68 insertions, 9 deletions
diff --git a/native/src/widget/container.rs b/native/src/widget/container.rs
index 7852eecf..3459a832 100644
--- a/native/src/widget/container.rs
+++ b/native/src/widget/container.rs
@@ -2,7 +2,8 @@
use std::hash::Hash;
use crate::{
- layout, Align, Element, Event, Hasher, Layout, Length, Point, Widget,
+ layout, Align, Clipboard, Element, Event, Hasher, Layout, Length, Point,
+ Rectangle, Widget,
};
use std::u32;
@@ -11,17 +12,21 @@ use std::u32;
///
/// It is normally used for alignment purposes.
#[allow(missing_debug_implementations)]
-pub struct Container<'a, Message, Renderer> {
+pub struct Container<'a, Message, Renderer: self::Renderer> {
width: Length,
height: Length,
max_width: u32,
max_height: u32,
horizontal_alignment: Align,
vertical_alignment: Align,
+ style: Renderer::Style,
content: Element<'a, Message, Renderer>,
}
-impl<'a, Message, Renderer> Container<'a, Message, Renderer> {
+impl<'a, Message, Renderer> Container<'a, Message, Renderer>
+where
+ Renderer: self::Renderer,
+{
/// Creates an empty [`Container`].
///
/// [`Container`]: struct.Container.html
@@ -36,6 +41,7 @@ impl<'a, Message, Renderer> Container<'a, Message, Renderer> {
max_height: u32::MAX,
horizontal_alignment: Align::Start,
vertical_alignment: Align::Start,
+ style: Renderer::Style::default(),
content: content.into(),
}
}
@@ -71,13 +77,28 @@ impl<'a, Message, Renderer> Container<'a, Message, Renderer> {
self.max_height = max_height;
self
}
+
+ /// Sets the content alignment for the horizontal axis of the [`Container`].
+ ///
+ /// [`Container`]: struct.Container.html
+ pub fn align_x(mut self, alignment: Align) -> Self {
+ self.horizontal_alignment = alignment;
+ self
+ }
+
+ /// Sets the content alignment for the vertical axis of the [`Container`].
+ ///
+ /// [`Container`]: struct.Container.html
+ pub fn align_y(mut self, alignment: Align) -> Self {
+ self.vertical_alignment = alignment;
+ self
+ }
/// Centers the contents in the horizontal axis of the [`Container`].
///
/// [`Container`]: struct.Container.html
pub fn center_x(mut self) -> Self {
self.horizontal_alignment = Align::Center;
-
self
}
@@ -86,7 +107,14 @@ impl<'a, Message, Renderer> Container<'a, Message, Renderer> {
/// [`Container`]: struct.Container.html
pub fn center_y(mut self) -> Self {
self.vertical_alignment = Align::Center;
+ self
+ }
+ /// Sets the style of the [`Container`].
+ ///
+ /// [`Container`]: struct.Container.html
+ pub fn style(mut self, style: impl Into<Renderer::Style>) -> Self {
+ self.style = style.into();
self
}
}
@@ -94,7 +122,7 @@ impl<'a, Message, Renderer> Container<'a, Message, Renderer> {
impl<'a, Message, Renderer> Widget<Message, Renderer>
for Container<'a, Message, Renderer>
where
- Renderer: crate::Renderer,
+ Renderer: self::Renderer,
{
fn width(&self) -> Length {
self.width
@@ -131,6 +159,7 @@ where
cursor_position: Point,
messages: &mut Vec<Message>,
renderer: &Renderer,
+ clipboard: Option<&dyn Clipboard>,
) {
self.content.widget.on_event(
event,
@@ -138,19 +167,24 @@ where
cursor_position,
messages,
renderer,
+ clipboard,
)
}
fn draw(
&self,
renderer: &mut Renderer,
+ defaults: &Renderer::Defaults,
layout: Layout<'_>,
cursor_position: Point,
) -> Renderer::Output {
- self.content.draw(
- renderer,
- layout.children().next().unwrap(),
+ renderer.draw(
+ defaults,
+ layout.bounds(),
cursor_position,
+ &self.style,
+ &self.content,
+ layout.children().next().unwrap(),
)
}
@@ -165,10 +199,35 @@ where
}
}
+/// The renderer of a [`Container`].
+///
+/// Your [renderer] will need to implement this trait before being
+/// able to use a [`Container`] in your user interface.
+///
+/// [`Container`]: struct.Container.html
+/// [renderer]: ../../renderer/index.html
+pub trait Renderer: crate::Renderer {
+ /// The style supported by this renderer.
+ type Style: Default;
+
+ /// Draws a [`Container`].
+ ///
+ /// [`Container`]: struct.Container.html
+ fn draw<Message>(
+ &mut self,
+ defaults: &Self::Defaults,
+ bounds: Rectangle,
+ cursor_position: Point,
+ style: &Self::Style,
+ content: &Element<'_, Message, Self>,
+ content_layout: Layout<'_>,
+ ) -> Self::Output;
+}
+
impl<'a, Message, Renderer> From<Container<'a, Message, Renderer>>
for Element<'a, Message, Renderer>
where
- Renderer: 'a + crate::Renderer,
+ Renderer: 'a + self::Renderer,
Message: 'static,
{
fn from(