19 个版本 (4 个重大更新)

0.5.0 2024年8月12日
0.4.4 2024年7月25日
0.2.3 2024年3月12日
0.2.1 2023年12月31日

#423 in 命令行界面

Download history 122/week @ 2024-05-03 161/week @ 2024-05-10 651/week @ 2024-05-17 244/week @ 2024-05-24 103/week @ 2024-05-31 56/week @ 2024-06-07 60/week @ 2024-06-14 226/week @ 2024-06-21 87/week @ 2024-06-28 313/week @ 2024-07-05 314/week @ 2024-07-12 419/week @ 2024-07-19 190/week @ 2024-07-26 267/week @ 2024-08-02 457/week @ 2024-08-09 50/week @ 2024-08-16

1,214 个月下载量
用于 4 crates

MIT/Apache

21KB
206 代码行(不含注释)

tui-popup

Crates.io badge License badge Docs.rs badge Deps.rs badge Discord badge

Ratatui 的弹出窗口小部件

弹出窗口小部件是一个简单的组件,它在屏幕中央渲染弹出窗口。

示例

use ratatui::prelude::*;
use tui_popup::Popup;

fn render_popup(frame: &mut Frame) {
    let popup = Popup::new("tui-popup demo", "Press any key to exit")
       .style(Style::new().white().on_blue());
    frame.render_widget(&popup, frame.size());
}

demo

状态

该组件支持在 PopupState 中存储弹出窗口的位置。这是实验性的,该 API 的确切用法可能会改变。

use ratatui::prelude::*;
use tui_popup::Popup;

fn render_stateful_popup(frame: &mut Frame, popup_state: &mut PopupState) {
    let popup = Popup::new("tui-popup demo", "Press any key to exit")
       .style(Style::new().white().on_blue());
    frame.render_stateful_widget_ref(popup, frame.size(), popup_state);
}

fn move_up(popup_state: &mut PopupState) {
    popup_state.move_by(0, -1);
}

弹出窗口可以通过传递鼠标上/下/拖动事件的列和行来自动处理移动。当前实现检查点击是否在弹出窗口的第一行,否则忽略该事件。

match event.read()? {
    Event::Mouse(event) => {
        match event.kind {
            event::MouseEventKind::Down(MouseButton::Left) => {
                popup_state.mouse_down(event.column, event.row)
            }
            event::MouseEventKind::Up(MouseButton::Left) => {
                popup_state.mouse_up(event.column, event.row);
            }
            event::MouseEventKind::Drag(MouseButton::Left) => {
                popup_state.mouse_drag(event.column, event.row);
            }
            _ => {}
        };
    }
    // -- snip --
}

state demo

弹出窗口还支持通过实现 SizedWidgetRef(或使用提供的 SizedWrapper 包装)渲染任意小部件。这使得使用 Paragraph 小部件支持包装和滚动,或使用 tui-scrollview 滚动任意数量的小部件成为可能。

let lines: Text = (0..10).map(|i| Span::raw(format!("Line {}", i))).collect();
let paragraph = Paragraph::new(lines).scroll((scroll, 0));
let sized_paragraph = SizedWrapper {
    inner: paragraph,
    width: 21,
    height: 5,
};
let popup = Popup::new("scroll: ↑/↓ quit: Esc", sized_paragraph)
    .style(Style::new().white().on_blue());
frame.render_widget_ref(popup, area);

paragraph example

特性

  • 自动居中
  • 自动根据内容调整大小
  • 设置弹出窗口样式
  • 通过状态移动弹出窗口
  • 处理拖动鼠标事件
  • 移动到指定位置
  • 调整大小
  • 设置边框和样式
  • 添加关闭按钮
  • 添加标题等的更美观的样式
  • 配置正文的文本包装以符合特定大小

许可证

版权所有 (c) Josh McKinney

本项目的许可证为以下两者之一:

任选其一。

贡献

除非您明确说明,否则根据Apache-2.0许可定义的,您有意提交用于作品包含的贡献,将按上述方式双授权,不附加任何额外条款或条件。

参见CONTRIBUTING.md

依赖项

~6–16MB
~190K SLoC