diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-05-10 16:15:57 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-05-10 16:15:57 +0000 |
commit | 98c3c29c4f106c98bac64c882c8255f977a3980a (patch) | |
tree | 24158ccc8af8721e1fd92b1069e0458ebfaa655e /source/ui_menu.c | |
parent | 1f71b2b7cb486c1f3fd5b69c814a234460471414 (diff) |
Added `field', `strings', `blank' menu control types.
Diffstat (limited to 'source/ui_menu.c')
-rw-r--r-- | source/ui_menu.c | 107 |
1 files changed, 96 insertions, 11 deletions
diff --git a/source/ui_menu.c b/source/ui_menu.c index a4cc243..1e0c63f 100644 --- a/source/ui_menu.c +++ b/source/ui_menu.c @@ -50,6 +50,10 @@ static void Action_Init( menuAction_t *a ) { Com_Error( ERR_FATAL, "Action_Init: NULL a->generic.name" ); } + if( ( a->generic.uiFlags & UI_CENTER ) != UI_CENTER ) { + a->generic.x += RCOLUMN_OFFSET; + } + a->generic.rect.x = a->generic.x; a->generic.rect.y = a->generic.y; UI_StringDimensions( &a->generic.rect, a->generic.uiFlags, a->generic.name ); @@ -66,7 +70,13 @@ static void Action_Draw( menuAction_t *a ) { flags = a->generic.uiFlags; if( a->generic.flags & QMF_HASFOCUS ) { - flags |= UI_ALTCOLOR; + if( ( a->generic.uiFlags & UI_CENTER ) != UI_CENTER ) { + if( ( uis.realtime >> 8 ) & 1 ) { + UI_DrawChar( a->generic.x - RCOLUMN_OFFSET / 2, a->generic.y, a->generic.uiFlags | UI_RIGHT, 13 ); + } + } else { + flags |= UI_ALTCOLOR; + } } UI_DrawString( a->generic.x, a->generic.y, NULL, @@ -269,13 +279,27 @@ FIELD CONTROL =================================================================== */ +static void Field_Push( menuField_t *f ) { + IF_Init( &f->field, f->width, MAX_FIELD_TEXT, f->cvar->string ); +} + +static void Field_Pop( menuField_t *f ) { + Cvar_SetByVar( f->cvar, f->field.text, CVAR_SET_CONSOLE ); +} + +static void Field_Free( menuField_t *f ) { + Z_Free( f->generic.name ); + Z_Free( f->generic.status ); + Z_Free( f ); +} + /* ================= Field_Init ================= */ static void Field_Init( menuField_t *f ) { - int w = f->field.visibleChars * CHAR_WIDTH; + int w = f->width * CHAR_WIDTH; f->generic.uiFlags &= ~( UI_LEFT | UI_RIGHT ); @@ -284,7 +308,7 @@ static void Field_Init( menuField_t *f ) { f->generic.rect.y = f->generic.y; UI_StringDimensions( &f->generic.rect, f->generic.uiFlags | UI_RIGHT, f->generic.name ); - f->generic.rect.width += RCOLUMN_OFFSET + w; + f->generic.rect.width += ( RCOLUMN_OFFSET - LCOLUMN_OFFSET ) + w; } else { f->generic.rect.x = f->generic.x - w / 2; f->generic.rect.y = f->generic.y; @@ -333,7 +357,19 @@ static int Field_Key( menuField_t *f, int key ) { qboolean ret; ret = IF_KeyEvent( &f->field, key ); - return ret ? QMS_SILENT : QMS_NOTHANDLED; + if( ret ) { + return QMS_SILENT; + } + if( f->generic.flags & QMF_NUMBERSONLY ) { + if( Q_isdigit( key ) ) { + return QMS_SILENT; + } + } else { + if( key >= 32 && key < 127 ) { + return QMS_SILENT; + } + } + return QMS_NOTHANDLED; } /* @@ -552,6 +588,29 @@ static void Pairs_Free( menuSpinControl_t *s ) { /* =================================================================== +STRINGS CONTROL + +=================================================================== +*/ + +static void Strings_Push( menuSpinControl_t *s ) { + int i; + + for( i = 0; i < s->numItems; i++ ) { + if( !Q_stricmp( s->itemnames[i], s->cvar->string ) ) { + s->curvalue = i; + break; + } + } +} + +static void Strings_Pop( menuSpinControl_t *s ) { + Cvar_SetByVar( s->cvar, s->itemnames[s->curvalue], CVAR_SET_CONSOLE ); +} + +/* +=================================================================== + TOGGLE CONTROL =================================================================== @@ -1260,6 +1319,8 @@ void Menu_Init( menuFrameWork_t *menu ) { case MTYPE_SPINCONTROL: case MTYPE_BITFIELD: case MTYPE_PAIRS: + case MTYPE_VALUES: + case MTYPE_STRINGS: case MTYPE_TOGGLE: SpinControl_Init( item ); break; @@ -1350,11 +1411,15 @@ void Menu_SetFocus( menuCommon_t *focus ) { item->flags |= QMF_HASFOCUS; if( item->focus ) { item->focus( item, qtrue ); + } else if( item->status ) { + menu->status = item->status; } } else if( item->flags & QMF_HASFOCUS ) { item->flags &= ~QMF_HASFOCUS; if( item->focus ) { item->focus( item, qfalse ); + } else if( menu->status == item->status ) { + menu->status = NULL; } } } @@ -1454,6 +1519,8 @@ void Menu_Draw( menuFrameWork_t *menu ) { case MTYPE_SPINCONTROL: case MTYPE_BITFIELD: case MTYPE_PAIRS: + case MTYPE_VALUES: + case MTYPE_STRINGS: case MTYPE_TOGGLE: SpinControl_Draw( item ); break; @@ -1502,6 +1569,8 @@ menuSound_t Menu_SelectItem( menuFrameWork_t *s ) { case MTYPE_SPINCONTROL: case MTYPE_BITFIELD: case MTYPE_PAIRS: + case MTYPE_VALUES: + case MTYPE_STRINGS: case MTYPE_TOGGLE: return SpinControl_DoEnter( (menuSpinControl_t *)item ); case MTYPE_KEYBIND: @@ -1528,6 +1597,8 @@ menuSound_t Menu_SlideItem( menuFrameWork_t *s, int dir ) { case MTYPE_SPINCONTROL: case MTYPE_BITFIELD: case MTYPE_PAIRS: + case MTYPE_VALUES: + case MTYPE_STRINGS: case MTYPE_TOGGLE: return SpinControl_DoSlide( (menuSpinControl_t *)item, dir ); default: @@ -1725,6 +1796,9 @@ qboolean Menu_Push( menuFrameWork_t *menu ) { case MTYPE_PAIRS: Pairs_Push( item ); break; + case MTYPE_STRINGS: + Strings_Push( item ); + break; case MTYPE_SPINCONTROL: SpinControl_Push( item ); break; @@ -1734,6 +1808,9 @@ qboolean Menu_Push( menuFrameWork_t *menu ) { case MTYPE_KEYBIND: Keybind_Push( item ); break; + case MTYPE_FIELD: + Field_Push( item ); + break; default: break; } @@ -1758,10 +1835,16 @@ void Menu_Pop( menuFrameWork_t *menu ) { case MTYPE_PAIRS: Pairs_Pop( item ); break; + case MTYPE_STRINGS: + Strings_Pop( item ); + break; case MTYPE_SPINCONTROL: case MTYPE_TOGGLE: SpinControl_Pop( item ); break; + case MTYPE_FIELD: + Field_Pop( item ); + break; default: break; } @@ -1790,23 +1873,25 @@ void Menu_Free( menuFrameWork_t *menu ) { Pairs_Free( item ); break; case MTYPE_SPINCONTROL: + case MTYPE_STRINGS: SpinControl_Free( item ); break; case MTYPE_KEYBIND: Keybind_Free( item ); break; + case MTYPE_FIELD: + Field_Free( item ); + break; + case MTYPE_SEPARATOR: + Z_Free( item ); + break; default: break; } } - if( menu->title ) { - Z_Free( menu->title ); - } - if( menu->name ) { - Z_Free( menu->name ); - } - + Z_Free( menu->title ); + Z_Free( menu->name ); Z_Free( menu ); } |