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:
1 parent
fbc412e96a
commit
08c70aa14c
13 files changed
+872
-96
No files matched your search
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user