Rust终端UI框架cursive_core的使用,构建跨平台文本用户界面的核心库

Rust终端UI框架cursive_core的使用,构建跨平台文本用户界面的核心库

cursive-core是cursive终端UI框架的核心库,定义了大部分功能(不包括后端实现)。第三方库建议依赖cursive-core而不是cursive,因为它会有更少的语义版本破坏性更新。

安装

在项目目录中运行以下Cargo命令:

cargo add cursive_core

或者在Cargo.toml中添加以下行:

cursive_core = "0.4.6"

基本使用示例

下面是一个简单的cursive_core示例,创建一个基本的终端UI应用程序:

use cursive::{
    Cursive,
    views::{Dialog, TextView},
};

fn main() {
    // 创建Cursive对象
    let mut siv = Cursive::default();
    
    // 创建一个带文本的对话框
    siv.add_layer(
        Dialog::around(TextView::new("Hello World!"))
            .title("Cursive Demo")
            .button("Quit", |s| s.quit()),
    );
    
    // 运行事件循环
    siv.run();
}

完整示例

以下是一个更完整的示例,展示了如何使用cursive_core创建交互式终端UI:

use cursive::{
    Cursive,
    views::{
        Dialog, EditView, LinearLayout, TextView, 
        Checkbox, RadioGroup, ListView
    },
    align::HAlign,
    traits::*,
};

fn main() {
    let mut siv = Cursive::default();

    // 创建单选按钮组
    let radio_group = RadioGroup::new()
        .button("Option 1", "opt1")
        .button("Option 2", "opt2")
        .button("Option 3", "opt3");

    // 创建表单布局
    let layout = LinearLayout::vertical()
        .child(TextView::new("Please fill the form:"))
        .child(TextView::new("Name:"))
        .child(EditView::new().fixed_width(20))
        .child(TextView::new("Age:"))
        .child(EditView::new().fixed_width(5))
        .child(Checkbox::new().label("Agree to terms"))
        .child(TextView::new("Select an option:"))
        .child(radio_group)
        .child(ListView::new()
            .child("Item 1", TextView::new("Details 1"))
            .child("Item 2", TextView::new("Details 2"))
        );

    // 添加对话框和按钮
    siv.add_layer(
        Dialog::around(layout)
            .title("Interactive Form")
            .h_align(HAlign::Center)
            .button("Submit", |s| {
                s.add_layer(Dialog::info("Form submitted!"));
            })
            .button("Cancel", Cursive::quit),
    );

    siv.run();
}

特性

  • 跨平台支持:可以在任何支持终端的平台上运行
  • 灵活的布局系统:支持垂直、水平布局和嵌套
  • 丰富的控件:包括按钮、文本框、复选框、单选按钮等
  • 事件驱动架构:响应式用户交互处理
  • 主题支持:可自定义UI外观

文档

更多详细用法请参考官方文档

许可证

本项目采用MIT许可证发布。


1 回复

Rust终端UI框架cursive_core使用指南

简介

cursive_core是Rust中一个用于构建跨平台文本用户界面(TUI)的核心库。它提供了创建终端应用程序所需的底层组件和抽象,是cursive框架的基础。

主要特性

  • 跨平台支持(Linux/macOS/Windows)
  • 响应式布局系统
  • 丰富的组件库(按钮、文本框、列表等)
  • 事件驱动架构
  • 主题和样式支持

基本使用方法

添加依赖

首先在Cargo.toml中添加依赖:

[dependencies]
cursive_core = "0.3.0"

创建基本应用

use cursive_core::Cursive;
use cursive_core::views::{Dialog, TextView};

fn main() {
    // 创建Cursive对象
    let mut siv = cursive_core::default();
    
    // 创建一个带有文本的对话框
    siv.add_layer(
        Dialog::around(TextView::new("Hello, cursive_core!"))
            .title("Greeting")
            .button("Quit", |s| s.quit()),
    );
    
    // 运行应用
    siv.run();
}

核心组件

视图(View)

视图是cursive_core中的基本构建块。以下是一些常用视图:

use cursive_core::views::{Button, Checkbox, EditView, ListView, TextView};

// 文本框
let text_view = TextView::new("Static text");

// 可编辑文本框
let edit_view = EditView::new()
    .content("Editable text")
    .fixed_width(20);

// 按钮
let button = Button::new("Click me", |s| {
    s.add_layer(Dialog::info("Button clicked!"));
});

// 复选框
let checkbox = Checkbox::new().checked(true);

// 列表视图
let list = ListView::new()
    .child("Item 1", TextView::new("Details 1"))
    .child("Item 2", TextView::new("Details 2"));

布局

cursive_core提供多种布局方式:

use cursive_core::views::{LinearLayout, DummyView};

let layout = LinearLayout::vertical()
    .child(TextView::new("Top"))
    .child(DummyView) // 空白空间
    .child(LinearLayout::horizontal()
        .child(Button::new("Left", |_| {}))
        .child(DummyView.fixed_width(10))
        .child(Button::new("Right", |_| {}))
    )
    .child(DummyView.fixed_height(1))
    .child(TextView::new("Bottom"));

事件处理

cursive_core使用回调函数处理事件:

use cursive_core::Cursive;
use cursive_core::event::Key;
use cursive_core::views::TextView;

fn main() {
    let mut siv = cursive_core::default();
    
    let text_view = TextView::new("Press q to quit")
        .with_name("text");
    
    siv.add_layer(text_view);
    
    // 添加全局快捷键
    siv.add_global_callback(Key::Char('q'), |s| s.quit());
    
    // 动态更新视图
    siv.add_global_callback(Key::Char('u'), |s| {
        let mut text = s.find_name::<TextView>("text").unwrap();
        text.set_content("Updated!");
    });
    
    siv.run();
}

主题定制

可以自定义应用的外观:

use cursive_core::theme::{Theme, Color, Palette, BorderStyle};

fn main() {
    let mut siv = cursive_core::default();
    
    // 创建自定义主题
    let mut theme = Theme::default();
    theme.shadow = false;
    theme.borders = BorderStyle::Simple;
    theme.palette[Palette::Background] = Color::Dark(Default::default());
    theme.palette[Palette::View] = Color::Light(Default::default());
    
    siv.set_theme(theme);
    
    // ... 添加视图等
    
    siv.run();
}

完整示例

下面是一个简单的待办事项应用示例:

use cursive_core::{
    Cursive, 
    views::{Dialog, EditView, ListView, LinearLayout, TextView},
    traits::Nameable,
};

fn main() {
    let mut siv = cursive_core::default();
    
    // 创建输入框和列表
    let input = EditView::new()
        .with_name("task_input")
        .fixed_width(30);
    
    let list = ListView::new()
        .with_name="task_list");
    
    // 创建布局
    let layout = LinearLayout::vertical()
        .child(TextView::new("Add a new task:"))
        .child(input)
        .child(Dialog::around(list).title("Tasks"))
        .child(LinearLayout::horizontal()
            .child(Button::new("Add", add_task))
            .child(Button::new("Quit", |s| s.quit()))
        );
    
    siv.add_layer(Dialog::around(layout).title("Todo App"));
    
    siv.run();
}

fn add_task(s: &mut Cursive) {
    // 获取输入框内容
    let task = s.call_on_name("task_input", |v: &mut EditView| {
        let content = v.get_content();
        v.set_content("");
        content.to_string()
    }).unwrap();
    
    if !task.is_empty() {
        // 添加到列表
        s.call_on_name("task_list", |v: &mut ListView| {
            v.add_child(&task, TextView::new(""));
        });
    }
}

跨平台注意事项

cursive_core设计为跨平台工作,但不同平台可能有细微差异:

  • 在Windows上可能需要启用ANSI支持
  • 某些终端模拟器可能不完全支持所有功能
  • 复杂布局在小型终端上可能需要调整

进阶功能

  • 自定义视图:实现View trait创建自己的组件
  • 异步支持:与async/await集成
  • 多线程:从其他线程更新UI
  • 持久化:保存应用状态

cursive_core为构建丰富的终端应用提供了强大基础,结合cursive可以获得更多高级功能和现成组件。

回到顶部