BRESULT menusys_open(int x, int y) { MENUSYS *sys; sys = &menusys; if (menubase_open(1) != SUCCESS) { goto msopn_err; } sys->opened = 0; sys->lastdepth = -1; sys->lastpos = -1; if (wndopenbase(sys) != SUCCESS) { goto msopn_err; } sys->popupx = x; sys->popupy = y; sys->opened = openpopup(sys); menubase_draw(draw, sys); return(SUCCESS); msopn_err: menubase_close(); return(FAILURE); }
void menubase_close(void) { MENUBASE *mb; VRAMHDL hdl; int num; mb = &menubase; num = mb->num; if (num) { mb->num = 0; if (num == 1) { menusys_close(); } else { menudlg_destroy(); } hdl = menuvram; if (hdl) { menubase_draw(NULL, NULL); menuvram = NULL; vram_destroy(hdl); } scrnmng_leavemenu(); } }
static void menusys_settxt(MENUID id, void *arg) { MENUSYS *sys; MENUHDL itm; int depth; int pos; int focus; sys = &menusys; itm = itemsea(sys, id); if (itm == NULL) { goto msst_end; } if (arg) { milstr_ncpy(itm->string, (OEMCHAR *)arg, NELEMENTS(itm->string)); } else { itm->string[0] = '\0'; } // リドローが必要? (ToDo: 再オープンすべし) depth = 0; while(depth < sys->depth) { itm = sys->wnd[depth].menu; pos = 0; while(itm) { if (itm->id == id) { if (!(itm->flag & (MENU_DISABLE | MENU_SEPARATOR))) { focus = 0; if (sys->wnd[depth].focus == pos) { focus = 2 - sys->opened; } itemdraw(sys, depth, pos, focus); menubase_draw(draw, sys); goto msst_end; } } pos++; itm = itm->next; } depth++; } msst_end: return; }
static void menusys_setflag(MENUID id, MENUFLG flag, MENUFLG mask) { MENUSYS *sys; MENUHDL itm; int depth; int pos; int focus; sys = &menusys; itm = itemsea(sys, id); if (itm == NULL) { goto mssf_end; } flag ^= itm->flag; flag &= mask; if (!flag) { goto mssf_end; } itm->flag ^= flag; // リドローが必要? depth = 0; while(depth < sys->depth) { itm = sys->wnd[depth].menu; pos = 0; while(itm) { if (itm->id == id) { if (!(itm->flag & (MENU_DISABLE | MENU_SEPARATOR))) { focus = 0; if (sys->wnd[depth].focus == pos) { focus = 2 - sys->opened; } itemdraw(sys, depth, pos, focus); menubase_draw(draw, sys); goto mssf_end; } } pos++; itm = itm->next; } depth++; } mssf_end: return; }
void menusys_key(UINT key) { MENUSYS *sys; int topwnd; sys = &menusys; topwnd = sys->depth - 1; if (topwnd == 0) { if (key & KEY_LEFT) { focusmove(sys, 0, -1); } if (key & KEY_RIGHT) { focusmove(sys, 0, 1); } if (key & KEY_DOWN) { focusenter(sys, 0, FALSE); } if (key & KEY_ENTER) { focusenter(sys, 0, TRUE); } } else { if (key & KEY_UP) { focusmove(sys, topwnd, -1); } if (key & KEY_DOWN) { focusmove(sys, topwnd, 1); } if (key & KEY_LEFT) { if (topwnd >= 2) { wndclose(sys, topwnd); } else { focusmove(sys, 0, -1); } } if (key & KEY_RIGHT) { focusenter(sys, topwnd, FALSE); } if (key & KEY_ENTER) { focusenter(sys, topwnd, TRUE); } } menubase_draw(draw, sys); }
void menusys_moving(int x, int y, int btn) { MENUSYS *sys; MENUPOS cur; int topwnd; sys = &menusys; getposinfo(sys, &cur, x, y); // メニューを閉じる〜 if (cur.depth < 0) { if (btn == 2) { menubase_close(); return; } } topwnd = sys->depth - 1; if (cur.menu != NULL) { if (cur.wnd->focus != cur.pos) { if (sys->opened) { if (cur.depth != topwnd) { wndclose(sys, cur.depth + 1); } if ((!(cur.menu->flag & MENU_GRAY)) && (cur.menu->child != NULL)) { childopn(sys, cur.depth, cur.pos); } } itemdraw(sys, cur.depth, cur.wnd->focus, 0); itemdraw(sys, cur.depth, cur.pos, 2 - sys->opened); cur.wnd->focus = cur.pos; } if (!(cur.menu->flag & MENU_GRAY)) { if (btn == 1) { if ((!sys->opened) && (cur.depth == 0) && (cur.menu->child != NULL)) { wndclose(sys, 1); itemdraw(sys, 0, cur.pos, 1); childopn(sys, 0, cur.pos); sys->opened = 1; } } else if (btn == 2) { if ((cur.menu->id) && (!(cur.menu->flag & MENU_NOSEND))) { menubase_close(); sys->cmd(cur.menu->id); return; } } } } else { if ((btn == 1) && (cur.depth == 0)) { wndclose(sys, 1); itemdraw(sys, 0, cur.wnd->focus, 0); sys->opened = openpopup(sys); } else if (cur.depth != topwnd) { cur.depth = topwnd; cur.pos = -1; cur.wnd = sys->wnd + cur.depth; if (cur.wnd->focus != cur.pos) { itemdraw(sys, cur.depth, cur.wnd->focus, 0); cur.wnd->focus = cur.pos; } } } menubase_draw(draw, sys); }