2 个版本

0.1.1 2024 年 8 月 12 日
0.1.0 2024 年 8 月 7 日

#361命令行界面

Download history 200/week @ 2024-08-07

200 每月下载量

自定义许可

145KB
3K SLoC

目录


Crate Badge Docs Badge License Badge

Dreg

一个简单的终端用户界面库。

快速开始

use dreg::prelude::*;

fn main() {
    let mut term = Terminal::new(std::io::stdout(), TerminalSettings::default()).unwrap();
    let mut prog = MyProgram {
        should_quit: false,
    };
    while !prog.should_quit {
        term.render_on_input(std::time::Duration::from_millis(31), |frame| {
            frame.render_with_context(&mut prog, frame.size())
        }).unwrap();
    }
    term.release().unwrap();
}

struct MyProgram {
    should_quit: bool,
}

impl Program for MyProgram {
    fn render(&mut self, ctx: &mut Context, area: Rect, buf: &mut Buffer) {
        if let Some(input) = ctx.take_last_input() {
            match input {
                Input::KeyDown(KeyCode::Char('q'), _) => {
                    self.should_quit = true;
                }
                _ => {}
            }
        }
        let (top_area, bottom_area) = area
            .inner_centered(31, 4)
            .vsplit_len(3);
        if ctx.left_clicked(&top_area) {
            self.should_quit = true;
            return;
        }
        let block_style = if ctx.hovered(&top_area) {
            Style::default().fg(Color::Green)
        } else {
            Style::default()
        };
        Block::bordered().style(block_style)
            .render(top_area, buf);
        Label::styled("Hover Me!", block_style)
            .render(top_area.inner(Margin::new(1, 1)), buf);
        Label::styled(
            "press [q] or click here to quit", 
            Style::default().fg(Color::DarkGray),
        ).render(bottom_area, buf);
    }
}

概述

设计哲学

Dreg 最初是从 ratatui Crate(tui-rs 的继任者)分叉出来的,因为我意识到它已经变得多么臃肿。

Dreg 的设计从一开始就非常简单。

致谢

许可

MIT

依赖项

~2.2–9MB
~53K SLoC