GUI 编程
盘古 OS
的设计仍在逐步改进与完善中,本文将随时发生变化,感兴趣的朋友们可以时刻保持关注;- 在下方的版权声明中有本文作者的联系方式,有不同意见和相关建议的朋友可以与其保持联系;
- 也可在本文底部的评论区登录 Github 后,直接发表您的观点;
- 文章作者: flytreeleft - flytreeleft@crazydan.org
- 文章链接: https://studio.crazydan.org/docs/pangu-os/program-language/gui
- 版权声明: 本文章采用许可协议《署名 4.0 国际 (CC BY 4.0)》。 转载或商用请注明来自 Crazydan Studio!
基于函数化、数据结构化的图形用户界面(GUI)语言,
其用于构建 盘古OS
的用户交互界面。
该语言为开箱即用的GUI编程语言,
编程模式类似于 Elm(数据也集中管理和更新),
但运行方式类似于 HTML,
可直接执行,不需要编译,不需要特定的执行器(由 盘古OS
提供运行支持),
也不需要记忆各类复杂的组件,可快速编写并验证用户界面。
同时,将为该语言实现一套标准的可视化设计器和设计流程,方便进行统一、规范化的用户界面开发。
架构模式为:底层图形绘制引擎+纯函数 GUI 语言。
各个组件均为对象,且与代码可双向联动更新,即,调整组件时可立即反馈到对函数的修改, 修改函数时可即刻显示组件的变化。
实现目标
- 函数式 UI 编码
- 结构化数据模型,包含UI视图、业务模型,视图与业务双向联动
- 高性能、跨平台
- 跨平台指的是跨设备的能力,而非跨操作系统
- 自适应、响应式
- 布局方式,一种叫 Box Layout,一种叫 Constraint-based Layout
- 元素尺寸实时更新,元素自动增长
- 矢量绘图
- 矢量字体: TrueType
- 2D、3D 支持
- 随时均可快速编写可用界面
- 统一国际化机制,支持为不同设备设计不同界面
- 通过可逆计算的差量机制实现国际化
实现流程
- 图形渲染引擎绘制图形
- OpenGL: 3D图形库,不适合绘制2D图形
- SDL: 2D图形窗口库,可与OpenGL集成以支持3D绘制
- Vulkan: 跨平台的2D和3D绘图应用程序接口,OpenGL替代者。Vulkan支持多线程,OpenGL不支持多线程
- Skia: Skia is an open source 2D graphics library which provides common APIs that work across a variety of hardware and software platforms. It serves as the graphics engine for Google Chrome and ChromeOS, Android, Flutter, Mozilla Firefox and Firefox OS, and many other products.
- 事件、布局、动画管理
实现细节
- 滚动条可自定义样式,设置监听等
- 仅为应用提供透明窗口,窗口内及窗口边框由应用处理
- 根据系统或窗口管理器的要求,对外提供窗口标题、状态等信息
- 内置窗口放大、缩小、缩放等处理函数
- 窗口状态管理、业务模型管理
- 组件自身独立处理其内部的消息和状态,但可对外提供监听
- 独立窗口展示应用窗口状态树和调试信息,并可进行调试
- 视图可自动实现路由,支持任意层级的切换
- 独立启动的应用自动放在window组件中,应用内启动的其他应用以内嵌视图形式集成
- 远程GUI共享就是在设备间传递窗口的绘制函数和数据
- 界面只能局部无响应,不能出现整体假死,也不能阻塞鼠标、键盘等输入
- 能够确切地知道页面中所有元素就绪的时间,并可触发监听
- 任何规模和复杂度的组件都发送就绪事件
- 引擎是能够知道以组件为单位的渲染起止时间的
- 组件边缘可配置变化的样式和触发的事件,实现拖动、滚动、缩放等操作
- 桌面自身就是视窗容器
- 基础组件即为容器。无形状,无边界,只有从属,可以通过样式,从视觉上感知其边界范围
- 统一管理和查看隐藏和透明窗口,以消除安全隐患
os.gui.desktop.window
os.gui.message
div({
id: 'panel',
style: {
color: Color.Red,
fontSize: 10,
},
onClick: onClickFn,
}, [])
function onClickFn(e) {
alter('Clicked');
}
开发实验
采用Elixir开发,并在底层调用SDL接口绘制2D窗口,再在需要时通过SDL与OpenGL/Vulkan集成实现3D渲染
Debian升级: https://wiki.debian.org/DebianUpgrade
Golang下载地址: https://go.dev/dl/
export http_proxy=http://192.168.10.47:6418; export https_proxy=$http_proxy
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138 0E98404D386FA1D9 605C66F00D6C9793
apt-get install gcc bash-completion vim openssh-server terminator fonts-noto git rsync
参考
LVGL: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type. It's boosted by a professional yet affordable drag and drop UI editor, called SquareLine Studio.
FyneDesk: FyneDesk is an easy to use Linux/Unix desktop environment following material design. It is built using the Fyne toolkit and is designed to be easy to use as well as easy to develop.
Immediate Mode Graphical User Interfaces
- Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies
U++ GUI Tutorial: U++ is a C++ cross-platform rapid application development framework focused on programmers productivity. It includes a set of libraries (GUI, SQL, etc.), and an integrated development environment.
- 完整的开发库,包括GUI、IDE等开发工具