summaryrefslogtreecommitdiffstats
path: root/zellij-utils/src/pane_size.rs
diff options
context:
space:
mode:
Diffstat (limited to 'zellij-utils/src/pane_size.rs')
-rw-r--r--zellij-utils/src/pane_size.rs51
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 {