8 个版本

0.2.6 2022年11月20日
0.2.5 2022年11月20日
0.2.2 2022年10月28日
0.1.0 2022年10月15日

243GUI 中排名

每月下载 28

GPL-3.0 许可证

56KB
1K SLoC

GtkUI

一种旨在提高 Gtk 应用程序开发可读性和整体效率的语言。

这种语言受到苹果公司 SwiftUI 语法的大力启发,通常是此项目的灵感来源。

这解决了什么问题?

看看这个非常基本的 "hello world"。

Hello World Gtk App

以下是您需要在标准的 "构建文件" 中编写的代码来获取这个。

<?xml version="1.0" encoding="UTF-8"?>
<interface>
   <requires lib="gtk" version="4.0" />
   <object class="GtkWindow" id="window1">
      <property name="title">My GTK App!</property>
      <child>
         <object class="GtkBox">
            <property name="homogeneous">1</property>
            <property name="visible">1</property>
            <child>
               <object class="GtkLabel">
                  <property name="label">Hello, world!</property>
                  <property name="visible">1</property>
                  <property name="margin-top">10</property>
                  <property name="margin-bottom">10</property>
               </object>
            </child>
         </object>
      </child>
   </object>
</interface>

这不是表示 UI 的非常可读或紧凑的方式。它是多余的,非常冗长。现在让我们看看它在 GtkUI 语法中可能是什么样子。

#include "gtk-4.0"

@root {
  GtkWindow {
    GtkBox {
      GtkLabel("Hello, world!")
        .visible(true)
        .align("center")
        .margin-top(10)
        .margin-bottom(10)
    }
    .homogeneous(true)
    .visible(true)
  }
  .id("window1")
  .title("My GTK App!")
}

这不仅代码更少,而且更准确地传达了 UI 的结构。您可以轻松地知道对象的子对象是什么,它有什么属性,更重要的是,像 GtkLabel 中的文本这样的信息,直接显示在对象旁边,这样您在浏览代码时可以很好地了解您在哪里。让我们尝试在我们的框中添加另一个 GtkLabel。它应该看起来像这样。

Second Label Image

以下是需要对构建文件进行的更改。

// ...

<object class="GtkBox">

  // ...

  // Add this

  <child>
    <object class="GtkLabel">
      <property name="label">My Second Label</property>
      <property name="visible">1</property>
    </object>
  </child>

</object>

// ...

不多说,这对于最基本的标签来说就是大量的代码。如果我们看看一些 GtkUI 代码...

// ...

GtkBox {
  GtkLabel("Hello, world!")
    .visible(true)
    .align("center")
    .margin-top(10)
    .margin-bottom(10)

  // Add this

  GtkLabel("My Second Label")
    .visible(true)
}

// ...

它既易于阅读又节省空间。

依赖项