diff options
| author | 2020-06-05 06:52:07 +0200 | |
|---|---|---|
| committer | 2020-06-05 06:52:07 +0200 | |
| commit | 4e1e0e0890b83fb1c4c4406791e3aa63bba58a93 (patch) | |
| tree | f74e6712955a4a7239e6a91adfe4c754d876ed52 /native/src/widget/pane_grid | |
| parent | a11bcf5af0be26671ba90097c64021014ab2092d (diff) | |
| download | iced-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.rs | 77 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/title_bar.rs | 121 | 
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 +    }  }  | 
