fix(sdk/hello): M2.71控件真机bug批次 — 圆形进度脏区+整环修复/Slider拖动/Dialog·Sheet背景快照scrim不叠黑/Disabled圆角α/点击重置息屏/滑动跟手/IME残影·键位·主题配色/List选中点击 (agent-162)
This commit is contained in:
1 parent
b12404a986
commit
b8c36bd33c
14 files changed
+554
-79
No files matched your search
@@ -20,6 +20,39 @@
|
||||
#define MEOW_MODAL_ROW 48
|
||||
#define MEOW_MODAL_BTN 44
|
||||
|
||||
/* M2.71-bug3:模态(Dialog/BottomSheet)背景快照/恢复。
|
||||
* 旧实现直接往 back_buf 画 scrim+卡片并 flush:①每次 open 再现叠一层 α150 遮罩(叠加变黑);
|
||||
* ②关闭后 scrim+卡片像素留在屏上(残影);③要整屏刷新才盖掉。此处 open 前把整帧背景拍下,
|
||||
* 关闭后回填 + 整帧上屏 → scrim 每次只叠一层、关闭即还原、无残留。 */
|
||||
static unsigned char *g_modal_cap = NULL;
|
||||
static int g_modal_cap_line = 0, g_modal_cap_h = 0, g_modal_cap_bpp = 0;
|
||||
|
||||
static void modal_capture(void)
|
||||
{
|
||||
unsigned char *bb = meow_ui_back_buf();
|
||||
int line = meow_ui_back_buf_pitch();
|
||||
int h = meow_ui_height();
|
||||
int bpp = meow_ui_back_buf_bpp();
|
||||
if (!bb || line <= 0 || h <= 0) { g_modal_cap = NULL; return; }
|
||||
size_t n = (size_t)line * (size_t)h;
|
||||
if (!g_modal_cap || g_modal_cap_line != line || g_modal_cap_h != h || g_modal_cap_bpp != bpp) {
|
||||
free(g_modal_cap);
|
||||
g_modal_cap = (unsigned char *)malloc(n);
|
||||
g_modal_cap_line = line; g_modal_cap_h = h; g_modal_cap_bpp = bpp;
|
||||
}
|
||||
if (g_modal_cap) memcpy(g_modal_cap, bb, n);
|
||||
}
|
||||
|
||||
static void modal_restore(void)
|
||||
{
|
||||
unsigned char *bb = meow_ui_back_buf();
|
||||
if (!g_modal_cap || !bb) return;
|
||||
size_t n = (size_t)g_modal_cap_line * (size_t)g_modal_cap_h;
|
||||
memcpy(bb, g_modal_cap, n);
|
||||
meow_gfx_mark_full();
|
||||
meow_ui_flush();
|
||||
}
|
||||
|
||||
/* ---- Dialog ---- */
|
||||
struct meow_dialog {
|
||||
meow_dlg_t type;
|
||||
@@ -62,58 +95,73 @@ static void dlg_calc(meow_dialog *d, const meow_theme *th, dlg_geom *g)
|
||||
g->btn_w = (g->dw - 2 * pad - 12) / 2;
|
||||
}
|
||||
|
||||
static void dlg_paint(meow_dialog *d, const meow_theme *th)
|
||||
/* 只画卡片内容(不含遮罩)——供「仅高亮变化」时重绘卡片区,不会把遮罩再叠一层(防叠加变黑)。 */
|
||||
static void dlg_card(meow_dialog *d, const meow_theme *th, const dlg_geom *g)
|
||||
{
|
||||
int W = meow_ui_width(), H = meow_ui_height();
|
||||
meow_ui_fill_rect_alpha(0, 0, W, H, 0x000000, 150); /* 遮罩压暗 */
|
||||
dlg_geom g;
|
||||
dlg_calc(d, th, &g);
|
||||
int pad = 24;
|
||||
meow_gfx_fill_round(g.dx, g.dy, g.dw, g.dh, th->radius_card, th->surfaceContainerHighest);
|
||||
meow_ui_draw_rect_round(g.dx, g.dy, g.dw, g.dh, th->radius_card, th->outline);
|
||||
meow_ui_text(g.dx + pad, g.dy + pad, d->title, th->font_title, th->onSurface);
|
||||
meow_gfx_fill_round(g->dx, g->dy, g->dw, g->dh, th->radius_card, th->surfaceContainerHighest);
|
||||
meow_ui_draw_rect_round(g->dx, g->dy, g->dw, g->dh, th->radius_card, th->outline);
|
||||
meow_ui_text(g->dx + pad, g->dy + pad, d->title, th->font_title, th->onSurface);
|
||||
|
||||
if (d->type == MEOW_DLG_SELECT) {
|
||||
for (int i = 0; i < d->nitems; i++) {
|
||||
int ry = g.row_y + i * g.rowh;
|
||||
if (ry + g.rowh > g.dy + g.dh - 12) break;
|
||||
int ry = g->row_y + i * g->rowh;
|
||||
if (ry + g->rowh > g->dy + g->dh - 12) break;
|
||||
if (i == d->cur) {
|
||||
meow_ui_fill_rect(g.dx + 8, ry, g.dw - 16, g.rowh, th->primary);
|
||||
meow_ui_text(g.dx + pad, ry + (g.rowh - meow_ui_text_height(th->font_body)) / 2,
|
||||
meow_ui_fill_rect(g->dx + 8, ry, g->dw - 16, g->rowh, th->primary);
|
||||
meow_ui_text(g->dx + pad, ry + (g->rowh - meow_ui_text_height(th->font_body)) / 2,
|
||||
d->items[i], th->font_body, 0xFFFFFF);
|
||||
} else {
|
||||
meow_ui_text(g.dx + pad, ry + (g.rowh - meow_ui_text_height(th->font_body)) / 2,
|
||||
meow_ui_text(g->dx + pad, ry + (g->rowh - meow_ui_text_height(th->font_body)) / 2,
|
||||
d->items[i], th->font_body, th->onSurface);
|
||||
}
|
||||
meow_ui_fill_rect(g.dx + pad, ry + g.rowh - 1, g.dw - 2 * pad, 1, th->outlineVariant);
|
||||
meow_ui_fill_rect(g->dx + pad, ry + g->rowh - 1, g->dw - 2 * pad, 1, th->outlineVariant);
|
||||
}
|
||||
} else {
|
||||
/* INFO/CONFIRM:正文行;INPUT:文本预览 */
|
||||
int nmsg = (d->type == MEOW_DLG_INFO) ? (d->nitems > 0 ? d->nitems : 1)
|
||||
: (d->nitems > 0 ? d->nitems : 1);
|
||||
int y = g.row_y;
|
||||
int y = g->row_y;
|
||||
if (d->type == MEOW_DLG_INPUT) {
|
||||
char buf[300];
|
||||
snprintf(buf, sizeof buf, "%s", d->ime.buf[0] ? d->ime.buf : "(tap OK to edit...)");
|
||||
meow_ui_text(g.dx + pad, y, buf, th->font_body, th->onSurfaceVariant);
|
||||
meow_ui_text(g->dx + pad, y, buf, th->font_body, th->onSurfaceVariant);
|
||||
} else {
|
||||
for (int i = 0; i < nmsg; i++) {
|
||||
if (i < d->nitems && d->items[i][0])
|
||||
meow_ui_text(g.dx + pad, y, d->items[i], th->font_body, th->onSurfaceVariant);
|
||||
meow_ui_text(g->dx + pad, y, d->items[i], th->font_body, th->onSurfaceVariant);
|
||||
y += meow_ui_text_height(th->font_body) + 8;
|
||||
}
|
||||
}
|
||||
/* 取消(左,text 型)/ 确定(右,filled) */
|
||||
int bx = g.dx + pad, cx = bx + g.btn_w + 12, by = g.btn_y;
|
||||
meow_ui_draw_rect_round(bx, by, g.btn_w, g.btn_h, 10, th->primary);
|
||||
meow_ui_text_center(bx + g.btn_w / 2, by + (g.btn_h - meow_ui_text_height(th->font_body)) / 2,
|
||||
int bx = g->dx + pad, cx = bx + g->btn_w + 12, by = g->btn_y;
|
||||
meow_ui_draw_rect_round(bx, by, g->btn_w, g->btn_h, 10, th->primary);
|
||||
meow_ui_text_center(bx + g->btn_w / 2, by + (g->btn_h - meow_ui_text_height(th->font_body)) / 2,
|
||||
"CANCEL", th->font_body, th->primary);
|
||||
meow_gfx_fill_round(cx, by, g.btn_w, g.btn_h, 10, th->primary);
|
||||
meow_ui_text_center(cx + g.btn_w / 2, by + (g.btn_h - meow_ui_text_height(th->font_body)) / 2,
|
||||
meow_gfx_fill_round(cx, by, g->btn_w, g->btn_h, 10, th->primary);
|
||||
meow_ui_text_center(cx + g->btn_w / 2, by + (g->btn_h - meow_ui_text_height(th->font_body)) / 2,
|
||||
"OK", th->font_body, th->onPrimary);
|
||||
}
|
||||
}
|
||||
|
||||
/* 整帧绘制:遮罩 + 卡片。 */
|
||||
static void dlg_paint(meow_dialog *d, const meow_theme *th)
|
||||
{
|
||||
meow_ui_fill_rect_alpha(0, 0, meow_ui_width(), meow_ui_height(), 0x000000, 150); /* 遮罩压暗 */
|
||||
dlg_geom g;
|
||||
dlg_calc(d, th, &g);
|
||||
dlg_card(d, th, &g);
|
||||
}
|
||||
|
||||
/* 仅重绘卡片区(遮罩不变),flush 卡片矩形:高亮变化用,不叠加遮罩。 */
|
||||
static void dlg_repaint(meow_dialog *d, const meow_theme *th)
|
||||
{
|
||||
dlg_geom g;
|
||||
dlg_calc(d, th, &g);
|
||||
dlg_card(d, th, &g);
|
||||
meow_ui_flush_region(g.dx, g.dy, g.dw, g.dh);
|
||||
}
|
||||
|
||||
meow_dialog *meow_dialog_create(meow_dlg_t t, const char *title)
|
||||
{
|
||||
meow_dialog *d = (meow_dialog *)calloc(1, sizeof *d);
|
||||
@@ -155,12 +203,14 @@ void meow_dialog_show(meow_dialog *d)
|
||||
meow_input_start();
|
||||
meow_input_drain(); /* 排空残留触摸(goodix 长尾) */
|
||||
d->done = 0; d->result = 0;
|
||||
modal_capture(); /* M2.71-bug3:拍下背景,关闭即还原(scrim 只叠一层/无残影) */
|
||||
dlg_paint(d, th);
|
||||
meow_ui_flush();
|
||||
|
||||
while (!d->done) {
|
||||
meow_input_ev e;
|
||||
while (meow_input_pop(&e)) {
|
||||
meow_ui_activity_ping(); /* M2.71-bug5:模态期间交互也重置息屏计时 */
|
||||
if (e.type == MEOW_EV_TAP) {
|
||||
int x = e.a, y = e.b;
|
||||
dlg_geom g;
|
||||
@@ -168,8 +218,13 @@ void meow_dialog_show(meow_dialog *d)
|
||||
int in_card = x >= g.dx && x < g.dx + g.dw && y >= g.dy && y < g.dy + g.dh;
|
||||
if (!in_card) { d->done = 1; d->result = 0; break; } /* 遮罩外=取消 */
|
||||
if (d->type == MEOW_DLG_SELECT) {
|
||||
/* M2.71-bug3:点项 → 立即刷「选中」高亮(不下线、不叠加遮罩);
|
||||
* 再点同一项 → 确认(返回该项下标)。点卡片外=取消。 */
|
||||
int idx = (y - g.row_y) / g.rowh;
|
||||
if (idx >= 0 && idx < d->nitems) { d->cur = idx; d->result = idx; d->done = 1; }
|
||||
if (idx >= 0 && idx < d->nitems) {
|
||||
if (idx == d->cur) { d->result = idx; d->done = 1; }
|
||||
else { d->cur = idx; dlg_repaint(d, th); }
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* 非选择:按钮命中 */
|
||||
@@ -195,6 +250,7 @@ void meow_dialog_show(meow_dialog *d)
|
||||
if (d->done) break;
|
||||
usleep(16000);
|
||||
}
|
||||
modal_restore(); /* M2.71-bug3:关闭还原背景,无残影 */
|
||||
}
|
||||
|
||||
int meow_dialog_result(meow_dialog *d) { return d ? d->result : 0; }
|
||||
@@ -257,6 +313,7 @@ int meow_sheet_open(meow_sheet *s)
|
||||
int W = meow_ui_width(), H = meow_ui_height();
|
||||
int ph = sheet_h(s, th);
|
||||
int py = H - ph, pad = 24;
|
||||
modal_capture(); /* M2.71-bug3:拍下背景,关闭即还原 */
|
||||
/* 首次绘制:遮罩 + 底部面板(顶部圆角) */
|
||||
meow_ui_fill_rect_alpha(0, 0, W, H, 0x000000, 150);
|
||||
meow_gfx_fill_round(0, py, W, ph, th->radius_card, th->surfaceContainerHighest);
|
||||
@@ -273,6 +330,7 @@ int meow_sheet_open(meow_sheet *s)
|
||||
while (!s->done) {
|
||||
meow_input_ev e;
|
||||
while (meow_input_pop(&e)) {
|
||||
meow_ui_activity_ping(); /* M2.71-bug5:模态期间交互也重置息屏计时 */
|
||||
if (e.type == MEOW_EV_TAP) {
|
||||
int y = e.b;
|
||||
if (y < py) { s->done = 1; s->result = -1; break; } /* 点面板外=取消 */
|
||||
@@ -288,6 +346,7 @@ int meow_sheet_open(meow_sheet *s)
|
||||
if (s->done) break;
|
||||
usleep(16000);
|
||||
}
|
||||
modal_restore(); /* M2.71-bug3:关闭还原背景,无残影 */
|
||||
return s->result;
|
||||
}
|
||||
void meow_sheet_free(meow_sheet *s) { if (s) free(s); }
|
||||
Reference in new issue
Block a user