窗口框架使用二叉树
This commit is contained in:
@@ -193,12 +193,8 @@ int WIN_CreatWindowExt(WIN_WindowStruct *win, WIN_WindowStruct *base,
|
||||
void WIN_DeleteWindow(WIN_WindowStruct *win) {
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD>ٺ<EFBFBD><D9BA><EFBFBD>
|
||||
// for (int i=0;i<win->chidWinNum;i++)
|
||||
// {
|
||||
// (win->chidWin[i])->deleteWindow(win->chidWin[i]);
|
||||
// }
|
||||
while (win->chidWinNum) {
|
||||
(win->chidWin[0])->deleteWindow(win->chidWin[0]);
|
||||
(win->chid)->deleteWindow(win->chid);
|
||||
}
|
||||
|
||||
// <20>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ڵĴ<DAB5><C4B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE>
|
||||
@@ -293,10 +289,12 @@ WIN_WindowStruct *WIN_GetWindowStructById(WIN_WindowStruct *win, u32 id) {
|
||||
if (win->id == id) {
|
||||
return win;
|
||||
} else {
|
||||
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
|
||||
for (int i = win->chidWinNum; i > 0; i--) {
|
||||
if (ret = WIN_GetWindowStructById(win->chidWin[i - 1], id), ret) {
|
||||
if (ret = WIN_GetWindowStructById(prev, id), ret) {
|
||||
return ret;
|
||||
}
|
||||
prev = prev->prev;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@@ -304,16 +302,23 @@ WIN_WindowStruct *WIN_GetWindowStructById(WIN_WindowStruct *win, u32 id) {
|
||||
|
||||
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>ɾ<EFBFBD><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
int WIN_DelFromChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
WIN_WindowStruct *next = win->chid;
|
||||
for (int i = 0; i < win->chidWinNum; i++) {
|
||||
if (win->chidWin[i] == chidWin) {
|
||||
win->chidWin[i] = 0; // ɾ<><C9BE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
for (; i < win->chidWinNum - 1; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
||||
{
|
||||
win->chidWin[i] = win->chidWin[i + 1];
|
||||
if (next == chidWin) {
|
||||
if(next != win->chid) {
|
||||
next->prev->next = next->next;
|
||||
} else {
|
||||
win->chid = next->next;
|
||||
}
|
||||
if(next->next){
|
||||
next->next->prev = next->prev;
|
||||
}else{
|
||||
win->chid->prev = next->prev;
|
||||
}
|
||||
win->chidWinNum--; // <20>Ӵ<EFBFBD><D3B4>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD>һ
|
||||
return 0;
|
||||
}
|
||||
next = next->next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -321,17 +326,27 @@ int WIN_DelFromChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
// <20><>ָ<EFBFBD><D6B8><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||
int WIN_SetChidWinTop(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
WIN_WindowStruct *t = 0;
|
||||
WIN_WindowStruct *next = win->chid;
|
||||
for (int i = 0; i < win->chidWinNum; i++) {
|
||||
if (win->chidWin[i] == chidWin) {
|
||||
t = win->chidWin[i];
|
||||
win->chidWin[i] = 0; // ɾ<><C9BE><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
for (; i < win->chidWinNum; i++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>
|
||||
{
|
||||
win->chidWin[i] = win->chidWin[i + 1];
|
||||
if (next == chidWin) {
|
||||
t = next;
|
||||
if(next != win->chid) {
|
||||
next->prev->next = next->next;
|
||||
} else {
|
||||
win->chid = next->next;
|
||||
}
|
||||
win->chidWin[win->chidWinNum - 1] = t; // <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
||||
if(next->next){
|
||||
next->next->prev = next->prev;
|
||||
}else{
|
||||
win->chid->prev = next->prev;
|
||||
}
|
||||
t->next = 0;
|
||||
t->prev = win->chid->prev;
|
||||
win->chid->prev->next = t;
|
||||
win->chid->prev = t;
|
||||
return 0;
|
||||
}
|
||||
next = next->next;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -339,7 +354,14 @@ int WIN_SetChidWinTop(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
// <20><><EFBFBD>Ӵ<EFBFBD><D3B4>ڵ<EFBFBD><DAB5>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>
|
||||
int WIN_AddToChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
if (win->chidWinNum < win->chidWinMaxSize) {
|
||||
win->chidWin[win->chidWinNum] = chidWin;
|
||||
chidWin->next = 0;
|
||||
if(win->chid == 0){
|
||||
win->chid = chidWin;
|
||||
}else{
|
||||
chidWin->prev = win->chid->prev;
|
||||
win->chid->prev->next = chidWin;
|
||||
}
|
||||
win->chid->prev = chidWin;
|
||||
win->chidWinNum++;
|
||||
return 0;
|
||||
} else {
|
||||
@@ -349,9 +371,11 @@ int WIN_AddToChidList(WIN_WindowStruct *win, WIN_WindowStruct *chidWin) {
|
||||
|
||||
// <20>ж<EFBFBD>Ŀ<EFBFBD>괰<EFBFBD><EAB4B0><EFBFBD>Dz<EFBFBD><C7B2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڣ<EFBFBD><DAA3>Ƿ<EFBFBD><C7B7><EFBFBD>1
|
||||
int WIN_CheckChidWin(WIN_WindowStruct *win, WIN_WindowStruct *chid) {
|
||||
WIN_WindowStruct *next = win->chid;
|
||||
for (int i = 0; i < win->chidWinNum; i++) {
|
||||
if (win->chidWin[i] == chid)
|
||||
if (next == chid)
|
||||
return 1;
|
||||
next = next->next;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -429,12 +453,13 @@ WIN_WindowStruct *WIN_GetCurrentWindow(void) {
|
||||
// <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>˿ɿش<C9BF><D8B4><EFBFBD>
|
||||
WIN_WindowStruct *WIN_FindTopWin(WIN_WindowStruct *win) {
|
||||
WIN_WindowStruct *ret = 0;
|
||||
|
||||
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
|
||||
if (win && (win->chidWinNum)) {
|
||||
for (int i = win->chidWinNum; i > 0; i--) {
|
||||
ret = WIN_FindTopWin(win->chidWin[i - 1]);
|
||||
ret = WIN_FindTopWin(prev);
|
||||
if (ret)
|
||||
return ret;
|
||||
prev = prev->prev;
|
||||
}
|
||||
}
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
|
||||
@@ -450,10 +475,12 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
|
||||
RECT_Struct r2 = {0};
|
||||
WIN_WindowStruct *top = 0;
|
||||
WIN_WindowStruct *base = win->baseWin;
|
||||
WIN_WindowStruct *next = win->chid;
|
||||
WIN_WindowStruct *prev;
|
||||
|
||||
// <20>ô<EFBFBD><C3B4>ڱ<EFBFBD><DAB1>ڵ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ں<EFBFBD><DABA><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for (int i = 0; i < win->chidWinNum; i++) {
|
||||
top = win->chidWin[i];
|
||||
top = next;
|
||||
if ((top->keyShield == 1) || (top->keyChid == 1))
|
||||
continue;
|
||||
r1.x = 0;
|
||||
@@ -467,10 +494,12 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
|
||||
if (POS_RectIntersection(&r1, &r1, &r2)) {
|
||||
return 1;
|
||||
}
|
||||
next = next->next;
|
||||
}
|
||||
while (base) {
|
||||
prev = WIN_GetLastChidWin(base);
|
||||
for (int i = base->chidWinNum; i > 0; i--) {
|
||||
top = base->chidWin[i - 1];
|
||||
top = prev;
|
||||
if (top == win) {
|
||||
// ֻ<>Ƚ<EFBFBD><C8BD>ڴ˴<DAB4><CBB4><EFBFBD>֮ǰ<D6AE>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
// <20><>û<EFBFBD>б<EFBFBD><D0B1>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>丸<EFBFBD><E4B8B8><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
||||
@@ -482,6 +511,7 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
|
||||
if (POS_RectIntersection(&r1, &r1, &r2)) {
|
||||
return 1;
|
||||
}
|
||||
prev = prev->prev;
|
||||
}
|
||||
base = base->baseWin;
|
||||
}
|
||||
@@ -490,8 +520,10 @@ int WIN_FindBlock(WIN_WindowStruct *win) {
|
||||
|
||||
// <20><><EFBFBD>κͽӴ<CDBD><D3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>ڵİ<DAB5><C4B0><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
||||
int WIN_SetChildWinkeyShield(WIN_WindowStruct *win, int power) {
|
||||
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
|
||||
for (int i = win->chidWinNum - 1; i >= 0; i--) {
|
||||
win->chidWin[i]->keyShield = power;
|
||||
prev->keyShield = power;
|
||||
prev = prev->prev;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -503,6 +535,7 @@ WIN_WindowStruct *WIN_FindTopWinByPos(WIN_WindowStruct *win, int x, int y) {
|
||||
int win_y_s = 0;
|
||||
int x_size = win->x_size;
|
||||
int y_size = win->y_size;
|
||||
WIN_WindowStruct *prev = WIN_GetLastChidWin(win);
|
||||
|
||||
WIN_GetWinPosOnLcd(win, &win_x_s, &win_y_s, &x_size, &y_size);
|
||||
|
||||
@@ -512,11 +545,12 @@ WIN_WindowStruct *WIN_FindTopWinByPos(WIN_WindowStruct *win, int x, int y) {
|
||||
// <20>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ң<EFBFBD><D2A3><EFBFBD>ΪԽ<CEAA><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE>Խǰ<D4BD><C7B0>
|
||||
for (int i = win->chidWinNum - 1; i >= 0; i--) {
|
||||
t = WIN_FindTopWinByPos(win->chidWin[i], x, y);
|
||||
t = WIN_FindTopWinByPos(prev, x, y);
|
||||
if (t) {
|
||||
ret = t; // <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
||||
break;
|
||||
}
|
||||
prev = prev->prev;
|
||||
}
|
||||
} else {
|
||||
// ָ<><D6B8><EFBFBD>㲻<EFBFBD>ڱ<EFBFBD><DAB1><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE>
|
||||
@@ -553,13 +587,15 @@ WIN_WindowStruct *WIN_GetWinByTitle(WIN_WindowStruct *win, char *title) {
|
||||
WIN_WindowStruct *ret = 0;
|
||||
if (win == 0)
|
||||
win = WIN_GetBaseWindow();
|
||||
WIN_WindowStruct *next = win->chid;
|
||||
|
||||
if (strcmp(win->winTitle, title) == 0) {
|
||||
ret = win;
|
||||
} else {
|
||||
for (int i = 0; i < win->chidWinNum; i++) {
|
||||
if (ret = WIN_GetWinByTitle(win->chidWin[i], title), ret)
|
||||
if (ret = WIN_GetWinByTitle(next, title), ret)
|
||||
break;
|
||||
next = next->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user