重构显示逻辑为 MVP 架构,进行显示模块的解耦

This commit is contained in:
2026-03-24 19:52:22 +08:00
parent a4bf0962b2
commit 0690d6a00e
42 changed files with 2207 additions and 1417 deletions

View File

@@ -0,0 +1,93 @@
#include <string.h>
#include "test_common.h"
#include "../src/Drv/key.h"
#include "../src/Drv/menu/presenter/menu_navigator.h"
static int g_exec_count = 0;
static int on_exec(void)
{
g_exec_count++;
return 0;
}
static void build_legacy_like_tree(MenuNavState *nav, tagMenuItem *root, tagMenuItem *m1, tagMenuItem *m2, tagMenuItem *m1_sub)
{
memset(nav, 0, sizeof(*nav));
memset(root, 0, sizeof(*root));
memset(m1, 0, sizeof(*m1));
memset(m2, 0, sizeof(*m2));
memset(m1_sub, 0, sizeof(*m1_sub));
root->byClass = 0;
root->ptLower = m1;
root->ptBefore = root;
root->ptBehind = root;
root->wPos = 1;
m1->byClass = 1;
m1->wPos = 1;
m1->ptHigher = root;
m1->ptBefore = m2;
m1->ptBehind = m2;
m1->ptLower = m1_sub;
m1->pfnWinProc = on_exec;
m2->byClass = 1;
m2->wPos = 2;
m2->ptHigher = root;
m2->ptBefore = m1;
m2->ptBehind = m1;
m2->pfnWinProc = on_exec;
m1_sub->byClass = 2;
m1_sub->wPos = 1;
m1_sub->ptHigher = m1;
m1_sub->ptBefore = m1_sub;
m1_sub->ptBehind = m1_sub;
m1_sub->pfnWinProc = on_exec;
nav->ptHead = root;
nav->ptCurrent = m1;
nav->ptCurBak = m1;
nav->ptRoute[0] = root;
nav->ptRoute[1] = m1;
}
int main(void)
{
MenuNavState nav;
tagMenuItem root;
tagMenuItem m1;
tagMenuItem m2;
tagMenuItem m1_sub;
MenuNavResult result;
build_legacy_like_tree(&nav, &root, &m1, &m2, &m1_sub);
result = MenuNavigator_ProcessKey(&nav, KEY_D);
ASSERT_EQ_INT(1, result.needRefresh);
ASSERT_TRUE(nav.ptCurrent == &m2);
result = MenuNavigator_ProcessKey(&nav, KEY_U);
ASSERT_EQ_INT(1, result.needRefresh);
ASSERT_TRUE(nav.ptCurrent == &m1);
result = MenuNavigator_ProcessKey(&nav, KEY_ENT);
ASSERT_EQ_INT(1, result.needRefresh);
ASSERT_TRUE(nav.ptCurrent == &m1_sub);
result = MenuNavigator_ProcessKey(&nav, KEY_ESC);
ASSERT_EQ_INT(1, result.needRefresh);
ASSERT_TRUE(nav.ptCurrent == &m1);
g_exec_count = 0;
nav.ptCurrent = &m2;
result = MenuNavigator_ProcessKey(&nav, KEY_ENT);
ASSERT_EQ_INT(0, result.needRefresh);
ASSERT_EQ_INT(1, g_exec_count);
return 0;
}