use anyhow::Result;
use ratatui::layout::Position;
use ratatui::{Frame, Viewport};
use radicle_tui as tui;
use tui::event::Key;
use tui::store;
use tui::task::EmptyProcessors;
use tui::ui::theme::Theme;
use tui::ui::widget::{Borders, Window};
use tui::ui::{Context, Show};
use tui::{Channel, Exit};
#[derive(Clone, Debug)]
struct App {
hello: String,
}
#[derive(Clone, Debug)]
enum Message {
Quit,
}
impl store::Update<Message> for App {
type Return = ();
fn update(&mut self, message: Message) -> Option<tui::Exit<()>> {
match message {
Message::Quit => Some(Exit { value: None }),
}
}
}
impl Show<Message> for App {
fn show(&self, ctx: &Context<Message>, frame: &mut Frame) -> Result<()> {
Window::default().show(ctx, Theme::default(), |ui| {
ui.text_view(
frame,
self.hello.clone(),
&mut Position::default(),
Some(Borders::None),
);
if ui.has_input(|key| key == Key::Char('q')) {
ui.send_message(Message::Quit);
}
});
Ok(())
}
}
#[tokio::main]
pub async fn main() -> Result<()> {
let app = App {
hello: "Hello World!".to_string(),
};
tui::im(
app,
Viewport::default(),
Channel::default(),
EmptyProcessors::new(),
)
.await?;
Ok(())
}