#gtk #xml #serde #ui

gtk_comfy

Gtk Comfy 提供了一种在 GTK 构建器文件中使用 serde 格式的解决方案

11 个不稳定版本 (3 个破坏性更新)

0.4.4 2022年2月6日
0.4.3 2021年10月23日
0.3.0 2021年10月16日
0.2.0 2021年9月17日
0.1.3 2021年9月4日

#283GUI

每月30次下载

GPL-3.0 或更高版本

20KB
278

Gtk Comfy

Gtk Comfy 是改进 GTK 构建器文件的一个尝试。虽然代码和界面之间的分离是好的,但实现方式不佳。XML 很棘手且难以理解

示例

<?xml version="1.0" encoding="UTF-8"?>
<interface>
  <object class="GtkApplicationWindow" id="window">
    <property name="title">My GTK App</property>
    <child>
      <object class="GtkButton" id="button">
        <property name="label">Press me!</property>
        <property name="margin-top">12</property>
        <property name="margin-bottom">12</property>
        <property name="margin-start">12</property>
        <property name="margin-end">12</property>  
      </object>
    </child>
  </object>
</interface>

因此,使用 GTK Comfy,您可以使用任何与 serde 兼容的格式,如下面的示例所示

# The root interface
interface:
  # The class of the object (reserverd keyword)
  class: GtkApplicationWindow

  # The id of the widget (reserved keyword)
  id: window

  # The title property. See that properties are automatically infered
  title: My Gtk App

  # The children
  children:
    - class: GtkButton
      id: Button
      label: Press me!
      margin-start: "12"
      margin-top: "12"
      margin-bottom: "12"
      margin-end: "12"

特性

Gtk Comfy 提供了许多便利特性,例如

  • 推断属性,如果它不识别变量,则将其推断为属性(参见上述示例中的 title。)
  • 子类型,如果小部件被赋予了 child_type 属性,则可以设置子类型(我不记得何时需要这个,但确实需要。)
  • Pango 属性。对于标签(以及类似的东西),您可以使用 attributes 提供属性映射(如下面的示例。)
  • 样式类,提供在 style 数组中。
  • 网格,支持子项中的 layout
  • interface 的翻译域。
  • 翻译

示例

Rust 中使用

在您的构建脚本中放置以下类似内容

use std::fs;

// Load the UI.
let interface: gtk_comfy::Interface =
    serde_yaml::from_str(include_str!("ui.yaml"))?;

// Write it as xml.
fs::write(
    "ui.xml",
    interface.to_string(),
)?;

属性

class: GtkLabel
label: "This is a red label"
attributes:
  foreground: '#FF0000'

样式

class: GtkBox
orientation: "horizontal"
style:
  - linked
children:
# ...

网格

class: GtkGrid
  id: grid
  children:
  - class: GtkButton
    id: button1
    label: Button 1
    layout:
      column: 0
      row: 0
  - class: GtkButton
    id: button2
    label: Button 2
    layout:
      column: 1
      row: 0
  - class: GtkButton
    id: button3
    label: Button 3
    layout:
      column: 2
      row: 0
      row-span: 2
  - class: GtkButton
    id: button4
    label: Button 4
    layout:
      column: 0
      row: 1
      column-span: 2

翻译域

domain: "whatever_this_value_does_i_have_no_idea_what_it_is"
interface:
  class: GtkWindow
  #...

翻译

翻译可以如下进行

label:
  translatable: Save
  comment: For saving the state

可扩展性

如果您需要将其扩展以添加自定义 XML(因为这个应用程序并不完美),则可以使用 xml 属性

xml: <property name="label">

依赖关系

~0.7–1.3MB
~35K SLoC