summaryrefslogtreecommitdiffstats
path: root/native/src/widget/pane_grid
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-06-05 06:52:07 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2020-06-05 06:52:07 +0200
commit4e1e0e0890b83fb1c4c4406791e3aa63bba58a93 (patch)
treef74e6712955a4a7239e6a91adfe4c754d876ed52 /native/src/widget/pane_grid
parenta11bcf5af0be26671ba90097c64021014ab2092d (diff)
downloadiced-4e1e0e0890b83fb1c4c4406791e3aa63bba58a93.tar.gz
iced-4e1e0e0890b83fb1c4c4406791e3aa63bba58a93.tar.bz2
iced-4e1e0e0890b83fb1c4c4406791e3aa63bba58a93.zip
Draft drawing logic for `Content` and `TitleBar`
Diffstat (limited to 'native/src/widget/pane_grid')
-rw-r--r--native/src/widget/pane_grid/content.rs77
-rw-r--r--native/src/widget/pane_grid/title_bar.rs121
2 files changed, 182 insertions, 16 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)
+ }
+}
diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs
index fa868a20..1fd06411 100644
--- a/native/src/widget/pane_grid/title_bar.rs
+++ b/native/src/widget/pane_grid/title_bar.rs
@@ -1,6 +1,119 @@
-use crate::Element;
+use crate::container;
+use crate::layout;
+use crate::pane_grid;
+use crate::{Element, Layout, Point, Size};
-pub struct TitleBar<'a, Message, Renderer> {
- title: String,
- buttons: Option<Element<'a, Message, Renderer>>,
+pub struct TitleBar<'a, Message, Renderer: container::Renderer> {
+ title: Element<'a, Message, Renderer>,
+ controls: Option<Element<'a, Message, Renderer>>,
+ padding: u16,
+ style: Renderer::Style,
+}
+
+impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer>
+where
+ Renderer: container::Renderer,
+{
+ pub fn new(title: impl Into<Element<'a, Message, Renderer>>) -> Self {
+ Self {
+ title: title.into(),
+ controls: None,
+ padding: 0,
+ style: Renderer::Style::default(),
+ }
+ }
+
+ pub fn controls(
+ mut self,
+ controls: impl Into<Element<'a, Message, Renderer>>,
+ ) -> Self {
+ self.controls = Some(controls.into());
+ self
+ }
+
+ /// Sets the padding of the [`TitleBar`].
+ ///
+ /// [`TitleBar`]: struct.TitleBar.html
+ pub fn padding(mut self, units: u16) -> Self {
+ self.padding = units;
+ self
+ }
+}
+
+impl<'a, Message, Renderer> TitleBar<'a, Message, Renderer>
+where
+ Renderer: pane_grid::Renderer,
+{
+ pub fn draw(
+ &self,
+ renderer: &mut Renderer,
+ defaults: &Renderer::Defaults,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> Renderer::Output {
+ if let Some(controls) = &self.controls {
+ let mut children = layout.children();
+ let title_layout = children.next().unwrap();
+ let controls_layout = children.next().unwrap();
+
+ renderer.draw_title_bar(
+ defaults,
+ &self.style,
+ (&self.title, title_layout),
+ Some((controls, controls_layout)),
+ cursor_position,
+ )
+ } else {
+ renderer.draw_title_bar(
+ defaults,
+ &self.style,
+ (&self.title, layout),
+ None,
+ cursor_position,
+ )
+ }
+ }
+
+ pub(crate) fn layout(
+ &self,
+ renderer: &Renderer,
+ limits: &layout::Limits,
+ ) -> layout::Node {
+ let padding = f32::from(self.padding);
+ let limits = limits.pad(padding);
+
+ let mut node = if let Some(controls) = &self.controls {
+ let max_size = limits.max();
+
+ let title_layout = self
+ .title
+ .layout(renderer, &layout::Limits::new(Size::ZERO, max_size));
+
+ let title_size = title_layout.size();
+
+ let mut controls_layout = controls.layout(
+ renderer,
+ &layout::Limits::new(
+ Size::ZERO,
+ Size::new(
+ max_size.width - title_size.width,
+ max_size.height,
+ ),
+ ),
+ );
+
+ controls_layout.move_to(Point::new(title_size.width, 0.0));
+
+ layout::Node::with_children(
+ max_size,
+ vec![title_layout, controls_layout],
+ )
+ } else {
+ self.title.layout(renderer, &limits)
+ };
+
+ node.move_to(Point::new(padding, padding));
+
+ node
+ }
}