diff options
Diffstat (limited to 'zellij-utils/src/pane_size.rs')
-rw-r--r-- | zellij-utils/src/pane_size.rs | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/zellij-utils/src/pane_size.rs b/zellij-utils/src/pane_size.rs index c3c74748a..16c111b24 100644 --- a/zellij-utils/src/pane_size.rs +++ b/zellij-utils/src/pane_size.rs @@ -4,7 +4,8 @@ use std::{ hash::{Hash, Hasher}, }; -use crate::input::layout::SplitDirection; +use crate::data::FloatingPaneCoordinates; +use crate::input::layout::{SplitDirection, SplitSize}; use crate::position::Position; /// Contains the position and size of a [`Pane`], or more generally of any terminal, measured @@ -130,6 +131,18 @@ impl Dimension { pub fn is_percent(&self) -> bool { matches!(self.constraint, Constraint::Percent(_)) } + pub fn from_split_size(split_size: SplitSize, full_size: usize) -> Self { + match split_size { + SplitSize::Fixed(fixed) => Dimension { + constraint: Constraint::Fixed(fixed), + inner: fixed, + }, + SplitSize::Percent(percent) => Dimension { + constraint: Constraint::Percent(percent as f64), + inner: ((percent as f64 / 100.0) * full_size as f64).floor() as usize, + }, + } + } } #[derive(Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] @@ -181,6 +194,42 @@ impl PaneGeom { SplitDirection::Horizontal => self.rows.is_percent(), } } + pub fn adjust_coordinates( + &mut self, + floating_pane_coordinates: FloatingPaneCoordinates, + viewport: Viewport, + ) { + if let Some(x) = floating_pane_coordinates.x { + self.x = x.to_fixed(viewport.cols); + } + if let Some(y) = floating_pane_coordinates.y { + self.y = y.to_fixed(viewport.rows); + } + if let Some(height) = floating_pane_coordinates.height { + self.rows = Dimension::from_split_size(height, viewport.rows); + } + if let Some(width) = floating_pane_coordinates.width { + self.cols = Dimension::from_split_size(width, viewport.cols); + } + if self.x < viewport.x { + self.x = viewport.x; + } else if self.x > viewport.x + viewport.cols { + self.x = (viewport.x + viewport.cols).saturating_sub(self.cols.as_usize()); + } + if self.y < viewport.y { + self.y = viewport.y; + } else if self.y > viewport.y + viewport.rows { + self.y = (viewport.y + viewport.rows).saturating_sub(self.rows.as_usize()); + } + if self.x + self.cols.as_usize() > viewport.x + viewport.cols { + let new_cols = (viewport.x + viewport.cols).saturating_sub(self.x); + self.cols.set_inner(new_cols); + } + if self.y + self.rows.as_usize() > viewport.y + viewport.rows { + let new_rows = (viewport.y + viewport.rows).saturating_sub(self.y); + self.rows.set_inner(new_rows); + } + } } impl Display for PaneGeom { |