652 lines · 14.0 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <stdio.h>#include <ctype.h>#include "dat.h"#include "fns.h" void	 Action_DoEnter( menuaction_t *a );void	 Action_Draw( menuaction_t *a );void  Menu_DrawStatusBar( char *string );void	 Menulist_DoEnter( menulist_t *l );void	 MenuList_Draw( menulist_t *l );void	 Separator_Draw( menuseparator_t *s );void	 Slider_DoSlide( menuslider_t *s, int dir );void	 Slider_Draw( menuslider_t *s );void	 SpinControl_DoEnter( menulist_t *s );void	 SpinControl_Draw( menulist_t *s );void	 SpinControl_DoSlide( menulist_t *s, int dir ); #define RCOLUMN_OFFSET  16#define LCOLUMN_OFFSET -16 extern refexport_t re; #define Draw_Char re.DrawChar#define Draw_Fill re.DrawFill void Action_DoEnter( menuaction_t *a ){	if ( a->generic.callback )		a->generic.callback( a );} void Action_Draw( menuaction_t *a ){	if ( a->generic.flags & QMF_LEFT_JUSTIFY )	{		if ( a->generic.flags & QMF_GRAYED )			Menu_DrawStringDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );		else			Menu_DrawString( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );	}	else	{		if ( a->generic.flags & QMF_GRAYED )			Menu_DrawStringR2LDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );		else			Menu_DrawStringR2L( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );	}	if ( a->generic.ownerdraw )		a->generic.ownerdraw( a );} qboolean Field_DoEnter( menufield_t *f ){	if ( f->generic.callback )	{		f->generic.callback( f );		return true;	}	return false;} void Field_Draw( menufield_t *f ){	int i;	char tempbuffer[128]=""; 	if ( f->generic.name )		Menu_DrawStringR2LDark( f->generic.x + f->generic.parent->x + LCOLUMN_OFFSET, f->generic.y + f->generic.parent->y, f->generic.name ); 	strncpy( tempbuffer, f->buffer + f->visible_offset, f->visible_length ); 	Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y - 4, 18 );	Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y + 4, 24 ); 	Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y - 4, 20 );	Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y + 4, 26 ); 	for ( i = 0; i < f->visible_length; i++ )	{		Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y - 4, 19 );		Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y + 4, 25 );	} 	Menu_DrawString( f->generic.x + f->generic.parent->x + 24, f->generic.y + f->generic.parent->y, tempbuffer ); 	if ( Menu_ItemAtCursor( f->generic.parent ) == f )	{		int offset; 		if ( f->visible_offset )			offset = f->visible_length;		else			offset = f->cursor; 		if ( ( ( int ) ( Sys_Milliseconds() / 250 ) ) & 1 )		{			Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,					   f->generic.y + f->generic.parent->y,					   11 );		}		else		{			Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,					   f->generic.y + f->generic.parent->y,					   ' ' );		}	}} qboolean Field_Key( menufield_t *f, int key ){	extern int keydown[]; 	switch ( key )	{	case K_KP_SLASH:		key = '/';		break;	case K_KP_MINUS:		key = '-';		break;	case K_KP_PLUS:		key = '+';		break;	case K_KP_HOME:		key = '7';		break;	case K_KP_UPARROW:		key = '8';		break;	case K_KP_PGUP:		key = '9';		break;	case K_KP_LEFTARROW:		key = '4';		break;	case K_KP_5:		key = '5';		break;	case K_KP_RIGHTARROW:		key = '6';		break;	case K_KP_END:		key = '1';		break;	case K_KP_DOWNARROW:		key = '2';		break;	case K_KP_PGDN:		key = '3';		break;	case K_KP_INS:		key = '0';		break;	case K_KP_DEL:		key = '.';		break;	} 	if ( key > 127 )	{		switch ( key )		{		case K_DEL:		default:			return false;		}	} 	/*	** support pasting from the clipboard	*/	if ( ( toupper( key ) == 'V' && keydown[K_CTRL] ) ||		 ( ( ( key == K_INS ) || ( key == K_KP_INS ) ) && keydown[K_SHIFT] ) )	{		char *cbd;				if ( ( cbd = Sys_GetClipboardData() ) != 0 )		{			strtok( cbd, "\n\r\b" ); 			strncpy( f->buffer, cbd, f->length - 1 );			f->cursor = strlen( f->buffer );			f->visible_offset = f->cursor - f->visible_length;			if ( f->visible_offset < 0 )				f->visible_offset = 0; 			free( cbd );		}		return true;	} 	switch ( key )	{	case K_KP_LEFTARROW:	case K_LEFTARROW:	case K_BACKSPACE:		if ( f->cursor > 0 )		{			memmove( &f->buffer[f->cursor-1], &f->buffer[f->cursor], strlen( &f->buffer[f->cursor] ) + 1 );			f->cursor--; 			if ( f->visible_offset )			{				f->visible_offset--;			}		}		break; 	case K_KP_DEL:	case K_DEL:		memmove( &f->buffer[f->cursor], &f->buffer[f->cursor+1], strlen( &f->buffer[f->cursor+1] ) + 1 );		break; 	case K_KP_ENTER:	case K_ENTER:	case K_ESCAPE:	case K_TAB:		return false; 	case K_SPACE:	default:		if ( !isdigit( key ) && ( f->generic.flags & QMF_NUMBERSONLY ) )			return false; 		if ( f->cursor < f->length )		{			f->buffer[f->cursor++] = key;			f->buffer[f->cursor] = 0; 			if ( f->cursor > f->visible_length )			{				f->visible_offset++;			}		}	} 	return true;} void Menu_AddItem( menuframework_t *menu, void *item ){	if ( menu->nitems == 0 )		menu->nslots = 0; 	if ( menu->nitems < MAXMENUITEMS )	{		menu->items[menu->nitems] = item;		( ( menucommon_t * ) menu->items[menu->nitems] )->parent = menu;		menu->nitems++;	} 	menu->nslots = Menu_TallySlots( menu );} /*** Menu_AdjustCursor**** This function takes the given menu, the direction, and attempts** to adjust the menu's cursor so that it's at the next available** slot.*/void Menu_AdjustCursor( menuframework_t *m, int dir ){	menucommon_t *citem; 	/*	** see if it's in a valid spot	*/	if ( m->cursor >= 0 && m->cursor < m->nitems )	{		if ( ( citem = Menu_ItemAtCursor( m ) ) != 0 )		{			if ( citem->type != MTYPE_SEPARATOR )				return;		}	} 	/*	** it's not in a valid spot, so crawl in the direction indicated until we	** find a valid spot	*/	if ( dir == 1 )	{		while ( 1 )		{			citem = Menu_ItemAtCursor( m );			if ( citem )				if ( citem->type != MTYPE_SEPARATOR )					break;			m->cursor += dir;			if ( m->cursor >= m->nitems )				m->cursor = 0;		}	}	else	{		while ( 1 )		{			citem = Menu_ItemAtCursor( m );			if ( citem )				if ( citem->type != MTYPE_SEPARATOR )					break;			m->cursor += dir;			if ( m->cursor < 0 )				m->cursor = m->nitems - 1;		}	}} void Menu_Center( menuframework_t *menu ){	int height; 	height = ( ( menucommon_t * ) menu->items[menu->nitems-1])->y;	height += 10; 	menu->y = ( vid.height - height ) / 2;} void Menu_Draw( menuframework_t *menu ){	int i;	menucommon_t *item; 	/*	** draw contents	*/	for ( i = 0; i < menu->nitems; i++ )	{		switch ( ( ( menucommon_t * ) menu->items[i] )->type )		{		case MTYPE_FIELD:			Field_Draw( ( menufield_t * ) menu->items[i] );			break;		case MTYPE_SLIDER:			Slider_Draw( ( menuslider_t * ) menu->items[i] );			break;		case MTYPE_LIST:			MenuList_Draw( ( menulist_t * ) menu->items[i] );			break;		case MTYPE_SPINCONTROL:			SpinControl_Draw( ( menulist_t * ) menu->items[i] );			break;		case MTYPE_ACTION:			Action_Draw( ( menuaction_t * ) menu->items[i] );			break;		case MTYPE_SEPARATOR:			Separator_Draw( ( menuseparator_t * ) menu->items[i] );			break;		}	} 	item = Menu_ItemAtCursor( menu ); 	if ( item && item->cursordraw )	{		item->cursordraw( item );	}	else if ( menu->cursordraw )	{		menu->cursordraw( menu );	}	else if ( item && item->type != MTYPE_FIELD )	{		if ( item->flags & QMF_LEFT_JUSTIFY )		{			Draw_Char( menu->x + item->x - 24 + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );		}		else		{			Draw_Char( menu->x + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );		}	} 	if ( item )	{		if ( item->statusbarfunc )			item->statusbarfunc( ( void * ) item );		else if ( item->statusbar )			Menu_DrawStatusBar( item->statusbar );		else			Menu_DrawStatusBar( menu->statusbar ); 	}	else	{		Menu_DrawStatusBar( menu->statusbar );	}} void Menu_DrawStatusBar( char *string ){	if ( string )	{		int l = strlen( string );		//int maxrow = vid.height / 8;		int maxcol = vid.width / 8;		int col = maxcol / 2 - l / 2; 		Draw_Fill( 0, vid.height-8, vid.width, 8, 4 );		Menu_DrawString( col*8, vid.height - 8, string );	}	else	{		Draw_Fill( 0, vid.height-8, vid.width, 8, 0 );	}} void Menu_DrawString( int x, int y, char *string ){	unsigned i; 	for ( i = 0; i < strlen( string ); i++ )	{		Draw_Char( ( x + i*8 ), y, string[i] );	}} void Menu_DrawStringDark( int x, int y, char *string ){	unsigned i; 	for ( i = 0; i < strlen( string ); i++ )	{		Draw_Char( ( x + i*8 ), y, string[i] + 128 );	}} void Menu_DrawStringR2L( int x, int y, char *string ){	unsigned i; 	for ( i = 0; i < strlen( string ); i++ )	{		Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1] );	}} void Menu_DrawStringR2LDark( int x, int y, char *string ){	unsigned i; 	for ( i = 0; i < strlen( string ); i++ )	{		Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1]+128 );	}} void *Menu_ItemAtCursor( menuframework_t *m ){	if ( m->cursor < 0 || m->cursor >= m->nitems )		return 0; 	return m->items[m->cursor];} qboolean Menu_SelectItem( menuframework_t *s ){	menucommon_t *item = ( menucommon_t * ) Menu_ItemAtCursor( s ); 	if ( item )	{		switch ( item->type )		{		case MTYPE_FIELD:			return Field_DoEnter( ( menufield_t * ) item ) ;		case MTYPE_ACTION:			Action_DoEnter( ( menuaction_t * ) item );			return true;		case MTYPE_LIST://			Menulist_DoEnter( ( menulist_t * ) item );			return false;		case MTYPE_SPINCONTROL://			SpinControl_DoEnter( ( menulist_t * ) item );			return false;		}	}	return false;} void Menu_SetStatusBar( menuframework_t *m, char *string ){	m->statusbar = string;} void Menu_SlideItem( menuframework_t *s, int dir ){	menucommon_t *item = ( menucommon_t * ) Menu_ItemAtCursor( s ); 	if ( item )	{		switch ( item->type )		{		case MTYPE_SLIDER:			Slider_DoSlide( ( menuslider_t * ) item, dir );			break;		case MTYPE_SPINCONTROL:

Lines 1–500 of 652.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t