1个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年10月23日 |
---|
#541 在 GUI
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。
上面的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
表示小部件拥有的一块区域。多个小部件可以拥有相同的单元格,但每个小部件只关注自己。对于标签来说,我们希望将文本写入单元格区域。与其他小部件一样,这个标签可以被对话框拥有、打包并绘制到屏幕上。
任何小部件都实现了基本功能:绘图、打包、轮廓化、调整大小和返回框架。在大多数情况下,实际的小部件是框架,而像Label
或Button
这样的结构封装框架以提供特殊功能。
创建自定义小部件
在默认的UI组件集不足以满足你的GUI需求的情况下,Oxide允许你轻松地扩展现有的小部件,甚至可以使用核心特质创建全新的小部件。
假设StdButton对你来说不够用,你需要一个总是将文本以红色打印的按钮。在创建任何自定义小部件时,你需要以下要求
- 新组件包含一个oxide::core::Frame或一个oxide::core::Canvas
- 新组件实现了Widget
使用指南
示例和用法建议可以在API文档中找到。
联系方式
依赖关系
~2–10MB
~112K SLoC