feat(sdk/view): 视图框架批次① — z序绘制物注册表(meow_ui_draw.c: 自动注册+auto_z(深度*步长+层内seq)+set_z(999)置顶+MEOW_Z_AUTO_MAX=127) + meow_view骨架(meow_ui_view.c/.h: 嵌套容器+六生命周期+page_push/pop/replace包装activity栈+sub_push/pop预留桩) + 收敛live_btn走invalidate + hello迁移(d_paint_region/d_redraw删除→meow_ui_invalidate, chrome set_z(999), demo文本注册CUSTOM z=128) (agent-176, 定案见SDK_VIEW_FRAMEWORK_DESIGN.md §E①)

meow_ui.a d814d0ed→7e20f10e; hello 0a1c96a5→2ce09466
宿主验证: test_p1p2p3_repro P1c/P2/P3 ALL PASS; test_meow_ui_widgets ALL PASS 无回归; mipsel -Wall -Wextra 0 warning
This commit is contained in:
MeowOS committed 2026-08-31 02:38:32 +08:00
1 parent fbc412e96a
commit 08c70aa14c
13 files changed
+872 -96

No files matched your search

+47 -1
View File
@@ -211,10 +211,16 @@ static meow_widget *live_btn_hit(int x, int y)
return r;
}
/* 重绘并局部刷新一个按钮区(绘制内部调 meow_gfx_fill_round 已标脏;flush_region 合区+上屏)。 */
/* 重绘并局部刷新一个按钮区。
* §6.2 收敛:若按钮已注册绘制物 → 走 meow_ui_invalidate(清底 + 按 z 重画重叠区完整 z 栈),
* 避免按钮压上层 chrome 时被单控件 flush 抹掉(P1);未注册则回退单控件绘制+区域上屏。 */
static void live_btn_redraw(meow_widget *w)
{
if (!w) return;
if (meow_draw_widget_registered(w)) {
meow_ui_invalidate(w->x, w->y, w->w, w->h);
return;
}
meow_widget_draw(w);
meow_ui_flush_region(w->x, w->y, w->w, w->h);
}
@@ -275,6 +281,7 @@ meow_widget *meow_btn_create(int x, int y, int w, int h, const char *label)
t->state = MEOW_WS_ENABLED; /* §5.8.3:默认 ENABLED */
if (label) { strncpy(t->label, label, sizeof t->label - 1); t->label[sizeof t->label - 1] = 0; }
live_btn_register(t);
meow_draw_widget_register(t); /* §6.2 自动注册(创建即注册,App 零调用) */
return t;
}
@@ -286,6 +293,7 @@ meow_widget *meow_slider_create(int x, int y, int w, int min, int max, int val)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->min = min; t->max = (max > min) ? max : min + 1; t->val = (val < min) ? min : (val > t->max) ? t->max : val;
meow_draw_widget_register(t);
return t;
}
@@ -298,6 +306,7 @@ meow_widget *meow_switch_create(int x, int y, int on)
t->state = MEOW_WS_ENABLED;
t->on = on ? 1 : 0;
if (t->on) t->state |= MEOW_WS_SELECTED; /* §5.8.3:开关 on → selected */
meow_draw_widget_register(t);
return t;
}
@@ -310,12 +319,14 @@ meow_widget *meow_list_create(int x, int y, int w, int h, int count,
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->count = count; t->src = src; t->ctx = ctx; t->sel = 0;
meow_draw_widget_register(t);
return t;
}
void meow_widget_free(meow_widget *w)
{
if (!w) return;
meow_draw_widget_unregister(w); /* §6.2:绘制物注册表自动注销(stale id 失效勿用) */
live_btn_unregister(w);
free(w);
}
@@ -334,6 +345,7 @@ meow_widget *meow_widget_custom_create(int x, int y, int w, int h,
t->render_cb = render_cb;
t->hit_cb = hit_cb;
t->ctx = ctx;
meow_draw_widget_register(t);
return t;
}
@@ -346,6 +358,7 @@ meow_widget *meow_row_create(int x, int y, int w, int h, int spacing)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->spacing = spacing > 0 ? spacing : 0;
meow_draw_widget_register(t);
return t;
}
meow_widget *meow_column_create(int x, int y, int w, int h, int spacing)
@@ -356,6 +369,7 @@ meow_widget *meow_column_create(int x, int y, int w, int h, int spacing)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->spacing = spacing > 0 ? spacing : 0;
meow_draw_widget_register(t);
return t;
}
meow_widget *meow_box_create(int x, int y, int w, int h)
@@ -366,6 +380,7 @@ meow_widget *meow_box_create(int x, int y, int w, int h)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->spacing = 0;
meow_draw_widget_register(t);
return t;
}
meow_widget *meow_layout_spacer(int w, int h)
@@ -375,6 +390,7 @@ meow_widget *meow_layout_spacer(int w, int h)
t->type = W_SPACER; t->x = 0; t->y = 0; t->w = w > 0 ? w : 0; t->h = h > 0 ? h : 0;
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
meow_draw_widget_register(t);
return t;
}
@@ -421,6 +437,24 @@ void meow_layout_arrange(meow_widget *layout)
}
}
/* ---- 布局深度反推访问器(meow_ui_draw.c 用,读本 TU 的 struct meow_widget 内部字段)---- */
int meow_widget_is_layout(const meow_widget *w)
{ return w && w->type == W_LAYOUT; }
int meow_widget_nchild(const meow_widget *w)
{ return (w && w->type == W_LAYOUT) ? w->nchildren : 0; }
const meow_widget *meow_widget_child_at(const meow_widget *w, int idx)
{ return (w && w->type == W_LAYOUT && idx >= 0 && idx < w->nchildren) ? w->children[idx] : NULL; }
/* ---- 几何/归属访问器(meow_ui_draw.c 用:绘制物 rect 实时读 + owner 过滤)---- */
int meow_widget_owner(const meow_widget *w)
{ return w ? w->owner : 0; }
void meow_widget_rect(const meow_widget *w, int out[4])
{
if (!out) return;
if (!w) { out[0] = out[1] = out[2] = out[3] = 0; return; }
out[0] = w->x; out[1] = w->y; out[2] = w->w; out[3] = w->h;
}
/* ============================================================ */
/* §5.8.6 batch2 Material 组件子集 API(create/setter/getter/hit) */
/* ============================================================ */
@@ -460,6 +494,7 @@ meow_widget *meow_textfield_create(int x, int y, int w, int h, const char *place
t->buf = buf; t->buflen = buf ? (int)strlen(buf) : 0;
t->maxlen = (maxlen > 0 && maxlen <= 256) ? maxlen : 256;
t->ime_mode = mode;
meow_draw_widget_register(t);
return t;
}
void meow_textfield_set_placeholder(meow_widget *w, const char *placeholder)
@@ -515,6 +550,7 @@ meow_widget *meow_card_create(int x, int y, int w, int h)
t->type = W_CARD; t->x = x; t->y = y; t->w = w; t->h = h;
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
meow_draw_widget_register(t);
return t;
}
void meow_card_set_content(meow_widget *card, meow_widget *child)
@@ -535,6 +571,7 @@ meow_widget *meow_divider_create(int x, int y, int len, int vertical)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->variant = vertical ? 1 : 0;
meow_draw_widget_register(t);
return t;
}
@@ -547,6 +584,7 @@ meow_widget *meow_badge_create(int cx, int cy)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->value = 0; /* 红点 */
meow_draw_widget_register(t);
return t;
}
void meow_badge_set(meow_widget *w, int count)
@@ -564,6 +602,7 @@ meow_widget *meow_checkbox_create(int x, int y)
t->type = W_CHECKBOX; t->x = x; t->y = y; t->w = 34; t->h = 34;
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
meow_draw_widget_register(t);
return t;
}
meow_widget *meow_radio_create(int x, int y)
@@ -573,6 +612,7 @@ meow_widget *meow_radio_create(int x, int y)
t->type = W_RADIO; t->x = x; t->y = y; t->w = 34; t->h = 34;
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
meow_draw_widget_register(t);
return t;
}
@@ -586,6 +626,7 @@ meow_widget *meow_progress_create(int x, int y, int w, int h, int value)
t->state = MEOW_WS_ENABLED;
t->variant = 0; /* 线性 */
t->value = value < 0 ? -1 : (value > 100 ? 100 : value);
meow_draw_widget_register(t);
return t;
}
meow_widget *meow_progress_circular_create(int cx, int cy, int r, int value)
@@ -603,6 +644,7 @@ meow_widget *meow_progress_circular_create(int cx, int cy, int r, int value)
t->state = MEOW_WS_ENABLED;
t->variant = 1; /* 圆形 */
t->value = value < 0 ? -1 : (value > 100 ? 100 : value);
meow_draw_widget_register(t);
return t;
}
void meow_progress_set(meow_widget *w, int value)
@@ -621,6 +663,7 @@ meow_widget *meow_fab_create(int x, int y, int size, const char *label)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
if (label) { strncpy(t->label, label, sizeof t->label - 1); t->label[sizeof t->label - 1] = 0; }
meow_draw_widget_register(t);
return t;
}
@@ -634,6 +677,7 @@ meow_widget *meow_topappbar_create(int x, int y, int w, int h, const char *title
t->state = MEOW_WS_ENABLED;
t->back_on = 0; t->nitems = 0;
if (title) { strncpy(t->label, title, sizeof t->label - 1); t->label[sizeof t->label - 1] = 0; }
meow_draw_widget_register(t);
return t;
}
void meow_topappbar_set_title(meow_widget *w, const char *title)
@@ -682,6 +726,7 @@ meow_widget *meow_navigationbar_create(int x, int y, int w, int h)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->nitems = 0; t->selected = 0;
meow_draw_widget_register(t);
return t;
}
int meow_navigationbar_add_item(meow_widget *w, const char *label)
@@ -721,6 +766,7 @@ meow_widget *meow_tabbar_create(int x, int y, int w, int h)
t->owner = meow_ui_activity_active();
t->state = MEOW_WS_ENABLED;
t->nitems = 0; t->selected = 0;
meow_draw_widget_register(t);
return t;
}
int meow_tabbar_add_tab(meow_widget *w, const char *label)