mirror of
https://seed.radicle.dev/rad:z39mP9rQAaGmERfUMPULfPUi473tY.git
synced 2026-10-18 19:10:36 +08:00
71 lines
1.4 KiB
Rust
71 lines
1.4 KiB
Rust
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(())
|
|
}
|