目前,Capy 还不适合在生产环境中使用,因为我仍在进行破坏性更改
Capy 针对 Zig 版本 0.13.0-dev.351+64ef45eb0
/ 2024.5.0-mach
(指定的 Zig 版本)
,但它也适用于 Zig 0.13.0
简介
Capy 是一个 Zig 的 GUI 库。它主要用于使用操作系统的原生控件创建应用程序。 Capy 是一个声明式 UI 库,旨在易于编写和多功能。
它的开发目标是为独立的 UI 应用程序赋能,而不是集成到游戏或其他渲染过程中。
特性
- 使用 Zig 编写前端和后端
- 可访问性:与几乎所有辅助工具兼容
- 跨平台
- 使用目标操作系统的工具包
- 可从任何平台交叉编译到任何其他平台
- 可执行文件体积小 - 每个示例的大小 < 2MB,比 Go 中的 'hello world' 还小
入门
如果你要开始一个新项目,只需克隆 capy-template 并按照构建说明进行操作。
否则或需要更多信息,请查看文档。
你可以在 #capy-ui Matrix 频道提问并接收更新。
用法
使用 capy 的简单应用程序:
const capy = @import("capy");
const std = @import("std");
pub fn main() !void {
try capy.backend.init();
var window = try capy.Window.init();
try window.set(
capy.column(.{ .spacing = 10 }, .{ // 列元素之间有 10px 的间距
capy.row(.{ .spacing = 5 }, .{ // 行元素之间有 5px 的间距
capy.button(.{ .label = "保存", .onclick = @ptrCast(&buttonClicked) }),
capy.button(.{ .label = "运行", .onclick = @ptrCast(&buttonClicked) })
}),
// Expanded 意味着小部件将在父容器中占用所有可用空间
capy.expanded(
capy.textArea(.{ .text = "你好,世界!" })
)
})
);
window.setPreferredSize(800, 600);
window.show();
capy.runEventLoop();
}
fn buttonClicked(button: *capy.Button) !void {
std.log.info("你点击了文本为 {s} 的按钮", .{button.getLabel()});
}
添加按钮或文本区域等元素非常简单。从这个例子中可以看出,小部件的参数通常封装在匿名结构中(.{ .label = "保存" }
)。你还可以看到,只需用 capy.Expanded( ... )
包装一个小部件,就可以告诉它占用所有可用空间。
贡献
贡献可以简单到提出一个问题,详细说明你遇到的错误或希望添加的功能。 如果你想更直接地帮助项目,你可以 fork 项目,然后创建一个拉取请求。
支持的平台
只有当一个平台可以从其他所有操作系统构建时,才被视为受支持。
桌面
✅ Windows x86_64
✅ Windows i386
🏃 macOS M1
🏃 macOS x86_64
✅ Linux x86_64
✅ Linux i386
✅ Linux aarch64 (PinePhone, PineBook...)
✅ FreeBSD x86_64
移动
🧪 Android
🏃 iOS
网页
✅ WebAssembly
- ✅ 可用且可从 Zig 支持的所有平台交叉编译
- 🧪 实验性
- 🏃 计划中
注意:由于 Linux 没有"官方"的 GUI 库,选择了 GTK 4,因为它在大多数发行版上都能工作并可以配置。这也是不采用 Libadwaita 的原因,因为它仅适用于 GNOME,通过禁止样式化和与其他桌面环境的集成来限制使用。