#terminal #graphics #command-line-interface #tui #rustty

rustty-oxide

一个易于使用和可扩展的Rust终端应用程序GUI库。

1个不稳定版本

使用旧的Rust 2015

0.1.0 2017年10月23日

#541GUI

GPL-3.0 许可证

51KB
853

Oxide:rustty与小部件

一个易于使用和可扩展的Rust终端应用程序GUI库。

简介

Oxide是rustty的一个附加扩展,它提供了一个基于小部件的API,用于构建终端UI应用程序。该项目深受Python的Tkinter的启发,并旨在简单和模块化。

查看GameOfLife以了解Oxide能做什么的示例,如果您在使用Oxide时遇到问题,请随时提交问题。

有关使用rustty的文档,请参阅https://github.com/cpjreynolds/rustty

设计理念

Oxide建立在这样一个理念之上:所有GUI元素最初都是一个小部件,并且可以后来专门用于某些任务。通过为所有UI组件提供一个共同的祖先,Oxide可以概括组件之间的交互,并为开发者创建一个易于扩展的接口。为了可视化这种关系,请参见下面的图1。

fig 1

上面的UML图并不完全准确(省略了一些任意信息和关系),但它为您提供了所有UI元素如何连接的总体概述。一个小部件提供了最基本UI元素所需的所有基本功能,如绘制、调整大小和对齐。按钮是一个更高级的小部件,因此继承自按钮,这是一个具有额外功能的小部件。

上述信息对于仅使用默认UI组件的应用程序来说并不是特别有用,但在设计自定义小部件时将很有帮助。

基于小部件的编程

如果您曾经使用过Python的Tkinter,您会发现Oxide的结构与它相似(尽管不那么先进)。

要开始使用小部件,您最基本且最广泛使用的容器将是Dialog。对话框的任务是将小部件组合在一起,并充当聚合器,这是一个接受其他小部件以便于管理的窗口。创建对话框很简单

let mut dlg = Dialog::new(60, 10);	// create dialog 60 terminal columns wide, 10 terminal rows long
dlg.draw_box();				        // draw the border or the dialog

现在我们有了对话框,我们可以向其中添加UI元素

let mut b1 = StdButton::new("Quit", 'q', ButtonResult::Ok);		        // Create a stanard button
b1.pack(&maindlg, HorizontalAlign::Left, VerticalAlign::Bottom, (4,2));	// Align button within dialog

// move b1 into dlg, giving ownership to the dialog
dlg.add_button(b1);	

太棒了!现在我们有一个带有按钮的对话框窗口,我们可以在主循环的事件轮询阶段使用它

// Poll events instantly, no delay
while let Some(Event::Key(ch)) = terminal.get_event(Duration::from_secs(0)).unwrap() {
    // Check to see if the event was a button press for anything inside dlg
    match dlg.result_for_key(ch) {
        Some(ButtonResult::Ok) => break 'main,
        _ => {},
    }
}

小部件仍然可以作为独立对象使用,但对话框有助于将一切整合在一起,以便您更好地组织UI。

了解Oxide小部件的一个好方法是将它们视为简单地专门化框架,它们拥有一个单元格区域,并根据该专门化执行操作。在其核心,小部件实现了一个框架和一些基本的特质专门化。以标签为例

pub struct Label {
    frame: Frame,
    text: Vec<String>
    // ...
}

在这个例子中,我们的小部件有一个框架,并使用text在这个框架中绘图。Frames表示小部件拥有的一块区域。多个小部件可以拥有相同的单元格,但每个小部件只关注自己。对于标签来说,我们希望将文本写入单元格区域。与其他小部件一样,这个标签可以被对话框拥有、打包并绘制到屏幕上。

任何小部件都实现了基本功能:绘图、打包、轮廓化、调整大小和返回框架。在大多数情况下,实际的小部件是框架,而像LabelButton这样的结构封装框架以提供特殊功能。

创建自定义小部件

在默认的UI组件集不足以满足你的GUI需求的情况下,Oxide允许你轻松地扩展现有的小部件,甚至可以使用核心特质创建全新的小部件。

假设StdButton对你来说不够用,你需要一个总是将文本以红色打印的按钮。在创建任何自定义小部件时,你需要以下要求

  1. 新组件包含一个oxide::core::Frame或一个oxide::core::Canvas
  2. 新组件实现了Widget

使用指南

示例和用法建议可以在API文档中找到。

联系方式

给我发电子邮件

依赖关系

~2–10MB
~112K SLoC