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:
1 parent
b2e7cc8c70
commit
32a6a8ed1e
14 files changed
+257
-44
No files matched your search
@@ -40,17 +40,24 @@ static meow_view *view_map_get(int id)
|
||||
return (id >= 0 && id < MEOW_VIEW_BY_ID_MAX) ? g_view_by_id[id] : NULL;
|
||||
}
|
||||
|
||||
/* 进入一个 view(置 ENTERED + on_enter)。 */
|
||||
/* 进入一个 view(置 ENTERED + on_enter),**递归 children**(子视图随父进出,§A.4)。
|
||||
* 进入顺序:父 on_enter 先(记录顺序 home.enter→demo.enter),随后子视图依递归逐个进入;
|
||||
* 子视图的 on_draw 经 meow_draw_view_entered(含祖先已进入判定)保证父 on_enter 重绘时可见。 */
|
||||
static void view_enter(meow_view *v)
|
||||
{
|
||||
if (!v || (v->state & MEOW_VIEW_STATE_ENTERED)) return;
|
||||
v->state |= MEOW_VIEW_STATE_ENTERED;
|
||||
run_fn(v->hooks.on_enter, v);
|
||||
for (int i = 0; i < v->nchildren; i++)
|
||||
view_enter(v->children[i]);
|
||||
}
|
||||
/* 离开一个 view(清 ENTERED + on_leave;默认不销毁子 view/widget——弹回零重建)。 */
|
||||
/* 离开一个 view(清 ENTERED + on_leave;默认不销毁子 view/widget——弹回零重建),
|
||||
* **递归 children**:先子后父(demo.leave→home.leave)。 */
|
||||
static void view_leave(meow_view *v)
|
||||
{
|
||||
if (!v || !(v->state & MEOW_VIEW_STATE_ENTERED)) return;
|
||||
for (int i = 0; i < v->nchildren; i++)
|
||||
view_leave(v->children[i]);
|
||||
v->state &= ~MEOW_VIEW_STATE_ENTERED;
|
||||
run_fn(v->hooks.on_leave, v);
|
||||
}
|
||||
@@ -175,6 +182,36 @@ meow_view *meow_view_sub_pop(meow_view *v)
|
||||
return NULL; /* 预留 */
|
||||
}
|
||||
|
||||
/* ============================================================ */
|
||||
/* 事件路由(§A.7:每个 view 的 on_event 先把事件发给后代(按 z 降序),命中即消费,
|
||||
* 再落本 view 的控件)。SDK 提供递归树走;叶子 on_event 负责本 view 的 widget 命中。 */
|
||||
/* ============================================================ */
|
||||
static int view_dispatch_event(meow_view *v, int ev, int a, int b)
|
||||
{
|
||||
if (!v || !(v->state & MEOW_VIEW_STATE_ENTERED)) return 0; /* 仅已进入的视图参与 */
|
||||
if (v->nchildren > 0) {
|
||||
meow_view *kids[MEOW_VIEW_MAX_CHILD];
|
||||
int nn = v->nchildren;
|
||||
for (int i = 0; i < nn; i++) kids[i] = v->children[i];
|
||||
/* 按 z 降序(同 z 保持挂载序稳定);z 同值时树序,靠后挂的在先。 */
|
||||
for (int i = 1; i < nn; i++) {
|
||||
meow_view *key = kids[i];
|
||||
int j = i - 1;
|
||||
while (j >= 0 && meow_view_z(kids[j]) < meow_view_z(key)) { kids[j + 1] = kids[j]; j--; }
|
||||
kids[j + 1] = key;
|
||||
}
|
||||
for (int i = 0; i < nn; i++)
|
||||
if (view_dispatch_event(kids[i], ev, a, b)) return 1; /* 子命中即消费 */
|
||||
}
|
||||
if (v->hooks.on_event && v->hooks.on_event(v, ev, a, b, v->ctx)) return 1; /* 落到本 view 事件 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
int meow_view_dispatch_event(int ev, int a, int b)
|
||||
{
|
||||
return view_dispatch_event(g_top_view, ev, a, b);
|
||||
}
|
||||
|
||||
/* ============================================================ */
|
||||
/* 坐标 / 查询 */
|
||||
/* ============================================================ */
|
||||
|
||||
Reference in new issue
Block a user