Radish alpha
r
Radicle terminal user interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
lib: Add example
Erik Kundt committed 1 year ago
commit ff151faefd26fe18866b7b4db99e0f05a5529200
parent f712ba6d2baf21f3aeb5cad2118a377370cf8abd
1 file changed +64 -0
added examples/hello.rs
@@ -0,0 +1,64 @@
+
use anyhow::Result;
+

+
use radicle_tui as tui;
+

+
use termion::event::Key;
+
use tui::store;
+
use tui::ui::widget::text::{Paragraph, ParagraphProps};
+
use tui::ui::widget::{Properties, Widget};
+
use tui::{Channel, Exit};
+

+
#[derive(Clone, Debug)]
+
struct State {
+
    welcome: String,
+
}
+

+
enum Message {
+
    Quit,
+
    ReverseWelcome,
+
}
+

+
impl store::State<()> for State {
+
    type Message = Message;
+

+
    fn update(&mut self, message: Self::Message) -> Option<tui::Exit<()>> {
+
        match message {
+
            Message::Quit => Some(Exit { value: None }),
+
            Message::ReverseWelcome => {
+
                self.welcome = self.welcome.chars().rev().collect::<String>();
+
                None
+
            }
+
        }
+
    }
+

+
    fn tick(&self) {}
+
}
+

+
#[tokio::main]
+
pub async fn main() -> Result<()> {
+
    let channel = Channel::default();
+
    let state = State {
+
        welcome: "Hello TUI".to_string(),
+
    };
+

+
    let welcome = Paragraph::new(&state, channel.tx.clone())
+
        .on_update(|state| {
+
            ParagraphProps::default()
+
                .text(&state.welcome.clone().into())
+
                .to_boxed()
+
        })
+
        .on_event(|paragraph, key| {
+
            paragraph
+
                .downcast_mut::<Paragraph<'_, State, Message>>()
+
                .and_then(|paragraph| match key {
+
                    Key::Char('r') => paragraph.send(Message::ReverseWelcome).ok(),
+
                    Key::Char('q') => paragraph.send(Message::Quit).ok(),
+
                    _ => None,
+
                });
+
        })
+
        .to_boxed();
+

+
    tui::run(channel, state, welcome).await?;
+

+
    Ok(())
+
}