From 4ff0d99398b33988dc61c458754e31c3771a788e Mon Sep 17 00:00:00 2001 From: MeowOS Date: Sun, 30 Aug 2026 23:28:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(hello):=20=E6=8E=A7=E4=BB=B6=E5=BA=93demo?= =?UTF-8?q?=E6=BC=94=E7=A4=BA=E9=A1=B5(agent-159)=20=E2=80=94=20M2.71=20Ma?= =?UTF-8?q?terial=E7=BB=84=E4=BB=B6=E5=B1=95=E7=A4=BA+=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - home加「WIDGETS DEMO」入口 + ACT_DEMO activity; demo控件启动push一次创建(owner=ACT_DEMO, 命中只owner==active, home/demo零重建) - 覆盖: Button五型+禁用/Switch/Slider/TextField(阻塞IME)/Checkbox/Radio(互斥)/ProgressBar(线圆动画)/Card(嵌子按钮)/Divider/Badge(3)/TabBar/NavigationBar/TopAppBar(返回箭头)/Dialog+BottomSheet/FAB/LazyColumn(100项) - 交互真实控件状态机; 配色全取meow_theme(随MD3/MIUIx+明暗); 局部刷d_redraw(矩形)+meow_ui_flush_region不整屏不冲状态栏; 原home逻辑逐字未改 - 交叉编译0warning; hello=803b23fb meow_ui.a=92e61fb8(未变未碰SDK); 宿主离屏PPM目检3帧渲染正确 - 遗留真机观感; 滑动=按scroll重建内容控件(SDK无位置setter, 方案§0记录修正) --- hello | Bin 240844 -> 255564 bytes hello.c | 580 ++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 462 insertions(+), 118 deletions(-) diff --git a/hello b/hello index 11374f93963f61c5f1b911c84307a7e78fe326fa..074f1412ae7db6aa28dde82924b9599f1c5af805 100755 GIT binary patch delta 76672 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 M2EilJ93ndZzw=a?y#N3J diff --git a/hello.c b/hello.c index a7a8285..86489e2 100644 --- a/hello.c +++ b/hello.c @@ -2,17 +2,39 @@ * * 契约(MEOW_APP_SDK.md §1/§3/§6):应用只调 meow_ui API —— 屏幕(back_buf + * flush 上屏)与输入(meow_ui_run 事件循环)由框架接管;不再 open/mmap/ioctl - * /dev/fb0、不再读 /dev/input/event*。本应用验证「清屏 + 画文本 + 画按钮 + - * 响应触摸」这一最小工作闭环,并集成了通知触发按钮(meow_notify_send,§9.1) - * 用于端到端测试通知链路(SDK → IPC → launcher 中央存储 → 10s TTL 落盘)。 + * /dev/fb0、不再读 /dev/input/event*。 + * + * 两大职责: + * A) 原有:验证「清屏 + 画文本 + 画按钮 + 响应触摸」最小闭环 + 通知触发按钮 + * (meow_notify_send,§9.1)端到端测试通知链路; + * B) 新增:**控件库 Demo 演示页**(§5.8 第一/二批组件)——作为 SDK 控件库的 + * 验证载体 + 活文档:用真实控件(meow_btn_* / meow_switch_* / meow_slider_* / + * meow_widget_custom_create / meow_*)搭「展示 + 可交互」界面,用户刷 hello + * 从 home 的「WIDGETS DEMO」按钮进入,逐项验证各组件外观 / 命中 / 状态。 * * 交互: - * - 点按钮 → tap 计数 +1(按钮标签实时更新); - * - 通知触发行(6 个按钮):每个点击 meow_notify_send() 发一条不同参数的通知, - * 覆盖 普通INFO / 媒体(单例) / HIGH紧急度 / 进度(40%) / 常驻 / 跳转Activity; - * - CANCEL LAST 按钮:meow_notify_cancel(最近一次 send 的 id); - * - 左缘左滑(抬手触发)→ 请求退出(回应用列表);滑动过程顶部出现随位移增长的进度条; - * - 空闲时 on_tick 每秒刷新一行状态(含运行秒数)。 + * - home:点 TAP ME → 回圈计数;6 个通知触发行;CANCEL LAST;FULLSCREEN; + * 新增「WIDGETS DEMO」按钮 → 进入 demo 页;左缘左滑 → 退出。 + * - demo 页:TopAppBar 返回箭头 / 左缘左滑 → 回 home;内容区展示并交互 + * Button 五型(含禁用) / Switch / Slider / TextField(点开阻塞 IME) / Checkbox / + * Radio(单选组) / ProgressBar(线性+圆形带动画) / Card(嵌子项) / Divider / + * Badge / TabBar / NavigationBar(底部) / TopAppBar(顶部) / Dialog+BottomSheet / + * FAB / LazyColumn(100 项列表,swipe 滚动)。配色取 meow_theme 语义色板(随系统 + * MD3/MIUIx + 明暗自动切,零硬编码品牌色)。交互局部刷新(meow_ui_flush_region, + * 不整屏、不冲状态栏)。 + * + * 页面/Activity(§6.1 ①):home(根,ACT_HOME 0)、全屏(ACT_FULL 1)、demo(ACT_DEMO 2) + * 三态互斥;控件 owner=创建时 active Activity,命中只在 owner==active 生效(根治跨页 + * 残留)。demo 控件在启动 push(ACT_DEMO) 下一次性创建(owner=ACT_DEMO),此后 home + * 态不命中不绘制、demo 态 home 控件不命中。 + * + * 滚动实现(关键:SDK 控件不透明——结构体对外不可见,App 不能读/写控件坐标;也无 + * 位置 setter): + * - 内容控件以**绝对坐标**创建(App 侧另存 rect_t 几何用于局部 flush/命中)。 + * - 页滚动 = 按「base_y - scroll」**重建**内容控件(仍处于 ACT_DEMO,owner 不变); + * 各控件跨重建状态存于 g_ds(App 持有),重建后恢复。 + * - LazyColumn 是第二滚动区:滚它时 meow_list_scroll_by + 列表区局部刷新,不重建。 + * - 因内容仅略超一屏(max_scroll 小),一次滑动仅触发 1~2 次重建,代价可接受。 * * 宿主/qemu 离屏:设 MEOW_UI_DUMP= 时,首帧 flush 即把 back_buf 写成 * PPM 截图供检查;设备上无副作用。 @@ -28,16 +50,17 @@ #include #include -/* §6.1 ①:Activity 归属。主界面(根,stack 空时 active()=0)绑定全部按钮控件; - * 全屏沉浸页为独立 Activity(无控件)——触摸它绝不命中主界面按钮(根治跨页残留)。 - * 进全屏 meow_ui_activity_push(ACT_FULL),退出 pop 回根(主界面按钮恢复可点,对象复用)。 */ +/* §6.1 ①:Activity 归属。home=根(0);全屏=独立 Activity(无控件);demo=独立 Activity。 */ #define ACT_HOME 0 #define ACT_FULL 1 +#define ACT_DEMO 2 +/* ---- home 既有控件 ---- */ static meow_widget *g_btn; static meow_widget *g_nbtn[6]; /* 通知触发按钮行 */ static meow_widget *g_cancel; /* 取消最近一条通知 */ static meow_widget *g_fs_btn; /* FULLSCREEN 进入按钮(主界面) */ +static meow_widget *g_demo_btn; /* 「控件库 Demo」入口按钮(主界面,新增) */ static int g_fullscreen = 0; /* 1=处于全屏视图(点任意处退出回主界面) */ static const char *g_notif_labels[6] = { "INFO", "MEDIA", "HIGH", "PROG", "ONGO", "TGT" }; static uint32_t g_last_notif = 0; /* 最近一次 send 返回的 id,供 cancel */ @@ -45,72 +68,107 @@ static int g_taps = 0; static int g_secs = 0; static char g_btn_label[32] = "TAP ME"; -/* M2.51:统一日志改用 SDK meow_log()(按 app 分离 + 级别过滤 + 降级), - * 删除自造轮子的 hellolog()(自读 MEOW_LOG_DIR + snprintf + fopen/fprintf)。 */ +/* ---- demo 演示页状态 ---- */ +static int g_demo = 0; /* 1=处于 demo 演示页 */ +static int g_demo_scroll = 0; /* 内容区滚动偏移(base 空间 px) */ +static int g_demo_focus = 0; /* 1=LazyColumn 聚焦(swipe 滚列表而非页面) */ +static int g_demo_fab = 0; /* FAB 点击计数反馈 */ +static int g_demo_prog = 0; /* ProgressBar 动画当前值 0..100 */ +static uint64_t g_demo_prog_last = 0; +static int g_demo_ct = 0; /* 内容视口顶(屏幕 y,= statusbar+56+8) */ +static int g_demo_cb = 0; /* 内容视口底(屏幕 y,=608,NavBar 上方留白) */ +static int g_demo_content_h = 0; /* 内容总高(base 空间;决定 max_scroll) */ + +/* SDK 控件不透明:App 自记几何,用于局部 flush / 命中 / scroll 重建。 */ +typedef struct { int x, y, w, h; } rect_t; +#define RX(x,y,w,h) ((rect_t){ (x), (y), (w), (h) }) + +/* demo 各控件跨重建保留的状态(app 持有;重建后按此恢复) */ +static struct { + int sw_on; int slider; char tf[32]; + int ck; int r1, r2; int btn[5]; int card; int tab; int list; int prog; +} g_ds = { .sw_on = 1, .slider = 40, .r1 = 1, .tab = 1, .list = 0, .prog = 0 }; + +/* demo 内容布局常量(base 空间) */ +#define DCL_X 16 +#define DCR_X 252 +#define DCW 212 +#define DFW 448 +#define DBH 44 +#define DCH 52 /* 一行两列按钮步进 */ + +/* demo 内容槽:控件 + 其当前屏幕几何(rebuild 时重算) */ +#define D_SLOT_MAX 64 +static struct { meow_widget *w; rect_t r; } g_dslot[D_SLOT_MAX]; +static int g_dslot_n = 0; + +/* demo 分区小标题(纯文本,非控件;屏幕坐标在 rebuild 时算好) */ +#define D_TITLE_MAX 16 +static struct { int x, y; const char *s; } g_dtitle[D_TITLE_MAX]; +static int g_dtitle_n = 0; + +/* demo 交互组件引用(rebuild 时 g_* 与 r_* 同步重指/recompute) */ +static meow_widget *g_tb; static rect_t r_tb; /* TopAppBar(chrome 固定) */ +static meow_widget *g_nav; static rect_t r_nav; /* NavigationBar(chrome 固定) */ +static meow_widget *g_fab; static rect_t r_fab; /* FAB(chrome 固定,可重建换计数 label) */ +static meow_widget *g_dbtn_b[5]; static rect_t r_btn[5]; /* Button 五型 */ +static meow_widget *g_dbtn_d; /* DISABLED 按钮(禁用不命中,无需 rect) */ +static meow_widget *g_dsw; static rect_t r_dsw; /* Switch */ +static meow_widget *g_dslider; static rect_t r_slider, r_slider_txt; /* Slider + 值文本 */ +static meow_widget *g_dtf; static rect_t r_dtf; /* TextField */ +static meow_widget *g_dcb; static rect_t r_dcb; /* Checkbox */ +static meow_widget *g_dr1, *g_dr2; static rect_t r_dr1, r_dr2; /* Radio 单选组 */ +static meow_widget *g_dprl; static rect_t r_prl; /* ProgressBar 线性 */ +static meow_widget *g_dprc; static rect_t r_prc; /* ProgressBar 圆形 */ +static meow_widget *g_dcard; static rect_t r_card; /* Card */ +static meow_widget *g_dcard_btn; static rect_t r_cardbtn; /* Card 内容子按钮 */ +static meow_widget *g_dbadge; /* Badge */ +static meow_widget *g_dtab; static rect_t r_tab; /* TabBar */ +static meow_widget *g_dbtn_dlg; static rect_t r_dlg; /* 打开 Dialog 的按钮 */ +static meow_widget *g_dbtn_sheet; static rect_t r_sheet;/* 打开 BottomSheet 的按钮 */ +static meow_widget *g_dlc; static rect_t r_list; /* LazyColumn */ + +/* Dialog / BottomSheet(阻塞模态;非控件,main() 创建一次) */ +static meow_dialog *g_dlg; +static meow_sheet *g_sheet; + +/* 前向声明 */ +static void redraw(void); +static void demo_rebuild_to(int scroll); +static void demo_paint(void); + +/* M2.51:统一日志改用 SDK meow_log()。 */ static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); } -/* 通知触发:对应第 which 个按钮(0..5)。SDK 端 meow_notify_send() 自动注册未声明 - * 类型(本应用用到 4 种:GENERAL / MEDIA / PROGRESS / MESSAGE,均在 4 种上限内), - * 超时语义见 meow_ui.h §9.1;媒体类型为单例(重发替换)。 */ +/* ============================================================ */ +/* 通知触发(home 既有) */ +/* ============================================================ */ static void notif_send(int which) { meow_notify n; memset(&n, 0, sizeof n); - n.progress = -1; /* 缺省不显示进度条 */ + n.progress = -1; n.timeout_ms = MEOW_NOTIFY_TIMEOUT_NEVER; n.urgency = MEOW_NOTIFY_URG_NORMAL; const char *label = "?"; switch (which) { - case 0: /* 普通 INFO */ - label = "INFO"; - n.cat = MEOW_NOTIFY_CAT_GENERAL; - n.title = "测试-普通通知"; - n.body = "普通 INFO 通知,timeout=5000ms"; - n.timeout_ms = 5000; - break; - case 1: /* 媒体单例(ongoing,不自动过期) */ - label = "MEDIA"; - n.cat = MEOW_NOTIFY_CAT_MEDIA; - n.urgency = MEOW_NOTIFY_URG_LOW; - n.title = "测试-媒体通知"; - n.body = "媒体单例,正在播放,timeout=-1 常驻"; - n.timeout_ms = MEOW_NOTIFY_TIMEOUT_ONGOING; - break; - case 2: /* HIGH 紧急度 */ - label = "HIGH"; - n.cat = MEOW_NOTIFY_CAT_GENERAL; - n.urgency = MEOW_NOTIFY_URG_HIGH; - n.title = "测试-紧急度HIGH"; - n.body = "高紧急度:顶部横幅+提示音"; - n.timeout_ms = 3000; - break; - case 3: /* 进度通知 */ - label = "PROG"; - n.cat = MEOW_NOTIFY_CAT_PROGRESS; - n.title = "测试-进度通知"; - n.body = "下载进度 40%"; - n.timeout_ms = 8000; - n.progress = 40; - break; - case 4: /* 常驻(timeout=-1,不自动过期,需手动取消) */ - label = "ONGO"; - n.cat = MEOW_NOTIFY_CAT_GENERAL; - n.title = "测试-常驻通知"; - n.body = "常驻不自动过期(timeout=-1),需手动取消"; - n.timeout_ms = MEOW_NOTIFY_TIMEOUT_ONGOING; - break; - case 5: /* 带 target_activity + icon(SDK 结构含 icon 字段;NULL/空=用 app 默认图标) */ - label = "TGT"; - n.cat = MEOW_NOTIFY_CAT_MESSAGE; - n.title = "测试-跳转Activity"; - n.body = "点击跳转 target_activity=main"; - n.timeout_ms = 6000; - n.target_activity = "main"; - n.icon = NULL; /* 空 → launcher 用 app 默认图标(app.json icon) */ - break; - default: - return; + case 0: label = "INFO"; n.cat = MEOW_NOTIFY_CAT_GENERAL; + n.title = "测试-普通通知"; n.body = "普通 INFO 通知,timeout=5000ms"; n.timeout_ms = 5000; break; + case 1: label = "MEDIA"; n.cat = MEOW_NOTIFY_CAT_MEDIA; n.urgency = MEOW_NOTIFY_URG_LOW; + n.title = "测试-媒体通知"; n.body = "媒体单例,正在播放,timeout=-1 常驻"; + n.timeout_ms = MEOW_NOTIFY_TIMEOUT_ONGOING; break; + case 2: label = "HIGH"; n.cat = MEOW_NOTIFY_CAT_GENERAL; n.urgency = MEOW_NOTIFY_URG_HIGH; + n.title = "测试-紧急度HIGH"; n.body = "高紧急度:顶部横幅+提示音"; n.timeout_ms = 3000; break; + case 3: label = "PROG"; n.cat = MEOW_NOTIFY_CAT_PROGRESS; + n.title = "测试-进度通知"; n.body = "下载进度 40%"; n.timeout_ms = 8000; n.progress = 40; break; + case 4: label = "ONGO"; n.cat = MEOW_NOTIFY_CAT_GENERAL; + n.title = "测试-常驻通知"; n.body = "常驻不自动过期(timeout=-1),需手动取消"; + n.timeout_ms = MEOW_NOTIFY_TIMEOUT_ONGOING; break; + case 5: label = "TGT"; n.cat = MEOW_NOTIFY_CAT_MESSAGE; + n.title = "测试-跳转Activity"; n.body = "点击跳转 target_activity=main"; + n.timeout_ms = 6000; n.target_activity = "main"; n.icon = NULL; break; + default: return; } uint32_t id = meow_notify_send(&n); @@ -119,8 +177,7 @@ static void notif_send(int which) "notify btn=%s id=%u cat=%s urg=%s tmo=%d prog=%d target=%s title=%s", label, (unsigned)id, meow_notify_category_str(n.cat), meow_notify_urgency_str(n.urgency), n.timeout_ms, n.progress, - n.target_activity ? n.target_activity : "-", - n.title ? n.title : "-"); + n.target_activity ? n.target_activity : "-", n.title ? n.title : "-"); } static void notif_cancel(void) @@ -130,13 +187,6 @@ static void notif_cancel(void) g_last_notif = 0; } -/* 进入/退出全屏视图(MeowOS 全屏机制,§3.1): - * - fullscreen(1) + collapsed(1):状态栏「上收出屏只留提示线」(不完全沉浸,inset=4px), - * 顶部提示线热区仍可下拉,左缘返回手势(app 已注册 on_swipe)仍生效——SDK 自动处理,非 app 拦截; - * - fullscreen(0) + collapsed(0):恢复整条状态栏主界面。 - * SDK 基座默认瞬切(g_sbar_collapse_anim_ms=0);如需过渡动画可先 meow_ui_statusbar_animate(ms)。 - * §6.1 ①:全屏 = 独立 Activity——进时压栈 ACT_FULL(主界面控件因 owner=ACT_HOME 不再参与命中, - * 根治「全屏页触摸到主页按钮区域闪现」);退时弹栈回根,主界面按钮恢复可点(对象复用零重建)。 */ static void set_fullscreen(int on) { g_fullscreen = on ? 1 : 0; @@ -145,16 +195,315 @@ static void set_fullscreen(int on) if (on) meow_ui_activity_push(ACT_FULL); else meow_ui_activity_pop(); meow_log(MEOW_LOG_INFO, g_fullscreen ? "fullscreen ON (collapsed), activity->%d" - : "fullscreen OFF (restore), activity->%d", + : "fullscreen OFF (restore), activity->%d", meow_ui_activity_active()); } +/* ============================================================ */ +/* demo 演示页:布局 / 绘制 / 交互 */ +/* ============================================================ */ + +static void d_slot(meow_widget *w, rect_t r) +{ + if (g_dslot_n < D_SLOT_MAX) { g_dslot[g_dslot_n].w = w; g_dslot[g_dslot_n].r = r; g_dslot_n++; } +} +static void d_title(int x, int y, const char *s) +{ + if (g_dtitle_n < D_TITLE_MAX) { g_dtitle[g_dtitle_n].x = x; g_dtitle[g_dtitle_n].y = y; + g_dtitle[g_dtitle_n].s = s; g_dtitle_n++; } +} + +/* LazyColumn 数据源(100 项虚拟化) */ +static int demo_list_src(int idx, char *label, int len, void *ctx) +{ + (void)ctx; + if (idx < 0 || idx >= 100) return 0; + snprintf(label, (size_t)len, "list item %d", idx); + return 1; +} + +/* 释放当前全部内容控件(含 Card 的独立子按钮);chrome 不在其列。 */ +static void demo_free_content(void) +{ + for (int i = 0; i < g_dslot_n; i++) meow_widget_free(g_dslot[i].w); + g_dslot_n = 0; + if (g_dcard_btn) { meow_widget_free(g_dcard_btn); g_dcard_btn = NULL; } + g_dtitle_n = 0; +} + +/* 按 scroll 重建全部内容控件(owner=ACT_DEMO:调用方须已 push ACT_DEMO)。 + * 控件以绝对坐标创建于 (x, base_y - scroll),几何同步写入 r_* / 槽;状态从 g_ds 恢复。 */ +static void demo_build_at(int scroll) +{ + int ct = meow_ui_statusbar_height() + 56 + 8; + g_demo_ct = ct; g_demo_cb = 608; + g_dslot_n = 0; g_dtitle_n = 0; + int yb = 0; +#define SY(base) (ct + (base) - scroll) /* base 空间 → 屏幕 y */ +#define SLOT(w,x,y,ww,hh) do { rect_t _r=RX(x,y,ww,hh); d_slot((w),_r); } while(0) + + /* ---- Buttons(五型 + 禁用) ---- */ + d_title(DCL_X, SY(yb), "BUTTONS 5-variants"); yb += 26; + r_btn[0] = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_b[0] = meow_btn_create_variant(r_btn[0].x, r_btn[0].y, DCW, DBH, "FILLED", MEOW_BTN_FILLED); SLOT(g_dbtn_b[0], r_btn[0].x, r_btn[0].y, r_btn[0].w, r_btn[0].h); + r_btn[1] = RX(DCR_X, SY(yb), DCW, DBH); g_dbtn_b[1] = meow_btn_create_variant(r_btn[1].x, r_btn[1].y, DCW, DBH, "TONAL", MEOW_BTN_TONAL); SLOT(g_dbtn_b[1], r_btn[1].x, r_btn[1].y, r_btn[1].w, r_btn[1].h); + yb += DCH; + r_btn[2] = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_b[2] = meow_btn_create_variant(r_btn[2].x, r_btn[2].y, DCW, DBH, "OUTLINED", MEOW_BTN_OUTLINED); SLOT(g_dbtn_b[2], r_btn[2].x, r_btn[2].y, r_btn[2].w, r_btn[2].h); + r_btn[3] = RX(DCR_X, SY(yb), DCW, DBH); g_dbtn_b[3] = meow_btn_create_variant(r_btn[3].x, r_btn[3].y, DCW, DBH, "TEXT", MEOW_BTN_TEXT); SLOT(g_dbtn_b[3], r_btn[3].x, r_btn[3].y, r_btn[3].w, r_btn[3].h); + yb += DCH; + r_btn[4] = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_b[4] = meow_btn_create_variant(r_btn[4].x, r_btn[4].y, DCW, DBH, "ELEVATED", MEOW_BTN_ELEVATED); SLOT(g_dbtn_b[4], r_btn[4].x, r_btn[4].y, r_btn[4].w, r_btn[4].h); + g_dbtn_d = meow_btn_create_variant(DCR_X, SY(yb), DCW, DBH, "DISABLED", MEOW_BTN_FILLED); + SLOT(g_dbtn_d, DCR_X, SY(yb), DCW, DBH); + meow_widget_set_enabled(g_dbtn_d, 0); /* 禁用态:不命中 + 变暗 */ + yb += DCH; + for (int i = 0; i < 5; i++) meow_widget_set_selected(g_dbtn_b[i], g_ds.btn[i]); + + SLOT(meow_divider_create(DCL_X, SY(yb), DFW, 0), DCL_X, SY(yb), DFW, 1); yb += 16; + + /* ---- Input / State(Switch / Slider / TextField / Checkbox / Radio) ---- */ + d_title(DCL_X, SY(yb), "INPUT & STATE"); yb += 26; + r_dsw = RX(DCL_X, SY(yb), 56, 32); g_dsw = meow_switch_create(r_dsw.x, r_dsw.y, g_ds.sw_on); SLOT(g_dsw, r_dsw.x, r_dsw.y, r_dsw.w, r_dsw.h); yb += 44; + + r_slider_txt = RX(DCL_X, SY(yb), 100, 24); yb += 24; + r_slider = RX(DCL_X, SY(yb), DFW, 40); g_dslider = meow_slider_create(r_slider.x, r_slider.y, r_slider.w, 0, 100, g_ds.slider); SLOT(g_dslider, r_slider.x, r_slider.y, r_slider.w, r_slider.h); yb += 48; + + r_dtf = RX(DCL_X, SY(yb), DFW, 44); g_dtf = meow_textfield_create(r_dtf.x, r_dtf.y, r_dtf.w, r_dtf.h, "Type here...", g_ds.tf, 32, MEOW_IME_ASCII); SLOT(g_dtf, r_dtf.x, r_dtf.y, r_dtf.w, r_dtf.h); yb += 54; + + r_dcb = RX(DCL_X, SY(yb), 34, 34); g_dcb = meow_checkbox_create(r_dcb.x, r_dcb.y); SLOT(g_dcb, r_dcb.x, r_dcb.y, r_dcb.w, r_dcb.h); + r_dr1 = RX(DCR_X, SY(yb), 34, 34); g_dr1 = meow_radio_create(r_dr1.x, r_dr1.y); SLOT(g_dr1, r_dr1.x, r_dr1.y, r_dr1.w, r_dr1.h); + yb += 40; + r_dr2 = RX(DCR_X, SY(yb), 34, 34); g_dr2 = meow_radio_create(r_dr2.x, r_dr2.y); SLOT(g_dr2, r_dr2.x, r_dr2.y, r_dr2.w, r_dr2.h); + yb += 40; + meow_widget_set_selected(g_dcb, g_ds.ck); + meow_widget_set_selected(g_dr1, g_ds.r1); + meow_widget_set_selected(g_dr2, g_ds.r2); + + /* ---- ProgressBar(线性 + 圆形,on_tick 动画) ---- */ + d_title(DCL_X, SY(yb), "PROGRESS (animated)"); yb += 26; + r_prl = RX(DCL_X, SY(yb), DFW, 8); g_dprl = meow_progress_create(r_prl.x, r_prl.y, r_prl.w, r_prl.h, g_ds.prog); SLOT(g_dprl, r_prl.x, r_prl.y, r_prl.w, r_prl.h); yb += 16; + r_prc = RX(DCL_X + 400, SY(yb), 34, 34); g_dprc = meow_progress_circular_create(r_prc.x + 17, r_prc.y + 17, 17, g_ds.prog); SLOT(g_dprc, r_prc.x, r_prc.y, r_prc.w, r_prc.h); yb += 48; + + /* ---- Container(Card / Badge / TabBar) ---- */ + d_title(DCL_X, SY(yb), "CONTAINER"); yb += 26; + r_card = RX(DCL_X, SY(yb), DFW, 88); g_dcard = meow_card_create(r_card.x, r_card.y, r_card.w, r_card.h); SLOT(g_dcard, r_card.x, r_card.y, r_card.w, r_card.h); + r_cardbtn = RX(DCL_X + 16, SY(yb) + 20, DFW - 32, 40); g_dcard_btn = meow_btn_create_variant(r_cardbtn.x, r_cardbtn.y, r_cardbtn.w, r_cardbtn.h, "IN-CARD BUTTON", MEOW_BTN_TONAL); + meow_widget_set_selected(g_dcard_btn, g_ds.card); + meow_card_set_content(g_dcard, g_dcard_btn); + yb += 96; + g_dbadge = meow_badge_create(DCL_X + 60, SY(yb) + 10); + SLOT(g_dbadge, DCL_X + 52, SY(yb) + 2, 18, 18); + meow_badge_set(g_dbadge, 3); + yb += 30; + r_tab = RX(DCL_X, SY(yb), DFW, 36); g_dtab = meow_tabbar_create(r_tab.x, r_tab.y, r_tab.w, r_tab.h); SLOT(g_dtab, r_tab.x, r_tab.y, r_tab.w, r_tab.h); + meow_tabbar_add_tab(g_dtab, "Playlist"); + meow_tabbar_add_tab(g_dtab, "Queue"); + meow_tabbar_add_tab(g_dtab, "Now"); + meow_tabbar_set_selected(g_dtab, g_ds.tab); + yb += 44; + + /* ---- Modals(Dialog + BottomSheet) ---- */ + d_title(DCL_X, SY(yb), "MODALS (blocking)"); yb += 26; + r_dlg = RX(DCL_X, SY(yb), DCW, DBH); g_dbtn_dlg = meow_btn_create_variant(r_dlg.x, r_dlg.y, r_dlg.w, r_dlg.h, "DIALOG", MEOW_BTN_OUTLINED); SLOT(g_dbtn_dlg, r_dlg.x, r_dlg.y, r_dlg.w, r_dlg.h); + r_sheet = RX(DCR_X, SY(yb), DCW, DBH); g_dbtn_sheet = meow_btn_create_variant(r_sheet.x, r_sheet.y, r_sheet.w, r_sheet.h, "SHEET", MEOW_BTN_OUTLINED); SLOT(g_dbtn_sheet, r_sheet.x, r_sheet.y, r_sheet.w, r_sheet.h); + yb += DCH; + + /* ---- LazyColumn(100 项列表滚动) ---- */ + d_title(DCL_X, SY(yb), "LIST (LazyColumn, tap+swipe)"); yb += 26; + r_list = RX(DCL_X, SY(yb), DFW, 150); g_dlc = meow_lazycolumn_create(r_list.x, r_list.y, r_list.w, r_list.h, 40, 100, demo_list_src, NULL); + SLOT(g_dlc, r_list.x, r_list.y, r_list.w, r_list.h); + meow_list_set_scroll(g_dlc, g_ds.list); + yb += 158; + + g_demo_content_h = yb; +#undef SY +#undef SLOT +} + +/* demo 全页重绘:背景 + 内容控件(已定位) + 标题 + slider 值 + chrome(后画覆盖) + 内容区 flush */ +static void demo_paint(void) +{ + const meow_theme *th = meow_theme_get(); + int sb = meow_ui_statusbar_height(); + + meow_ui_fill_rect(0, sb, 480, 720 - sb, th->bg); + + for (int i = 0; i < g_dslot_n; i++) meow_widget_draw(g_dslot[i].w); + for (int i = 0; i < g_dtitle_n; i++) + meow_ui_text(g_dtitle[i].x, g_dtitle[i].y, g_dtitle[i].s, 20, th->primary); + if (g_dslider) { + char buf[28]; snprintf(buf, sizeof buf, "slider = %d", meow_slider_get(g_dslider)); + meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim); + } + /* chrome(固定;后画覆盖内容溢出区) */ + meow_widget_draw(g_tb); + meow_widget_draw(g_nav); + meow_widget_draw(g_fab); + + meow_ui_flush_region(0, sb, 480, 720 - sb); +} + +/* 重建内容到指定 scroll(clamp 到 [0, max_scroll]);进入/滚动共用 */ +static void demo_rebuild_to(int scroll) +{ + int vp_h = g_demo_cb - g_demo_ct; + int maxs = g_demo_content_h - vp_h; + if (maxs < 0) maxs = 0; + if (scroll < 0) scroll = 0; + if (scroll > maxs) scroll = maxs; + demo_free_content(); + demo_build_at(scroll); + g_demo_scroll = scroll; + demo_paint(); +} + +/* 局部刷新一个控件:清底 + 重画 + flush 其几何矩形(App 自记 rect) */ +static void d_redraw(meow_widget *w, rect_t r) +{ + if (!w) return; + const meow_theme *th = meow_theme_get(); + meow_ui_fill_rect(r.x, r.y, r.w, r.h, th->bg); + meow_widget_draw(w); + meow_ui_flush_region(r.x, r.y, r.w, r.h); +} + +static void d_toggle_sel(meow_widget *w, rect_t r) +{ + if (!w) return; + meow_widget_set_selected(w, !meow_widget_selected(w)); + d_redraw(w, r); +} + +/* Tap:落点在内容控件上,返回 1=已消费 */ +static int demo_content_tap(int x, int y) +{ + g_demo_focus = 0; /* 默认切回页滚动;仅命中列表时改置 1 */ + + for (int i = 0; i < 5; i++) + if (meow_widget_hit(g_dbtn_b[i], x, y)) { d_toggle_sel(g_dbtn_b[i], r_btn[i]); g_ds.btn[i] = meow_widget_selected(g_dbtn_b[i]); return 1; } + if (meow_widget_hit(g_dr1, x, y)) { meow_widget_set_selected(g_dr1, 1); meow_widget_set_selected(g_dr2, 0); g_ds.r1 = 1; g_ds.r2 = 0; d_redraw(g_dr1, r_dr1); d_redraw(g_dr2, r_dr2); return 1; } + if (meow_widget_hit(g_dr2, x, y)) { meow_widget_set_selected(g_dr2, 1); meow_widget_set_selected(g_dr1, 0); g_ds.r2 = 1; g_ds.r1 = 0; d_redraw(g_dr1, r_dr1); d_redraw(g_dr2, r_dr2); return 1; } + if (meow_widget_hit(g_dcb, x, y)) { d_toggle_sel(g_dcb, r_dcb); g_ds.ck = meow_widget_selected(g_dcb); return 1; } + if (meow_widget_hit(g_dsw, x, y)) { g_ds.sw_on = !meow_switch_get(g_dsw); meow_switch_set(g_dsw, g_ds.sw_on); d_redraw(g_dsw, r_dsw); return 1; } + if (meow_widget_hit(g_dslider, x, y)) { + int frac = x - r_slider.x; if (frac < 0) frac = 0; if (frac > r_slider.w) frac = r_slider.w; + g_ds.slider = frac * 100 / r_slider.w; + meow_slider_set(g_dslider, g_ds.slider); + d_redraw(g_dslider, r_slider); + { + const meow_theme *th = meow_theme_get(); + char buf[28]; snprintf(buf, sizeof buf, "slider = %d", g_ds.slider); + meow_ui_fill_rect(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h, th->bg); + meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim); + meow_ui_flush_region(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h); + } + return 1; + } + if (meow_widget_hit(g_dtf, x, y)) { + meow_textfield_activate(g_dtf); /* 阻塞 IME,返回后刷新 + 状态回写 */ + strncpy(g_ds.tf, meow_textfield_text(g_dtf), sizeof g_ds.tf - 1); + g_ds.tf[sizeof g_ds.tf - 1] = 0; + d_redraw(g_dtf, r_dtf); + return 1; + } + if (meow_widget_hit(g_dcard_btn, x, y)) { d_toggle_sel(g_dcard_btn, r_cardbtn); g_ds.card = meow_widget_selected(g_dcard_btn); return 1; } + if (g_dtab) { + int t = meow_tabbar_hit(g_dtab, x, y); + if (t >= 0) { g_ds.tab = t; meow_tabbar_set_selected(g_dtab, t); d_redraw(g_dtab, r_tab); return 1; } + } + if (meow_widget_hit(g_dbtn_dlg, x, y)) { meow_dialog_show(g_dlg); meow_log(MEOW_LOG_INFO, "dialog result=%d", meow_dialog_result(g_dlg)); d_redraw(g_dbtn_dlg, r_dlg); return 1; } + if (meow_widget_hit(g_dbtn_sheet, x, y)) { int r = meow_sheet_open(g_sheet); meow_log(MEOW_LOG_INFO, "sheet result=%d", r); d_redraw(g_dbtn_sheet, r_sheet); return 1; } + if (meow_widget_hit(g_dlc, x, y)) { g_demo_focus = 1; return 1; } + return 0; +} + +/* demo 页 on_tap 分发(chrome → 内容) */ +static void demo_on_tap(int x, int y) +{ + if (g_tb) { + int ah = meow_topappbar_hit(g_tb, x, y); + if (ah == MEOW_TOPBAR_BACK) { g_demo = 0; meow_ui_activity_pop(); redraw(); return; } + } + if (g_fab && meow_widget_hit(g_fab, x, y)) { + g_demo_fab++; + char lb[16]; snprintf(lb, sizeof lb, "+%d", g_demo_fab); + meow_widget_free(g_fab); + g_fab = meow_fab_create(r_fab.x, r_fab.y, 56, lb); + meow_widget_draw(g_fab); + meow_ui_flush_region(r_fab.x, r_fab.y, r_fab.w, r_fab.h); + return; + } + if (g_nav) { + int idx = meow_navigationbar_hit(g_nav, x, y); + if (idx >= 0) { meow_navigationbar_set_selected(g_nav, idx); d_redraw(g_nav, r_nav); return; } + } + if (demo_content_tap(x, y)) return; +} + +/* demo 页 on_tick:ProgressBar 动画(局部刷,~120ms 步进) */ +static void demo_tick(uint64_t now) +{ + if (g_demo_prog_last == 0) g_demo_prog_last = now; + if (now - g_demo_prog_last < 120) return; + g_demo_prog_last = now; + g_ds.prog = (g_ds.prog + 3) % 101; + g_demo_prog = g_ds.prog; + meow_progress_set(g_dprl, g_demo_prog); d_redraw(g_dprl, r_prl); + meow_progress_set(g_dprc, g_demo_prog); d_redraw(g_dprc, r_prc); +} + +/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动 */ +static void demo_swipe(int dir, int dist) +{ + if (dir == MEOW_SWIPE_LEFT) { g_demo = 0; meow_ui_activity_pop(); redraw(); return; } + int del = 0; + if (dir == MEOW_SWIPE_UP) del = dist; /* 手指上移 → 偏移增大 */ + else if (dir == MEOW_SWIPE_DOWN) del = -dist; + if (del == 0) return; + if (g_demo_focus && g_dlc) { + meow_list_scroll_by(g_dlc, del); + g_ds.list = meow_list_scroll(g_dlc); + d_redraw(g_dlc, r_list); /* 列表区局部刷新 */ + } else { + demo_rebuild_to(g_demo_scroll + del); + } +} + +/* 进入 demo 演示页(重建到顶部) */ +static void demo_enter(void) +{ + g_demo = 1; + g_demo_focus = 0; + meow_ui_activity_push(ACT_DEMO); + demo_rebuild_to(0); + meow_log(MEOW_LOG_INFO, "demo enter scroll=0"); +} + +/* 启动时创建 chrome(固定)+ 内容(scroll=0);push(ACT_DEMO) 后创建使 owner=ACT_DEMO。 */ +static void demo_init(void) +{ + int sb = meow_ui_statusbar_height(); + meow_ui_activity_push(ACT_DEMO); + r_tb = RX(0, sb, 480, 56); g_tb = meow_topappbar_create(0, sb, 480, 56, "Widgets Demo"); + meow_topappbar_set_back(g_tb, 1); + r_nav = RX(0, 680, 480, 40); g_nav = meow_navigationbar_create(0, 680, 480, 40); + meow_navigationbar_add_item(g_nav, "Buttons"); + meow_navigationbar_add_item(g_nav, "List"); + meow_navigationbar_add_item(g_nav, "More"); + meow_navigationbar_set_selected(g_nav, 0); + r_fab = RX(406, 616, 56, 56); g_fab = meow_fab_create(406, 616, 56, "+"); + demo_build_at(0); + meow_ui_activity_pop(); + g_demo_scroll = 0; +} + +/* ============================================================ */ +/* 既有 home 绘制 / 事件 */ +/* ============================================================ */ + static void redraw(void) { const meow_theme *th = meow_theme_get(); - int sb = meow_ui_statusbar_height(); /* A-0 全局状态栏 inset:内容下移避免被盖 */ + int sb = meow_ui_statusbar_height(); if (g_fullscreen) { - /* 全屏页:纯色占满 + 居中提示;点任意处 / 左缘左滑(SDK on_swipe)返回 */ meow_ui_clear(th->accent); meow_ui_text_center(240, 330, "FULLSCREEN ACTIVE", 28, 0xFFFFFF); meow_ui_text_center(240, 366, "tap anywhere = back to home", 20, 0xFFFFFF); @@ -162,8 +511,6 @@ static void redraw(void) meow_ui_flush(); return; } - /* inset:只清「状态栏之下」内容区(top sb px 保留给系统状态栏——由 launcher 进程叠加绘制; - * App 进程不渲染状态栏、也不冲掉它)。非全屏时 App 内容只在 y>=sb。 */ if (sb > 0) meow_ui_fill_rect(0, sb, 480, 720 - sb, th->bg); else meow_ui_clear(th->bg); meow_ui_text_center(240, sb + 8, "MEOWOS HELLO", 28, th->fg); @@ -173,6 +520,7 @@ static void redraw(void) for (int i = 0; i < 6; i++) meow_widget_draw(g_nbtn[i]); meow_widget_draw(g_cancel); meow_widget_draw(g_fs_btn); + meow_widget_draw(g_demo_btn); char line[64]; snprintf(line, sizeof line, "taps=%d uptime=%ds", g_taps, g_secs); meow_ui_text_center(240, 516, line, 20, th->dim); @@ -182,33 +530,17 @@ static void redraw(void) static void on_tap(int x, int y) { - if (g_fullscreen) { - /* 全屏页:点任意处退出回主界面(左缘左滑由 SDK on_swipe 处理,见下) */ - set_fullscreen(0); - redraw(); - return; - } + if (g_demo) { demo_on_tap(x, y); return; } + if (g_fullscreen) { set_fullscreen(0); redraw(); return; } + if (meow_widget_hit(g_demo_btn, x, y)) { demo_enter(); return; } for (int i = 0; i < 6; i++) { - if (meow_widget_hit(g_nbtn[i], x, y)) { - notif_send(i); - redraw(); - return; - } - } - if (meow_widget_hit(g_cancel, x, y)) { - notif_cancel(); - redraw(); - return; - } - if (meow_widget_hit(g_fs_btn, x, y)) { - set_fullscreen(1); - redraw(); - return; + if (meow_widget_hit(g_nbtn[i], x, y)) { notif_send(i); redraw(); return; } } + if (meow_widget_hit(g_cancel, x, y)) { notif_cancel(); redraw(); return; } + if (meow_widget_hit(g_fs_btn, x, y)) { set_fullscreen(1); redraw(); return; } if (meow_widget_hit(g_btn, x, y)) { g_taps++; snprintf(g_btn_label, sizeof g_btn_label, "TAPPED x%d", g_taps); - /* 重建按钮标签(release 旧控件,重新 create 保持几何) */ meow_widget_free(g_btn); g_btn = meow_btn_create(120, 300, 240, 64, g_btn_label); redraw(); @@ -217,26 +549,20 @@ static void on_tap(int x, int y) static void on_key(int keycode, int is_down) { - /* §3.4.1:物理键语义由系统统一管理,APP 禁映射(电源=息屏/亮屏、音量=调音量、播放=媒体)。 - * 这里仅记录日志,不做任何 exit/confirm 行为。 */ (void)keycode; (void)is_down; - meow_log(MEOW_LOG_DEBUG, "key"); /* 不处理:SDK 内部消化系统键语义 */ + meow_log(MEOW_LOG_DEBUG, "key"); } static void on_swipe_progress(int x_start, int dx) { - /* 左滑过程实时回调:SDK 已自动画顶部进度条;这里演示 app 侧接入(画同长度条,幂等—— - * 长度=当前 X=x_start+dx,与 SDK 自动画一致,不会误清条)。 - * 抬手达标时 SDK 清条 + 触发 on_swipe(LEFT)→退出。 */ meow_ui_swipe_hint(x_start + dx); } static void on_swipe(int dir, int dx, int dy) { - (void)dx; (void)dy; + (void)dy; + if (g_demo) { demo_swipe(dir, dx); return; } if (dir == MEOW_SWIPE_LEFT) { - /* §6.1 导航栈语义:非根(全屏)→ 左滑返回主页(pop),不退出;根 → 退出回应用列表。 - * 保证 on_swipe(LEFT) 在沉浸页=退出全屏回主页,而非直接退出整个 app。 */ if (g_fullscreen) { set_fullscreen(0); redraw(); } else { meow_log(MEOW_LOG_INFO, "exit:swipe"); meow_ui_request_exit(); } } @@ -244,9 +570,9 @@ static void on_swipe(int dir, int dx, int dy) static void on_tick(void) { - /* 每秒刷新一次状态行(避免 16ms 高频重绘) */ - static uint64_t last = 0; uint64_t now = meow_ui_time_ms(); + if (g_demo) { demo_tick(now); return; } + static uint64_t last = 0; if (now - last >= 1000) { last = now; g_secs++; @@ -259,26 +585,44 @@ int main(void) meow_log(MEOW_LOG_INFO, "start"); meow_ui_opts o = { 480, 720 }; if (meow_ui_init(&o) != 0) { meow_log(MEOW_LOG_ERROR, "init failed"); return 1; } - /* M2.46 不再强制 set_mode 深色——主题跟随系统 display.theme/theme_mode(manual/auto+时段), - * 与 launcher s_ui_theme() 判定对齐(meow_theme_get() 已读 settings.conf)。 */ - meow_theme_add_listener(NULL); /* noop: 预留主题变化重绘 */ + meow_theme_add_listener(NULL); - signal(SIGTERM, on_sigterm); /* 看门狗返回键 → 干净退出 */ + signal(SIGTERM, on_sigterm); g_btn = meow_btn_create(120, 300, 240, 64, g_btn_label); for (int i = 0; i < 6; i++) g_nbtn[i] = meow_btn_create(3 + i * 80, 400, 74, 56, g_notif_labels[i]); g_cancel = meow_btn_create(36, 464, 200, 42, "CANCEL LAST"); g_fs_btn = meow_btn_create(244, 464, 200, 42, "FULLSCREEN"); + g_demo_btn = meow_btn_create(36, 560, 408, 44, "WIDGETS DEMO"); + + /* Dialog / BottomSheet 实例(阻塞模态;打开前排空残留触摸由 SDK 处理) */ + g_dlg = meow_dialog_create(MEOW_DLG_SELECT, "Pick a fruit"); + const char *items[] = { "Apple", "Banana", "Cherry" }; + meow_dialog_set_items(g_dlg, items, 3, 1); + g_sheet = meow_sheet_create("Options", 0); + meow_sheet_add_item(g_sheet, "Copy"); + meow_sheet_add_item(g_sheet, "Delete"); + meow_sheet_add_item(g_sheet, "Share"); + + demo_init(); redraw(); meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress }; meow_ui_run(&ev); + meow_widget_free(g_demo_btn); for (int i = 0; i < 6; i++) meow_widget_free(g_nbtn[i]); meow_widget_free(g_cancel); meow_widget_free(g_fs_btn); meow_widget_free(g_btn); + /* demo 内容 + chrome */ + demo_free_content(); + meow_widget_free(g_tb); + meow_widget_free(g_nav); + meow_widget_free(g_fab); + meow_dialog_free(g_dlg); + meow_sheet_free(g_sheet); meow_ui_shutdown(); meow_log(MEOW_LOG_INFO, "exit"); return 0;