#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. Load more
#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: