Files
player/Project/Src/MyWinApp/mywin_user_status_bar.c

316 lines
9.3 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mywin_user_status_bar.h"
#include "date.h"
#include "mywin_inc.h"
2025-06-27 00:32:57 +08:00
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>̳<EFBFBD><CCB3><EFBFBD>MYWIN<49><4E><EFBFBD><EFBFBD>
// <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><E6A3AC><EFBFBD>ݾ<EFBFBD><DDBE><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>;<EFBFBD><CDBE>д<EFBFBD><D0B4>û<EFBFBD><C3BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define WIN_STATUSBAR_TYPE "WIN_StatusBarStruct"
WIN_StatusBarStruct *WIN_CreatStatusBar(
WIN_WindowStruct *base,
void (*msgLoop)(struct _WIN_WindowStruct *win, WIN_MsgStruct *msg), int x,
int y, int x_size, int y_size) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣѭ<CFA2><D1AD>
if (msgLoop == 0) {
msgLoop = (void (*)(struct _WIN_WindowStruct *win,
WIN_MsgStruct *msg))STATUSBAR_DefaultMsgLoop;
}
WIN_StatusBarStruct *ret = mymalloc(sizeof(WIN_StatusBarStruct));
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><ECBAAF>
if (ret) {
mymemset(ret, 0, sizeof(WIN_StatusBarStruct));
if (0 == WIN_CreatWindowExt((WIN_WindowStruct *)ret, base, msgLoop, x, y,
x_size, y_size)) {
// <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
myfree(ret);
ret = 0;
} else {
((WIN_WindowStruct *)ret)->winType = WIN_STATUSBAR_TYPE;
//((WIN_WindowStruct *)ret)->keyShield=1;//<2F><><EFBFBD>ΰ<EFBFBD><CEB0><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD>Ϣ
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
ret->img_xsize = 40;
ret->backColor = 0;
ret->color = 0xffffffff;
mymemcpy(ret->stat.time, "ʾ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> 00:00", 15);
mymemcpy(ret->stat.mode, "ʾ<EFBFBD><EFBFBD>ģʽ", 9);
ret->timerIdGet = WIN_CreatTimer((WIN_WindowStruct *)ret, 100);
// WIN_SetAsTopWin ((WIN_WindowStruct *)ret);//<2F><><EFBFBD><EFBFBD><EFBFBD>ö<EFBFBD>
ret->y_size_def = y_size;
ret->app_y_step = 30;
}
}
return ret;
2025-06-27 00:32:57 +08:00
}
// ״̬<D7B4><CCAC>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
void STATUSBAR_StateUpdata(WIN_StatusBarStruct *statusbar,
STATUSBAR_DataStruct *s) {
int temp = statusbar->stat.mode_x;
// ʹ<><CAB9><EFBFBD>ڴ渴<DAB4>Ƶķ<C6B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<C6BD><E1B9B9>
mymemcpy(&statusbar->stat, s, sizeof(STATUSBAR_DataStruct));
if (strlen(statusbar->stat.mode) > 8) {
// <20>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʹ<CAB1>ù<EFBFBD><C3B9><EFBFBD><EFBFBD><EFBFBD>ʾ
if (statusbar->timerId == 0) {
statusbar->timerId = WIN_CreatTimer((WIN_WindowStruct *)statusbar, 100);
statusbar->stat.mode_x = WIN_GetFontWidth() * 4 / 2;
} else {
statusbar->stat.mode_x = temp;
}
} else {
if (statusbar->timerId) {
WIN_DeleteTimer(statusbar->timerId);
statusbar->timerId = 0;
}
}
2025-06-27 00:32:57 +08:00
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD>ļ<EFBFBD>
void STATUSBAR_SetRes(WIN_StatusBarStruct *statusbar, STATUSBAR_ResStruct *r) {
// ʹ<><CAB9><EFBFBD>ڴ渴<DAB4>Ƶķ<C6B5><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<C6BD><E1B9B9>
mymemcpy(&statusbar->res, r, sizeof(STATUSBAR_ResStruct));
2025-06-27 00:32:57 +08:00
}
// <20><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>ͼƬ
void STATUSBAR_SetBackPic(WIN_StatusBarStruct *statusbar, WIN_PicStruct *pic) {
if (pic) {
mymemcpy(&statusbar->pic, pic, sizeof(WIN_PicStruct));
} else {
mymemset(&statusbar->pic, 0, sizeof(WIN_PicStruct));
}
2025-06-27 00:32:57 +08:00
}
void STATUSBAR_ScanApp(WIN_StatusBarStruct *bar) {
for (int i = 0; i < APPM_LIST_MAXLEN; i++) {
app_struct *app = appm_get(i);
if (app) {
bar->app_item[bar->app_num].app = app;
bar->app_num++;
}
}
2025-06-27 00:32:57 +08:00
}
void STATUSBAR_ClearApp(WIN_StatusBarStruct *bar) { bar->app_num = 0; }
// Ĭ<>ϻ<EFBFBD><CFBB>ƺ<EFBFBD><C6BA><EFBFBD>
void STATUSBAR_DefaultPaint(WIN_StatusBarStruct *statusbar) {
int x = 0;
int y = 0;
int x_size = ((WIN_WindowStruct *)statusbar)->x_size;
// int y_size=((WIN_WindowStruct *)statusbar)->y_size;
int y_size = 20;
int tag_xsize = 0; // <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
WIN_SetLcdBkColor(statusbar->backColor);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼƬ<CDBC><C6AC><EFBFBD><EFBFBD>ʾͼƬ
if (statusbar->pic.data) {
WIN_FillRect(0, 0, ((WIN_WindowStruct *)statusbar)->x_size,
((WIN_WindowStruct *)statusbar)->y_size, statusbar->pic.data,
((WIN_WindowStruct *)statusbar)->x,
((WIN_WindowStruct *)statusbar)->y, statusbar->pic.xsize,
statusbar->pic.ysize);
} else {
WIN_Clear();
}
uint32_t font_type = WIN_SetFontSize(16);
WIN_SetLcdColor(statusbar->color);
// <20><>ʾʱ<CABE><CAB1>
WIN_SetFontMode(WIN_DRAWMODE_ALONE);
WIN_SetLcdBkColor(statusbar->color);
if (statusbar->stat.time[0]) {
WIN_DrawTxtAt(statusbar->stat.time, x, y_size / 2 - WIN_GetFontHight() / 2);
}
// <20><>ʾģʽ
if (statusbar->stat.mode[0]) {
WIN_DrawTxtHCenterAt(statusbar->stat.mode, x_size / 2,
y_size / 2 - WIN_GetFontHight() / 2);
}
// <20><>ʾ<EFBFBD><CABE><EFBFBD>ذٷֱ<D9B7>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (statusbar->stat.betty[0]) {
tag_xsize = strlen(statusbar->stat.betty) * WIN_GetFontWidth() / 2;
WIN_DrawTxtAt(statusbar->stat.betty, x_size - tag_xsize - 1,
y_size / 2 - WIN_GetFontHight() / 2);
x_size -= tag_xsize;
}
int y_step = statusbar->app_y_step;
x = 15;
y = statusbar->y_size_def + 10;
x_size = ((WIN_WindowStruct *)statusbar)->x_size;
char txt[20] = {0};
for (int i = 0; i < statusbar->app_num; i++) {
int txt_y = y + (y_step - WIN_GetFontHight()) / 2;
STATUSBAR_AppStruct *app_item = &statusbar->app_item[i];
RECT_Struct *rect = 0;
WIN_DrawTxtAt(app_item->app->app_info->name, x, txt_y);
if (app_item->app->run_state)
WIN_DrawTxtAt("<EFBFBD><EFBFBD><EFBFBD>", x + x_size * 1 / 4, txt_y);
rect = &app_item->enter;
rect->x_size = x_size / 4;
rect->y_size = y_step;
rect->x = x + x_size * 2 / 4;
rect->y = y;
WIN_DrawTxtAt("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", rect->x, txt_y);
rect = &app_item->exit;
rect->x = x + x_size * 3 / 4;
rect->y = y;
rect->x_size = x_size / 4;
rect->y_size = y_step;
WIN_DrawTxtAt("ɾ<EFBFBD><EFBFBD>", rect->x, txt_y);
y += y_step;
WIN_DrawHLine(10, y, x_size - 1 - 10);
}
WIN_SetFontSize(font_type);
2025-06-27 00:32:57 +08:00
}
int STATUSBAR_AppButton(WIN_StatusBarStruct *bar, WIN_MoveStruct *m) {
WIN_WindowStruct *win = (WIN_WindowStruct *)bar;
for (int i = 0; i < bar->app_num; i++) {
STATUSBAR_AppStruct *app_item = &bar->app_item[i];
RECT_Struct *rect = 0;
rect = &app_item->enter;
if (POS_InRect(rect->x, rect->y, rect->x_size, rect->y_size, m->x_move,
m->y_move)) {
// <20>򿪱<EFBFBD><F2BFAAB1><EFBFBD>Ϊi<CEAA><69>app
WIN_SetSize(win, win->x_size, bar->y_size_def);
bar->dis = 0;
app_run(app_item->app);
return 0;
}
rect = &app_item->exit;
if (POS_InRect(rect->x, rect->y, rect->x_size, rect->y_size, m->x_move,
m->y_move)) {
// <20>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>Ϊi<CEAA><69>app
if (app_exit(app_item->app) != 0) {
MSGBOX_TipsTime((WIN_WindowStruct *)bar, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>", "ȷ<EFBFBD><EFBFBD>",
5 * 1000);
}
WIN_SetSize(win, win->x_size, bar->y_size_def);
bar->dis = 0;
return 0;
}
}
return -1;
2025-06-27 00:32:57 +08:00
}
int STATUSBAR_TouchMove(WIN_StatusBarStruct *statusbar, WIN_MoveStruct *m) {
WIN_WindowStruct *win = (WIN_WindowStruct *)statusbar;
int y_max = WIN_GetWinStruct()->lcd->getLcdSizeY();
switch (m->moveType) {
case MOVE_DATA_SHORT:
STATUSBAR_AppButton(statusbar, m);
break;
case MOVE_DATA_MOVED:
if (statusbar->mov_start) {
int y_temp = win->y_size + m->y_move;
if (y_temp < statusbar->y_size_def)
y_temp = statusbar->y_size_def;
WIN_SetSize(win, win->x_size, y_temp);
}
break;
case MOVE_DATA_TOUCHIN:
if (statusbar->mov_start == 0) {
// <20><><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>Ե<EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڸı<C4B1>ڴ<EFBFBD>С
// if(m->y_move<20||m->y_move>y_max-20)
{
statusbar->mov_start = 1;
if (statusbar->dis == 0) {
statusbar->dis = 1;
WIN_SetSize(win, win->x_size, 100);
} else {
statusbar->dis = 0;
}
}
}
break;
case MOVE_DATA_TOUCHOUT:
case MOVE_DATA_MOVEOUT:
if (statusbar->mov_start) {
if (statusbar->dis == 1) {
if (win->y_size > 200) {
WIN_SetSize(win, win->x_size, y_max);
} else {
WIN_SetSize(win, win->x_size, statusbar->y_size_def);
statusbar->dis = 0;
}
} else {
if (win->y_size < y_max - 100) {
WIN_SetSize(win, win->x_size, statusbar->y_size_def);
} else {
WIN_SetSize(win, win->x_size, y_max);
statusbar->dis = 1;
}
}
statusbar->mov_start = 0;
}
break;
}
return 0;
2025-06-27 00:32:57 +08:00
}
// Ĭ<><C4AC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void STATUSBAR_DefaultMsgLoop(WIN_StatusBarStruct *statusbar,
WIN_MsgStruct *msg) {
WIN_MoveStruct *m = 0;
WIN_TouchStruct *t = 0;
STATUSBAR_DataStruct *s = 0;
switch (msg->msg) {
case WIN_MSG_PAINT:
STATUSBAR_DefaultPaint(statusbar);
break;
case WIN_MSG_KEY:
break;
case WIN_MSG_MOVE:
m = msg->data.p;
STATUSBAR_TouchMove(statusbar, m);
break;
case WIN_MSG_TIMER:
if (msg->data.v == statusbar->timerId) {
} else if (msg->data.v == statusbar->timerIdGet) {
int Hours = 0;
int Minutes = 0;
int Seconds;
STATUSBAR_DataStruct *statu = mymalloc(sizeof(STATUSBAR_DataStruct));
mymemset(statu, 0, sizeof(STATUSBAR_DataStruct));
date_rtc_get_time(&Hours, &Minutes, &Seconds);
if (statusbar->sec != Seconds) {
// <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
statusbar->sec = Seconds;
int a = mem_perused(), b = exmem_perused();
sprintf(statu->time, "%02d:%02d:%02d", Hours, Minutes, Seconds);
sprintf(statu->mode, "mem:%02d.%02d,exm:%02d.%02d", a / 100, a % 100,
b / 100, b % 100);
sprintf(statu->betty, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:100%%");
STATUSBAR_StateUpdata(statusbar, statu);
STATUSBAR_ClearApp(statusbar);
STATUSBAR_ScanApp(statusbar);
WIN_SetInvalidWhenTop((WIN_WindowStruct *)statusbar);
}
myfree(statu);
}
break;
// ״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ⲿ<EFBFBD><E2B2BF>Ϣ<EFBFBD><CFA2>Ϊ STATUSBAR_Struct <20><><EFBFBD>͵Ľṹ<C4BD><E1B9B9>
case WIN_MSG_EXTMSG:
s = msg->data.p;
STATUSBAR_StateUpdata(statusbar, s);
WIN_SetInvalid((WIN_WindowStruct *)statusbar);
break;
default:
WIN_DefaultMsgLoop((WIN_WindowStruct *)statusbar, msg);
break;
}
2025-06-27 00:32:57 +08:00
}