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日 |
#283 在 GUI
每月30次下载
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