Skip to main content

vtcode_tui/core_tui/session/
impl_layout.rs

1use super::*;
2use crate::ui::tui::widgets::LayoutMode;
3
4impl Session {
5    pub(crate) fn resolved_layout_mode(&self, area: Rect) -> LayoutMode {
6        match self.appearance.layout_mode {
7            crate::ui::tui::session::config::LayoutModeOverride::Auto => {
8                LayoutMode::from_area(area)
9            }
10            crate::ui::tui::session::config::LayoutModeOverride::Compact => LayoutMode::Compact,
11            crate::ui::tui::session::config::LayoutModeOverride::Standard => LayoutMode::Standard,
12            crate::ui::tui::session::config::LayoutModeOverride::Wide => LayoutMode::Wide,
13        }
14    }
15
16    pub fn apply_view_rows(&mut self, rows: u16) {
17        let resolved = rows.max(2);
18        if self.view_rows != resolved {
19            self.view_rows = resolved;
20            self.invalidate_scroll_metrics();
21        }
22        self.recalculate_transcript_rows();
23        self.enforce_scroll_bounds();
24    }
25
26    #[allow(dead_code)]
27    pub(crate) fn force_view_rows(&mut self, rows: u16) {
28        self.apply_view_rows(rows);
29    }
30
31    pub(super) fn recalculate_transcript_rows(&mut self) {
32        // Calculate reserved rows: header + input + borders (2)
33        let header_rows = self.header_rows.max(ui::INLINE_HEADER_HEIGHT);
34        let reserved = (header_rows + self.input_height).saturating_add(2);
35        let available = self.view_rows.saturating_sub(reserved).max(1);
36
37        if self.transcript_rows != available {
38            self.transcript_rows = available;
39            self.invalidate_scroll_metrics();
40        }
41    }
42}