61

0

Vgtk

基于 GTK 和 Gtk-rs 的 Rust 声明式桌面 UI 框架

vgtk

一个基于GTKGtk-rs的 Rust 声明式桌面 UI 框架。

乍看上去

文档

看看!

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>());
}

安装

在使用 vgtk. 有关详细说明,请参阅Gtk 文档。它尤其适用于 Windows,但如果您仔细按照他们的说明进行操作,它最终会起作用。

入门

你可以cargo generate用来启动一个 vgtk 项目:

cargo generate --git https://github.com/bodil/cargo-template-vgtk

或者,如果您不想安装 cargo generate,您可以克隆 模板存储库并手动编辑 Cargo.toml文件以适合您的项目。

要运行您的应用程序,请进入项目文件夹并输入 cargo run,然后惊叹于最终出现的小窗口以及您可以填充它的奇迹。

例子

请参阅示例文件夹以获取示例应用程序的集合,包括完整的 TodoMVC实现。要试用 TodoMVC 示例,请从项目根目录克隆 vgtkrepo 和 issue 。cargo run --bin todomvc

执照

该程序是免费软件:您可以根据自由软件基金会发布的 GNU 宽通用公共许可证(许可证的第 3 版或(由您选择)任何更高版本)的条款重新分发和/或修改它。

分发此程序的目的是希望它有用,但不提供任何保证;甚至没有对适销性或特定用途适用性的默示保证。有关更多详细信息,请参阅 GNU 通用公共许可证。

您应该已经收到了一份 GNU 宽通用公共许可证的副本以及这个程序。如果没有,请参阅https://www.gnu.org/licenses/