TUI #1
@ -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) {
|
||||||
|
|||||||
@ -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"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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),
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user