Gio-view: 使用Go快速开发GUI

1,016 阅读3分钟

Gioview是我近期开源的一个GUI相关项目,用于构建基于Gioui的原生应用。 叫它toolkit其实不太贴合我对它的期望,它不是一堆widget/component的组合,更像是一个framework。

以下是示例的屏幕截图:

Screenshot-1.png

Screenshot-2.png

Screenshot-3.png

动机

近大半年来迷恋GUI,准确来说是Gio。 断断续续的读了很多它的代码,核心库,扩展库,包括第三方的一些组件库也都有涉猎,因为要写编辑器,所以字体渲染、排版和编辑器相关的代码也是反复研读了很多遍。迷恋它是因为很凑巧它符合我的技术审美,没有其他的依赖,不是某个现成图形库的wrapper项目,也不像electron这些框架一样依赖webview去渲染,它使用的是OpenGL或Vulkan来完成显示操作。而窗口管理,IO设备的事件处理则是用CGO对系统API进行了集成。Gio实现的是一种叫做Immediate mode GUI, 因此组件方面是一种非传统的设计, 使用函数形式的widget tree对各类事件进行快速处理,据说这种模式在游戏开发领域比较多。

Gio有很多好的方面,但是学习曲线长,上手难度大,但对普通开发者来说确实不太友好。雪上加霜的是官方文档非常简陋,初学者很难从里面找到快速上手的例子。另一方面,Gio的生态并不大,鲜有成熟可用的第三方组件库,商业开发的案例更是很少见到,当然这和核心开发者对项目的投入不大是有很大关系的。

编写一个复杂的GUI程序,不只是需要组件库,不只是处理渲染,布局等等问题, 提供更高层次的抽象,组件间的通信等问题也很重要。所有这些问题堆积起来,使得从头开发一个GUI程序比web生态的UI开发要难很多。

看起来Gio问题挺多,但那些问题并不妨碍它是一个有趣、有潜力的GUI库。Gioview即是我对解决这些问题的一次尝试,如前面说的,它并不是想替代Gio的某一部分,而是成为Gio之上的一个framework, 让普通的Go使用者能快速开发GUI程序,同时也为开发者提供更丰富的学习Gio的案例。当然Gioview不是凭空创建出来的,在这之前它是我的Fernnote项目的一部分。

开发计划和方向

  1. view和view管理器,这部分已经完成了,但是依赖抽象的tab管理模式,不知其他场景下有没有局限性。
  2. i18n: 集成多语言框架,这部分在Fernnote里已经解决了,但并未移植过来。
  3. 更多的UI layout算法,如table/grid。
  4. 设计新的icon widget替代官方的icon widget. 官方的icon使用了一种非常小众甚至是不成熟的iconvg的格式。生产这种格式的工具缺乏,导致目前只能用golang shiny库里预编译的icon,只能望梅止渴于前端流行的svg icon, font icon。目前也没有实现SVG的渲染,因此可能会走font icon的路线了。
  5. 富文本渲染和编辑。
  6. 其他更高阶的控件。
  7. 移动端适配。Gio支持主流的移动平台,因此这部分工作更多的是组件布局和样式方面的。

如果你对GUI感兴趣,同时也想使用Go来开发GUI,不妨试试Gioview吧:github.com/oligo/giovi…