diff options
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/ui_shared.c | 426 | ||||
| -rw-r--r-- | src/ui/ui_shared.h | 10 | 
2 files changed, 156 insertions, 280 deletions
diff --git a/src/ui/ui_shared.c b/src/ui/ui_shared.c index 8862f328..315f6135 100644 --- a/src/ui/ui_shared.c +++ b/src/ui/ui_shared.c @@ -1773,9 +1773,8 @@ void Script_Reset( itemDef_t *item, char **args )      {        if( resetItem->type == ITEM_TYPE_LISTBOX )        { -        listBoxDef_t * listPtr = ( listBoxDef_t* )resetItem->typeData;          resetItem->cursorPos = 0; -        listPtr->startPos = 0; +        resetItem->typeData.list->startPos = 0;          DC->feederSelection( resetItem->special, 0 );        }      } @@ -2668,7 +2667,7 @@ qboolean Item_SetFocus( itemDef_t *item, float x, float y )  int Item_ListBox_MaxScroll( itemDef_t *item )  { -  listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData; +  listBoxDef_t *listPtr = item->typeData.list;    int count = DC->feederCount( item->special );    int max; @@ -2686,7 +2685,7 @@ int Item_ListBox_MaxScroll( itemDef_t *item )  int Item_ListBox_ThumbPosition( itemDef_t *item )  {    float max, pos, size; -  listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData; +  int startPos = item->typeData.list->startPos;    max = Item_ListBox_MaxScroll( item ); @@ -2699,7 +2698,7 @@ int Item_ListBox_ThumbPosition( itemDef_t *item )      else        pos = 0; -    pos *= listPtr->startPos; +    pos *= startPos;      return item->window.rect.x + 1 + SCROLLBAR_WIDTH + pos;    }    else @@ -2711,7 +2710,7 @@ int Item_ListBox_ThumbPosition( itemDef_t *item )      else        pos = 0; -    pos *= listPtr->startPos; +    pos *= startPos;      return item->window.rect.y + 1 + SCROLLBAR_HEIGHT + pos;    }  } @@ -2750,7 +2749,7 @@ int Item_ListBox_ThumbDrawPosition( itemDef_t *item )  float Item_Slider_ThumbPosition( itemDef_t *item )  {    float value, range, x; -  editFieldDef_t *editDef = item->typeData; +  editFieldDef_t *editDef = item->typeData.edit;    if( item->text )      x = item->textRect.x + item->textRect.w + ITEM_VALUE_OFFSET; @@ -2804,12 +2803,10 @@ int Item_Slider_OverSlider( itemDef_t *item, float x, float y )  int Item_ListBox_OverLB( itemDef_t *item, float x, float y )  {    rectDef_t r; -  listBoxDef_t *listPtr;    int thumbstart;    int count;    count = DC->feederCount( item->special ); -  listPtr = ( listBoxDef_t* )item->typeData;    if( item->window.flags & WINDOW_HORIZONTAL )    { @@ -2889,7 +2886,7 @@ int Item_ListBox_OverLB( itemDef_t *item, float x, float y )  void Item_ListBox_MouseEnter( itemDef_t *item, float x, float y )  {    rectDef_t r; -  listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData; +  listBoxDef_t *listPtr = item->typeData.list;    item->window.flags &= ~( WINDOW_LB_LEFTARROW | WINDOW_LB_RIGHTARROW | WINDOW_LB_THUMB |                             WINDOW_LB_PGUP | WINDOW_LB_PGDN ); @@ -3043,7 +3040,7 @@ qboolean Item_OwnerDraw_HandleKey( itemDef_t *item, int key )  qboolean Item_ListBox_HandleKey( itemDef_t *item, int key, qboolean down, qboolean force )  { -  listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData; +  listBoxDef_t *listPtr = item->typeData.list;    int count = DC->feederCount( item->special );    int max, viewmax; @@ -3362,12 +3359,10 @@ qboolean Item_YesNo_HandleKey( itemDef_t *item, int key )  int Item_Multi_CountSettings( itemDef_t *item )  { -  multiDef_t *multiPtr = ( multiDef_t* )item->typeData; - -  if( multiPtr == NULL ) +  if( item->typeData.multi == NULL )      return 0; -  return multiPtr->count; +  return item->typeData.multi->count;  }  int Item_Multi_FindCvarByValue( itemDef_t *item ) @@ -3375,7 +3370,7 @@ int Item_Multi_FindCvarByValue( itemDef_t *item )    char buff[1024];    float value = 0;    int i; -  multiDef_t *multiPtr = ( multiDef_t* )item->typeData; +  multiDef_t *multiPtr = item->typeData.multi;    if( multiPtr )    { @@ -3407,7 +3402,7 @@ const char *Item_Multi_Setting( itemDef_t *item )    char buff[1024];    float value = 0;    int i; -  multiDef_t *multiPtr = ( multiDef_t* )item->typeData; +  multiDef_t *multiPtr = item->typeData.multi;    if( multiPtr )    { @@ -3436,7 +3431,7 @@ const char *Item_Multi_Setting( itemDef_t *item )  qboolean Item_Combobox_HandleKey( itemDef_t *item, int key )  { -  comboBoxDef_t *comboPtr = (comboBoxDef_t *)item->typeData; +  comboBoxDef_t *comboPtr = item->typeData.combo;    qboolean mouseOver = Rect_ContainsPoint( &item->window.rect, DC->cursorx, DC->cursory );    int count = DC->feederCount( item->special ); @@ -3472,12 +3467,11 @@ qboolean Item_Combobox_HandleKey( itemDef_t *item, int key )  qboolean Item_Multi_HandleKey( itemDef_t *item, int key )  { -  multiDef_t *multiPtr = ( multiDef_t* )item->typeData;    qboolean mouseOver = Rect_ContainsPoint( &item->window.rect, DC->cursorx, DC->cursory );    int max = Item_Multi_CountSettings( item );    qboolean changed = qfalse; -  if( multiPtr ) +  if( item->typeData.multi )    {      if( item->window.flags & WINDOW_HASFOCUS && item->cvar && max > 0 )      { @@ -3498,11 +3492,11 @@ qboolean Item_Multi_HandleKey( itemDef_t *item, int key )        if( changed )        { -        if( multiPtr->strDef ) -          DC->setCVar( item->cvar, multiPtr->cvarStr[current] ); +        if( item->typeData.multi->strDef ) +          DC->setCVar( item->cvar, item->typeData.multi->cvarStr[current] );          else          { -          float value = multiPtr->cvarValue[current]; +          float value = item->typeData.multi->cvarValue[current];            if( ( ( float )( ( int ) value ) ) == value )              DC->setCVar( item->cvar, va( "%i", ( int ) value ) ); @@ -3523,7 +3517,7 @@ qboolean Item_Multi_HandleKey( itemDef_t *item, int key )  static void Item_TextField_CalcPaintOffset( itemDef_t *item, char *buff )  { -  editFieldDef_t  *editPtr = ( editFieldDef_t* )item->typeData; +  editFieldDef_t  *editPtr = item->typeData.edit;    if( item->cursorPos < editPtr->paintOffset )      editPtr->paintOffset = item->cursorPos; @@ -3559,7 +3553,7 @@ qboolean Item_TextField_HandleKey( itemDef_t *item, int key )    char buff[1024];    int len;    itemDef_t *newItem = NULL; -  editFieldDef_t *editPtr = ( editFieldDef_t* )item->typeData; +  editFieldDef_t *editPtr = item->typeData.edit;    qboolean releaseFocus = qtrue;    if( item->cvar ) @@ -3748,8 +3742,6 @@ static void Scroll_ListBox_ThumbFunc( void *p )    rectDef_t r;    int pos, max; -  listBoxDef_t *listPtr = ( listBoxDef_t* )si->item->typeData; -    if( si->item->window.flags & WINDOW_HORIZONTAL )    {      if( DC->cursorx == si->xStart ) @@ -3768,7 +3760,7 @@ static void Scroll_ListBox_ThumbFunc( void *p )      else if( pos > max )        pos = max; -    listPtr->startPos = pos; +    si->item->typeData.list->startPos = pos;      si->xStart = DC->cursorx;    }    else if( DC->cursory != si->yStart ) @@ -3786,7 +3778,7 @@ static void Scroll_ListBox_ThumbFunc( void *p )      else if( pos > max )        pos = max; -    listPtr->startPos = pos; +    si->item->typeData.list->startPos = pos;      si->yStart = DC->cursory;    } @@ -3812,7 +3804,6 @@ static void Scroll_Slider_ThumbFunc( void *p )  {    float x, value, cursorx;    scrollInfo_t *si = ( scrollInfo_t* )p; -  editFieldDef_t *editDef = si->item->typeData;    if( si->item->text )      x = si->item->textRect.x + si->item->textRect.w + ITEM_VALUE_OFFSET; @@ -3828,8 +3819,8 @@ static void Scroll_Slider_ThumbFunc( void *p )    value = cursorx - x;    value /= SLIDER_WIDTH; -  value *= ( editDef->maxVal - editDef->minVal ); -  value += editDef->minVal; +  value *= si->item->typeData.edit->maxVal - si->item->typeData.edit->minVal; +  value += si->item->typeData.edit->minVal;    DC->setCVar( si->item->cvar, va( "%f", value ) );  } @@ -3899,42 +3890,34 @@ void Item_StopCapture( itemDef_t *item )  qboolean Item_Slider_HandleKey( itemDef_t *item, int key, qboolean down )  { -  float x, value, width, work; +  float x, value, width;    if( item->window.flags & WINDOW_HASFOCUS && item->cvar &&        Rect_ContainsPoint( &item->window.rect, DC->cursorx, DC->cursory ) )    { -    if( key == K_MOUSE1 || key == K_ENTER || key == K_MOUSE2 || key == K_MOUSE3 ) +    if( item->typeData.edit && ( key == K_ENTER || +        key == K_MOUSE1 || key == K_MOUSE2 || key == K_MOUSE3 ) )      { -      editFieldDef_t *editDef = item->typeData; - -      if( editDef ) -      { -        rectDef_t testRect; -        width = SLIDER_WIDTH; +      rectDef_t testRect; +      width = SLIDER_WIDTH; -        if( item->text ) -          x = item->textRect.x + item->textRect.w + ITEM_VALUE_OFFSET; -        else -          x = item->window.rect.x; +      if( item->text ) +        x = item->textRect.x + item->textRect.w + ITEM_VALUE_OFFSET; +      else +        x = item->window.rect.x; -        testRect = item->window.rect; -        testRect.x = x; -        value = ( float )SLIDER_THUMB_WIDTH / 2; -        testRect.x -= value; -        testRect.w = ( SLIDER_WIDTH + ( float )SLIDER_THUMB_WIDTH / 2 ); +      testRect = item->window.rect; +      value = ( float )SLIDER_THUMB_WIDTH / 2; +      testRect.x = x - value; +      testRect.w = SLIDER_WIDTH + value; -        if( Rect_ContainsPoint( &testRect, DC->cursorx, DC->cursory ) ) -        { -          work = DC->cursorx - x; -          value = work / width; -          value *= ( editDef->maxVal - editDef->minVal ); -          // vm fuckage -          // value = (((float)(DC->cursorx - x)/ SLIDER_WIDTH) * (editDef->maxVal - editDef->minVal)); -          value += editDef->minVal; -          DC->setCVar( item->cvar, va( "%f", value ) ); -          return qtrue; -        } +      if( Rect_ContainsPoint( &testRect, DC->cursorx, DC->cursory ) ) +      { +        value = ( float )( DC->cursorx - x ) / width; +        value *= ( item->typeData.edit->maxVal - item->typeData.edit->minVal ); +        value += item->typeData.edit->minVal; +        DC->setCVar( item->cvar, va( "%f", value ) ); +        return qtrue;        }      }    } @@ -4159,16 +4142,14 @@ void  Menus_Activate( menuDef_t *menu )      {        if( menu->items[ i ]->type == ITEM_TYPE_LISTBOX )        { -        listBoxDef_t *listPtr = ( listBoxDef_t* )menu->items[ i ]->typeData;          menu->items[ i ]->cursorPos = 0; -        listPtr->startPos = 0; +        menu->items[ i ]->typeData.list->startPos = 0;          DC->feederSelection( menu->items[ i ]->special, 0 );        }        else if( menu->items[ i ]->type == ITEM_TYPE_COMBO )        { -        comboBoxDef_t *comboPtr = (comboBoxDef_t *)menu->items[ i ]->typeData; - -        comboPtr->cursorPos = DC->feederInitialise( menu->items[ i ]->special ); +        menu->items[ i ]->typeData.combo->cursorPos = +          DC->feederInitialise( menu->items[ i ]->special );        }      } @@ -4980,7 +4961,7 @@ void Item_TextField_Paint( itemDef_t *item )    vec4_t          newColor;    int             offset = ( item->text && *item->text ) ? ITEM_VALUE_OFFSET : 0;    menuDef_t       *parent = ( menuDef_t* )item->parent; -  editFieldDef_t  *editPtr = ( editFieldDef_t* )item->typeData; +  editFieldDef_t  *editPtr = item->typeData.edit;    char            cursor = DC->getOverstrikeMode() ? '|' : '_';    qboolean        editing = ( item->window.flags & WINDOW_HASFOCUS && g_editingField );    const int       cursorWidth = editing ? EDIT_CURSOR_WIDTH : 0; @@ -5090,15 +5071,15 @@ void Item_Combobox_Paint( itemDef_t *item )    vec4_t newColor;    const char *text = "";    menuDef_t *parent = (menuDef_t *)item->parent; -  comboBoxDef_t *comboPtr = (comboBoxDef_t *)item->typeData;    if( item->window.flags & WINDOW_HASFOCUS )      memcpy( newColor, &parent->focusColor, sizeof( vec4_t ) );    else      memcpy( &newColor, &item->window.foreColor, sizeof( vec4_t ) ); -  if( comboPtr ) -    text = DC->feederItemText( item->special, comboPtr->cursorPos, 0, NULL ); +  if( item->typeData.combo ) +    text = DC->feederItemText( item->special, item->typeData.combo->cursorPos, +                               0, NULL );    if( item->text )    { @@ -5382,10 +5363,9 @@ void Item_Bind_Paint( itemDef_t *item )    float value;    int maxChars = 0;    menuDef_t *parent = ( menuDef_t* )item->parent; -  editFieldDef_t *editPtr = ( editFieldDef_t* )item->typeData; -  if( editPtr ) -    maxChars = editPtr->maxPaintChars; +  if( item->typeData.edit ) +    maxChars = item->typeData.edit->maxPaintChars;    value = ( item->cvar ) ? DC->getCVarValue( item->cvar ) : 0; @@ -5552,7 +5532,7 @@ void Item_Model_Paint( itemDef_t *item )    refEntity_t   ent;    vec3_t      mins, maxs, origin;    vec3_t      angles; -  modelDef_t *modelPtr = ( modelDef_t* )item->typeData; +  modelDef_t *modelPtr = item->typeData.model;    if( modelPtr == NULL )      return; @@ -5652,7 +5632,7 @@ void Item_ListBox_Paint( itemDef_t *item )    int i, count;    qhandle_t image;    qhandle_t optionalImage; -  listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData; +  listBoxDef_t *listPtr = item->typeData.list;    menuDef_t *menu = ( menuDef_t * )item->parent;    float one, two; @@ -6331,9 +6311,8 @@ void Menu_SetFeederSelection( menuDef_t *menu, int feeder, int index, const char        {          if( index == 0 )          { -          listBoxDef_t *listPtr = ( listBoxDef_t* )menu->items[i]->typeData; -          listPtr->cursorPos = 0; -          listPtr->startPos = 0; +          menu->items[ i ]->typeData.list->cursorPos = 0; +          menu->items[ i ]->typeData.list->startPos = 0;          }          menu->items[i]->cursorPos = index; @@ -6518,43 +6497,50 @@ void Menu_Paint( menuDef_t *menu, qboolean forcePaint )  /*  ===============  Item_ValidateTypeData + +If the typeData pointer is null, allocate it a memory block appropriate to the +item type and memset it to 0  ===============  */  void Item_ValidateTypeData( itemDef_t *item )  { -  if( item->typeData ) +  if( item->typeData.data )      return; -  if( item->type == ITEM_TYPE_LISTBOX ) -  { -    item->typeData = UI_Alloc( sizeof( listBoxDef_t ) ); -    memset( item->typeData, 0, sizeof( listBoxDef_t ) ); -  } -  else if( item->type == ITEM_TYPE_COMBO ) -  { -    item->typeData = UI_Alloc( sizeof( comboBoxDef_t ) ); -    memset( item->typeData, 0, sizeof( comboBoxDef_t ) ); -  } -  else if( item->type == ITEM_TYPE_EDITFIELD || -           item->type == ITEM_TYPE_NUMERICFIELD || -           item->type == ITEM_TYPE_YESNO || -           item->type == ITEM_TYPE_BIND || -           item->type == ITEM_TYPE_SLIDER || -           item->type == ITEM_TYPE_TEXT ) +  switch( item->type )    { -    item->typeData = UI_Alloc( sizeof( editFieldDef_t ) ); -    memset( item->typeData, 0, sizeof( editFieldDef_t ) ); +    case ITEM_TYPE_LISTBOX: +      item->typeData.list = UI_Alloc( sizeof( listBoxDef_t ) ); +      memset( item->typeData.list, 0, sizeof( listBoxDef_t ) ); +      break; -    if( item->type == ITEM_TYPE_EDITFIELD ) -    { -      if( !( ( editFieldDef_t * ) item->typeData )->maxPaintChars ) -        ( ( editFieldDef_t * ) item->typeData )->maxPaintChars = MAX_EDITFIELD; -    } +    case ITEM_TYPE_COMBO: +      item->typeData.combo = UI_Alloc( sizeof( comboBoxDef_t ) ); +      memset( item->typeData.combo, 0, sizeof( comboBoxDef_t ) ); +      break; + +    case ITEM_TYPE_EDITFIELD: +    case ITEM_TYPE_NUMERICFIELD: +    case ITEM_TYPE_YESNO: +    case ITEM_TYPE_BIND: +    case ITEM_TYPE_SLIDER: +    case ITEM_TYPE_TEXT: +      item->typeData.edit = UI_Alloc( sizeof( editFieldDef_t ) ); +      memset( item->typeData.edit, 0, sizeof( editFieldDef_t ) ); + +      if( item->type == ITEM_TYPE_EDITFIELD ) +        item->typeData.edit->maxPaintChars = MAX_EDITFIELD; +      break; + +    case ITEM_TYPE_MULTI: +      item->typeData.multi = UI_Alloc( sizeof( multiDef_t ) ); +      memset( item->typeData.multi, 0, sizeof( multiDef_t ) ); +      break; + +    case ITEM_TYPE_MODEL: +      item->typeData.model = UI_Alloc( sizeof( modelDef_t ) ); +      memset( item->typeData.model, 0, sizeof( modelDef_t ) );    } -  else if( item->type == ITEM_TYPE_MULTI ) -    item->typeData = UI_Alloc( sizeof( multiDef_t ) ); -  else if( item->type == ITEM_TYPE_MODEL ) -    item->typeData = UI_Alloc( sizeof( modelDef_t ) );  }  /* @@ -6671,15 +6657,13 @@ qboolean ItemParse_group( itemDef_t *item, int handle )  qboolean ItemParse_asset_model( itemDef_t *item, int handle )  {    const char *temp; -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData;    if( !PC_String_Parse( handle, &temp ) )      return qfalse;    item->asset = DC->registerModel( temp ); -  modelPtr->angle = rand() % 360; +  item->typeData.model->angle = rand() % 360;    return qtrue;  } @@ -6698,72 +6682,43 @@ qboolean ItemParse_asset_shader( itemDef_t *item, int handle )  // model_origin <number> <number> <number>  qboolean ItemParse_model_origin( itemDef_t *item, int handle )  { -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData; -  if( PC_Float_Parse( handle, &modelPtr->origin[0] ) ) -  { -    if( PC_Float_Parse( handle, &modelPtr->origin[1] ) ) -    { -      if( PC_Float_Parse( handle, &modelPtr->origin[2] ) ) -        return qtrue; -    } -  } - -  return qfalse; +  return ( PC_Float_Parse( handle, &item->typeData.model->origin[0] ) && +           PC_Float_Parse( handle, &item->typeData.model->origin[1] ) && +           PC_Float_Parse( handle, &item->typeData.model->origin[2] ) );  }  // model_fovx <number>  qboolean ItemParse_model_fovx( itemDef_t *item, int handle )  { -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData; - -  if( !PC_Float_Parse( handle, &modelPtr->fov_x ) ) -    return qfalse; -  return qtrue; +  return PC_Float_Parse( handle, &item->typeData.model->fov_x );  }  // model_fovy <number>  qboolean ItemParse_model_fovy( itemDef_t *item, int handle )  { -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData; - -  if( !PC_Float_Parse( handle, &modelPtr->fov_y ) ) -    return qfalse; -  return qtrue; +  return PC_Float_Parse( handle, &item->typeData.model->fov_y );  }  // model_rotation <integer>  qboolean ItemParse_model_rotation( itemDef_t *item, int handle )  { -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData; - -  if( !PC_Int_Parse( handle, &modelPtr->rotationSpeed ) ) -    return qfalse; -  return qtrue; +  return PC_Int_Parse( handle, &item->typeData.model->rotationSpeed );  }  // model_angle <integer>  qboolean ItemParse_model_angle( itemDef_t *item, int handle )  { -  modelDef_t *modelPtr;    Item_ValidateTypeData( item ); -  modelPtr = ( modelDef_t* )item->typeData; -  if( !PC_Int_Parse( handle, &modelPtr->angle ) ) -    return qfalse; - -  return qtrue; +  return PC_Int_Parse( handle, &item->typeData.model->angle );  }  // rect <rectangle> @@ -6805,7 +6760,7 @@ qboolean ItemParse_notselectable( itemDef_t *item, int handle )  {    listBoxDef_t *listPtr;    Item_ValidateTypeData( item ); -  listPtr = ( listBoxDef_t* )item->typeData; +  listPtr = item->typeData.list;    if( item->type == ITEM_TYPE_LISTBOX && listPtr )      listPtr->notselectable = qtrue; @@ -6818,7 +6773,7 @@ qboolean ItemParse_noscrollbar( itemDef_t *item, int handle )  {    listBoxDef_t *listPtr;    Item_ValidateTypeData( item ); -  listPtr = ( listBoxDef_t* )item->typeData; +  listPtr = item->typeData.list;    if( item->type == ITEM_TYPE_LISTBOX && listPtr )      listPtr->noscrollbar = qtrue; @@ -6855,30 +6810,18 @@ qboolean ItemParse_type( itemDef_t *item, int handle )  // uses textalignx for storage  qboolean ItemParse_elementwidth( itemDef_t *item, int handle )  { -  listBoxDef_t *listPtr; -    Item_ValidateTypeData( item ); -  listPtr = ( listBoxDef_t* )item->typeData; - -  if( !PC_Float_Parse( handle, &listPtr->elementWidth ) ) -    return qfalse; -  return qtrue; +  return PC_Float_Parse( handle, &item->typeData.list->elementWidth );  }  // elementheight, used for listbox image elements  // uses textaligny for storage  qboolean ItemParse_elementheight( itemDef_t *item, int handle )  { -  listBoxDef_t *listPtr; -    Item_ValidateTypeData( item ); -  listPtr = ( listBoxDef_t* )item->typeData; - -  if( !PC_Float_Parse( handle, &listPtr->elementHeight ) ) -    return qfalse; -  return qtrue; +  return PC_Float_Parse( handle, &item->typeData.list->elementHeight );  }  // feeder <float> @@ -6894,59 +6837,39 @@ qboolean ItemParse_feeder( itemDef_t *item, int handle )  // uses textstyle for storage  qboolean ItemParse_elementtype( itemDef_t *item, int handle )  { -  listBoxDef_t *listPtr; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) -    return qfalse; - -  listPtr = ( listBoxDef_t* )item->typeData; - -  if( !PC_Int_Parse( handle, &listPtr->elementStyle ) ) -    return qfalse; - -  return qtrue; +  return ( item->typeData.list && +           PC_Int_Parse( handle, &item->typeData.list->elementStyle ) );  }  // columns sets a number of columns and an x pos and width per..  qboolean ItemParse_columns( itemDef_t *item, int handle )  { -  int num, i; -  listBoxDef_t *listPtr; +  int i;    Item_ValidateTypeData( item ); -  if( !item->typeData ) +  if( !item->typeData.list || +      !PC_Int_Parse( handle, &item->typeData.list->numColumns ) )      return qfalse; -  listPtr = ( listBoxDef_t* )item->typeData; +  if( item->typeData.list->numColumns > MAX_LB_COLUMNS ) +    item->typeData.list->numColumns = MAX_LB_COLUMNS; -  if( PC_Int_Parse( handle, &num ) ) +  for( i = 0; i < item->typeData.list->numColumns; i++ )    { -    if( num > MAX_LB_COLUMNS ) -      num = MAX_LB_COLUMNS; - -    listPtr->numColumns = num; +    int pos, width, align; -    for( i = 0; i < num; i++ ) -    { -      int pos, width, align; +    if( !PC_Int_Parse( handle, &pos ) || +        !PC_Int_Parse( handle, &width ) || +        !PC_Int_Parse( handle, &align ) ) +      return qfalse; -      if( PC_Int_Parse( handle, &pos ) && -          PC_Int_Parse( handle, &width ) && -          PC_Int_Parse( handle, &align ) ) -      { -        listPtr->columnInfo[i].pos = pos; -        listPtr->columnInfo[i].width = width; -        listPtr->columnInfo[i].align = align; -      } -      else -        return qfalse; -    } +    item->typeData.list->columnInfo[i].pos = pos; +    item->typeData.list->columnInfo[i].width = width; +    item->typeData.list->columnInfo[i].align = align;    } -  else -    return qfalse;    return qtrue;  } @@ -7123,19 +7046,10 @@ qboolean ItemParse_cinematic( itemDef_t *item, int handle )  qboolean ItemParse_doubleClick( itemDef_t *item, int handle )  { -  listBoxDef_t *listPtr; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) -    return qfalse; - -  listPtr = ( listBoxDef_t* )item->typeData; - -  if( !PC_Script_Parse( handle, &listPtr->doubleClick ) ) -    return qfalse; - -  return qtrue; +  return ( item->typeData.list && +           PC_Script_Parse( handle, &item->typeData.list->doubleClick ) );  }  qboolean ItemParse_onFocus( itemDef_t *item, int handle ) @@ -7220,19 +7134,16 @@ qboolean ItemParse_cvarTest( itemDef_t *item, int handle )  qboolean ItemParse_cvar( itemDef_t *item, int handle )  { -  editFieldDef_t *editPtr; -    Item_ValidateTypeData( item );    if( !PC_String_Parse( handle, &item->cvar ) )      return qfalse; -  if( item->typeData ) +  if( item->typeData.edit )    { -    editPtr = ( editFieldDef_t* )item->typeData; -    editPtr->minVal = -1; -    editPtr->maxVal = -1; -    editPtr->defVal = -1; +    item->typeData.edit->minVal = -1; +    item->typeData.edit->maxVal = -1; +    item->typeData.edit->defVal = -1;    }    return qtrue; @@ -7240,59 +7151,30 @@ qboolean ItemParse_cvar( itemDef_t *item, int handle )  qboolean ItemParse_maxChars( itemDef_t *item, int handle )  { -  editFieldDef_t *editPtr; -  int maxChars; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) -    return qfalse; - -  if( !PC_Int_Parse( handle, &maxChars ) ) -    return qfalse; - -  editPtr = ( editFieldDef_t* )item->typeData; -  editPtr->maxChars = maxChars; -  return qtrue; +  return ( item->typeData.edit && +           PC_Int_Parse( handle, &item->typeData.edit->maxChars ) );  }  qboolean ItemParse_maxPaintChars( itemDef_t *item, int handle )  { -  editFieldDef_t *editPtr; -  int maxChars; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) -    return qfalse; - -  if( !PC_Int_Parse( handle, &maxChars ) ) -    return qfalse; - -  editPtr = ( editFieldDef_t* )item->typeData; -  editPtr->maxPaintChars = maxChars; -  return qtrue; +  return ( item->typeData.edit && +           PC_Int_Parse( handle, &item->typeData.edit->maxPaintChars ) );  }  qboolean ItemParse_maxFieldWidth( itemDef_t *item, int handle )  { -  editFieldDef_t *editPtr; -  int maxFieldWidth; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) +  if( !item->typeData.edit || +      !PC_Int_Parse( handle, &item->typeData.edit->maxFieldWidth ) )      return qfalse; -  if( !PC_Int_Parse( handle, &maxFieldWidth ) ) -    return qfalse; - -  editPtr = ( editFieldDef_t* )item->typeData; - -  if( maxFieldWidth < MIN_FIELD_WIDTH ) -    editPtr->maxFieldWidth = MIN_FIELD_WIDTH; -  else -    editPtr->maxFieldWidth = maxFieldWidth; +  if( item->typeData.edit->maxFieldWidth < MIN_FIELD_WIDTH ) +    item->typeData.edit->maxFieldWidth = MIN_FIELD_WIDTH;    return qtrue;  } @@ -7301,22 +7183,13 @@ qboolean ItemParse_maxFieldWidth( itemDef_t *item, int handle )  qboolean ItemParse_cvarFloat( itemDef_t *item, int handle )  { -  editFieldDef_t *editPtr; -    Item_ValidateTypeData( item ); -  if( !item->typeData ) -    return qfalse; - -  editPtr = ( editFieldDef_t* )item->typeData; - -  if( PC_String_Parse( handle, &item->cvar ) && -      PC_Float_Parse( handle, &editPtr->defVal ) && -      PC_Float_Parse( handle, &editPtr->minVal ) && -      PC_Float_Parse( handle, &editPtr->maxVal ) ) -    return qtrue; - -  return qfalse; +  return ( item->typeData.edit && +           PC_String_Parse( handle, &item->cvar ) && +           PC_Float_Parse( handle, &item->typeData.edit->defVal ) && +           PC_Float_Parse( handle, &item->typeData.edit->minVal ) && +           PC_Float_Parse( handle, &item->typeData.edit->maxVal ) );  }  qboolean ItemParse_cvarStrList( itemDef_t *item, int handle ) @@ -7327,13 +7200,11 @@ qboolean ItemParse_cvarStrList( itemDef_t *item, int handle )    Item_ValidateTypeData( item ); -  if( !item->typeData ) +  if( !item->typeData.multi )      return qfalse; -  multiPtr = ( multiDef_t* )item->typeData; - +  multiPtr = item->typeData.multi;    multiPtr->count = 0; -    multiPtr->strDef = qtrue;    if( !trap_Parse_ReadToken( handle, &token ) ) @@ -7385,13 +7256,11 @@ qboolean ItemParse_cvarFloatList( itemDef_t *item, int handle )    Item_ValidateTypeData( item ); -  if( !item->typeData ) +  if( !item->typeData.multi )      return qfalse; -  multiPtr = ( multiDef_t* )item->typeData; - +  multiPtr = item->typeData.multi;    multiPtr->count = 0; -    multiPtr->strDef = qfalse;    if( !trap_Parse_ReadToken( handle, &token ) ) @@ -7650,15 +7519,14 @@ void Item_InitControls( itemDef_t *item )    if( item->type == ITEM_TYPE_LISTBOX )    { -    listBoxDef_t *listPtr = ( listBoxDef_t* )item->typeData;      item->cursorPos = 0; -    if( listPtr ) +    if( item->typeData.list )      { -      listPtr->cursorPos = 0; -      listPtr->startPos = 0; -      listPtr->endPos = 0; -      listPtr->cursorPos = 0; +      item->typeData.list->cursorPos = 0; +      item->typeData.list->startPos = 0; +      item->typeData.list->endPos = 0; +      item->typeData.list->cursorPos = 0;      }    }  } diff --git a/src/ui/ui_shared.h b/src/ui/ui_shared.h index 48bf78cd..c42dd241 100644 --- a/src/ui/ui_shared.h +++ b/src/ui/ui_shared.h @@ -282,7 +282,15 @@ typedef struct itemDef_s    colorRangeDef_t colorRanges[MAX_COLOR_RANGES];    float special;                 // used for feeder id's etc.. diff per type    int cursorPos;                 // cursor position in characters -  void *typeData;                 // type specific data ptr's +  union +  { +    void           *data; +    listBoxDef_t   *list; +    editFieldDef_t *edit; +    multiDef_t     *multi; +    comboBoxDef_t  *combo; +    modelDef_t     *model; +  } typeData;                    // type specific data pointers  }  itemDef_t;  | 
