- M7 launcher 重写 5 期(虚拟化宫格/meow_theme 单一权威/横幅动画/自定义 PIN 键盘) - OOM 通用化(cachegov 上收 SDK)、自动切歌根治、meowpanel jv_free 泄漏修复、Hello 滚动卡顿修复 - ncm 歌词 UI / 媒体通知封面 / 封面分辨率 640 - 5 bug 修复:ncm 后台化 UI 叠层+点击穿透、再进 ncm 桌面叠层、播放页新旧 UI 叠层抢刷脏区(meow_ui_gfx 恢复边沿整帧重画)、PIN 亮屏亮度跳(keys.c meow_panel_on 按 settings_brightness_clamped 恢复)、通知中心封面显歌单封面(cover.c save_cover_raw 加 is_song + 命中块守卫) - 四 App 统一重链新 meow_ui.a 51caee4a;M6.19=0.8.19 固件 2d2331f2 推卡自刷验收全绿
107 lines
6.3 KiB
C
107 lines
6.3 KiB
C
/*
|
||
* meow_lazygrid.h — SDK 2 维虚拟化宫格(§12.4:meow_lazygrid,M7.4 主界面前置)。
|
||
*
|
||
* 定位:给「卡片/图标宫格」提供**二维虚拟化**——应用入口宫格、图标墙、设置快捷卡等。
|
||
* 只实例化**可见行**(视口内),行高/列几何 + gap;滚动复用 §12.3 meow_scroll(fling/snap),
|
||
* 与 meow_listview 同款惯性;命中 meow_lazygrid_hit/tap_at 把滚动+网格坐标映射回 item idx。
|
||
*
|
||
* 设计(仿 meow_listview 的 vsource 思想 + meow_scroll 滚动 + meow_box 列几何):
|
||
* - 数据源:count_fn() 返回总项数(任意长),bind_fn(index, item) 仅当 item「进入视口」
|
||
* (绑定到固定池槽)时调一次;回滚命中同槽不重绑(同 listview 池语义)。
|
||
* - 固定 item 池:池容量 = 视口行数 + 2(× cols),静态有界(≤MEOW_LAZYGRID_POOL_MAX)。
|
||
* - 列几何:cols + cell_w + cell_h + gap;行高 row_h = cell_h + gap;按 scroll offset 推可见行。
|
||
* - 渲染:默认 renderer 画「圆角卡片(icon+名+状态)」;App 也可经 set_item_draw 完全自绘
|
||
* (主界面卡片宫格用:icon+名+后台标注)。支持选中高亮/禁用变淡/空态占位。
|
||
* - 滚动:接 meow_scroll(meow_lazygrid_scroll 返回会话;track/fling/snap 与 listview 同款)。
|
||
*
|
||
* 内存纪律(M7 §5.2):静态有界 item 池(冷路径 create/set_vsource 分配,热路径 draw/hit/scroll
|
||
* 零 malloc),与 listview 池同源;不常驻 count 个 item 对象。
|
||
*
|
||
* 非 meow_widget:lazygrid 是**自包含控件**(不注册进 z 序/绘制注册表),由宿主(launcher session)
|
||
* 在 draw 阶段调 meow_lazygrid_draw、命中阶段调 meow_lazygrid_hit/tap_at、滚动喂 meow_scroll——
|
||
* 与 meow_scroll/meow_box 同为「正交模块」,不侵入 struct meow_widget(全追加式)。
|
||
*/
|
||
#ifndef MEOW_UI_LAZYGRID_H
|
||
#define MEOW_UI_LAZYGRID_H
|
||
|
||
#include "meow_ui_types.h" /* meow_img 前向 + 基础类型(子头不引伞头,避免相对路径依赖) */
|
||
#include "meow_ui_theme.h" /* meow_theme(draw 取语义色) */
|
||
#include "meow_ui_scroll.h" /* meow_scroll(滚动集成;子头引依赖子头,同 widgets.h→theme.h) */
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
typedef struct meow_lazygrid meow_lazygrid;
|
||
|
||
/* ---- cell / item ---- */
|
||
/* 单格数据(bind 回调填充;SDK 固定池持有;App 跨 bind 用 user 存业务态/图/index)。 */
|
||
typedef struct meow_lazygrid_item {
|
||
const char *title; /* 主文本(名;必填,NULL 视为空格) */
|
||
const char *subtitle; /* 副文本(状态/后台标注),可空 */
|
||
const meow_img *icon; /* 可选:格内图标(NULL=无) */
|
||
int enabled; /* 1=可交互;0=变淡不响应 */
|
||
void *user; /* App 私有(跨 bind 保存业务态;SDK 不碰) */
|
||
} meow_lazygrid_item;
|
||
|
||
/* 数据源:count 返回总项数(>=0,任意长);bind 在 item 进入视口时调一次填充 item。
|
||
* 二者均不常驻 item 对象;count 每帧实时查(支持动态长度/搜索过滤)。 */
|
||
typedef int (*meow_lazygrid_count_fn)(void *ctx);
|
||
typedef void (*meow_lazygrid_bind_fn)(int index, meow_lazygrid_item *item, void *ctx);
|
||
|
||
/* 完全自绘回调(覆盖默认 renderer):index=项号;x,y,w,h=格矩形(已裁剪到宫格视口);
|
||
* state=MEOW_LAZYGRID_ST_* 状态位(选中/禁用组合)。App 用 §3 绘制 API 自绘整格。 */
|
||
typedef void (*meow_lazygrid_draw_fn)(int index, int x, int y, int w, int h,
|
||
int state, void *ctx);
|
||
/* state 位(draw 回调收到)。 */
|
||
#define MEOW_LAZYGRID_ST_SELECTED (1u<<0)
|
||
#define MEOW_LAZYGRID_ST_DISABLED (1u<<1)
|
||
|
||
/* 命中/点击回调(idx=项号;App 在 tap_at 命中后触发动作)。 */
|
||
typedef void (*meow_lazygrid_tap_fn)(int idx, void *ctx);
|
||
|
||
#define MEOW_LAZYGRID_POOL_MAX 96 /* 池容量上限(固定;保证静态有界) */
|
||
|
||
/* ---- 生命周期(冷路径 create/free;热路径 draw/hit/scroll 零 malloc)----
|
||
* cols=列数(>=1,越界 clamp);cell_w/cell_h=格宽高;gap=格间距(水平与垂直同用)。 */
|
||
meow_lazygrid *meow_lazygrid_create(int x, int y, int w, int h, int cols,
|
||
int cell_w, int cell_h, int gap);
|
||
void meow_lazygrid_free(meow_lazygrid *g);
|
||
|
||
/* ---- 几何配置 ---- */
|
||
void meow_lazygrid_set_rect(meow_lazygrid *g, int x, int y, int w, int h); /* 视口矩形(绝对坐标) */
|
||
void meow_lazygrid_set_cols(meow_lazygrid *g, int cols);
|
||
void meow_lazygrid_set_cell(meow_lazygrid *g, int cell_w, int cell_h, int gap);
|
||
|
||
/* ---- 数据源 + 渲染 ---- */
|
||
int meow_lazygrid_set_vsource(meow_lazygrid *g, meow_lazygrid_count_fn count,
|
||
meow_lazygrid_bind_fn bind, void *ctx);
|
||
int meow_lazygrid_set_item_draw(meow_lazygrid *g, meow_lazygrid_draw_fn draw,
|
||
void *ctx); /* NULL=用默认卡片 renderer */
|
||
int meow_lazygrid_set_empty_text(meow_lazygrid *g, const char *text);
|
||
|
||
/* ---- 滚动(像素级;可视行数按 offset 实时推) ---- */
|
||
void meow_lazygrid_set_scroll(meow_lazygrid *g, int off);
|
||
void meow_lazygrid_scroll_by(meow_lazygrid *g, int dy);
|
||
int meow_lazygrid_scroll(meow_lazygrid *g);
|
||
int meow_lazygrid_max_scroll(meow_lazygrid *g); /* max(0, 内容高 - 视口高) */
|
||
int meow_lazygrid_row_h(const meow_lazygrid *g); /* 行高(=cell_h+gap) */
|
||
/* 便捷:包一个 meow_scroll 会话(set/max/get/redraw 指回本宫格;redraw 只刷视口区)。
|
||
* App 在 on_touch_move 喂 meow_scroll_track、松手 meow_scroll_fling。返回 NULL=池满。 */
|
||
meow_scroll *meow_lazygrid_scroll_attach(meow_lazygrid *g);
|
||
|
||
/* ---- 选中 / 命中 ---- */
|
||
void meow_lazygrid_set_on_tap(meow_lazygrid *g, meow_lazygrid_tap_fn cb, void *ctx);
|
||
void meow_lazygrid_set_sel(meow_lazygrid *g, int idx); /* 越界 clamp;<0 清除;标脏 */
|
||
int meow_lazygrid_sel(const meow_lazygrid *g);
|
||
int meow_lazygrid_hit(meow_lazygrid *g, int x, int y); /* 命中项 idx(滚动+网格坐标映射);-1=未命中/禁用 */
|
||
int meow_lazygrid_tap_at(meow_lazygrid *g, int x, int y); /* 命中:置选中 + 回调 + 返回 idx/-1 */
|
||
|
||
/* ---- 绘制 ---- */
|
||
void meow_lazygrid_draw(meow_lazygrid *g, const meow_theme *th);
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
#endif /* MEOW_UI_LAZYGRID_H */
|