vgtk 是 Rust 编写的声明式桌面 UI 框架,内置了 GTK 和 Gtk-rs。
示例
use vgtk::{ext::*, gtk, run, Component, UpdateAction, VNode};
use vgtk::lib::{gtk::*, gio::ApplicationFlags};
#[derive(Clone, Default, Debug)]
struct Model {
counter: usize,
}
#[derive(Clone, Debug)]
enum Message {
Inc,
Exit,
}
impl Component for Model {
type Message = Message;
type Properties = ();
fn update(&mut self, message: Message) -> UpdateAction<Self> {
match message {
Message::Inc => {
self.counter += 1;
UpdateAction::Render
}
Message::Exit => {
vgtk::quit();
UpdateAction::None
}
}
}
fn view(&self) -> VNode<Model> {
gtk! {
<Application::new_unwrap(None, ApplicationFlags::empty())>
<Window border_width=20 on destroy=|_| Message::Exit>
<HeaderBar title="inc!" show_close_button=true />
<Box spacing=10 halign=Align::Center>
<Label label=self.counter.to_string() />
<Button label="inc!" image="add" always_show_image=true
on clicked=|_| Message::Inc />
</Box>
</Window>
</Application>
}
}
}
fn main() {
std::process::exit(run::<Model>());
}
特性
- 受 Elm 架构、Redux 和 Yew 启发,采用了简洁、实用的组件模型
- 采用了一种声明式 DSL,用于组合受 React 和 JSX 启发的 GTK 小部件,使用虚拟“DOM”差异进行有效更新
- 完全跨平台,具有适用于 Linux、Windows 和 macOS 的原生外观
- 无需依赖嵌入式浏览器引擎
- 基于 Rust 的
Future
构建,使用 GLib 的事件循环,提供了与 GTK 事件模型干净集成的 async/await
评论