From 0f11fb9273afb48c4cd3744c1dd0f49f104dfcd3 Mon Sep 17 00:00:00 2001 From: alice pellerin Date: Thu, 19 Mar 2026 03:07:05 -0500 Subject: [PATCH] tab bar --- src/app/widget.rs | 35 ++++++++++++++++++++++++++++++++--- src/buffer/widget.rs | 6 ++---- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/src/app/widget.rs b/src/app/widget.rs index 1fb03b4..8a54e74 100644 --- a/src/app/widget.rs +++ b/src/app/widget.rs @@ -1,8 +1,37 @@ -use ratatui::{layout::Rect, widgets::Widget}; -use crate::app::App; +use ratatui::{layout::Rect, style::{Color, Stylize}, text::{Line, Span}, widgets::Widget}; +use crate::{app::App, buffer::Buffer, custom_greys::CustomGreys}; impl Widget for &App { fn render(self, area: Rect, buf: &mut ratatui::buffer::Buffer) { - self.current_buffer().render(area, buf); + if self.buffers.len() == 1 { + self.current_buffer().render(area, buf); + } else { + let tab_bar_area = Rect::new(area.x, area.y, area.width, 1); + self.render_tab_bar().render(tab_bar_area, buf); + + let buffer_area = Rect::new(area.x, area.y + 1, area.width, area.height - 1); + self.current_buffer().render(buffer_area, buf); + } + } +} + +impl App { + fn render_tab_bar(&self) -> Line<'static> { + self.buffers + .iter() + .enumerate() + .map(|(index, buffer)| self.tab_for(buffer, index == self.current_buffer_index)) + .collect() + } + + fn tab_for(&self, buffer: &Buffer, is_active: bool) -> Span<'static> { + let background = if is_active { + Color::select_grey() + } else { + Color::ui_grey() + }; + + Span::from(format!(" {} ", buffer.file_name)) + .bg(background) } } diff --git a/src/buffer/widget.rs b/src/buffer/widget.rs index 2f13ca5..369f7da 100644 --- a/src/buffer/widget.rs +++ b/src/buffer/widget.rs @@ -53,8 +53,7 @@ impl Widget for &Buffer { } impl Buffer { - #[allow(mismatched_lifetime_syntaxes)] - fn render_line(&self, address: usize, bytes: &[u8; BYTES_PER_LINE]) -> Line { + fn render_line(&self, address: usize, bytes: &[u8; BYTES_PER_LINE]) -> Line<'static> { iter::once(address::render_address(address)) .chain(self.render_chunks(address, bytes)) .chain(iter::once(" ".into())) @@ -62,8 +61,7 @@ impl Buffer { .collect() } - #[allow(mismatched_lifetime_syntaxes)] - fn render_partial_line(&self, address: usize, bytes: &[u8]) -> Line { + fn render_partial_line(&self, address: usize, bytes: &[u8]) -> Line<'static> { iter::once(address::render_address(address)) .chain(self.render_partial_chunks(address, bytes)) .chain(iter::once(" ".into()))