2025-06-27 00:32:57 +08:00
|
|
|
|
#include "mywin_user_status_bar.h"
|
|
|
|
|
#include "date.h"
|
2025-10-18 01:02:27 +08:00
|
|
|
|
#include "mywin_inc.h"
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
2025-10-18 01:02:27 +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"
|
|
|
|
|
|
2025-10-18 01:02:27 +08:00
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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();
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 13:58:40 +08:00
|
|
|
|
uint32_t font_type = WIN_SetFontSize(16);
|
2025-10-18 01:02:27 +08:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|
|
|
|
|
|
2025-10-18 01:02:27 +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
|
|
|
|
}
|