145 lines
5.0 KiB
C
145 lines
5.0 KiB
C
|
|
#include "ui_home.h"
|
||
|
|
#include "img_bg.h"
|
||
|
|
#include "ico_bt.h"
|
||
|
|
#include "ico_music.h"
|
||
|
|
#include "kt_ui.h"
|
||
|
|
#include "kt.h"
|
||
|
|
#include "key_event_deal.h"
|
||
|
|
#include "lvgl.h"
|
||
|
|
#include "drv_st7789.h"
|
||
|
|
#include "app_task.h"
|
||
|
|
|
||
|
|
static u8 select_block_index = 0;
|
||
|
|
static lv_obj_t *block_bt; /* 索引 0: BT 色块 */
|
||
|
|
static lv_obj_t *block_music; /* 索引 1: Music 色块 */
|
||
|
|
|
||
|
|
/* 刷新选中态: 选中的色块加白边框+高亮, 未选中无边框+60%透明 */
|
||
|
|
static void ui_home_refresh_select(void)
|
||
|
|
{
|
||
|
|
lv_obj_t *sel = (select_block_index == 0) ? block_bt : block_music;
|
||
|
|
lv_obj_t *unsel = (select_block_index == 0) ? block_music : block_bt;
|
||
|
|
if (sel)
|
||
|
|
{
|
||
|
|
lv_obj_set_style_border_width(sel, 3, 0);
|
||
|
|
lv_obj_set_style_border_color(sel, lv_color_hex(0xFFFFFF), 0);
|
||
|
|
lv_obj_set_style_bg_opa(sel, LV_OPA_80, 0);
|
||
|
|
}
|
||
|
|
if (unsel)
|
||
|
|
{
|
||
|
|
lv_obj_set_style_border_width(unsel, 0, 0);
|
||
|
|
lv_obj_set_style_bg_opa(unsel, LV_OPA_60, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
/* 创建带色块、图标和文字的大按钮 (40% 透明度) */
|
||
|
|
static lv_obj_t *lv_create_color_block(lv_obj_t *parent, int x, int y, int w, int h,
|
||
|
|
lv_color_t color, const char *text,
|
||
|
|
const lv_img_dsc_t *icon)
|
||
|
|
{
|
||
|
|
lv_obj_t *obj = lv_obj_create(parent);
|
||
|
|
lv_obj_set_size(obj, w, h);
|
||
|
|
lv_obj_set_pos(obj, x, y);
|
||
|
|
lv_obj_set_style_bg_color(obj, color, 0);
|
||
|
|
lv_obj_set_style_bg_opa(obj, LV_OPA_60, 0);
|
||
|
|
lv_obj_set_style_border_width(obj, 0, 0);
|
||
|
|
lv_obj_set_style_radius(obj, 8, 0);
|
||
|
|
lv_obj_clear_flag(obj, LV_OBJ_FLAG_SCROLLABLE);
|
||
|
|
|
||
|
|
if (icon)
|
||
|
|
{
|
||
|
|
lv_obj_t *img = lv_img_create(obj);
|
||
|
|
lv_img_set_src(img, icon);
|
||
|
|
lv_obj_align(img, LV_ALIGN_TOP_MID, 0, 8);
|
||
|
|
}
|
||
|
|
|
||
|
|
lv_obj_t *label = lv_label_create(obj);
|
||
|
|
lv_label_set_text(label, text);
|
||
|
|
lv_obj_set_style_text_color(label, lv_color_hex(0xFFFFFF), 0);
|
||
|
|
lv_obj_align(label, LV_ALIGN_BOTTOM_MID, 0, -8);
|
||
|
|
return obj;
|
||
|
|
}
|
||
|
|
|
||
|
|
lv_obj_t *ui_home_create(void)
|
||
|
|
{
|
||
|
|
lv_obj_t *scr = lv_obj_create(NULL);
|
||
|
|
lv_obj_set_style_bg_img_src(scr, &img_bg, 0);
|
||
|
|
lv_obj_set_style_pad_all(scr, 0, 0);
|
||
|
|
lv_obj_clear_flag(scr, LV_OBJ_FLAG_SCROLLABLE);
|
||
|
|
|
||
|
|
/* 横屏: LCD_W=320, LCD_H=240, 色块增大1/3, 垂直居中 */
|
||
|
|
#define BLOCK_GAP 24
|
||
|
|
#define TITLE_H 36
|
||
|
|
#define BLOCK_W (((LCD_W - BLOCK_GAP * 3) / 2 / 2) * 4 / 3)
|
||
|
|
#define BLOCK_H (((LCD_H - TITLE_H - 16) / 2) * 4 / 3)
|
||
|
|
#define BLOCK_Y (TITLE_H + ((LCD_H - TITLE_H) - BLOCK_H) / 2)
|
||
|
|
|
||
|
|
/* 顶部标题 (浅色, 深色背景可见) */
|
||
|
|
lv_obj_t *title = lv_label_create(scr);
|
||
|
|
lv_label_set_text(title, "Home");
|
||
|
|
lv_obj_set_style_text_font(title, &lv_font_montserrat_20, 0);
|
||
|
|
lv_obj_set_style_text_color(title, lv_color_hex(0xFFFFFF), 0);
|
||
|
|
lv_obj_set_pos(title, 0, 8);
|
||
|
|
lv_obj_set_width(title, LCD_W);
|
||
|
|
lv_obj_set_style_text_align(title, LV_TEXT_ALIGN_CENTER, 0);
|
||
|
|
|
||
|
|
/* 中间两个色块: 左 BT (select_block_index=0), 右 Music (select_block_index=1) */
|
||
|
|
int block_area_w = BLOCK_W * 2 + BLOCK_GAP;
|
||
|
|
int block_start_x = (LCD_W - block_area_w) / 2;
|
||
|
|
block_bt = lv_create_color_block(scr, block_start_x, BLOCK_Y, BLOCK_W, BLOCK_H,
|
||
|
|
lv_color_hex(0x2196F3), "BT", &ico_bt);
|
||
|
|
block_music = lv_create_color_block(scr, block_start_x + BLOCK_W + BLOCK_GAP, BLOCK_Y, BLOCK_W, BLOCK_H,
|
||
|
|
lv_color_hex(0xFF9800), "Music", &ico_music);
|
||
|
|
|
||
|
|
ui_home_refresh_select(); /* 根据 select_block_index 显示选中态 */
|
||
|
|
return scr;
|
||
|
|
}
|
||
|
|
|
||
|
|
void ui_home_on_key(int key_event, int key_value)
|
||
|
|
{
|
||
|
|
printf("ui_home_on_key: key_event:%d, key_value:%d\n", key_event, key_value);
|
||
|
|
(void)key_value;
|
||
|
|
switch (key_event)
|
||
|
|
{
|
||
|
|
case KEY_MUSIC_PREV:
|
||
|
|
case KEY_USER_PREV:
|
||
|
|
printf("ui_home_on_key: KEY_USER_PREV\n");
|
||
|
|
select_block_index = (select_block_index > 0) ? (select_block_index - 1) : 0;
|
||
|
|
ui_home_refresh_select();
|
||
|
|
break;
|
||
|
|
case KEY_MUSIC_NEXT:
|
||
|
|
case KEY_USER_NEXT:
|
||
|
|
printf("ui_home_on_key: KEY_USER_NEXT\n");
|
||
|
|
select_block_index = (select_block_index < 1) ? (select_block_index + 1) : 1;
|
||
|
|
ui_home_refresh_select();
|
||
|
|
break;
|
||
|
|
case KEY_USER_APP_BT_START:
|
||
|
|
printf("ui_home_on_key: KEY_USER_APP_BT_START\n");
|
||
|
|
//app_task_switch_to(APP_BT_TASK);
|
||
|
|
kt_ui_show_page(KT_PAGE_BT);
|
||
|
|
break;
|
||
|
|
case KEY_USER_APP_MUSIC_START:
|
||
|
|
printf("ui_home_on_key: KEY_USER_APP_MUSIC_START\n");
|
||
|
|
//app_task_switch_to(APP_MUSIC_TASK);
|
||
|
|
kt_ui_show_page(KT_PAGE_MUSIC);
|
||
|
|
break;
|
||
|
|
case KEY_USER_ENTER:
|
||
|
|
printf("ui_home_on_key: KEY_USER_ENTER\n");
|
||
|
|
if (select_block_index == 0)
|
||
|
|
{
|
||
|
|
//kt_ui_show_page(KT_PAGE_BT);
|
||
|
|
app_task_switch_to(APP_BT_TASK);
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
//kt_ui_show_page(KT_PAGE_MUSIC);
|
||
|
|
if (music_app_check())
|
||
|
|
{
|
||
|
|
app_task_switch_to(APP_MUSIC_TASK);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|