diff options
Diffstat (limited to 'native/src/widget/pane_grid')
| -rw-r--r-- | native/src/widget/pane_grid/content.rs | 41 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/state.rs | 68 | ||||
| -rw-r--r-- | native/src/widget/pane_grid/title_bar.rs | 52 | 
3 files changed, 124 insertions, 37 deletions
diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs index c236d820..5f269d1f 100644 --- a/native/src/widget/pane_grid/content.rs +++ b/native/src/widget/pane_grid/content.rs @@ -5,7 +5,7 @@ use crate::overlay;  use crate::renderer;  use crate::widget::container;  use crate::widget::pane_grid::{Draggable, TitleBar}; -use crate::widget::Tree; +use crate::widget::{self, Tree};  use crate::{Clipboard, Element, Layout, Point, Rectangle, Shell, Size};  /// The content of a [`Pane`]. @@ -87,7 +87,7 @@ where      /// Draws the [`Content`] with the provided [`Renderer`] and [`Layout`].      /// -    /// [`Renderer`]: iced_native::Renderer +    /// [`Renderer`]: crate::Renderer      pub fn draw(          &self,          tree: &Tree, @@ -103,7 +103,7 @@ where          let bounds = layout.bounds();          { -            let style = theme.appearance(self.style); +            let style = theme.appearance(&self.style);              container::draw_background(renderer, &style, bounds);          } @@ -183,6 +183,33 @@ where          }      } +    pub(crate) fn operate( +        &self, +        tree: &mut Tree, +        layout: Layout<'_>, +        operation: &mut dyn widget::Operation<Message>, +    ) { +        let body_layout = if let Some(title_bar) = &self.title_bar { +            let mut children = layout.children(); + +            title_bar.operate( +                &mut tree.children[1], +                children.next().unwrap(), +                operation, +            ); + +            children.next().unwrap() +        } else { +            layout +        }; + +        self.body.as_widget().operate( +            &mut tree.children[0], +            body_layout, +            operation, +        ); +    } +      pub(crate) fn on_event(          &mut self,          tree: &mut Tree, @@ -278,12 +305,12 @@ where      }      pub(crate) fn overlay<'b>( -        &'b self, +        &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>,          renderer: &Renderer,      ) -> Option<overlay::Element<'b, Message, Renderer>> { -        if let Some(title_bar) = self.title_bar.as_ref() { +        if let Some(title_bar) = self.title_bar.as_mut() {              let mut children = layout.children();              let title_bar_layout = children.next()?; @@ -294,14 +321,14 @@ where              match title_bar.overlay(title_bar_state, title_bar_layout, renderer)              {                  Some(overlay) => Some(overlay), -                None => self.body.as_widget().overlay( +                None => self.body.as_widget_mut().overlay(                      body_state,                      children.next()?,                      renderer,                  ),              }          } else { -            self.body.as_widget().overlay( +            self.body.as_widget_mut().overlay(                  &mut tree.children[0],                  layout,                  renderer, diff --git a/native/src/widget/pane_grid/state.rs b/native/src/widget/pane_grid/state.rs index cdca6267..c4ae0a0e 100644 --- a/native/src/widget/pane_grid/state.rs +++ b/native/src/widget/pane_grid/state.rs @@ -4,9 +4,9 @@  use crate::widget::pane_grid::{      Axis, Configuration, Direction, Node, Pane, Split,  }; -use crate::{Point, Rectangle, Size}; +use crate::{Point, Size}; -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap;  /// The state of a [`PaneGrid`].  /// @@ -31,6 +31,11 @@ pub struct State<T> {      ///      /// [`PaneGrid`]: crate::widget::PaneGrid      pub internal: Internal, + +    /// The maximized [`Pane`] of the [`PaneGrid`]. +    /// +    /// [`PaneGrid`]: crate::widget::PaneGrid +    pub(super) maximized: Option<Pane>,  }  impl<T> State<T> { @@ -52,7 +57,11 @@ impl<T> State<T> {          let internal =              Internal::from_configuration(&mut panes, config.into(), 0); -        State { panes, internal } +        State { +            panes, +            internal, +            maximized: None, +        }      }      /// Returns the total amount of panes in the [`State`]. @@ -153,6 +162,7 @@ impl<T> State<T> {          node.split(new_split, axis, new_pane);          let _ = self.panes.insert(new_pane, state); +        let _ = self.maximized.take();          Some((new_pane, new_split))      } @@ -194,12 +204,39 @@ impl<T> State<T> {      /// Closes the given [`Pane`] and returns its internal state and its closest      /// sibling, if it exists.      pub fn close(&mut self, pane: &Pane) -> Option<(T, Pane)> { +        if self.maximized == Some(*pane) { +            let _ = self.maximized.take(); +        } +          if let Some(sibling) = self.internal.layout.remove(pane) {              self.panes.remove(pane).map(|state| (state, sibling))          } else {              None          }      } + +    /// Maximize the given [`Pane`]. Only this pane will be rendered by the +    /// [`PaneGrid`] until [`Self::restore()`] is called. +    /// +    /// [`PaneGrid`]: crate::widget::PaneGrid +    pub fn maximize(&mut self, pane: &Pane) { +        self.maximized = Some(*pane); +    } + +    /// Restore the currently maximized [`Pane`] to it's normal size. All panes +    /// will be rendered by the [`PaneGrid`]. +    /// +    /// [`PaneGrid`]: crate::widget::PaneGrid +    pub fn restore(&mut self) { +        let _ = self.maximized.take(); +    } + +    /// Returns the maximized [`Pane`] of the [`PaneGrid`]. +    /// +    /// [`PaneGrid`]: crate::widget::PaneGrid +    pub fn maximized(&self) -> Option<Pane> { +        self.maximized +    }  }  /// The internal state of a [`PaneGrid`]. @@ -226,11 +263,13 @@ impl Internal {                  let Internal {                      layout: a,                      last_id: next_id, +                    ..                  } = Self::from_configuration(panes, *a, next_id);                  let Internal {                      layout: b,                      last_id: next_id, +                    ..                  } = Self::from_configuration(panes, *b, next_id);                  ( @@ -304,25 +343,8 @@ impl Action {  }  impl Internal { -    /// Calculates the current [`Pane`] regions from the [`PaneGrid`] layout. -    /// -    /// [`PaneGrid`]: crate::widget::PaneGrid -    pub fn pane_regions( -        &self, -        spacing: f32, -        size: Size, -    ) -> BTreeMap<Pane, Rectangle> { -        self.layout.pane_regions(spacing, size) -    } - -    /// Calculates the current [`Split`] regions from the [`PaneGrid`] layout. -    /// -    /// [`PaneGrid`]: crate::widget::PaneGrid -    pub fn split_regions( -        &self, -        spacing: f32, -        size: Size, -    ) -> BTreeMap<Split, (Axis, Rectangle, f32)> { -        self.layout.split_regions(spacing, size) +    /// The layout [`Node`] of the [`Internal`] state +    pub fn layout(&self) -> &Node { +        &self.layout      }  } diff --git a/native/src/widget/pane_grid/title_bar.rs b/native/src/widget/pane_grid/title_bar.rs index eb85f924..28e4670f 100644 --- a/native/src/widget/pane_grid/title_bar.rs +++ b/native/src/widget/pane_grid/title_bar.rs @@ -4,7 +4,7 @@ use crate::mouse;  use crate::overlay;  use crate::renderer;  use crate::widget::container; -use crate::widget::Tree; +use crate::widget::{self, Tree};  use crate::{      Clipboard, Element, Layout, Padding, Point, Rectangle, Shell, Size,  }; @@ -114,7 +114,7 @@ where      /// Draws the [`TitleBar`] with the provided [`Renderer`] and [`Layout`].      /// -    /// [`Renderer`]: iced_native::Renderer +    /// [`Renderer`]: crate::Renderer      pub fn draw(          &self,          tree: &Tree, @@ -129,7 +129,7 @@ where          use container::StyleSheet;          let bounds = layout.bounds(); -        let style = theme.appearance(self.style); +        let style = theme.appearance(&self.style);          let inherited_style = renderer::Style {              text_color: style.text_color.unwrap_or(inherited_style.text_color),          }; @@ -257,6 +257,44 @@ where          layout::Node::with_children(node.size().pad(self.padding), vec![node])      } +    pub(crate) fn operate( +        &self, +        tree: &mut Tree, +        layout: Layout<'_>, +        operation: &mut dyn widget::Operation<Message>, +    ) { +        let mut children = layout.children(); +        let padded = children.next().unwrap(); + +        let mut children = padded.children(); +        let title_layout = children.next().unwrap(); +        let mut show_title = true; + +        if let Some(controls) = &self.controls { +            let controls_layout = children.next().unwrap(); + +            if title_layout.bounds().width + controls_layout.bounds().width +                > padded.bounds().width +            { +                show_title = false; +            } + +            controls.as_widget().operate( +                &mut tree.children[1], +                controls_layout, +                operation, +            ) +        }; + +        if show_title { +            self.content.as_widget().operate( +                &mut tree.children[0], +                title_layout, +                operation, +            ) +        } +    } +      pub(crate) fn on_event(          &mut self,          tree: &mut Tree, @@ -357,7 +395,7 @@ where      }      pub(crate) fn overlay<'b>( -        &'b self, +        &'b mut self,          tree: &'b mut Tree,          layout: Layout<'_>,          renderer: &Renderer, @@ -377,13 +415,13 @@ where          let controls_state = states.next().unwrap();          content -            .as_widget() +            .as_widget_mut()              .overlay(title_state, title_layout, renderer)              .or_else(move || { -                controls.as_ref().and_then(|controls| { +                controls.as_mut().and_then(|controls| {                      let controls_layout = children.next()?; -                    controls.as_widget().overlay( +                    controls.as_widget_mut().overlay(                          controls_state,                          controls_layout,                          renderer,  | 
