Skip to main content

rmux_core/session/
resize.rs

1use rmux_proto::{ResizePaneAdjustment, RmuxError, SplitDirection};
2
3use super::target_error::{invalid_pane_target, invalid_window_target};
4use super::Session;
5
6impl Session {
7    /// Applies the supported resize adjustment to the session layout.
8    pub fn resize_pane(
9        &mut self,
10        pane_index: u32,
11        adjustment: ResizePaneAdjustment,
12    ) -> Result<(), RmuxError> {
13        self.resize_pane_in_window(self.active_window, pane_index, adjustment)
14    }
15
16    /// Applies the supported resize adjustment to the addressed window.
17    pub fn resize_pane_in_window(
18        &mut self,
19        window_index: u32,
20        pane_index: u32,
21        adjustment: ResizePaneAdjustment,
22    ) -> Result<(), RmuxError> {
23        if adjustment == ResizePaneAdjustment::Zoom {
24            return self.toggle_zoom_in_window(window_index, pane_index);
25        }
26
27        self.ensure_resize_target(window_index, pane_index)?;
28        let window = self
29            .window_at_mut(window_index)
30            .expect("addressed session window must exist");
31
32        match adjustment {
33            ResizePaneAdjustment::NoOp => {}
34            ResizePaneAdjustment::AbsoluteWidth { columns } => {
35                let _ = window.resize_pane_width(pane_index, columns);
36            }
37            ResizePaneAdjustment::AbsoluteHeight { rows } => {
38                let _ = window.resize_pane_height(pane_index, rows);
39            }
40            ResizePaneAdjustment::AbsoluteSize { columns, rows } => {
41                let _ = window.resize_pane_width(pane_index, columns);
42                let _ = window.resize_pane_height(pane_index, rows);
43            }
44            ResizePaneAdjustment::Up { cells } => {
45                let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Up { cells });
46            }
47            ResizePaneAdjustment::Down { cells } => {
48                let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Down { cells });
49            }
50            ResizePaneAdjustment::Left { cells } => {
51                let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Left { cells });
52            }
53            ResizePaneAdjustment::Right { cells } => {
54                let _ = window.resize_pane_by(pane_index, ResizePaneAdjustment::Right { cells });
55            }
56            ResizePaneAdjustment::Zoom => unreachable!("zoom returned early"),
57        }
58        Ok(())
59    }
60
61    /// Resizes the addressed pane to an exact size along the split axis.
62    pub fn resize_pane_to_in_window(
63        &mut self,
64        window_index: u32,
65        pane_index: u32,
66        direction: SplitDirection,
67        size: u32,
68    ) -> Result<(), RmuxError> {
69        self.ensure_resize_target(window_index, pane_index)?;
70        let window = self
71            .window_at_mut(window_index)
72            .expect("addressed session window must exist");
73        let _ = window.resize_pane_to(pane_index, direction, size.max(1));
74        Ok(())
75    }
76
77    /// Toggles zoom for the addressed pane's window.
78    pub fn toggle_zoom_in_window(
79        &mut self,
80        window_index: u32,
81        pane_index: u32,
82    ) -> Result<(), RmuxError> {
83        self.ensure_resize_target(window_index, pane_index)?;
84        self.window_at_mut(window_index)
85            .expect("addressed session window must exist")
86            .toggle_zoom(pane_index);
87        Ok(())
88    }
89
90    fn ensure_resize_target(&self, window_index: u32, pane_index: u32) -> Result<(), RmuxError> {
91        if self.window_at(window_index).is_none() {
92            return Err(invalid_window_target(&self.name, window_index));
93        }
94
95        if self
96            .window_at(window_index)
97            .and_then(|window| window.pane(pane_index))
98            .is_none()
99        {
100            return Err(invalid_pane_target(
101                &self.name,
102                window_index,
103                pane_index,
104                "pane index does not exist in session",
105            ));
106        }
107
108        Ok(())
109    }
110}