- 前端
- UI组件
- 3D渲染
- 跨平台
- 游戏开发
【免费下载链接】makepad
Makepad is a creative software development platform for Rust that compiles to wasm/webGL, osx/metal, windows/dx11 linux/opengl
IconSet 是 Makepad 控件库中用于显示字体图标的专用控件,它以 FontAwesome 图标字体(fa-solid-900.ttf)为数据源,通过text属性直接填入图标的 Unicode 码位即可渲染出图标,并天然继承 Makepad 的 Live 主题体系。读完本文你将掌握 IconSet 的全部属性与样式配置方式,能通过draw_text、text_style实现图标颜色、字号、行距与字体族的精细控制,并能在 uizoo 这类演示工程里复现它的完整用法。
控件概述:什么是 IconSet
根据 iconset.md 的定义,IconSet 是一个基于 FontAwesome 的图标集控件("FontAwesome IconSet")。它并非一个独立实现的复杂控件,而是直接复用 Makepad 的文本标签控件 Label 并覆盖其默认样式而成——这一点在 label.rs 的脚本注册代码中可以直接看到:
mod.widgets.IconSet = mod.widgets.Label{ width: Fit draw_text +: { ink_centered: false text_style: theme.font_icons{ line_spacing: theme.font_wdgt_line_spacing font_size: 100. } color: theme.color_text } text: "Car" }从源码结构可以看出,IconSet 与 Label 是同一套渲染管线:控件内部持有DrawText,绘制时调用draw_text.draw_walk(cx, walk, self.align, self.text.as_ref())完成字形光栅化(见 label.rs)。因此,任何关于文本对齐、换行、溢出截断、悬停上报的机制,IconSet 都天然具备。
IconSet 的核心定位是"以字库为图标源":它不加载 SVG 路径,也不生成位图,而是让图标字体里的字形直接参与文本排版。这与同目录下的 Icon 控件(基于单色 SVG 矢量路径渲染)形成互补——前者适合工具类 UI 图标、操作按钮图形,后者适合精细的品牌图形与自定义路径。
核心属性(Attributes)
IconSet 的属性全部继承自 Label 控件,以下是 iconset.md 给出的完整属性清单及其实际行为:
| 属性 | 类型 | 作用 |
|---|---|---|
align | Align | 文本在布局区域内的对齐方式(水平/垂直),决定字形落点 |
draw_text | DrawText | 文本绘制对象,承载颜色、字形样式等全部绘制参数 |
flow | Flow | 内部布局流向,默认Flow::right_wrap() |
hover_actions_enabled | bool | 是否上报鼠标悬停动作(HoverIn/HoverOut),默认false |
padding | Padding | 内边距,默认theme.mspace_1 |
text | String | 图标文本内容,通常是 FontAwesome 图标的 Unicode 码位 |
对应到 label.rs 中Label结构体的字段声明,可以看到除了上述属性外,控件还支持max_lines(最大行数,0表示不限)与text_overflow(溢出处理,配合Ellipsis可显示省略号)。text以ArcStringMut存储,支持运行时通过set_text动态更新并触发重绘。
样式属性(Styling Attributes)
IconSet 的样式全部通过draw_text子树配置,层级结构如下:
draw_text ├── color (Color) └── text_style ├── font_size (float) ├── line_spacing (float) └── font_family (FontFamilyId)color:字形颜色,Color类型。默认取theme.color_text,随主题的暗/亮切换自动变化;也可以直接写成十六进制颜色,如#0ff。text_style:一个TextStyle对象,其中:font_size(float):字形字号,默认 100.0(见 label.rs);line_spacing(float):行距,默认取主题的theme.font_wdgt_line_spacing;font_family(FontFamilyId):字体族引用,默认是theme.font_icons,即主题注册的图标字体族。
text_style可通过+:{}增量覆盖语法局部修改,无需重建整个对象。例如在 uizoo 演示 中,每个图标都通过draw_text +: {color: #0ff}把字形刷成青色。
图标字体从哪来:theme.font_icons 与 fa-solid-900.ttf
IconSet 之所以被称为 FontAwesome IconSet,关键在于它的默认字体族指向主题的图标字体。在 font_policy.rs 中,install_theme_fonts为暗色、亮色、骨架三套主题统一注册了font_icons: TextStyle{font_family: #(icons) line_spacing: 1.2},而#(icons)字体族的实际资源在 theme_desktop_skeleton.rs 中定义:
font_icons: TextStyle{ font_family: FontFamily{ latin := FontMember{res: crate_resource("makepad_widgets:resources/fa-solid-900.ttf") asc: 0.0 desc: 0.0} } line_spacing: 1.2 }由此可以确认:图标源是随makepad_widgets打包的 FontAwesome Solid 900 字库(fa-solid-900.ttf),且asc、desc均为 0.0,即字形以字体自身请求的基线排布,不额外上下偏移。
如何使用 FontAwesome 码位:FontAwesome 图标的字形位于 Unicode 私有区(PUA),每个图标对应一个形如\u{f015}的码位。由于这些字形本质是"装在盒子里的图形"而不是常规大写字母,IconSet 特地将ink_centered设为false(见 label.rs 的注释:图标字形应该留在字体请求的基线上,而不是按文本视觉中心对齐)。这一点是 IconSet 与普通 Label 的关键差异:普通 Label 默认ink_centered: true,会以"墨迹重心"居中;图标字形若按此处理会偏离预期位置。
实战:在 uizoo 中查看并复现 IconSet 演示
仓库中的 uizoo 是一个控件演示工程,IconSet 是其 Dock 选项卡之一。其集成链路如下:
- app.rs 将
@tIconSet加入tab_set_2的标签列表; - app.rs 定义
tIconSet := DockTab{name: "IconSet" template: @PermanentTab kind: @TabIconSet}; - app.rs 将
DemoIconSet挂到UIZooTab布局下; - app.rs 在启动时注册
crate::tab_iconset::script_mod(vm),把演示所用的脚本模板加载进虚拟机。
实际的演示代码在 tab_iconset.rs,它把 16 个 FontAwesome 图标按flow: Right、间距30.横向排布:
mod.widgets.DemoIconSet = UIZooTabLayout_B{ desc +: { Markdown{body: "# IconSet\n\nIconSet displays font-based icons."} } demos +: { flow: Right spacing: 30. IconSet{text: "\u{f015}" draw_text +: {color: #0ff}} IconSet{text: "\u{f2bd}" draw_text +: {color: #0ff}} IconSet{text: "\u{f03e}" draw_text +: {color: #0ff}} IconSet{text: "\u{f15b}" draw_text +: {color: #0ff}} IconSet{text: "\u{f030}" draw_text +: {color: #0ff}} IconSet{text: "\u{f133}" draw_text +: {color: #0ff}} IconSet{text: "\u{f0c2}" draw_text +: {color: #0ff}} IconSet{text: "\u{f0d1}" draw_text +: {color: #0ff}} IconSet{text: "\u{f164}" draw_text +: {color: #0ff}} IconSet{text: "\u{f118}" draw_text +: {color: #0ff}} IconSet{text: "\u{f025}" draw_text +: {color: #0ff}} IconSet{text: "\u{f0f3}" draw_text +: {color: #0ff}} IconSet{text: "\u{f007}" draw_text +: {color: #0ff}} IconSet{text: "\u{f075}" draw_text +: {color: #0ff}} IconSet{text: "\u{f0e0}" draw_text +: {color: #0ff}} IconSet{text: "\u{f1b9}" draw_text +: {color: #0ff}} } }参考 FontAwesome 的码位表,这些示例对应:\u{f015}(房子/home)、\u{f2bd}(用户头像)、\u{f03e}(图片)、\u{f15b}(文件)、\u{f030}(相机)、\u{f133}(电源)、\u{f0c2}(云)、\u{f0d1}(购物车)、\u{f164}(回复箭头)、\u{f118}(笑脸)、\u{f025}(音乐)、\u{f0f3}(铃铛)、\u{f007}(用户)、\u{f075}(对话气泡)、\u{f0e0}(邮件)、\u{f1b9}(插头)。演示代码同时展示了两个重要能力:一是多个图标可在同一容器内按flow: Right排列;二是每个实例可独立覆盖draw_text,实现同屏多配色。
一个可直接套用的最小示例
在任意 Makepad 工程中(例如基于makepad_widgets的 app),在 Live DSL 里声明:
IconSet{ text: "\u{f015}" draw_text +: { color: #0ff text_style +: { font_size: 24. line_spacing: 1.2 } } }要点归纳:
- 大小控制:图标尺寸由
text_style.font_size决定(默认 100.0 偏大,UI 场景常覆盖为 16~32); - 颜色控制:通过
draw_text.color设置,支持主题变量(如theme.color_text)与直接色值两种写法; - 换字库:把
text_style.font_family换成#(...)指向的其它FontFamily,即可复用 IconSet 的渲染链路显示任意字体字形; - 悬停交互:需要做 Tooltip 或 hover 高亮时,将
hover_actions_enabled设为true,控件即会在鼠标进入/离开时派发LabelAction::HoverIn(Rect)/LabelAction::HoverOut(见 label.rs),且它只"报告"指针位置、绝不抢占指针捕获,因此不会破坏外层列表/滚动的手势(这一行为有专门的单元测试pointer_capture_tests验证,见 label.rs)。
运行演示工程
要直观查看 IconSet 的实际渲染效果,可以运行 uizoo 工程(工程清单见 Cargo.toml):
cargo run -p uizoo启动后在 Dock 标签栏选择 "IconSet" 标签即可看到一排青色 FontAwesome 图标。本文所述内容均基于当前仓库源码(widgets/core与examples/uizoo)核实,若要在自己的 Makepad 应用中引入 IconSet,请确保依赖makepad_widgets且主题包含font_icons(该样式由 font_policy.rs 在主题安装阶段自动注册)。
关键参考路径
- 控件文档:examples/uizoo/resources/iconset.md
- 控件定义与实现:widgets/core/src/label.rs(IconSet 别名定义见 L241-L255,Label 结构见 L266-L310,绘制与事件见 L344-L420)
- 图标字体注册:widgets/core/src/font_policy.rs
- 图标字体资源:widgets/core/src/theme_desktop_skeleton.rs
- 演示集成:examples/uizoo/src/app.rs 与 examples/uizoo/src/tab_iconset.rs
- 前端
- UI组件
- 3D渲染
- 跨平台
- 游戏开发
【免费下载链接】makepad
Makepad is a creative software development platform for Rust that compiles to wasm/webGL, osx/metal, windows/dx11 linux/opengl
相关推荐
Dear ImGui 图标字体集成:将 FontAwesome 用 MergeMode 合并进主字体
Dear ImGui 图标字体集成:将 FontAwesome 用 MergeMode 合并进主字体 如果你的 Dear ImGui 应用里想直接在按钮、文本中
UI组件前端桌面应用图形学终极指南:如何在Pencil Project中高效集成与使用FontAwesome图标字体
终极指南:如何在Pencil Project中高效集成与使用FontAwesome图标字体 Pencil Project是一款免费开源的GUI原型设计与 dia
桌面应用amis Icon 图标组件完整指南:字体图标、SVG、URL 与 FontAwesome 多版本适配
amis Icon 图标组件完整指南:字体图标、SVG、URL 与 FontAwesome 多版本适配 导读 本文基于 amis 低代码框架的 Icon 图标组
前端低代码UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考