[tui] Add help text for last focused widget.

+ Fill in TODO help text for all widgets.
This commit is contained in:
Shaun Reed 2026-01-24 12:29:24 -05:00
parent 029e0b2952
commit aa4bf8aea6
4 changed files with 39 additions and 26 deletions

View File

@ -97,11 +97,18 @@ impl<'a> App<'a> {
AppExplorer => self.explorer.component_state.help_text.clone(), AppExplorer => self.explorer.component_state.help_text.clone(),
AppLogger => self.logger.component_state.help_text.clone(), AppLogger => self.logger.component_state.help_text.clone(),
}; };
Paragraph::new(help) Paragraph::new(
.style(Color::Gray) concat!(
.wrap(Wrap { trim: false }) "ALT+Q: Focus project explorer | ALT+W: Focus editor | ALT+E: Focus logger |",
.centered() " CTRL+C: Quit\n"
.render(area, buf); )
.to_string()
+ help.as_str(),
)
.style(Color::Gray)
.wrap(Wrap { trim: false })
.centered()
.render(area, buf);
} }
fn draw_tabs(&self, area: Rect, buf: &mut Buffer) { fn draw_tabs(&self, area: Rect, buf: &mut Buffer) {

View File

@ -33,7 +33,8 @@ impl Editor {
event_handler: EditorEventHandler::default(), event_handler: EditorEventHandler::default(),
file_path: None, file_path: None,
syntax_set: SyntaxSet::load_defaults_nonewlines(), syntax_set: SyntaxSet::load_defaults_nonewlines(),
component_state: ComponentState::default().with_help_text("TODO: Vim help text"), component_state: ComponentState::default()
.with_help_text("CTRL+S: Save file | Any other input is handled by vim"),
} }
} }

View File

@ -7,11 +7,12 @@ 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};
use std::fs; use std::fs;
use std::path::PathBuf;
use tui_tree_widget::{Tree, TreeItem, TreeState}; use tui_tree_widget::{Tree, TreeItem, TreeState};
#[derive(Debug)] #[derive(Debug)]
pub struct Explorer<'a> { pub struct Explorer<'a> {
pub(crate) root_path: std::path::PathBuf, pub(crate) root_path: PathBuf,
tree_items: TreeItem<'a, String>, tree_items: TreeItem<'a, String>,
tree_state: TreeState<String>, tree_state: TreeState<String>,
pub(crate) component_state: ComponentState, pub(crate) component_state: ComponentState,
@ -27,7 +28,9 @@ impl<'a> Explorer<'a> {
root_path: path.to_owned(), root_path: path.to_owned(),
tree_items: Self::build_tree_from_path(path.to_owned())?, tree_items: Self::build_tree_from_path(path.to_owned())?,
tree_state: TreeState::default(), tree_state: TreeState::default(),
component_state: ComponentState::default().with_help_text("TODO: Explorer help text."), component_state: ComponentState::default().with_help_text(
"(↑/k)/(↓/j): Select item | ←/h: Close folder | →/l/Enter: Open folder",
),
}; };
Ok(explorer) Ok(explorer)
} }
@ -140,14 +143,14 @@ impl<'a> Component for Explorer<'a> {
fn handle_key_events(&mut self, key: KeyEvent) -> Result<Action> { fn handle_key_events(&mut self, key: KeyEvent) -> Result<Action> {
let changed = match key.code { let changed = match key.code {
KeyCode::Up => self.tree_state.key_up(), KeyCode::Up | KeyCode::Char('k') => self.tree_state.key_up(),
KeyCode::Char('k') => self.tree_state.key_up(), KeyCode::Down | KeyCode::Char('j') => self.tree_state.key_down(),
KeyCode::Down => self.tree_state.key_down(), KeyCode::Left | KeyCode::Char('h') => {
KeyCode::Char('j') => self.tree_state.key_down(), // Do not call key_left(); Calling it on a closed folder clears the selection.
KeyCode::Left => self.tree_state.key_left(), let key = self.tree_state.selected().to_owned();
KeyCode::Char('h') => self.tree_state.key_left(), self.tree_state.close(key.as_ref())
KeyCode::Right => self.tree_state.key_right(), }
KeyCode::Char('l') => self.tree_state.key_right(), KeyCode::Right | KeyCode::Char('l') => self.tree_state.key_right(),
KeyCode::Enter => self.tree_state.toggle_selected(), KeyCode::Enter => self.tree_state.toggle_selected(),
_ => false, _ => false,
}; };

View File

@ -19,12 +19,14 @@ impl Logger {
} }
pub fn new() -> Self { pub fn new() -> Self {
let state = TuiWidgetState::new();
state.transition(TuiWidgetEvent::HideKey);
Self { Self {
state: TuiWidgetState::new(), state,
component_state: ComponentState::default().with_help_text(concat!( component_state: ComponentState::default().with_help_text(concat!(
"Q: Quit | ↑/↓: Select target | f: Focus target", "Space: Hide/show logging target selector panel | (↑/k)/(↓/j): Select target |",
" | ←/→: Display level | +/-: Filter level | Space: Toggle hidden targets", " (←/h)/(→/l): Display level | f: Focus target | +/-: Filter level |",
" | h: Hide target selector | PageUp/Down: Scroll | Esc: Cancel scroll" " v: Toggle filtered targets visibility | PageUp/Down: Scroll | Esc: Cancel scroll"
)), )),
} }
} }
@ -62,17 +64,17 @@ impl Component for Logger {
fn handle_key_events(&mut self, key: KeyEvent) -> anyhow::Result<Action> { fn handle_key_events(&mut self, key: KeyEvent) -> anyhow::Result<Action> {
match key.code { match key.code {
KeyCode::Char(' ') => self.state.transition(TuiWidgetEvent::SpaceKey), KeyCode::Char('v') => self.state.transition(TuiWidgetEvent::SpaceKey),
KeyCode::Esc => self.state.transition(TuiWidgetEvent::EscapeKey), KeyCode::Esc => self.state.transition(TuiWidgetEvent::EscapeKey),
KeyCode::PageUp => self.state.transition(TuiWidgetEvent::PrevPageKey), KeyCode::PageUp => self.state.transition(TuiWidgetEvent::PrevPageKey),
KeyCode::PageDown => self.state.transition(TuiWidgetEvent::NextPageKey), KeyCode::PageDown => self.state.transition(TuiWidgetEvent::NextPageKey),
KeyCode::Up => self.state.transition(TuiWidgetEvent::UpKey), KeyCode::Up | KeyCode::Char('k') => self.state.transition(TuiWidgetEvent::UpKey),
KeyCode::Down => self.state.transition(TuiWidgetEvent::DownKey), KeyCode::Down | KeyCode::Char('j') => self.state.transition(TuiWidgetEvent::DownKey),
KeyCode::Left => self.state.transition(TuiWidgetEvent::LeftKey), KeyCode::Left | KeyCode::Char('h') => self.state.transition(TuiWidgetEvent::LeftKey),
KeyCode::Right => self.state.transition(TuiWidgetEvent::RightKey), KeyCode::Right | KeyCode::Char('l') => self.state.transition(TuiWidgetEvent::RightKey),
KeyCode::Char('+') => self.state.transition(TuiWidgetEvent::PlusKey), KeyCode::Char('+') => self.state.transition(TuiWidgetEvent::PlusKey),
KeyCode::Char('-') => self.state.transition(TuiWidgetEvent::MinusKey), KeyCode::Char('-') => self.state.transition(TuiWidgetEvent::MinusKey),
KeyCode::Char('h') => self.state.transition(TuiWidgetEvent::HideKey), KeyCode::Char(' ') => self.state.transition(TuiWidgetEvent::HideKey),
KeyCode::Char('f') => self.state.transition(TuiWidgetEvent::FocusKey), KeyCode::Char('f') => self.state.transition(TuiWidgetEvent::FocusKey),
_ => (), _ => (),
} }