sdk: sb_icons 扩充动作图标 + TopAppBar 位图图标支持

TopAppBar 动作项此前用字体码点(⚙↻⌕)绘制,4k 字库无这些码点→豆腐。改走位图:
- sb_icons.h 追加 15 个 Material Symbols Rounded 动作位图(settings/refresh/search/
  play_arrow/pause/skip_next/skip_previous/arrow_back/close/add/check/lyrics/
  queue_music/download/heart),FILL=1 实心与状态栏一致;sb_icons[] 只追加(0-14 不变),
  动作索引 15-29。
- 生成脚本 tools/gen_action_icons.py(cairosvg svg→32x32 单通道 alpha,SVG 缓存
  icons_src/ 可复现、断网可跑)。
- meow_ui_gfx.c 抽取图标 blit 像素核心 icon_blit_px,新增 meow_gfx_blit_icon_ink
  (控件路径不标顶栏脏区);meow_gfx_blit_icon 状态栏路径行为不变。
- meow_ui_widget.c W_TOPAPPBAR 项支持位图模式:新 API meow_topappbar_set_item_icon
  (w, idx, icon_idx),绘制取主题 onSurface/按压向栏底色淡 12%,文本项行为不变;
  hit 用统一项宽。
- 公共头 widgets.h 加 MEOW_ICON_*(15-29) 枚举与 set_item_icon 声明;internal.h 声明
  meow_gfx_blit_icon_ink。
- 宿主测试(test_meow_ui_widgets)加 topbar 位图图标绘制/命中/按压变淡 + 状态栏 blit
  回归断言;test_umbrella 加 MEOW_ICON_* 编译期锁;MEOW_APP_SDK.md 补说明+索引表。
- 验证:宿主测试 ALL PASS(14项);交叉 zig 构建 0 warning;meow_ui.a 新 md5
  1d69cdae55ab5dde3a98f5e2124f3656。
This commit is contained in:
AskaEth committed 2026-09-02 03:24:46 +08:00
1 parent 41427fdcb3
commit 3611cbbbde
24 files changed
+1006 -22

No files matched your search

+50
View File
@@ -769,6 +769,56 @@ meow_widget *meow_layout_spacer(int w, int h);
> **说明**:多数 Material 组件是**既有设计模板(§5.2-§5.7)的「MD3 观感化」**——如 Card=圆角容器、BottomSheet 复用 §5.7 面板、Dialog 复用 §5.6 弹窗、TabBar 联动 §5.2 分页、列表容器复用 §5.5 listview。故 Material 子集**不重复造结构**,只把这些模板的绘制观感对齐 MD3 语义色 + 统一基座。**第二批已实现(M2.71/0.7.66,见 §5.8.8)**。
> **TopAppBar 位图动作图标(M2.9x,追加式)**:TopAppBar 动作项默认是**文本**(`meow_topappbar_add_action`)。为支持「⚙↻⌕」类**动作图标**(4k 字库无这些码点,字体码点画图标会出豆腐),新增把某动作项改为**位图图标**的接口:
>
> ```c
> int meow_topappbar_set_item_icon(meow_widget *w, int idx, int icon_idx);
> ```
> - `idx` = 动作项下标(`meow_topappbar_add_action` 返回值;越界返回负值)。
> - `icon_idx` = `sb_icons[]` 位图索引(用 `MEOW_ICON_*` 常量,见下表;<0 非法)。
> - 返回 `0`=成功;`NULL`/非 TopAppBar/越界 `idx`/非法 `icon_idx`=负值。
> - 绘制:与状态栏**同源**位图(Material Symbols Rounded 32x32 单通道 alpha,`meow_gfx_blit_icon_ink`),
> 图标槽在动作格内水平居中、ink 垂直对齐栏中点,颜色取主题 `onSurface`、**按压态向栏底色淡 12%**。
> - **兼容**:未调用本 API 的动作项保持文本(行为不变);`items` 文本条目不感知位图化。
>
> **sb_icons[] 索引表**(Material Symbols Rounded,MD3,单通道 alpha 32x32;Apache-2.0,
> 来源 google/material-design-icons,重新生成 `patch_v2/sdk/tools/gen_action_icons.py`):
>
> | 索引 | 状态栏 `SB_I_*`(SDK 内部) | TopAppBar `MEOW_ICON_*`(App 用) | 图形 | 用途 |
> |---|---|---|---|---|
> | 0 | `SB_I_WIFI` | — | Wi-Fi | 状态栏 WiFi(满格) |
> | 1 | `SB_I_BT` | — | 蓝牙 | 状态栏蓝牙(连接中) |
> | 2 | `SB_I_BATT` | — | 电池 | 状态栏电量 |
> | 3 | `SB_I_VOL` | — | 音量 | 状态栏音量 |
> | 4 | `SB_I_BRIGHT` | — | 亮度 | 状态栏背光 |
> | 5 | `SB_I_WIFI_STRONG` | — | Wi-Fi | 状态栏(-60dBm 强) |
> | 6 | `SB_I_WIFI_MEDIUM` | — | Wi-Fi | 状态栏(-75dBm 中) |
> | 7 | `SB_I_WIFI_WEAK` | — | Wi-Fi | 状态栏(更弱) |
> | 8 | `SB_I_WIFI_NO` | — | Wi-Fi | 状态栏(开未连接) |
> | 9 | `SB_I_WIFI_OFF` | — | Wi-Fi | 状态栏(关闭) |
> | 10 | `SB_I_BT_NO` | — | 蓝牙 | 状态栏(未连接) |
> | 11 | `SB_I_BT_CONN` | — | 蓝牙 | 状态栏(已连接) |
> | 12 | `SB_I_BT_DIS` | — | 蓝牙 | 状态栏(关闭) |
> | 13 | `SB_I_BT_SEARCH` | — | 蓝牙 | 状态栏(搜索中) |
> | 14 | `SB_I_BATT_CHG` | — | 电池 | 状态栏(充电) |
> | 15 | `SB_I_SETTINGS` | `MEOW_ICON_SETTINGS` | ⚙ 齿轮 | 设置 |
> | 16 | `SB_I_REFRESH` | `MEOW_ICON_REFRESH` | ↻ 回转 | 刷新 |
> | 17 | `SB_I_SEARCH` | `MEOW_ICON_SEARCH` | 🔍 放大镜 | 搜索 |
> | 18 | `SB_I_PLAY_ARROW` | `MEOW_ICON_PLAY_ARROW` | ▶ | 播放 |
> | 19 | `SB_I_PAUSE` | `MEOW_ICON_PAUSE` | ⏸ | 暂停 |
> | 20 | `SB_I_SKIP_NEXT` | `MEOW_ICON_SKIP_NEXT` | ⏭ | 下一首 |
> | 21 | `SB_I_SKIP_PREV` | `MEOW_ICON_SKIP_PREV` | ⏮ | 上一首 |
> | 22 | `SB_I_ARROW_BACK` | `MEOW_ICON_ARROW_BACK` | ← | 返回 |
> | 23 | `SB_I_CLOSE` | `MEOW_ICON_CLOSE` | × | 关闭 |
> | 24 | `SB_I_ADD` | `MEOW_ICON_ADD` | + | 添加 |
> | 25 | `SB_I_CHECK` | `MEOW_ICON_CHECK` | ✓ | 勾选 |
> | 26 | `SB_I_LYRICS` | `MEOW_ICON_LYRICS` | 歌词 | 歌词 |
> | 27 | `SB_I_QUEUE_MUSIC` | `MEOW_ICON_QUEUE_MUSIC` | 队列 | 播放列表 |
> | 28 | `SB_I_DOWNLOAD` | `MEOW_ICON_DOWNLOAD` | ↧ | 下载 |
> | 29 | `SB_I_HEART` | `MEOW_ICON_HEART` | ♥ | 收藏 |
>
> **索引约定**:状态栏占用 `0-14`(既有序号,**勿改序**);TopAppBar 动作从 `15` 起连续追加(只追加,既有索引不变)。`MEOW_ICON_*`(公共头 `meow_ui_widgets.h`)与 `SB_I_*`(SDK `sb_icons.h`)**同值**,二者须保持表序一致(`test_umbrella.c` 有 `_Static_assert` 锁 15/21/27/29)。
> **M2.73 修复(以 `meow_ui_widget.c` / `hello_app/hello.c` 为准)**:
> - **列表容器(W_LIST / LazyColumn / LazyRow)视口裁剪**:`meow_widget_draw` case `W_LIST` 现在计算视口绝对边界 `vx0/vx1/vy0/vy1`,**只绘制落在视口内的行、分隔线、文本**(整项可见才画文本/越界不画),滚动时不再把内容画到视口外再标脏上屏 → 根治「标题栏/底部残留脏区」。**SDK 全局生效**(非 App 侧)。
> - **z 序重叠区修复**:App 侧 `hello_app/hello.c` 的 `d_paint_region`(局部刷新)改为**按 z 栈重画该区全部控件**(内容→标题→slider 值→chrome),取代旧「清底 + 只画单个控件」——防止「下层动态控件(如圆形进度条)实时重绘盖住/抹掉上层浮层(FAB)」。**⚠️ 暂注**:此方案当前在 **App(hello)侧**实现,属**示范/落地点**;**SDK 级全局 z 序(框架统一管理层间重绘顺序)仍待评估,未正式纳入 SDK 公共 API**——在落定前请勿把「全局 z 序」写成正式规范,App 自定义绘制如需 z 序要参照 `d_paint_region` 自行重画完整栈。