예제 #1
0
/*
==================
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);
}
예제 #2
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 );
}
예제 #3
0
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);
}