1
0
зеркало из https://github.com/glebtv/tui-textarea.git synced 2026-08-28 11:36:17 +03:00

simplify UI structure of modal example

Этот коммит содержится в:
rhysd
2022-10-21 23:45:09 +09:00
родитель 8c0a76b052
Коммит c5138aabf2

Просмотреть файл

@@ -8,10 +8,8 @@ use std::fs;
use std::io;
use std::io::BufRead;
use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout};
use tui::style::{Modifier, Style};
use tui::text::{Span, Spans};
use tui::widgets::{Block, Borders, Paragraph};
use tui::style::{Color, Modifier, Style};
use tui::widgets::{Block, Borders};
use tui::Terminal;
use tui_textarea::{CursorMove, Input, Key, Scrolling, TextArea};
@@ -20,6 +18,22 @@ enum Mode {
Insert,
}
impl Mode {
fn help_message(&self) -> &'static str {
match self {
Self::Normal => "type q to quit, type i to enter insert mode",
Self::Insert => "type Esc to back to normal mode",
}
}
fn cursor_color(&self) -> Color {
match self {
Self::Normal => Color::Reset,
Self::Insert => Color::LightBlue,
}
}
}
impl fmt::Display for Mode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
match self {
@@ -47,37 +61,19 @@ fn main() -> io::Result<()> {
TextArea::default()
};
textarea.set_block(
Block::default()
.borders(Borders::ALL)
.title("Modal Example"),
);
let layout = Layout::default()
.direction(Direction::Vertical)
.constraints([Constraint::Min(1), Constraint::Length(1)].as_ref());
let mut mode = Mode::Normal;
loop {
term.draw(|f| {
let chunks = layout.split(f.size());
// Show help message and current mode in title of the block
let title = format!("{} MODE ({})", mode, mode.help_message());
let block = Block::default().borders(Borders::ALL).title(title);
textarea.set_block(block);
f.render_widget(textarea.widget(), chunks[0]);
// Change the cursor color looking at current mode
let color = mode.cursor_color();
let style = Style::default().fg(color).add_modifier(Modifier::REVERSED);
textarea.set_cursor_style(style);
let (row, col) = textarea.cursor();
let help = if let Mode::Normal = mode {
" type q for quit, type i to enter insert mode"
} else {
" type Esc to leave insert mode"
};
let status = Paragraph::new(Spans::from(vec![
Span::styled(
format!(" {} {},{} ", mode, row, col),
Style::default().add_modifier(Modifier::REVERSED),
),
Span::raw(help),
]));
f.render_widget(status, chunks[1]);
})?;
term.draw(|f| f.render_widget(textarea.widget(), f.size()))?;
let input = crossterm::event::read()?.into();
match mode {