TUI #1

Merged
shaunrd0 merged 73 commits from ui into master 2026-01-25 20:57:37 +00:00
3 changed files with 32 additions and 36 deletions
Showing only changes of commit 45d665f8f6 - Show all commits

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,36 +82,6 @@ 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<()> {
StatefulWidget::render(
Tree::new(&self.tree_items.children())
.context("Failed to build file Explorer Tree.")?
.style(Style::default())
.block(
Block::default()
.borders(Borders::ALL)
.title(
self.root_path
.file_name()
.context("Failed to get file name from path.")?
.to_string_lossy(),
)
.title_style(Style::default().fg(Color::Green))
.title_alignment(Alignment::Center),
)
.highlight_style(
Style::new()
.fg(Color::Black)
.bg(Color::Rgb(57, 59, 64))
.add_modifier(Modifier::BOLD),
),
area,
buf,
&mut self.tree_state,
);
Ok(())
}
pub fn selected(&self) -> Result<String> { pub fn selected(&self) -> Result<String> {
if let Some(path) = self.tree_state.selected().last() { if let Some(path) = self.tree_state.selected().last() {
return Ok(std::path::absolute(path)? return Ok(std::path::absolute(path)?
@ -123,6 +93,33 @@ impl<'a> Explorer<'a> {
} }
} }
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(
tree.style(Style::default())
.block(
Block::default()
.borders(Borders::ALL)
.title(file_name.to_string_lossy())
.title_style(Style::default().fg(Color::Green))
.title_alignment(Alignment::Center),
)
.highlight_style(
Style::new()
.fg(Color::Black)
.bg(Color::Rgb(57, 59, 64))
.add_modifier(Modifier::BOLD),
),
area,
buf,
&mut self.tree_state,
);
}
}
}
impl<'a> Component for Explorer<'a> { impl<'a> Component for Explorer<'a> {
fn handle_event(&mut self, event: Event) -> Result<Action> { fn handle_event(&mut self, event: Event) -> Result<Action> {
if let Some(key_event) = event.as_key_event() { if let Some(key_event) = event.as_key_event() {

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,
{ {