fix(sdk/hello): M2.71控件真机bug批次 — 圆形进度脏区+整环修复/Slider拖动/Dialog·Sheet背景快照scrim不叠黑/Disabled圆角α/点击重置息屏/滑动跟手/IME残影·键位·主题配色/List选中点击 (agent-162)

This commit is contained in:
MeowOS committed 2026-08-31 00:19:40 +08:00
1 parent 4ff0d99398
commit 4b96e56906
2 files changed
+91 -24

No files matched your search

BIN
View File
Binary file not shown.
+91 -24
View File
@@ -79,6 +79,14 @@ static int g_demo_ct = 0; /* 内容视口顶(屏幕 y,= statusbar+5
static int g_demo_cb = 0; /* 内容视口底(屏幕 y,=608,NavBar 上方留白) */
static int g_demo_content_h = 0; /* 内容总高(base 空间;决定 max_scroll) */
/* M2.71-bug2/6:拖动过程(跟手)状态。on_touch_down 锁一种拖拽,on_touch_move 期间实时更新。 */
static int g_drag_slider = 0; /* 手指按在 slider:拖拽改值(按即定位) */
static int g_drag_list = 0; /* 手指按在 LazyColumn:拖拽滚列表 */
static int g_drag_page = 0; /* 手指按在页内容(非 slider/list):拖拽滚页面 */
static int g_drag_list_last_y = 0; /* 列表拖拽上一帧 y(求增量) */
static int g_drag_page_last_y = 0; /* 页面拖拽上一帧 y */
static int g_drag_page_delta = 0; /* 页面拖拽累计位移(节流重建,≥8px 才重建一次) */
/* SDK 控件不透明:App 自记几何,用于局部 flush / 命中 / scroll 重建。 */
typedef struct { int x, y, w, h; } rect_t;
#define RX(x,y,w,h) ((rect_t){ (x), (y), (w), (h) })
@@ -86,8 +94,8 @@ typedef struct { int x, y, w, h; } rect_t;
/* demo 各控件跨重建保留的状态(app 持有;重建后按此恢复) */
static struct {
int sw_on; int slider; char tf[32];
int ck; int r1, r2; int btn[5]; int card; int tab; int list; int prog;
} g_ds = { .sw_on = 1, .slider = 40, .r1 = 1, .tab = 1, .list = 0, .prog = 0 };
int ck; int r1, r2; int btn[5]; int card; int tab; int list; int list_sel; int prog;
} g_ds = { .sw_on = 1, .slider = 40, .r1 = 1, .tab = 1, .list = 0, .list_sel = 0, .prog = 0 };
/* demo 内容布局常量(base 空间) */
#define DCL_X 16
@@ -136,6 +144,7 @@ static meow_sheet *g_sheet;
static void redraw(void);
static void demo_rebuild_to(int scroll);
static void demo_paint(void);
static void demo_slider_drag(int x);
/* M2.51:统一日志改用 SDK meow_log()。 */
static void on_sigterm(int s) { (void)s; meow_ui_request_exit(); }
@@ -280,7 +289,11 @@ static void demo_build_at(int scroll)
/* ---- ProgressBar(线性 + 圆形,on_tick 动画) ---- */
d_title(DCL_X, SY(yb), "PROGRESS (animated)"); yb += 26;
r_prl = RX(DCL_X, SY(yb), DFW, 8); g_dprl = meow_progress_create(r_prl.x, r_prl.y, r_prl.w, r_prl.h, g_ds.prog); SLOT(g_dprl, r_prl.x, r_prl.y, r_prl.w, r_prl.h); yb += 16;
r_prc = RX(DCL_X + 400, SY(yb), 34, 34); g_dprc = meow_progress_circular_create(r_prc.x + 17, r_prc.y + 17, 17, g_ds.prog); SLOT(g_dprc, r_prc.x, r_prc.y, r_prc.w, r_prc.h); yb += 48;
/* 圆形进度:r_prc = 整圆像素外接框(中心 ± (r+margin),r=17 → 40×40),使 d_redraw 的
* flush 区与控件 bbox(=真实绘制范围)一致,不漏刷外圈(bgg M2.71-bug1)。中心仍取原视觉点。 */
r_prc = RX(DCL_X + 400 + 17 - 20, SY(yb) + 17 - 20, 40, 40);
g_dprc = meow_progress_circular_create(r_prc.x + 20, r_prc.y + 20, 17, g_ds.prog);
SLOT(g_dprc, r_prc.x, r_prc.y, r_prc.w, r_prc.h); yb += 48;
/* ---- Container(Card / Badge / TabBar) ---- */
d_title(DCL_X, SY(yb), "CONTAINER"); yb += 26;
@@ -311,6 +324,7 @@ static void demo_build_at(int scroll)
r_list = RX(DCL_X, SY(yb), DFW, 150); g_dlc = meow_lazycolumn_create(r_list.x, r_list.y, r_list.w, r_list.h, 40, 100, demo_list_src, NULL);
SLOT(g_dlc, r_list.x, r_list.y, r_list.w, r_list.h);
meow_list_set_scroll(g_dlc, g_ds.list);
meow_list_set_selected(g_dlc, g_ds.list_sel); /* M2.71-bug8:跨重建保留选中行 */
yb += 158;
g_demo_content_h = yb;
@@ -383,20 +397,7 @@ static int demo_content_tap(int x, int y)
if (meow_widget_hit(g_dr2, x, y)) { meow_widget_set_selected(g_dr2, 1); meow_widget_set_selected(g_dr1, 0); g_ds.r2 = 1; g_ds.r1 = 0; d_redraw(g_dr1, r_dr1); d_redraw(g_dr2, r_dr2); return 1; }
if (meow_widget_hit(g_dcb, x, y)) { d_toggle_sel(g_dcb, r_dcb); g_ds.ck = meow_widget_selected(g_dcb); return 1; }
if (meow_widget_hit(g_dsw, x, y)) { g_ds.sw_on = !meow_switch_get(g_dsw); meow_switch_set(g_dsw, g_ds.sw_on); d_redraw(g_dsw, r_dsw); return 1; }
if (meow_widget_hit(g_dslider, x, y)) {
int frac = x - r_slider.x; if (frac < 0) frac = 0; if (frac > r_slider.w) frac = r_slider.w;
g_ds.slider = frac * 100 / r_slider.w;
meow_slider_set(g_dslider, g_ds.slider);
d_redraw(g_dslider, r_slider);
{
const meow_theme *th = meow_theme_get();
char buf[28]; snprintf(buf, sizeof buf, "slider = %d", g_ds.slider);
meow_ui_fill_rect(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h, th->bg);
meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim);
meow_ui_flush_region(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h);
}
return 1;
}
if (meow_widget_hit(g_dslider, x, y)) { demo_slider_drag(x); return 1; }
if (meow_widget_hit(g_dtf, x, y)) {
meow_textfield_activate(g_dtf); /* 阻塞 IME,返回后刷新 + 状态回写 */
strncpy(g_ds.tf, meow_textfield_text(g_dtf), sizeof g_ds.tf - 1);
@@ -411,7 +412,12 @@ static int demo_content_tap(int x, int y)
}
if (meow_widget_hit(g_dbtn_dlg, x, y)) { meow_dialog_show(g_dlg); meow_log(MEOW_LOG_INFO, "dialog result=%d", meow_dialog_result(g_dlg)); d_redraw(g_dbtn_dlg, r_dlg); return 1; }
if (meow_widget_hit(g_dbtn_sheet, x, y)) { int r = meow_sheet_open(g_sheet); meow_log(MEOW_LOG_INFO, "sheet result=%d", r); d_redraw(g_dbtn_sheet, r_sheet); return 1; }
if (meow_widget_hit(g_dlc, x, y)) { g_demo_focus = 1; return 1; }
if (meow_widget_hit(g_dlc, x, y)) {
g_demo_focus = 1;
int li = meow_list_tap_at(g_dlc, x, y); /* M2.71-bug8:命中行→置选中并高亮 */
if (li >= 0) { g_ds.list_sel = li; d_redraw(g_dlc, r_list); }
return 1;
}
return 0;
}
@@ -450,14 +456,64 @@ static void demo_tick(uint64_t now)
meow_progress_set(g_dprc, g_demo_prog); d_redraw(g_dprc, r_prc);
}
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动 */
/* 按触碰 X 落 slider 值并局部刷(按下即定位 + 拖动实时,M2.71-bug2) */
static void demo_slider_drag(int x)
{
int frac = x - r_slider.x; if (frac < 0) frac = 0; if (frac > r_slider.w) frac = r_slider.w;
g_ds.slider = frac * 100 / r_slider.w;
meow_slider_set(g_dslider, g_ds.slider);
d_redraw(g_dslider, r_slider);
const meow_theme *th = meow_theme_get();
char buf[28]; snprintf(buf, sizeof buf, "slider = %d", g_ds.slider);
meow_ui_fill_rect(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h, th->bg);
meow_ui_text(r_slider_txt.x, r_slider_txt.y, buf, 20, th->dim);
meow_ui_flush_region(r_slider_txt.x, r_slider_txt.y, r_slider_txt.w, r_slider_txt.h);
}
/* demo 页 on_touch_down:锁一种拖拽(slider > list > 页内容)。非 demo 态跳过。 */
static void demo_touch_down(int x, int y)
{
g_drag_slider = 0; g_drag_list = 0; g_drag_page = 0; g_drag_page_delta = 0;
if (!g_demo) return;
if (meow_widget_hit(g_dslider, x, y)) { g_drag_slider = 1; demo_slider_drag(x); return; }
/* 命中列表,或「已聚焦列表」时(g_demo_focus=1)→ 拖动滚列表(与原 on_swipe 的焦点语义一致) */
if (g_dlc && (meow_widget_hit(g_dlc, x, y) || g_demo_focus)) {
g_demo_focus = 1; g_drag_list = 1; g_drag_list_last_y = y; return;
}
/* 页内容视口内非 slider/list:页面拖拽跟手(按钮亦视为可滚动起点,阈值由 SDK tap/swipe 分流) */
if (y >= g_demo_ct && y < g_demo_cb && x >= 0 && x < meow_ui_width()) {
g_drag_page = 1; g_drag_page_last_y = y;
}
}
/* demo 页 on_touch_move:拖动过程实时更新(slider 值 / 列表滚动 / 页面滚动节流重建)。 */
static void demo_touch_move(int x, int y)
{
if (!g_demo) return;
if (g_drag_slider) { demo_slider_drag(x); return; }
if (g_drag_list) {
int dy = y - g_drag_list_last_y; g_drag_list_last_y = y;
if (dy) { meow_list_scroll_by(g_dlc, -dy); g_ds.list = meow_list_scroll(g_dlc); d_redraw(g_dlc, r_list); }
return;
}
if (g_drag_page) {
int dy = y - g_drag_page_last_y; g_drag_page_last_y = y;
g_drag_page_delta += -dy; /* 手指上移(y 减) → scroll 增(显示更低内容),与 on_swipe 一致 */
if (g_drag_page_delta >= 8 || g_drag_page_delta <= -8) {
demo_rebuild_to(g_demo_scroll + g_drag_page_delta);
g_drag_page_delta = 0;
}
}
}
/* demo 页 on_swipe:LEFT=回 home;UP/DOWN=列表聚焦滚列表,否则页滚动。
* M2.71-bug6:拖动过程已在 on_touch_move 实时跟手滚过,抬手不再重复滚(否则叠加一次全距跳变)。 */
static void demo_swipe(int dir, int dist)
{
if (dir == MEOW_SWIPE_LEFT) { g_demo = 0; meow_ui_activity_pop(); redraw(); return; }
int del = 0;
if (dir == MEOW_SWIPE_UP) del = dist; /* 手指上移 → 偏移增大 */
else if (dir == MEOW_SWIPE_DOWN) del = -dist;
if (del == 0) return;
if (dir != MEOW_SWIPE_UP && dir != MEOW_SWIPE_DOWN) return;
if (g_drag_page || g_drag_list) return; /* 本次手势已实时跟手滚动过 */
int del = (dir == MEOW_SWIPE_UP) ? dist : -dist; /* 手指上移 → 偏移增大 */
if (g_demo_focus && g_dlc) {
meow_list_scroll_by(g_dlc, del);
g_ds.list = meow_list_scroll(g_dlc);
@@ -558,6 +614,16 @@ static void on_swipe_progress(int x_start, int dx)
meow_ui_swipe_hint(x_start + dx);
}
/* M2.71-bug2/6:拖动过程回调(只对 demo 页有意义;home/全屏不拖拽)。 */
static void on_touch_down(int x, int y)
{
if (g_demo) demo_touch_down(x, y);
}
static void on_touch_move(int x, int y)
{
if (g_demo) demo_touch_move(x, y);
}
static void on_swipe(int dir, int dx, int dy)
{
(void)dy;
@@ -608,7 +674,8 @@ int main(void)
demo_init();
redraw();
meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress };
meow_ui_events ev = { on_key, on_tap, on_swipe, on_tick, on_swipe_progress,
on_touch_down, on_touch_move };
meow_ui_run(&ev);
meow_widget_free(g_demo_btn);