void BaseD::switch_mode(int mode) { if (grand_mode == mode) return; grand_mode = mode; clear_screen(); draw_menu_bar(); // If we switched from instrument window, need to re-enable regular spc playback if (mode == GrandMode::MAIN) { if_exp_is_instr_window_then_restore_spc(); if (main_window) exp = (Experience*)main_window; else { fprintf(stderr, "NO MAIN WINDOW!?!\n"); exit(2); } main_window->one_time_draw(); } else if (mode == GrandMode::DSP_MAP) { if (dsp_window) exp = (Experience*)dsp_window; else { fprintf(stderr, "NO DSPWINDOW!?!\n"); exit(2); } } else if (mode == GrandMode::INSTRUMENT) { if (instr_window) exp = (Experience*)instr_window; else { fprintf(stderr, "NO INSTRUMENT_WINDOW!?!\n"); exit(2); } instr_window->one_time_draw(); } }
bool Menu::keyhandler(int key) { static int clock_val; static int menu_active = false; static int button_used = 0; if (!getflag(F_menus_work)) return false; if (!menu_active) { clock_val = game.clock_enabled; game.clock_enabled = false; draw_menu_bar(); } /* * Mouse handling */ if (mouse.button) { int hmenu, vmenu; button_used = 1; /* Button has been used at least once */ if (mouse.y <= CHAR_LINES) { /* on the menubar */ hmenu = 0; MenuList::iterator iterh; for (iterh = menubar.begin(); iterh != menubar.end(); ++iterh) { agi_menu *m = *iterh; if (mouse_over_text(0, m->col, m->text)) { break; } else { hmenu++; } } if (hmenu <= h_max_menu) { if (h_cur_menu != hmenu) { v_cur_menu = -1; new_menu_selected(hmenu); } h_cur_menu = hmenu; } } else { /* not in menubar */ vmenu = 0; agi_menu *m = get_menu(h_cur_menu); MenuOptionList::iterator iterv; for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) { agi_menu_option *do1 = *iterv; if (mouse_over_text(2 + do1->index, m->wincol + 1, do1->text)) { break; } else { vmenu++; } } if (vmenu <= v_max_menu[h_cur_menu]) { if (v_cur_menu != vmenu) { draw_menu_option(h_cur_menu); draw_menu_option_hilite(h_cur_menu, vmenu); } v_cur_menu = vmenu; } } } else if (button_used) { /* Button released */ button_used = 0; debugC(6, kDebugLevelMenu | kDebugLevelInput, "button released!"); if (v_cur_menu < 0) v_cur_menu = 0; draw_menu_option_hilite(h_cur_menu, v_cur_menu); if (mouse.y <= CHAR_LINES) { /* on the menubar */ } else { /* see which option we selected */ agi_menu *m = get_menu(h_cur_menu); MenuOptionList::iterator iterv; for (iterv = m->down.begin(); iterv != m->down.end(); ++iterv) { agi_menu_option *d = *iterv; if (mouse_over_text(2 + d->index, m->wincol + 1, d->text)) { /* activate that option */ if (d->enabled) { debugC(6, kDebugLevelMenu | kDebugLevelInput, "event %d registered", d->event); game.ev_keyp[d->event].occured = true; game.ev_keyp[d->event].data = d->event; goto exit_menu; } } } goto exit_menu; } } if (!menu_active) { if (h_cur_menu >= 0) { draw_menu_hilite(h_cur_menu); draw_menu_option(h_cur_menu); if (!button_used && v_cur_menu >= 0) draw_menu_option_hilite(h_cur_menu, v_cur_menu); } menu_active = true; } switch (key) { case KEY_ESCAPE: debugC(6, kDebugLevelMenu | kDebugLevelInput, "KEY_ESCAPE"); goto exit_menu; case KEY_ENTER: { debugC(6, kDebugLevelMenu | kDebugLevelInput, "KEY_ENTER"); agi_menu_option* d = get_menu_option(h_cur_menu, v_cur_menu); if (d->enabled) { debugC(6, kDebugLevelMenu | kDebugLevelInput, "event %d registered", d->event); game.ev_keyp[d->event].occured = true; goto exit_menu; } break; } case KEY_DOWN: case KEY_UP: v_cur_menu += key == KEY_DOWN ? 1 : -1; if (v_cur_menu < 0) v_cur_menu = 0; if (v_cur_menu > v_max_menu[h_cur_menu]) v_cur_menu = v_max_menu[h_cur_menu]; draw_menu_option(h_cur_menu); draw_menu_option_hilite(h_cur_menu, v_cur_menu); break; case KEY_RIGHT: case KEY_LEFT: h_cur_menu += key == KEY_RIGHT ? 1 : -1; if (h_cur_menu < 0) h_cur_menu = h_max_menu; if (h_cur_menu > h_max_menu) h_cur_menu = 0; v_cur_menu = 0; new_menu_selected(h_cur_menu); draw_menu_option_hilite(h_cur_menu, v_cur_menu); break; } return true; exit_menu: button_used = 0; show_pic(); _text->write_status(); setvar(V_key, 0); game.keypress = 0; game.clock_enabled = clock_val; old_input_mode(); debugC(3, kDebugLevelMenu, "exit_menu: input mode reset to %d", game.input_mode); menu_active = false; return true; }
void Menu::new_menu_selected(int i) { show_pic(); draw_menu_bar(); draw_menu_hilite(i); draw_menu_option(i); }