#include "include.h" #include "func.h" #if TRACE_EN #define TRACE(...) printf(__VA_ARGS__) #else #define TRACE(...) #endif #define FOCUS_AUTO_TICK_EXPIRE 10 //松手后自动对齐焦点单位时间(ms) #define FOCUS_AUTO_STEP 5 //松手后自动对齐焦点单位时间步进 #define FOCUS_AUTO_STEP_DIV 16 #define DRAG_AUTO_SPEED 80 //拖动松手后的速度 #define SET_LIST_CNT ((int)(sizeof(tbl_setting_list) / sizeof(tbl_setting_list[0]))) enum { COMPO_ID_LISTBOX = 1, }; typedef struct f_set_list_t_ { compo_listbox_t *listbox; bool flag_drag; //开始拖动 bool flag_move_auto; //自动移到坐标 u32 tick; s32 focus_y; s32 focus_dy; s32 focus_ystep; int moveto_idx; //设定自动移到的目标菜单 s32 moveto_y; //设定自动移到的y坐标 s32 first_y; //首图标坐标 s32 last_y; //尾图标坐标 } f_set_list_t; static const compo_listbox_item_t tbl_setting_list[] = { {UI_BUF_SETTING_LIGHT_BIN, STR_SETTING_LIGHT, FUNC_LIGHT}, //亮度调节 {UI_BUF_SETTING_BREATHING_SCREEN_CLICK_BIN, STR_SETTING_DOUSING, FUNC_SET_SUB_DOUSING}, //息屏时长 {UI_BUF_SETTING_WRIST_BIN, STR_SETTING_UP, FUNC_SET_SUB_WRIST}, //抬腕亮屏 {UI_BUF_SETTING_DISTURB_CLICK_BIN, STR_SETTING_DISTURD, FUNC_SET_SUB_DISTURD}, //勿扰模式 {UI_BUF_SETTING_SOUND_AND_VIBRATION_BIN, STR_SETTING_SAV, FUNC_SET_SUB_SAV}, //声音与振动 {UI_BUF_SETTING_LANGUAGE_BIN, STR_SETTING_LANGUAGE, FUNC_SET_SUB_LANGUAGE}, //语言设置 {UI_BUF_SETTING_TIME_BIN, STR_SETTING_TIME, FUNC_SET_SUB_TIME}, //时间设置 {UI_BUF_SETTING_CALENDAR_BIN, STR_SETTING_CALENDAR, FUNC_CALENDAER}, //日期设置 {UI_BUF_SETTING_PASSWORD_BIN, STR_SETTING_PASSWORD, FUNC_SET_SUB_PASSWORD}, //密码锁 {UI_BUF_SETTING_ABOUT_BIN, STR_SETTING_ABOUT, FUNC_SET_SUB_ABOUT}, //关于 {UI_BUF_SETTING_RESTART_BIN, STR_SETTING_RESTART, FUNC_SET_SUB_RESTART}, //重启 {UI_BUF_SETTING_RESTORE_FACTORY_BIN, STR_SETTING_RSTFY, FUNC_SET_SUB_RSTFY}, //恢复出厂 {UI_BUF_SETTING_OFF_BIN, STR_SETTING_OFF, FUNC_SET_SUB_OFF}, //关机 }; //创建主菜单窗体,创建窗体中不要使用功能结构体 func_cb.f_cb compo_form_t *func_set_sub_list_form_create(void) { //新建窗体 compo_form_t *frm = compo_form_create(true); //新建菜单列表 compo_listbox_t *listbox = compo_listbox_create(frm, tbl_setting_list, SET_LIST_CNT); compo_setid(listbox, COMPO_ID_LISTBOX); u8 set_idx = sys_cb.set_idx; if (set_idx < 1) { set_idx = 1; } compo_listbox_set_focus_byidx(listbox, set_idx); compo_listbox_update(listbox); return frm; } //点进图标进入应用 static void func_set_sub_list_icon_click(void) { int icon_idx; f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_set->listbox; u8 func_sta; icon_idx = compo_listbox_select(listbox, ctp_get_sxy().y); if (icon_idx < 0 || icon_idx >= SET_LIST_CNT) { return; } //根据图标索引获取应用ID func_sta = tbl_setting_list[icon_idx].func_sta; //切入应用 if (func_sta > 0) { compo_form_t *frm = func_create_form(func_sta); func_switching(FUNC_SWITCH_ZOOM_ENTER | FUNC_SWITCH_AUTO, listbox->sel_icon); compo_form_destroy(frm); func_cb.sta = func_sta; sys_cb.set_idx = icon_idx; } } //切换到设置菜单页面 static void func_set_sub_list_switch_to_clock(void) { u8 func_sta = FUNC_CLOCK; f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_set->listbox; widget_icon_t *icon = compo_listbox_select_byidx(listbox, 0); compo_form_t *frm = func_create_form(func_sta); func_switching(FUNC_SWITCH_ZOOM_FADE_ENTER | FUNC_SWITCH_AUTO, icon); compo_form_destroy(frm); func_cb.sta = func_sta; sys_cb.set_idx = 0; } //主菜单功能事件处理 static void func_set_sub_list_process(void) { f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_set->listbox; if (f_set->flag_drag) { s32 dx; s32 dy = f_set->focus_dy; f_set->flag_drag = ctp_get_dxy(&dx, &f_set->focus_dy); if (f_set->flag_drag) { //拖动菜单图标 f_set->focus_ystep = f_set->focus_dy - dy; compo_listbox_set_focus(listbox, f_set->focus_y - f_set->focus_dy); compo_listbox_update(listbox); } else { //抬手后开始自动移动 s32 last_dy = ctp_get_last_dxy().y; f_set->focus_y = listbox->ofs_y; f_set->flag_move_auto = true; f_set->moveto_idx = listbox->focus_icon_idx - (last_dy * DRAG_AUTO_SPEED / GUI_SCREEN_HEIGHT); if (f_set->moveto_idx > SET_LIST_CNT) { f_set->moveto_idx = SET_LIST_CNT; } else if (f_set->moveto_idx < -1) { f_set->moveto_idx = -1; } f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx); f_set->tick = tick_get(); } } if (f_set->flag_move_auto) { //自动移动 if (f_set->focus_y == f_set->moveto_y) { if (f_set->focus_y < f_set->first_y) { f_set->moveto_y = f_set->first_y; //超过第1个,回弹 } else if (f_set->focus_y > f_set->last_y) { f_set->moveto_y = f_set->last_y; //超过最后1个,回弹 } else { f_set->flag_move_auto = false; //移动完成 } } else if (tick_check_expire(f_set->tick, FOCUS_AUTO_TICK_EXPIRE)) { s32 dy; f_set->tick = tick_get(); dy = f_set->moveto_y - f_set->focus_y; if (dy > 0) { if (dy > FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV) { dy = dy / FOCUS_AUTO_STEP_DIV; } else if (dy > FOCUS_AUTO_STEP) { dy = FOCUS_AUTO_STEP; } else { dy = 1; } } else { if (dy < -FOCUS_AUTO_STEP * FOCUS_AUTO_STEP_DIV) { dy = dy / FOCUS_AUTO_STEP_DIV; } else if (dy < -FOCUS_AUTO_STEP) { dy = -FOCUS_AUTO_STEP; } else { dy = -1; } } f_set->focus_y += dy; compo_listbox_set_focus(listbox, f_set->focus_y); compo_listbox_update(listbox); } } func_process(); } //拖动过程中,只响应部分消息 static void func_set_sub_list_drag_message(size_msg_t msg) { switch (msg) { default: evt_message(msg); break; } } //自动移动中,只响应部分消息 static void func_set_sub_list_move_auto_message(size_msg_t msg) { f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_set->listbox; switch (msg) { case MSG_CTP_TOUCH: f_set->flag_drag = true; //移动过程中,触屏停止 f_set->flag_move_auto = false; break; case MSG_QDEC_FORWARD: //向前滚动菜单 if (f_set->moveto_idx <= SET_LIST_CNT - 1) { f_set->moveto_idx++; f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx); } break; case MSG_QDEC_REVERSE: //向后滚动菜单 if (f_set->moveto_idx >= 0) { f_set->moveto_idx--; f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx); } break; default: evt_message(msg); break; } } //进入设置主菜单页面 static void func_set_sub_list_enter(void) { func_cb.f_cb = func_zalloc(sizeof(f_set_list_t)); func_cb.frm_main = func_set_sub_list_form_create(); f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; f_set->listbox = compo_getobj_byid(COMPO_ID_LISTBOX); compo_listbox_t *listbox = f_set->listbox; if (listbox->type != COMPO_TYPE_LISTBOX) { halt(HALT_GUI_COMPO_LISTBOX_TYPE); } f_set->focus_y = listbox->ofs_y; f_set->first_y = compo_listbox_gety_byidx(listbox, 0); f_set->last_y = compo_listbox_gety_byidx(listbox, SET_LIST_CNT - 1); func_cb.enter_tick = tick_get(); } //正常模式下 static void func_set_sub_list_normal_message(size_msg_t msg) { f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; compo_listbox_t *listbox = f_set->listbox; switch (msg) { case MSG_CTP_CLICK: func_set_sub_list_icon_click(); //单击图标 break; case MSG_CTP_SHORT_UP: case MSG_CTP_SHORT_DOWN: f_set->flag_drag = true; //任何方向短划,开启拖动 f_set->flag_move_auto = false; break; case MSG_CTP_SHORT_RIGHT: func_switching_to_menu(); //右滑缓慢退出任务 break; case MSG_QDEC_FORWARD: //向前滚动菜单 f_set->flag_move_auto = true; f_set->moveto_idx = listbox->focus_icon_idx; if (f_set->moveto_idx <= SET_LIST_CNT - 1) { f_set->moveto_idx++; f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx); } break; case MSG_QDEC_REVERSE: //向后滚动菜单 f_set->flag_move_auto = true; f_set->moveto_idx = listbox->focus_icon_idx; if (f_set->moveto_idx >= 0) { f_set->moveto_idx--; f_set->moveto_y = compo_listbox_gety_byidx(listbox, f_set->moveto_idx); } break; case MSG_CTP_LONG: break; case KU_DELAY_BACK: if (tick_check_expire(func_cb.enter_tick, TICK_IGNORE_KEY)) { func_set_sub_list_switch_to_clock(); //返回设置界面 } break; default: // func_set_sub_message(msg); break; } } //主菜单功能消息处理 static void func_set_sub_list_message(size_msg_t msg) { f_set_list_t *f_set = (f_set_list_t *)func_cb.f_cb; if (f_set->flag_drag) { //拖动过程中,只响应部分消息 func_set_sub_list_drag_message(msg); } else if (f_set->flag_move_auto) { //自动移动中,只响应部分消息 func_set_sub_list_move_auto_message(msg); } else { //正常模式下 func_set_sub_list_normal_message(msg); } } //退出菜单样式 void func_set_sub_exit(void) { printf("func_set_sub_exit\r\n"); func_cb.last = FUNC_SETTING; } //主菜单功能 void func_set_sub_list(void) { func_set_sub_list_enter(); while (func_cb.sta == FUNC_SETTING) { func_set_sub_list_process(); func_set_sub_list_message(msg_dequeue()); } func_set_sub_exit(); }