/* ================== MenuField_Key ================== */ sfxHandle_t MenuField_Key( menufield_s* m, int* key ) { int keycode; keycode = *key; switch ( keycode ) { case K_KP_ENTER: case K_ENTER: case K_JOY1: case K_JOY2: case K_JOY3: case K_JOY4: case K_2JOY1: case K_2JOY2: case K_2JOY3: case K_2JOY4: case K_3JOY1: case K_3JOY2: case K_3JOY3: case K_3JOY4: case K_4JOY1: case K_4JOY2: case K_4JOY3: case K_4JOY4: // have enter go to next cursor point *key = K_TAB; break; case K_TAB: case K_KP_DOWNARROW: case K_DOWNARROW: case K_KP_UPARROW: case K_UPARROW: break; default: if ( keycode & K_CHAR_FLAG ) { keycode &= ~K_CHAR_FLAG; if ((m->generic.flags & QMF_UPPERCASE) && Q_islower( keycode )) keycode -= 'a' - 'A'; else if ((m->generic.flags & QMF_LOWERCASE) && Q_isupper( keycode )) keycode -= 'A' - 'a'; else if ((m->generic.flags & QMF_NUMBERSONLY) && Q_isalpha( keycode )) return (menu_buzz_sound); MField_CharEvent( &m->field, keycode); } else MField_KeyDownEvent( &m->field, keycode ); break; } return (0); }
/* ================= UI_DrawBannerString ================= */ static void UI_DrawBannerString2( int x, int y, const char* str, vec4_t color ) { const char* s; unsigned char ch; float ax; float ay; float aw; float ah; float frow; float fcol; float fwidth; float fheight; // draw the colored text trap_R_SetColor( color ); ax = x * cgs.screenXScale + cgs.screenXBias; ay = y * cgs.screenXScale; s = str; while ( *s ) { ch = *s & 127; if ( ch == ' ' ) { ax += ( (float)PROPB_SPACE_WIDTH + (float)PROPB_GAP_WIDTH ) * cgs.screenXScale; } else if ( Q_isupper( ch ) ) { ch -= 'A'; fcol = (float)propMapB[ch][0] / 256.0f; frow = (float)propMapB[ch][1] / 256.0f; fwidth = (float)propMapB[ch][2] / 256.0f; fheight = (float)PROPB_HEIGHT / 256.0f; aw = (float)propMapB[ch][2] * cgs.screenXScale; ah = (float)PROPB_HEIGHT * cgs.screenXScale; trap_R_DrawStretchPic( ax, ay, aw, ah, fcol, frow, fcol + fwidth, frow + fheight, cgs.media.charsetPropB ); ax += ( aw + (float)PROPB_GAP_WIDTH * cgs.screenXScale ); } s++; } trap_R_SetColor( NULL ); }
sfxHandle_t ScrollList_Key(menulist_s *l, int key) { int x; int y; int w; int i; int j; int c; int cursorx; int cursory; int column; int index; switch (key) { case K_MOUSE1: if (l->generic.flags & QMF_HASMOUSEFOCUS) { // check scroll region x = l->generic.x; y = l->generic.y; w = ((l->width + l->seperation) * l->columns - l->seperation) * SMALLCHAR_SIZE; if (l->generic.flags & QMF_CENTER_JUSTIFY) { x -= w / 2; } if (UI_CursorInRect(x, y, w, l->height*SMALLCHAR_SIZE)) { cursorx = (uis.cursorx - x)/SMALLCHAR_SIZE; column = cursorx / (l->width + l->seperation); cursory = (uis.cursory - y)/SMALLCHAR_SIZE; index = column * l->height + cursory; if (l->top + index < l->numitems) { l->oldvalue = l->curvalue; l->curvalue = l->top + index; if (l->oldvalue != l->curvalue && l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); return (menu_move_sound); } } } // absorbed, silent sound effect return (menu_null_sound); } break; case K_KP_HOME: case K_HOME: l->oldvalue = l->curvalue; l->curvalue = 0; l->top = 0; if (l->oldvalue != l->curvalue && l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); return (menu_move_sound); } return (menu_buzz_sound); case K_KP_END: case K_END: l->oldvalue = l->curvalue; l->curvalue = l->numitems-1; if (l->columns > 1) { c = (l->curvalue / l->height + 1) * l->height; l->top = c - (l->columns * l->height); } else { l->top = l->curvalue - (l->height - 1); } if (l->top < 0) { l->top = 0; } if (l->oldvalue != l->curvalue && l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); return (menu_move_sound); } return (menu_buzz_sound); case K_PGUP: case K_KP_PGUP: if (l->columns > 1) { return menu_null_sound; } if (l->curvalue > 0) { l->oldvalue = l->curvalue; l->curvalue -= l->height-1; if (l->curvalue < 0) { l->curvalue = 0; } l->top = l->curvalue; if (l->top < 0) { l->top = 0; } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return (menu_move_sound); } return (menu_buzz_sound); case K_PGDN: case K_KP_PGDN: if (l->columns > 1) { return menu_null_sound; } if (l->curvalue < l->numitems-1) { l->oldvalue = l->curvalue; l->curvalue += l->height-1; if (l->curvalue > l->numitems-1) { l->curvalue = l->numitems-1; } l->top = l->curvalue - (l->height-1); if (l->top < 0) { l->top = 0; } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return (menu_move_sound); } return (menu_buzz_sound); case K_KP_UPARROW: case K_UPARROW: if (l->curvalue == 0) { return menu_buzz_sound; } l->oldvalue = l->curvalue; l->curvalue--; if (l->curvalue < l->top) { if (l->columns == 1) { l->top--; } else { l->top -= l->height; } } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return (menu_move_sound); case K_KP_DOWNARROW: case K_DOWNARROW: if (l->curvalue == l->numitems - 1) { return menu_buzz_sound; } l->oldvalue = l->curvalue; l->curvalue++; if (l->curvalue >= l->top + l->columns * l->height) { if (l->columns == 1) { l->top++; } else { l->top += l->height; } } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return menu_move_sound; case K_KP_LEFTARROW: case K_LEFTARROW: if (l->columns == 1) { return menu_null_sound; } if (l->curvalue < l->height) { return menu_buzz_sound; } l->oldvalue = l->curvalue; l->curvalue -= l->height; if (l->curvalue < l->top) { l->top -= l->height; } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return menu_move_sound; case K_KP_RIGHTARROW: case K_RIGHTARROW: if (l->columns == 1) { return menu_null_sound; } c = l->curvalue + l->height; if (c >= l->numitems) { return menu_buzz_sound; } l->oldvalue = l->curvalue; l->curvalue = c; if (l->curvalue > l->top + l->columns * l->height - 1) { l->top += l->height; } if (l->generic.callback) { l->generic.callback(l, QM_GOTFOCUS); } return menu_move_sound; } // cycle look for ascii key inside list items if (!Q_isprint(key)) { return 0; } // force to lower for case insensitive compare if (Q_isupper(key)) { key -= 'A' - 'a'; } // iterate list items for (i=1; i<=l->numitems; i++) { j = (l->curvalue + i) % l->numitems; c = l->itemnames[j][0]; if (Q_isupper(c)) { c -= 'A' - 'a'; } if (c == key) { // set current item, mimic windows listbox scroll behavior if (j < l->top) { // behind top most item, set this as new top l->top = j; } else if (j > l->top+l->height-1) { // past end of list box, do page down l->top = (j+1) - l->height; } if (l->curvalue != j) { l->oldvalue = l->curvalue; l->curvalue = j; if (l->generic.callback) l->generic.callback(l, QM_GOTFOCUS); return (menu_move_sound); } return (menu_buzz_sound); } } return (menu_buzz_sound); }