[tui] Implement Widget for Explorer and MenuBar.

This commit is contained in:
Shaun Reed 2026-01-24 16:30:22 -05:00
parent f531886255
commit 45d665f8f6
3 changed files with 32 additions and 36 deletions

View File

@ -199,10 +199,7 @@ impl<'a> Widget for &mut App<'a> {
self.draw_tabs(editor_layout[0], buf); self.draw_tabs(editor_layout[0], buf);
let id = App::id().to_string(); let id = App::id().to_string();
self.editor.render(editor_layout[1], buf); self.editor.render(editor_layout[1], buf);
self.explorer self.explorer.render(horizontal[0], buf);
.render(horizontal[0], buf)
.context("Failed to render Explorer")
.unwrap_or_else(|e| error!(target:id.as_str(), "{}", e));
self.logger.render(vertical[2], buf); self.logger.render(vertical[2], buf);
// The title bar is rendered last to overlay any popups created for drop-down menus. // The title bar is rendered last to overlay any popups created for drop-down menus.

View File

@ -5,7 +5,7 @@ use ratatui::crossterm::event::{Event, KeyCode, KeyEvent, MouseEvent, MouseEvent
use ratatui::layout::{Alignment, Position, Rect}; use ratatui::layout::{Alignment, Position, Rect};
use ratatui::prelude::Style; use ratatui::prelude::Style;
use ratatui::style::{Color, Modifier}; use ratatui::style::{Color, Modifier};
use ratatui::widgets::{Block, Borders, StatefulWidget}; use ratatui::widgets::{Block, Borders, StatefulWidget, Widget};
use std::fs; use std::fs;
use std::path::PathBuf; use std::path::PathBuf;
use tui_tree_widget::{Tree, TreeItem, TreeState}; use tui_tree_widget::{Tree, TreeItem, TreeState};
@ -82,20 +82,27 @@ impl<'a> Explorer<'a> {
.context("Failed to build tree from path.") .context("Failed to build tree from path.")
} }
pub fn render(&mut self, area: Rect, buf: &mut Buffer) -> Result<()> { pub fn selected(&self) -> Result<String> {
if let Some(path) = self.tree_state.selected().last() {
return Ok(std::path::absolute(path)?
.to_str()
.context("Failed to get absolute path to selected TreeItem")?
.to_string());
}
bail!("Failed to get selected TreeItem")
}
}
impl<'a> Widget for &mut Explorer<'a> {
fn render(self, area: Rect, buf: &mut Buffer) {
if let Ok(tree) = Tree::new(&self.tree_items.children()) {
let file_name = self.root_path.file_name().unwrap_or("Unknown".as_ref());
StatefulWidget::render( StatefulWidget::render(
Tree::new(&self.tree_items.children()) tree.style(Style::default())
.context("Failed to build file Explorer Tree.")?
.style(Style::default())
.block( .block(
Block::default() Block::default()
.borders(Borders::ALL) .borders(Borders::ALL)
.title( .title(file_name.to_string_lossy())
self.root_path
.file_name()
.context("Failed to get file name from path.")?
.to_string_lossy(),
)
.title_style(Style::default().fg(Color::Green)) .title_style(Style::default().fg(Color::Green))
.title_alignment(Alignment::Center), .title_alignment(Alignment::Center),
) )
@ -109,17 +116,7 @@ impl<'a> Explorer<'a> {
buf, buf,
&mut self.tree_state, &mut self.tree_state,
); );
Ok(())
} }
pub fn selected(&self) -> Result<String> {
if let Some(path) = self.tree_state.selected().last() {
return Ok(std::path::absolute(path)?
.to_str()
.context("Failed to get absolute path to selected TreeItem")?
.to_string());
}
bail!("Failed to get selected TreeItem")
} }
} }

View File

@ -144,8 +144,10 @@ impl MenuBar {
height, height,
} }
} }
}
pub fn render(&mut self, area: Rect, buf: &mut Buffer) impl Widget for &mut MenuBar {
fn render(self, area: Rect, buf: &mut Buffer)
where where
Self: Sized, Self: Sized,
{ {