Files
MeowOS-For-R3P2/patch_v2/hello_app/ui/home/home.c
T
MeowOS b5038f8673 refactor(hello): 视图框架批次③ — 目录嵌套(ui/home/home.c, ui/demo/demo.c+ui/demo/list/list.c) + 视图深度化(demo列表区抽 CONTAINER 子视图, 子>父命中) + on_draw 链路实测通过(list标题改由子视图 on_draw 经注册表绘制) + g_ds.prog 上收 logic/state.c (agent-181)
hello c06b3b4f→07b1ee37; mipsel -Wall -Wextra 0 warning; 宿主 P1c/P2/P3 + widgets 全 PASS
SDK 后续项(本批 App 层显式驱动适配, 未动 SDK): view enter/leave 不递归 children + on_event 路由未接线 — 待 SDK 侧补
2026-08-31 04:00:15 +08:00

120 lines
4.7 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ui/home/home.c — 主页(ACT_HOME)view + 控制器(批次③ 目录嵌套后)。
*
* 负责 home 控件(TAP ME / 6 通知行 / CANCEL LAST / FULLSCREEN / WIDGETS DEMO)+ 手绘(非注册表
* 路径,batch① 仅 demo 迁注册表,home 保持命令式 draw+flush)+ 命中分发 + 业务监听(logic 推送)。
* UI→业务只经 logic_taps_bump()/notif_send()/notif_cancel();业务变化经 logic_set_listener 回调
* home_state_listener 刷新(契约 ①②)。导航到 demo/full 经 meow_view_page_push(单一入口)。
*/
#include "hello_internal.h"
#include <stdio.h>
#include <string.h>
static home_ctrl g_home_ctrl;
/* ---- home 既有控件 ---- */
static meow_widget *g_btn;
static meow_widget *g_nbtn[6]; /* 通知触发按钮行 */
static meow_widget *g_cancel; /* 取消最近一条通知 */
static meow_widget *g_fs_btn; /* FULLSCREEN 进入按钮(主界面) */
static meow_widget *g_demo_btn; /* 「控件库 Demo」入口按钮(主界面) */
static const char *g_notif_labels[6] = { "INFO", "MEDIA", "HIGH", "PROG", "ONGO", "TGT" };
static char g_btn_label[32] = "TAP ME";
void home_redraw(void)
{
const meow_theme *th = meow_theme_get();
int sb = meow_ui_statusbar_height();
if (sb > 0) meow_ui_fill_rect(0, sb, 480, 720 - sb, th->bg);
else meow_ui_clear(th->bg);
meow_ui_text_center(240, sb + 8, "MEOWOS HELLO", 28, th->fg);
meow_ui_text_center(240, sb + 38, "SDK: meow_ui.a", 20, th->dim);
meow_widget_draw(g_btn);
meow_ui_text_center(240, 372, "tap = send notification (see log)", 20, th->dim);
for (int i = 0; i < 6; i++) meow_widget_draw(g_nbtn[i]);
meow_widget_draw(g_cancel);
meow_widget_draw(g_fs_btn);
meow_widget_draw(g_demo_btn);
char line[64];
snprintf(line, sizeof line, "taps=%d uptime=%ds", logic_taps_get(), logic_secs_get());
meow_ui_text_center(240, 516, line, 20, th->dim);
meow_ui_text(20, 660, "left-swipe = exit", 20, th->dim);
meow_ui_flush();
}
/* 业务→UI 监听器:taps 变化 → 重建按钮 label;secs 变化 → 重绘(仅本页在前台时,否则只改业务
* 不覆写全屏帧——例如全屏态下 logic_secs_add 仍触发,但本页 active=0 跳过 redraw)。 */
static void home_state_listener(int ev, void *ctx)
{
home_ctrl *c = (home_ctrl *)ctx;
if (ev == LOGIC_EV_TAPS) {
char lb[32];
snprintf(lb, sizeof lb, "TAPPED x%d", logic_taps_get());
meow_widget_free(g_btn);
g_btn = meow_btn_create(120, 300, 240, 64, lb);
}
if (!c->active) return; /* 本页不在前台(全屏):不覆写当前帧 */
home_redraw();
}
int home_on_tap(int x, int y)
{
if (meow_widget_hit(g_demo_btn, x, y)) { meow_view_page_push(ACT_DEMO); return 1; }
for (int i = 0; i < 6; i++) {
if (meow_widget_hit(g_nbtn[i], x, y)) { notif_send(i); home_redraw(); return 1; }
}
if (meow_widget_hit(g_cancel, x, y)) { notif_cancel(); home_redraw(); return 1; }
if (meow_widget_hit(g_fs_btn, x, y)) { meow_view_page_push(ACT_FULL); return 1; }
if (meow_widget_hit(g_btn, x, y)) { logic_taps_bump(); return 1; }
return 0;
}
static void home_page_create(meow_view *v, void *ctx)
{
(void)v;
((home_ctrl *)ctx)->view = v;
g_btn = meow_btn_create(120, 300, 240, 64, g_btn_label);
for (int i = 0; i < 6; i++)
g_nbtn[i] = meow_btn_create(3 + i * 80, 400, 74, 56, g_notif_labels[i]);
g_cancel = meow_btn_create(36, 464, 200, 42, "CANCEL LAST");
g_fs_btn = meow_btn_create(244, 464, 200, 42, "FULLSCREEN");
g_demo_btn = meow_btn_create(36, 560, 408, 44, "WIDGETS DEMO");
/* 注册业务→UI 推送监听器(biz-UI 绑定点 = 本页控制器 ctx)。 */
logic_set_listener(home_state_listener, ctx);
}
static void home_page_enter(meow_view *v, void *ctx)
{
(void)v;
((home_ctrl *)ctx)->active = 1;
home_redraw();
}
static void home_page_leave(meow_view *v, void *ctx)
{
(void)v;
((home_ctrl *)ctx)->active = 0; /* 默认不销毁子控件;弹回时 on_enter 重绘恢复 */
}
static void home_page_destroy(meow_view *v, void *ctx)
{
(void)v; (void)ctx;
meow_widget_free(g_demo_btn);
for (int i = 0; i < 6; i++) meow_widget_free(g_nbtn[i]);
meow_widget_free(g_cancel);
meow_widget_free(g_fs_btn);
meow_widget_free(g_btn);
g_btn = g_cancel = g_fs_btn = g_demo_btn = NULL;
for (int i = 0; i < 6; i++) g_nbtn[i] = NULL;
}
meow_view *home_view_create(void)
{
static const meow_view_hooks h = {
.on_create = home_page_create,
.on_enter = home_page_enter,
.on_leave = home_page_leave,
.on_destroy = home_page_destroy,
};
return meow_view_create(ACT_HOME, MEOW_VIEW_ACTIVITY, &h, &g_home_ctrl);
}