Annotation of quake2/client/qmenu.c, revision 1.1

1.1     ! root        1: #include <string.h>
        !             2: #include <ctype.h>
        !             3: 
        !             4: #include "client.h"
        !             5: #include "qmenu.h"
        !             6: 
        !             7: static void     Action_DoEnter( menuaction_s *a );
        !             8: static void     Action_Draw( menuaction_s *a );
        !             9: static void  Menu_DrawStatusBar( const char *string );
        !            10: static void     Menulist_DoEnter( menulist_s *l );
        !            11: static void     MenuList_Draw( menulist_s *l );
        !            12: static void     Separator_Draw( menuseparator_s *s );
        !            13: static void     Slider_DoSlide( menuslider_s *s, int dir );
        !            14: static void     Slider_Draw( menuslider_s *s );
        !            15: static void     SpinControl_DoEnter( menulist_s *s );
        !            16: static void     SpinControl_Draw( menulist_s *s );
        !            17: static void     SpinControl_DoSlide( menulist_s *s, int dir );
        !            18: 
        !            19: #define RCOLUMN_OFFSET  16
        !            20: #define LCOLUMN_OFFSET -16
        !            21: 
        !            22: extern refexport_t re;
        !            23: extern viddef_t viddef;
        !            24: 
        !            25: #define VID_WIDTH viddef.width
        !            26: #define VID_HEIGHT viddef.height
        !            27: 
        !            28: #define Draw_Char re.DrawChar
        !            29: #define Draw_Fill re.DrawFill
        !            30: 
        !            31: void Action_DoEnter( menuaction_s *a )
        !            32: {
        !            33:        if ( a->generic.callback )
        !            34:                a->generic.callback( a );
        !            35: }
        !            36: 
        !            37: void Action_Draw( menuaction_s *a )
        !            38: {
        !            39:        if ( a->generic.flags & QMF_LEFT_JUSTIFY )
        !            40:        {
        !            41:                if ( a->generic.flags & QMF_GRAYED )
        !            42:                        Menu_DrawStringDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
        !            43:                else
        !            44:                        Menu_DrawString( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
        !            45:        }
        !            46:        else
        !            47:        {
        !            48:                if ( a->generic.flags & QMF_GRAYED )
        !            49:                        Menu_DrawStringR2LDark( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
        !            50:                else
        !            51:                        Menu_DrawStringR2L( a->generic.x + a->generic.parent->x + LCOLUMN_OFFSET, a->generic.y + a->generic.parent->y, a->generic.name );
        !            52:        }
        !            53:        if ( a->generic.ownerdraw )
        !            54:                a->generic.ownerdraw( a );
        !            55: }
        !            56: 
        !            57: qboolean Field_DoEnter( menufield_s *f )
        !            58: {
        !            59:        if ( f->generic.callback )
        !            60:        {
        !            61:                f->generic.callback( f );
        !            62:                return true;
        !            63:        }
        !            64:        return false;
        !            65: }
        !            66: 
        !            67: void Field_Draw( menufield_s *f )
        !            68: {
        !            69:        int i;
        !            70:        char tempbuffer[128]="";
        !            71: 
        !            72:        if ( f->generic.name )
        !            73:                Menu_DrawStringR2LDark( f->generic.x + f->generic.parent->x + LCOLUMN_OFFSET, f->generic.y + f->generic.parent->y, f->generic.name );
        !            74: 
        !            75:        strncpy( tempbuffer, f->buffer + f->visible_offset, f->visible_length );
        !            76: 
        !            77:        Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y - 4, 18 );
        !            78:        Draw_Char( f->generic.x + f->generic.parent->x + 16, f->generic.y + f->generic.parent->y + 4, 24 );
        !            79: 
        !            80:        Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y - 4, 20 );
        !            81:        Draw_Char( f->generic.x + f->generic.parent->x + 24 + f->visible_length * 8, f->generic.y + f->generic.parent->y + 4, 26 );
        !            82: 
        !            83:        for ( i = 0; i < f->visible_length; i++ )
        !            84:        {
        !            85:                Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y - 4, 19 );
        !            86:                Draw_Char( f->generic.x + f->generic.parent->x + 24 + i * 8, f->generic.y + f->generic.parent->y + 4, 25 );
        !            87:        }
        !            88: 
        !            89:        Menu_DrawString( f->generic.x + f->generic.parent->x + 24, f->generic.y + f->generic.parent->y, tempbuffer );
        !            90: 
        !            91:        if ( Menu_ItemAtCursor( f->generic.parent ) == f )
        !            92:        {
        !            93:                int offset;
        !            94: 
        !            95:                if ( f->visible_offset )
        !            96:                        offset = f->visible_length;
        !            97:                else
        !            98:                        offset = f->cursor;
        !            99: 
        !           100:                if ( ( ( int ) ( Sys_Milliseconds() / 250 ) ) & 1 )
        !           101:                {
        !           102:                        Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,
        !           103:                                           f->generic.y + f->generic.parent->y,
        !           104:                                           11 );
        !           105:                }
        !           106:                else
        !           107:                {
        !           108:                        Draw_Char( f->generic.x + f->generic.parent->x + ( offset + 2 ) * 8 + 8,
        !           109:                                           f->generic.y + f->generic.parent->y,
        !           110:                                           ' ' );
        !           111:                }
        !           112:        }
        !           113: }
        !           114: 
        !           115: qboolean Field_Key( menufield_s *f, int key )
        !           116: {
        !           117:        extern int keydown[];
        !           118: 
        !           119:        switch ( key )
        !           120:        {
        !           121:        case K_KP_SLASH:
        !           122:                key = '/';
        !           123:                break;
        !           124:        case K_KP_MINUS:
        !           125:                key = '-';
        !           126:                break;
        !           127:        case K_KP_PLUS:
        !           128:                key = '+';
        !           129:                break;
        !           130:        case K_KP_HOME:
        !           131:                key = '7';
        !           132:                break;
        !           133:        case K_KP_UPARROW:
        !           134:                key = '8';
        !           135:                break;
        !           136:        case K_KP_PGUP:
        !           137:                key = '9';
        !           138:                break;
        !           139:        case K_KP_LEFTARROW:
        !           140:                key = '4';
        !           141:                break;
        !           142:        case K_KP_5:
        !           143:                key = '5';
        !           144:                break;
        !           145:        case K_KP_RIGHTARROW:
        !           146:                key = '6';
        !           147:                break;
        !           148:        case K_KP_END:
        !           149:                key = '1';
        !           150:                break;
        !           151:        case K_KP_DOWNARROW:
        !           152:                key = '2';
        !           153:                break;
        !           154:        case K_KP_PGDN:
        !           155:                key = '3';
        !           156:                break;
        !           157:        case K_KP_INS:
        !           158:                key = '0';
        !           159:                break;
        !           160:        case K_KP_DEL:
        !           161:                key = '.';
        !           162:                break;
        !           163:        }
        !           164: 
        !           165:        if ( key > 127 )
        !           166:        {
        !           167:                switch ( key )
        !           168:                {
        !           169:                case K_DEL:
        !           170:                default:
        !           171:                        return false;
        !           172:                }
        !           173:        }
        !           174: 
        !           175:        /*
        !           176:        ** support pasting from the clipboard
        !           177:        */
        !           178:        if ( ( toupper( key ) == 'V' && keydown[K_CTRL] ) ||
        !           179:                 ( ( ( key == K_INS ) || ( key == K_KP_INS ) ) && keydown[K_SHIFT] ) )
        !           180:        {
        !           181:                char *cbd;
        !           182:                
        !           183:                if ( ( cbd = Sys_GetClipboardData() ) != 0 )
        !           184:                {
        !           185:                        strtok( cbd, "\n\r\b" );
        !           186: 
        !           187:                        strncpy( f->buffer, cbd, f->length - 1 );
        !           188:                        f->cursor = strlen( f->buffer );
        !           189:                        f->visible_offset = f->cursor - f->visible_length;
        !           190:                        if ( f->visible_offset < 0 )
        !           191:                                f->visible_offset = 0;
        !           192: 
        !           193:                        free( cbd );
        !           194:                }
        !           195:                return true;
        !           196:        }
        !           197: 
        !           198:        switch ( key )
        !           199:        {
        !           200:        case K_KP_LEFTARROW:
        !           201:        case K_LEFTARROW:
        !           202:        case K_BACKSPACE:
        !           203:                if ( f->cursor > 0 )
        !           204:                {
        !           205:                        memmove( &f->buffer[f->cursor-1], &f->buffer[f->cursor], strlen( &f->buffer[f->cursor] ) + 1 );
        !           206:                        f->cursor--;
        !           207: 
        !           208:                        if ( f->visible_offset )
        !           209:                        {
        !           210:                                f->visible_offset--;
        !           211:                        }
        !           212:                }
        !           213:                break;
        !           214: 
        !           215:        case K_KP_DEL:
        !           216:        case K_DEL:
        !           217:                memmove( &f->buffer[f->cursor], &f->buffer[f->cursor+1], strlen( &f->buffer[f->cursor+1] ) + 1 );
        !           218:                break;
        !           219: 
        !           220:        case K_KP_ENTER:
        !           221:        case K_ENTER:
        !           222:        case K_ESCAPE:
        !           223:        case K_TAB:
        !           224:                return false;
        !           225: 
        !           226:        case K_SPACE:
        !           227:        default:
        !           228:                if ( !isdigit( key ) && ( f->generic.flags & QMF_NUMBERSONLY ) )
        !           229:                        return false;
        !           230: 
        !           231:                if ( f->cursor < f->length )
        !           232:                {
        !           233:                        f->buffer[f->cursor++] = key;
        !           234:                        f->buffer[f->cursor] = 0;
        !           235: 
        !           236:                        if ( f->cursor > f->visible_length )
        !           237:                        {
        !           238:                                f->visible_offset++;
        !           239:                        }
        !           240:                }
        !           241:        }
        !           242: 
        !           243:        return true;
        !           244: }
        !           245: 
        !           246: void Menu_AddItem( menuframework_s *menu, void *item )
        !           247: {
        !           248:        if ( menu->nitems == 0 )
        !           249:                menu->nslots = 0;
        !           250: 
        !           251:        if ( menu->nitems < MAXMENUITEMS )
        !           252:        {
        !           253:                menu->items[menu->nitems] = item;
        !           254:                ( ( menucommon_s * ) menu->items[menu->nitems] )->parent = menu;
        !           255:                menu->nitems++;
        !           256:        }
        !           257: 
        !           258:        menu->nslots = Menu_TallySlots( menu );
        !           259: }
        !           260: 
        !           261: /*
        !           262: ** Menu_AdjustCursor
        !           263: **
        !           264: ** This function takes the given menu, the direction, and attempts
        !           265: ** to adjust the menu's cursor so that it's at the next available
        !           266: ** slot.
        !           267: */
        !           268: void Menu_AdjustCursor( menuframework_s *m, int dir )
        !           269: {
        !           270:        menucommon_s *citem;
        !           271: 
        !           272:        /*
        !           273:        ** see if it's in a valid spot
        !           274:        */
        !           275:        if ( m->cursor >= 0 && m->cursor < m->nitems )
        !           276:        {
        !           277:                if ( ( citem = Menu_ItemAtCursor( m ) ) != 0 )
        !           278:                {
        !           279:                        if ( citem->type != MTYPE_SEPARATOR )
        !           280:                                return;
        !           281:                }
        !           282:        }
        !           283: 
        !           284:        /*
        !           285:        ** it's not in a valid spot, so crawl in the direction indicated until we
        !           286:        ** find a valid spot
        !           287:        */
        !           288:        if ( dir == 1 )
        !           289:        {
        !           290:                while ( 1 )
        !           291:                {
        !           292:                        citem = Menu_ItemAtCursor( m );
        !           293:                        if ( citem )
        !           294:                                if ( citem->type != MTYPE_SEPARATOR )
        !           295:                                        break;
        !           296:                        m->cursor += dir;
        !           297:                        if ( m->cursor >= m->nitems )
        !           298:                                m->cursor = 0;
        !           299:                }
        !           300:        }
        !           301:        else
        !           302:        {
        !           303:                while ( 1 )
        !           304:                {
        !           305:                        citem = Menu_ItemAtCursor( m );
        !           306:                        if ( citem )
        !           307:                                if ( citem->type != MTYPE_SEPARATOR )
        !           308:                                        break;
        !           309:                        m->cursor += dir;
        !           310:                        if ( m->cursor < 0 )
        !           311:                                m->cursor = m->nitems - 1;
        !           312:                }
        !           313:        }
        !           314: }
        !           315: 
        !           316: void Menu_Center( menuframework_s *menu )
        !           317: {
        !           318:        int height;
        !           319: 
        !           320:        height = ( ( menucommon_s * ) menu->items[menu->nitems-1])->y;
        !           321:        height += 10;
        !           322: 
        !           323:        menu->y = ( VID_HEIGHT - height ) / 2;
        !           324: }
        !           325: 
        !           326: void Menu_Draw( menuframework_s *menu )
        !           327: {
        !           328:        int i;
        !           329:        menucommon_s *item;
        !           330: 
        !           331:        /*
        !           332:        ** draw contents
        !           333:        */
        !           334:        for ( i = 0; i < menu->nitems; i++ )
        !           335:        {
        !           336:                switch ( ( ( menucommon_s * ) menu->items[i] )->type )
        !           337:                {
        !           338:                case MTYPE_FIELD:
        !           339:                        Field_Draw( ( menufield_s * ) menu->items[i] );
        !           340:                        break;
        !           341:                case MTYPE_SLIDER:
        !           342:                        Slider_Draw( ( menuslider_s * ) menu->items[i] );
        !           343:                        break;
        !           344:                case MTYPE_LIST:
        !           345:                        MenuList_Draw( ( menulist_s * ) menu->items[i] );
        !           346:                        break;
        !           347:                case MTYPE_SPINCONTROL:
        !           348:                        SpinControl_Draw( ( menulist_s * ) menu->items[i] );
        !           349:                        break;
        !           350:                case MTYPE_ACTION:
        !           351:                        Action_Draw( ( menuaction_s * ) menu->items[i] );
        !           352:                        break;
        !           353:                case MTYPE_SEPARATOR:
        !           354:                        Separator_Draw( ( menuseparator_s * ) menu->items[i] );
        !           355:                        break;
        !           356:                }
        !           357:        }
        !           358: 
        !           359:        item = Menu_ItemAtCursor( menu );
        !           360: 
        !           361:        if ( item && item->cursordraw )
        !           362:        {
        !           363:                item->cursordraw( item );
        !           364:        }
        !           365:        else if ( menu->cursordraw )
        !           366:        {
        !           367:                menu->cursordraw( menu );
        !           368:        }
        !           369:        else if ( item && item->type != MTYPE_FIELD )
        !           370:        {
        !           371:                if ( item->flags & QMF_LEFT_JUSTIFY )
        !           372:                {
        !           373:                        Draw_Char( menu->x + item->x - 24 + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );
        !           374:                }
        !           375:                else
        !           376:                {
        !           377:                        Draw_Char( menu->x + item->cursor_offset, menu->y + item->y, 12 + ( ( int ) ( Sys_Milliseconds()/250 ) & 1 ) );
        !           378:                }
        !           379:        }
        !           380: 
        !           381:        if ( item )
        !           382:        {
        !           383:                if ( item->statusbarfunc )
        !           384:                        item->statusbarfunc( ( void * ) item );
        !           385:                else if ( item->statusbar )
        !           386:                        Menu_DrawStatusBar( item->statusbar );
        !           387:                else
        !           388:                        Menu_DrawStatusBar( menu->statusbar );
        !           389: 
        !           390:        }
        !           391:        else
        !           392:        {
        !           393:                Menu_DrawStatusBar( menu->statusbar );
        !           394:        }
        !           395: }
        !           396: 
        !           397: void Menu_DrawStatusBar( const char *string )
        !           398: {
        !           399:        if ( string )
        !           400:        {
        !           401:                int l = strlen( string );
        !           402:                int maxrow = VID_HEIGHT / 8;
        !           403:                int maxcol = VID_WIDTH / 8;
        !           404:                int col = maxcol / 2 - l / 2;
        !           405: 
        !           406:                Draw_Fill( 0, VID_HEIGHT-8, VID_WIDTH, 8, 4 );
        !           407:                Menu_DrawString( col*8, VID_HEIGHT - 8, string );
        !           408:        }
        !           409:        else
        !           410:        {
        !           411:                Draw_Fill( 0, VID_HEIGHT-8, VID_WIDTH, 8, 0 );
        !           412:        }
        !           413: }
        !           414: 
        !           415: void Menu_DrawString( int x, int y, const char *string )
        !           416: {
        !           417:        unsigned i;
        !           418: 
        !           419:        for ( i = 0; i < strlen( string ); i++ )
        !           420:        {
        !           421:                Draw_Char( ( x + i*8 ), y, string[i] );
        !           422:        }
        !           423: }
        !           424: 
        !           425: void Menu_DrawStringDark( int x, int y, const char *string )
        !           426: {
        !           427:        unsigned i;
        !           428: 
        !           429:        for ( i = 0; i < strlen( string ); i++ )
        !           430:        {
        !           431:                Draw_Char( ( x + i*8 ), y, string[i] + 128 );
        !           432:        }
        !           433: }
        !           434: 
        !           435: void Menu_DrawStringR2L( int x, int y, const char *string )
        !           436: {
        !           437:        unsigned i;
        !           438: 
        !           439:        for ( i = 0; i < strlen( string ); i++ )
        !           440:        {
        !           441:                Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1] );
        !           442:        }
        !           443: }
        !           444: 
        !           445: void Menu_DrawStringR2LDark( int x, int y, const char *string )
        !           446: {
        !           447:        unsigned i;
        !           448: 
        !           449:        for ( i = 0; i < strlen( string ); i++ )
        !           450:        {
        !           451:                Draw_Char( ( x - i*8 ), y, string[strlen(string)-i-1]+128 );
        !           452:        }
        !           453: }
        !           454: 
        !           455: void *Menu_ItemAtCursor( menuframework_s *m )
        !           456: {
        !           457:        if ( m->cursor < 0 || m->cursor >= m->nitems )
        !           458:                return 0;
        !           459: 
        !           460:        return m->items[m->cursor];
        !           461: }
        !           462: 
        !           463: qboolean Menu_SelectItem( menuframework_s *s )
        !           464: {
        !           465:        menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
        !           466: 
        !           467:        if ( item )
        !           468:        {
        !           469:                switch ( item->type )
        !           470:                {
        !           471:                case MTYPE_FIELD:
        !           472:                        return Field_DoEnter( ( menufield_s * ) item ) ;
        !           473:                case MTYPE_ACTION:
        !           474:                        Action_DoEnter( ( menuaction_s * ) item );
        !           475:                        return true;
        !           476:                case MTYPE_LIST:
        !           477: //                     Menulist_DoEnter( ( menulist_s * ) item );
        !           478:                        return false;
        !           479:                case MTYPE_SPINCONTROL:
        !           480: //                     SpinControl_DoEnter( ( menulist_s * ) item );
        !           481:                        return false;
        !           482:                }
        !           483:        }
        !           484:        return false;
        !           485: }
        !           486: 
        !           487: void Menu_SetStatusBar( menuframework_s *m, const char *string )
        !           488: {
        !           489:        m->statusbar = string;
        !           490: }
        !           491: 
        !           492: void Menu_SlideItem( menuframework_s *s, int dir )
        !           493: {
        !           494:        menucommon_s *item = ( menucommon_s * ) Menu_ItemAtCursor( s );
        !           495: 
        !           496:        if ( item )
        !           497:        {
        !           498:                switch ( item->type )
        !           499:                {
        !           500:                case MTYPE_SLIDER:
        !           501:                        Slider_DoSlide( ( menuslider_s * ) item, dir );
        !           502:                        break;
        !           503:                case MTYPE_SPINCONTROL:
        !           504:                        SpinControl_DoSlide( ( menulist_s * ) item, dir );
        !           505:                        break;
        !           506:                }
        !           507:        }
        !           508: }
        !           509: 
        !           510: int Menu_TallySlots( menuframework_s *menu )
        !           511: {
        !           512:        int i;
        !           513:        int total = 0;
        !           514: 
        !           515:        for ( i = 0; i < menu->nitems; i++ )
        !           516:        {
        !           517:                if ( ( ( menucommon_s * ) menu->items[i] )->type == MTYPE_LIST )
        !           518:                {
        !           519:                        int nitems = 0;
        !           520:                        const char **n = ( ( menulist_s * ) menu->items[i] )->itemnames;
        !           521: 
        !           522:                        while (*n)
        !           523:                                nitems++, n++;
        !           524: 
        !           525:                        total += nitems;
        !           526:                }
        !           527:                else
        !           528:                {
        !           529:                        total++;
        !           530:                }
        !           531:        }
        !           532: 
        !           533:        return total;
        !           534: }
        !           535: 
        !           536: void Menulist_DoEnter( menulist_s *l )
        !           537: {
        !           538:        int start;
        !           539: 
        !           540:        start = l->generic.y / 10 + 1;
        !           541: 
        !           542:        l->curvalue = l->generic.parent->cursor - start;
        !           543: 
        !           544:        if ( l->generic.callback )
        !           545:                l->generic.callback( l );
        !           546: }
        !           547: 
        !           548: void MenuList_Draw( menulist_s *l )
        !           549: {
        !           550:        const char **n;
        !           551:        int y = 0;
        !           552: 
        !           553:        Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y, l->generic.name );
        !           554: 
        !           555:        n = l->itemnames;
        !           556: 
        !           557:        Draw_Fill( l->generic.x - 112 + l->generic.parent->x, l->generic.parent->y + l->generic.y + l->curvalue*10 + 10, 128, 10, 16 );
        !           558:        while ( *n )
        !           559:        {
        !           560:                Menu_DrawStringR2LDark( l->generic.x + l->generic.parent->x + LCOLUMN_OFFSET, l->generic.y + l->generic.parent->y + y + 10, *n );
        !           561: 
        !           562:                n++;
        !           563:                y += 10;
        !           564:        }
        !           565: }
        !           566: 
        !           567: void Separator_Draw( menuseparator_s *s )
        !           568: {
        !           569:        if ( s->generic.name )
        !           570:                Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->generic.name );
        !           571: }
        !           572: 
        !           573: void Slider_DoSlide( menuslider_s *s, int dir )
        !           574: {
        !           575:        s->curvalue += dir;
        !           576: 
        !           577:        if ( s->curvalue > s->maxvalue )
        !           578:                s->curvalue = s->maxvalue;
        !           579:        else if ( s->curvalue < s->minvalue )
        !           580:                s->curvalue = s->minvalue;
        !           581: 
        !           582:        if ( s->generic.callback )
        !           583:                s->generic.callback( s );
        !           584: }
        !           585: 
        !           586: #define SLIDER_RANGE 10
        !           587: 
        !           588: void Slider_Draw( menuslider_s *s )
        !           589: {
        !           590:        int     i;
        !           591: 
        !           592:        Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET,
        !           593:                                s->generic.y + s->generic.parent->y, 
        !           594:                                                s->generic.name );
        !           595: 
        !           596:        s->range = ( s->curvalue - s->minvalue ) / ( float ) ( s->maxvalue - s->minvalue );
        !           597: 
        !           598:        if ( s->range < 0)
        !           599:                s->range = 0;
        !           600:        if ( s->range > 1)
        !           601:                s->range = 1;
        !           602:        Draw_Char( s->generic.x + s->generic.parent->x + RCOLUMN_OFFSET, s->generic.y + s->generic.parent->y, 128);
        !           603:        for ( i = 0; i < SLIDER_RANGE; i++ )
        !           604:                Draw_Char( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 129);
        !           605:        Draw_Char( RCOLUMN_OFFSET + s->generic.x + i*8 + s->generic.parent->x + 8, s->generic.y + s->generic.parent->y, 130);
        !           606:        Draw_Char( ( int ) ( 8 + RCOLUMN_OFFSET + s->generic.parent->x + s->generic.x + (SLIDER_RANGE-1)*8 * s->range ), s->generic.y + s->generic.parent->y, 131);
        !           607: }
        !           608: 
        !           609: void SpinControl_DoEnter( menulist_s *s )
        !           610: {
        !           611:        s->curvalue++;
        !           612:        if ( s->itemnames[s->curvalue] == 0 )
        !           613:                s->curvalue = 0;
        !           614: 
        !           615:        if ( s->generic.callback )
        !           616:                s->generic.callback( s );
        !           617: }
        !           618: 
        !           619: void SpinControl_DoSlide( menulist_s *s, int dir )
        !           620: {
        !           621:        s->curvalue += dir;
        !           622: 
        !           623:        if ( s->curvalue < 0 )
        !           624:                s->curvalue = 0;
        !           625:        else if ( s->itemnames[s->curvalue] == 0 )
        !           626:                s->curvalue--;
        !           627: 
        !           628:        if ( s->generic.callback )
        !           629:                s->generic.callback( s );
        !           630: }
        !           631: 
        !           632: void SpinControl_Draw( menulist_s *s )
        !           633: {
        !           634:        char buffer[100];
        !           635: 
        !           636:        if ( s->generic.name )
        !           637:        {
        !           638:                Menu_DrawStringR2LDark( s->generic.x + s->generic.parent->x + LCOLUMN_OFFSET, 
        !           639:                                                        s->generic.y + s->generic.parent->y, 
        !           640:                                                        s->generic.name );
        !           641:        }
        !           642:        if ( !strchr( s->itemnames[s->curvalue], '\n' ) )
        !           643:        {
        !           644:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, s->itemnames[s->curvalue] );
        !           645:        }
        !           646:        else
        !           647:        {
        !           648:                strcpy( buffer, s->itemnames[s->curvalue] );
        !           649:                *strchr( buffer, '\n' ) = 0;
        !           650:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y, buffer );
        !           651:                strcpy( buffer, strchr( s->itemnames[s->curvalue], '\n' ) + 1 );
        !           652:                Menu_DrawString( RCOLUMN_OFFSET + s->generic.x + s->generic.parent->x, s->generic.y + s->generic.parent->y + 10, buffer );
        !           653:        }
        !           654: }
        !           655: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.