summaryrefslogtreecommitdiffstats
path: root/native/src/widget/pane_grid/content.rs
diff options
context:
space:
mode:
Diffstat (limited to 'native/src/widget/pane_grid/content.rs')
-rw-r--r--native/src/widget/pane_grid/content.rs77
1 files changed, 65 insertions, 12 deletions
diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs
index e1374c82..a30b0e7d 100644
--- a/native/src/widget/pane_grid/content.rs
+++ b/native/src/widget/pane_grid/content.rs
@@ -1,16 +1,20 @@
+use crate::container;
use crate::layout;
use crate::pane_grid::{self, TitleBar};
-use crate::{Clipboard, Element, Event, Hasher, Layout, Point};
+use crate::{Clipboard, Element, Event, Hasher, Layout, Point, Size};
/// The content of a [`Pane`].
///
/// [`Pane`]: struct.Pane.html
-pub struct Content<'a, Message, Renderer> {
+pub struct Content<'a, Message, Renderer: container::Renderer> {
title_bar: Option<TitleBar<'a, Message, Renderer>>,
body: Element<'a, Message, Renderer>,
}
-impl<'a, Message, Renderer> Content<'a, Message, Renderer> {
+impl<'a, Message, Renderer> Content<'a, Message, Renderer>
+where
+ Renderer: container::Renderer,
+{
pub fn new(body: impl Into<Element<'a, Message, Renderer>>) -> Self {
Self {
title_bar: None,
@@ -29,7 +33,7 @@ impl<'a, Message, Renderer> Content<'a, Message, Renderer> {
impl<'a, Message, Renderer> Content<'a, Message, Renderer>
where
- Renderer: pane_grid::Renderer,
+ Renderer: pane_grid::Renderer + container::Renderer,
{
pub fn draw(
&self,
@@ -38,13 +42,25 @@ where
layout: Layout<'_>,
cursor_position: Point,
) -> Renderer::Output {
- renderer.draw_pane(
- defaults,
- self.title_bar.as_ref(),
- &self.body,
- layout,
- cursor_position,
- )
+ if let Some(title_bar) = &self.title_bar {
+ let mut children = layout.children();
+ let title_bar_layout = children.next().unwrap();
+ let body_layout = children.next().unwrap();
+
+ renderer.draw_pane(
+ defaults,
+ Some((title_bar, title_bar_layout)),
+ (&self.body, body_layout),
+ cursor_position,
+ )
+ } else {
+ renderer.draw_pane(
+ defaults,
+ None,
+ (&self.body, layout),
+ cursor_position,
+ )
+ }
}
pub(crate) fn is_over_drag_target(
@@ -60,7 +76,34 @@ where
renderer: &Renderer,
limits: &layout::Limits,
) -> layout::Node {
- self.body.layout(renderer, limits)
+ if let Some(title_bar) = &self.title_bar {
+ let max_size = limits.max();
+
+ let title_bar_layout = title_bar
+ .layout(renderer, &layout::Limits::new(Size::ZERO, max_size));
+
+ let title_bar_size = title_bar_layout.size();
+
+ let mut body_layout = self.body.layout(
+ renderer,
+ &layout::Limits::new(
+ Size::ZERO,
+ Size::new(
+ max_size.width,
+ max_size.height - title_bar_size.height,
+ ),
+ ),
+ );
+
+ body_layout.move_to(Point::new(0.0, title_bar_size.height));
+
+ layout::Node::with_children(
+ max_size,
+ vec![title_bar_layout, body_layout],
+ )
+ } else {
+ self.body.layout(renderer, limits)
+ }
}
pub(crate) fn on_event(
@@ -86,3 +129,13 @@ where
self.body.hash_layout(state);
}
}
+
+impl<'a, T, Message, Renderer> From<T> for Content<'a, Message, Renderer>
+where
+ T: Into<Element<'a, Message, Renderer>>,
+ Renderer: pane_grid::Renderer + container::Renderer,
+{
+ fn from(element: T) -> Self {
+ Self::new(element)
+ }
+}