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}; const ALIEN: &str = r#" /// /// ,---------------------------------. /// /// | Hey there, press (q) to quit... | // // '---------------------------------' //,,,///,,,// .. /////////////////// . //////@@@@@//////@@@@@/// //////@@###//////@@###/// ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,, /// /// ,,, ,,, /// /// ,,, /// /// ///// ///// "#; #[derive(Clone, Debug)] struct App { alien: String, } #[derive(Clone, Debug)] enum Message { Quit, } impl store::Update for App { type Return = (); fn update(&mut self, message: Message) -> Option> { match message { Message::Quit => Some(Exit { value: None }), } } } impl Show for App { fn show(&self, ctx: &Context, frame: &mut Frame) -> Result<()> { Window::default().show(ctx, Theme::default(), |ui| { ui.text_view( frame, self.alien.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 { alien: ALIEN.to_string(), }; tui::im( app, Viewport::default(), Channel::default(), EmptyProcessors::new(), ) .await?; Ok(()) }