1个稳定版本

7.0.0 2024年2月19日

#151 in GUI

GPL-3.0-only

600KB
12K SLoC

克洛克

克洛克是新型的Czkawka前端,使用Slint编写,与主要使用C代码的Gtk 4前端不同。

Krokiet

不同的工具包意味着不同的外观、限制和功能,因此您不应期望与Gtk 4前端相同的功能(但当然我希望实现其他项目中大部分功能)。

用法

克洛克不应有任何特殊的运行时要求 - 它应该在几乎任何设备上运行,包括非抗性设备。

预构建的二进制文件应在Windows 10、11、Mac、Ubuntu 22.04/20.04以及类似操作系统上工作 - https://github.com/qarmin/czkawka/releases/

编译

在Ubuntu上,您需要安装以下依赖项

sudo apt install libfontconfig-dev libfreetype-dev

默认编译是通过 cargo build --release 完成的,并且应该在大多数系统上工作。

您需要最新版本的Rust来编译它,因为克洛克旨在支持最新的Slint版本,这应该提供最佳体验。

唯一的例外是构建skia渲染器,这是一个非默认功能,如果需要使用它,可以手动启用,这需要在Windows上使用msvc编译器(不确定如何确切安装)。

此外,skia渲染器是用C++编写的,并在x86_64和arm64等平台上使用预构建的二进制文件,因此如果您使用不同的架构,此库将从源代码构建,这可能需要很长时间并需要额外的依赖项。

附加渲染器

默认情况下,仅启用了femtovg(opengl)和软件渲染器,但您可以通过在编译应用程序时启用附加功能来启用更多渲染器。

大多数用户将希望使用具有窗口系统/合成器的应用程序,因此建议使用以 winit 命名的功能。

例如。

cargo build --release --features "winit_skia_opengl"
cargo build --release --features "winit_software"

要使用不同的渲染器运行应用程序,您需要使用它,通过添加 SLINT_BACKEND 环境变量

SLINT_BACKEND=winit-femtovg ./target/release/krokiet
SLINT_BACKEND=software ./target/release/krokiet
SLINT_BACKEND=skia ./target/release/krokiet # This uses now opengl - https://github.com/slint-ui/slint/discussions/3799

当您使用无效的/不存在的后端时,应用程序将显示警告

slint winit: unrecognized renderer skia, falling back to FemtoVG

要检查实际使用的内容,请添加 SLINT_DEBUG_PERFORMANCE=refresh_lazy,console,overlay 环境变量

SLINT_DEBUG_PERFORMANCE=refresh_lazy,console,overlay cargo run

应打印类似的内容

Slint: Build config: debug; Backend: software

不同的主题

应用是以深色流畅主题为基础创建的,但在编译时可以通过将环境变量 SLINT_STYLE 设置为 fluent-light 来使用浅色主题,例如。

SLINT_STYLE=fluent-light cargo run -- --path .

Slint 还支持其他主题,但它们不是由本应用程序官方支持,可能存在错误(但看起来与当前的样式搭配的 cupertino 看起来相当不错)。

SLINT_STYLE=cupertino-light cargo run -- --path .
SLINT_STYLE=cupertino-dark cargo run -- --path .
SLINT_STYLE=material-light cargo run -- --path .
SLINT_STYLE=material-dark cargo run -- --path .

如何帮助?

  • 建议在 GUI 中进行可能的设计更改——当然,它们应该在 slint 中简单地实现,同时考虑到性能方面。
  • 修改用户界面——GUI 使用类似于 qml 的简单语言编写,可以在 vscode/web 中进行修改并实时预览——slint 实时预览示例
  • 改进应用程序的 Rust 代码

为什么选择 Slint?

有许多原因让我决定在 Krokiet 中使用 Slint 作为工具包,而不是其他工具包。

工具包 优点 缺点
Gtk 4 - 优秀的 Linux 支持
- Cambalache 可以用来创建图形 GUI
- 优秀的 gtk4-rs 绑定(但有时不太直观)
- 硬编译/交叉编译,并在 Windows 上捆绑所有必需的库
- 强制使用特定的 GUI 创建风格
- 奇怪的错误,基本功能无法使用等(主要在 Windows 上)
- 强制在 Linux 上使用有缺陷/过时的但动态加载的库版本(例如 Ubuntu 22.04 上的 4.6)——并非所有修复都已回溯
Qt - QML 支持——简化了从代码创建 GUI,易于使用且功能强大
- 非常灵活的框架
- TypeScript/javascript 与 QML 互操作性
- 可能是最成熟的 GUI 库
- 新的 Qt 绑定有限
- 交叉编译困难
- 在 QML 中创建和使用无效状态非常容易(意外的 null/undefined 值,混乱的属性绑定等)
- 商业许可证或 GPL
Slint - 内部语言编译成原生代码
- 使用 Vscode/Vscodium 进行实时 GUI 预览,无需使用 Rust
- 全 Rust 解决方案——易于编译/交叉编译,运行时需求最小化
- Slint 文件中的静态类型检查
- 内部 .slint 语言比 QML 更有限
- 越界和类似错误被静默地纠正而不是打印错误——这可能导致难以调试的问题
- 只提供 GPL 开源许可证
- 弹出窗口几乎不存在
- 内部小部件几乎不可定制,通常相当有限
Iced - ~100% Rust 代码——因此编译简单
- Elm 架构——易于理解
- 主要由一个人维护——修复错误和实现新功能的速度减慢
- GUI 只能从 Rust 代码创建,这对于创建复杂的 GUI 来说真的很糟糕(主要由于 Rust 编译时间)
- 文档几乎不存在
Tauri - 容易创建 UI(至少对于 Web 开发者来说)——使用 html/css/js
- 比较便携
- Webview 依赖——它并不真正轻量级,在一些平台上编译困难,例如在 Linux 上 webRTC 无法工作
- 无法选择目录——文件选择器只能选择文件——虽然小事,但对我来说很重要
- Rust 与 Javascript 之间的通信性能不佳(在 Tauri 2 中问题较少)

由于我没有时间创建复杂且美观的 GUI,我需要一个辅助工具来创建 GUI 而不是从 Rust 创建(我不想使用不同的语言,因为这会使与 czkawka_core 的通信更加困难),所以我决定不查看只允许从 Rust 创建 GUI 的 Iced。

GTK和QT也因为C/C++内部使用造成的交叉编译问题而被我放弃。在Czkawka中使用GTK是我开始寻找其他工具包的原因。

Tauri - 我并不真的喜欢使用JavaScript,因为我已经使用过Qt(C++) + QML + TypeScript的组合,并且我发现用这种语言创建UI可能一开始很简单,但后来任何较大的更改都会导致许多运行时错误。

因此,只剩下Slint及其优缺点。

许可证

代码根据MIT许可证授权,但由于Slint许可证的限制,整个项目是根据GPL-3.0许可证授权的。

名称

为什么叫Krokiet(英文:Croquette)?
因为我喜欢波兰语的krokiet(即croquette),特别是有肉、蘑菇包裹在面包糠中的那种,它让我垂涎欲滴。
我还考虑了其他我喜欢的食物,比如 pierogi、żurek、pączek、schabowy或zapiekanka。
这个名字应该比czkawka或szyszka更容易记住。

依赖项

~61–105MB
~1.5M SLoC