用途
Makepad 2.0 DSL 语法技能面向使用 Makepad 构建或调试 UI 代码的场景,提供基于上游 Splash/script_mod! 生成流程的语法参考。资料明确说明,这并非完整稳定的 Makepad 语言规范,迁移既有 live_design 应用前应先从 Cargo.lock 记录确切的 Makepad git 修订版本,检查该版本的 widget/script 源码并编译最小示例,不应仅因包名为 2.0 就混用两代写法。
主要能力
资料覆盖的语法规则包括:
- 属性赋值使用冒号 key: value,而非等号;同级属性以空白或换行分隔,不用逗号。
- 命名实例使用 := 运算符,创建可寻址的 widget 实例,可从 Rust 通过 id!(my_button) 或 ids!(my_button) 访问,也可用点路径覆盖;命名子项存入 script 对象的 vec,普通属性存入 map。
- 合并运算符 +: 在父级基础上扩展而非替换,例如 draw_bg +: { color: #f00 } 只覆盖颜色;若用 draw_bg: 则会替换全部属性。
- 点路径简写等价于合并,如 draw_bg.color: #f00 等价于 draw_bg +: { color: #f00 }。
- let 在 script_mod! 块内创建局部可复用模板,可通过实例化并覆盖命名子项复用;let 绑定仅限当前块,跨模块共享需存于 mod.widgets.*。
- 展开运算符 .. 用于继承其他定义的全部属性。
- script_mod! 模块结构、应用基本结构、widget 与组件及 draw shader 的注册模式、set_type_default() 用法,以及注册顺序要求(widget 模块必须先于使用它的 UI 模块注册)。
- Prelude 系统:mod.prelude.widgets.* 用于应用开发,mod.prelude.widgets_internal.* 用于 widget 库内部开发;Prelude 别名语法可创建 theme、draw 等可访问名称。
- 跨模块共享只能通过 mod 对象,crate. 前缀在 script_mod 中不可用。
- 运行时属性更新使用 script_apply_eval! 并以 #(expr) 插值 Rust 表达式,替代旧的 apply_over + live!。
- 用 ~expression 在脚本求值期间输出调试日志。
使用方式
资料以语法示例形式给出正确与错误写法对照,包括应用骨架、widget 定义模块、注册模式与多模块聚合(lib.rs 模式)。使用时应按注册顺序组织:先基础 widgets,再自定义 widgets,再使用它们的 UI,最后 App 组件。资料同时给出安全提示:不得将不受信任的文本插入可执行脚本/DSL,文本应通过类型化属性/API 设置,校验资源路径并避免记录敏感模型或用户值。
常见陷阱
资料列出十类问题:缺少 #[source] source: ScriptObjectRef 字段;容器缺少 height: Fit 导致尺寸无法解析;混淆 : 与 := 造成匿名不可寻址;忘记 +: 导致属性被整体替换;使用旧版主题常量写法而非 theme.color_bg_app;含 e 的十六进制颜色被解析为科学计数法,需加 #x 前缀;在 script_mod 中使用 pub 无效;margin/padding 等需用 Inset{...}、Align{...} 构造语法;draw shader 结构中非实例数据字段须置于 #[deref] 之前,否则破坏 GPU 缓冲区;以及 script_mod! 中首个代码前不能有注释等。
适用场景与限制
适用于编写或调试 Makepad 2.0 UI 代码、迁移旧 live_design 应用时的语法对照。限制包括:必须对照当前 Makepad 2.0 文档核验,上游 API 变动频繁;未经用户明确同意不得运行随附脚本;着色器与布局示例仅为部分片段,需跨目标 GPU/平台、DPI 与键盘/无障碍行为验证;更详细的注释顺序等问题需参阅其扩展指南文件。