feat(sdk): 绘制期通用clip + view递归/on_event接线 (agent-195) — ①栈式clip rect(g_clip_stack[16]), 所有写像素原语过clip, meow_widget_draw push/pop控件矩形(含W_CUSTOM, 根治越界脏区), IME/模态顶层全屏不受影响 ②view enter/leave递归children + meow_view_dispatch_event(z降序子>父命中即消费); hello App层显式驱动退役

meow_ui.a→da4d3a7d; hello→c655ba43; 宿主4套件全PASS(含clip越界断言+view递归断言)
出入: W_SLIDER拇指在max处被裁(既有几何瑕疵可见化,待修); on_draw祖先已进入即画
This commit is contained in:
MeowOS committed 2026-08-31 05:24:43 +08:00
1 parent b2e7cc8c70
commit 32a6a8ed1e
14 files changed
+257 -44

No files matched your search

Binary file not shown.
+2 -3
View File
@@ -95,11 +95,10 @@ extern rect_t r_dr1, r_dr2; /* Radio 几何 */
/* ---- 列表区 CONTAINER 子视图(ui/demo/list/list.c;批③ 视图深度化)----
* demo 页把列表逻辑区块抽成 meow_view CONTAINER 子视图挂到 DEMO ACTIVITY view children,
* 承接列表交互(tap/down/move/swipe)、列表视图态与列表区块标题 on_draw 直绘。
* 嵌套生命周期(list_view_enter/leave)由 demo 页 on_enter/on_leave 驱动(SDK 骨架不递归)。 */
* 嵌套生命周期由 SDK view_enter/view_leave 递归驱动(随 demo 页进出;list_view_enter/leave
* 已退役,无需 App 层显式接管)。 */
meow_view *list_view_create(void); /* 建 CONTAINER 子视图(须即 meow_view_add_child) */
meow_view *list_view_get(void); /* 返回子视图(宿主测嵌套 on_enter/on_leave 断言) */
void list_view_enter(void); /* 进入子视图(置 ENTERED + on_enter,幂等) */
void list_view_leave(void); /* 离开子视图(清 ENTERED + on_leave,幂等) */
void list_view_bind(meow_widget *w, rect_t list, rect_t title); /* 内容重建后绑控件+几何+恢复态 */
void list_view_release(void); /* 内容释放后摘引用/几何 */
int list_view_hit(int x, int y); /* tap 分发给列表区,命中即消费(含选中) */
+3 -2
View File
@@ -408,7 +408,8 @@ static void demo_page_enter(meow_view *v, void *ctx)
((demo_ctrl *)ctx)->active = 1;
g_demo = 1;
g_demo_focus = 0;
list_view_enter(); /* 先进入列表区子视图(其 on_draw 在下面 rebuild→paint 中经注册表触发) */
/* 列表区 CONTAINER 子视图随本页进入由 SDK view_enter 递归驱动(其 on_draw 在 demo_rebuild_to
* →demo_paint 中经注册表绘制;meow_draw_view_entered 含祖先已进入判定,首批可见)。 */
demo_rebuild_to(0);
meow_log(MEOW_LOG_INFO, "demo enter scroll=0");
}
@@ -418,7 +419,7 @@ static void demo_page_leave(meow_view *v, void *ctx)
(void)v;
((demo_ctrl *)ctx)->active = 0;
g_demo = 0;
list_view_leave(); /* 子离开先于父离开(嵌套顺序) */
/* 列表区子视图由 SDK view_leave 在父之前递归离开(子<先>父,§A.4/D.1)。 */
}
static void demo_page_destroy(meow_view *v, void *ctx)
+5 -20
View File
@@ -13,8 +13,9 @@
* 实现「子>父」命中。list **控件创建/释放**仍留在 demo 页内容重建流(demo_build_at/
* demo_free_content),因为 widget 由 z 序注册表 auto 注册/注销、并随 scroll 重建——完整
* 的「控件归容器拥有」需 SDK 侧支持(本批冻结 patch_v2/sdk/),故以绑定引用的方式折中。
* - SDK 骨架(meow_ui_view.c)的 view_enter/view_leave 不递归 children(批次① 仅顶层页);
* 本子视图的 on_enter/on_leave 由 demo 页 on_enter/on_leave 显式驱动(list_view_enter/leave)。
* - SDK(meow_ui_view.c)的 view_enter/view_leave **递归 children**(批次①→③ 后接线):
* 本子视图随 demo 页 on_enter/on_leave 自动进入/离开,无需 App 层显式驱动(list_view_enter/leave
* 已退役);父 on_enter 重绘时子视图经 meow_draw_view_entered(含祖先已进入)可见。
* - on_draw 是回调、view 不缓存像素(非保留,§5.8.7);绘制由 meow_ui_paint_full/invalidate
* 触发,仅当本子视图 state 含 MEOW_VIEW_STATE_ENTERED 时注册表才绘制(meow_draw_view_entered)。
*/
@@ -66,24 +67,8 @@ static void list_page_destroy(meow_view *v, void *ctx)
g_list_view = NULL; /* meow_view_free 递归释放前清引用,防悬垂 */
}
/* 进入子视图:置 ENTERED + on_enter(幂等)。SDK view_enter 不递归,故由父页显式驱动。 */
void list_view_enter(void)
{
if (!g_list_view) return;
if (g_list_view->state & MEOW_VIEW_STATE_ENTERED) return;
g_list_view->state |= MEOW_VIEW_STATE_ENTERED;
if (g_list_view->hooks.on_enter) g_list_view->hooks.on_enter(g_list_view, g_list_view->ctx);
}
/* 离开子视图:清 ENTERED + on_leave(幂等)。 */
void list_view_leave(void)
{
if (!g_list_view) return;
if (!(g_list_view->state & MEOW_VIEW_STATE_ENTERED)) return;
g_list_view->state &= ~MEOW_VIEW_STATE_ENTERED;
if (g_list_view->hooks.on_leave) g_list_view->hooks.on_leave(g_list_view, g_list_view->ctx);
}
/* 建 CONTAINER 子视图(demo_page_create 调,随即 meow_view_add_child 到 demo ACTIVITY view)。 */
/* 建 CONTAINER 子视图(demo_page_create 调,随即 meow_view_add_child 到 demo ACTIVITY view)。
* 进入/离开经 SDK view_enter/view_leave 递归驱动(随 demo 页),本文件不再显式接管。 */
meow_view *list_view_create(void)
{
static const meow_view_hooks h = {