Files
player/Project/Src/MyWin/Window/mywin_working.c

214 lines
6.3 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "mywin_inc.h"
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD>ʽ<EFBFBD>˵<EFBFBD>
2025-06-27 00:32:57 +08:00
2025-07-06 18:46:13 +08:00
// <20><><EFBFBD><EFBFBD><E5B5AF>ʽ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
#define WIN_WORKING_TYPE "WIN_PopupStruct"
2025-07-06 18:46:13 +08:00
WIN_WorkingStruct *WIN_CreatWorking(
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))WORKING_DefaultMsgLoop;
}
WIN_WorkingStruct *ret = mymalloc(sizeof(WIN_WorkingStruct));
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><ECBAAF>
if (ret) {
mymemset(ret, 0, sizeof(WIN_WorkingStruct));
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 {
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
((WIN_WindowStruct *)ret)->winType = WIN_WORKING_TYPE;
((WIN_WindowStruct *)ret)->bkcolor = 0x342f2a;
((WIN_WindowStruct *)ret)->color = 0xc2ae9b;
((WIN_WindowStruct *)ret)->intercept = 1; // <20><>Ϊ<EFBFBD>Ӵ<EFBFBD><D3B4>ڣ<EFBFBD><DAA3>ӹܰ<D3B9><DCB0><EFBFBD><EFBFBD><EFBFBD>Ϣ
ret->rectColor = 0;
ret->txtColor = 0xffffff;
}
}
return ret;
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
const static char g_waite[] = "-\\|/";
// Ĭ<>ϻ<EFBFBD><CFBB>ƺ<EFBFBD><C6BA><EFBFBD>
void WORKING_DefaultPaint(WIN_WorkingStruct *working) {
int x = 0;
int y = 0;
int x_size = ((WIN_WindowStruct *)working)->x_size;
int y_size = ((WIN_WindowStruct *)working)->y_size;
WIN_PaintBackGround((WIN_WindowStruct *)working);
WIN_SetFontMode(WIN_DRAWMODE_ALONE);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
WIN_SetLcdColor(working->rectColor);
WIN_FillRectByColorAlpha(x + 2, y + 2, x_size - 4, y_size - 4, 16);
WIN_SetLcdColor(working->txtColor);
WIN_DrawTxtHCenterAt(working->msg_draw, x_size / 2,
y + y_size / 2 - WIN_GetFontHight() / 2);
// <20><><EFBFBD>Ʊ߿<C6B1>
WIN_SetLcdColor(((WIN_WindowStruct *)working)->bkcolor);
WIN_DrawRect(0, 0, ((WIN_WindowStruct *)working)->x_size,
((WIN_WindowStruct *)working)->y_size);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// Ĭ<><C4AC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void WORKING_DefaultMsgLoop(WIN_WorkingStruct *working, WIN_MsgStruct *msg) {
WIN_MoveStruct *m = 0;
WIN_KeyStruct *k = 0;
switch (msg->msg) {
case WIN_MSG_PAINT:
WORKING_DefaultPaint(working);
break;
case WIN_MSG_TIMER:
// <20><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD>
if (msg->data.v == working->time_id1) {
if (WIN_GetExWorkFunStat(working->work)) {
// <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>ɣ<EFBFBD>
WIN_SetBlockWinReturn(working->ret, 0, 0);
WIN_ExWorkFunClear(working->work);
((WIN_WindowStruct *)working)
->deleteWindow((WIN_WindowStruct *)working);
}
} else if (msg->data.v == working->time_id2) {
working->msg_draw[0] = g_waite[working->msg_h_index];
int now = 0;
int all = 0;
if (working->get_progress)
working->get_progress(&now, &all);
if (all)
sprintf(&working->msg_draw[1], "%s %d/%d", working->msg, now, all);
else
sprintf(&working->msg_draw[1], "%s", working->msg);
int x = 0;
int y = 0;
int x_size = 0;
int y_size = 0;
WIN_WindowStruct *win = (WIN_WindowStruct *)working;
WIN_GetTxtRectSize(working->msg_draw, &x_size, &y_size);
x_size += 4;
y_size += 4;
x = (win->baseWin->x_size - x_size) / 2;
y = (win->baseWin->y_size - y_size) / 2;
WIN_SetPos(win, x, y);
WIN_SetSize(win, x_size, y_size);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
WIN_SetBackPic(win);
working->msg_h_index++;
if (working->msg_h_index >= 4)
working->msg_h_index = 0;
WIN_SetInvalidWhenTop((WIN_WindowStruct *)working);
}
break;
case WIN_MSG_KEY:
k = msg->data.p;
if (k->shortPress & KEY_VALUE_HOME) // <20>̰<EFBFBD>
{
if (working->break_fun)
working->break_fun(working->ptr);
}
break;
case WIN_MSG_MOVE:
m = msg->data.p;
switch (m->moveType) {
case MOVE_DATA_OUTSIDE:
// <20><><EFBFBD><EFBFBD>
if (working->break_fun)
working->break_fun(working->ptr);
break;
default:
break;
}
break;
default:
break;
}
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><>ʾ<EFBFBD><CABE>ʾ<EFBFBD>򲢽<EFBFBD><F2B2A2BD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ֵ
int WORKING_DoWork(WIN_WindowStruct *base, char *msg, int (*fun)(void *),
void *ptr) {
int x, y;
int txt_xsize = 0;
int txt_ysize = 0;
WIN_GetTxtRectSize(msg, &txt_xsize, &txt_ysize);
txt_xsize += 4 + WIN_GetFontWidth();
txt_ysize += 4;
if (txt_xsize > base->x_size)
txt_xsize = base->x_size;
txt_ysize +=
(txt_xsize / base->x_size) *
WIN_GetFontHight(); // <20><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>С
if (txt_ysize > base->y_size)
txt_ysize = base->y_size;
x = (base->x_size - txt_xsize) / 2;
y = (base->y_size - txt_ysize) / 2;
WIN_WorkingStruct *w = WIN_CreatWorking(base, 0, x, y, txt_xsize, txt_ysize);
sprintf(w->msg, " %s", msg);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
WIN_SetBackPic((WIN_WindowStruct *)w);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
w->work = WIN_CreatThread(fun, ptr, &w->ret);
w->time_id1 = WIN_CreatTimer((WIN_WindowStruct *)w, 50);
w->time_id2 = WIN_CreatTimer((WIN_WindowStruct *)w, 500);
WIN_ShowWindow((WIN_WindowStruct *)w);
return WIN_RunBlock((WIN_WindowStruct *)w);
2025-06-27 00:32:57 +08:00
}
2025-07-06 18:46:13 +08:00
// <20><>ʾ<EFBFBD><CABE>ʾ<EFBFBD>򲢽<EFBFBD><F2B2A2BD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ֵ
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҿ<EFBFBD><D2BF><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>˳<EFBFBD>,<2C><><EFBFBD>Ի<EFBFBD>ȡ<EFBFBD>߳̽<DFB3><CCBD><EFBFBD>
int WORKING_DoWorkPro(WIN_WindowStruct *base, char *msg, int (*fun)(void *),
void *ptr, void (*break_fun)(void *), void *b_ptr,
void (*get_progress)(int *now, int *all), uint8_t pro) {
2025-07-06 18:46:13 +08:00
int x, y;
int txt_xsize = 0;
int txt_ysize = 0;
WIN_GetTxtRectSize(msg, &txt_xsize, &txt_ysize);
txt_xsize += 4 + WIN_GetFontWidth();
txt_ysize += 4;
if (txt_xsize > base->x_size)
txt_xsize = base->x_size;
txt_ysize +=
(txt_xsize / base->x_size) *
WIN_GetFontHight(); // <20><><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>Сʱ<D0A1><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB>С
if (txt_ysize > base->y_size)
txt_ysize = base->y_size;
x = (base->x_size - txt_xsize) / 2;
y = (base->y_size - txt_ysize) / 2;
WIN_WorkingStruct *w = WIN_CreatWorking(base, 0, x, y, txt_xsize, txt_ysize);
sprintf(w->msg, "%s", msg);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
WIN_SetBackPic((WIN_WindowStruct *)w);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
w->work = WIN_CreatThreadPro(fun, ptr, &w->ret, pro);
w->break_fun = break_fun;
w->ptr = b_ptr;
w->get_progress = get_progress;
w->time_id1 = WIN_CreatTimer((WIN_WindowStruct *)w, 50);
w->time_id2 = WIN_CreatTimer((WIN_WindowStruct *)w, 500);
WIN_ShowWindow((WIN_WindowStruct *)w);
return WIN_RunBlock((WIN_WindowStruct *)w);
}