//----------------------------------------------------------------------------- // Purpose: Render each of the cells in the Table //----------------------------------------------------------------------------- Panel* ScoreTablePanel::getCellRenderer(int column,int row,bool columnSelected,bool rowSelected,bool cellSelected) { char sz[128]; hud_player_info_t *pl_info = NULL; team_info_t *team_info = NULL; if ( m_iIsATeam[row] == TEAM_YES ) { // Get the team's data team_info = &g_TeamInfo[ m_iSortedRows[row] ]; // White text for team names m_pLabel->setFgColor(Scheme::sc_white); // Set background color m_pLabel->setBgColor( ScoreColorsBG[ team_info->teamnumber ][0], ScoreColorsBG[ team_info->teamnumber ][1], ScoreColorsBG[ team_info->teamnumber ][2], 128 ); } else if ( m_iIsATeam[row] == TEAM_UNASSIGNED || m_iIsATeam[row] == TEAM_SPECTATORS ) { // White text for team names m_pLabel->setFgColor(Scheme::sc_white); // Set background color m_pLabel->setBgColor( 0,0,0, 255 ); } else { // Grey text for player names m_pLabel->setFgColor( ScoreColorsFG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][0], ScoreColorsFG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][1], ScoreColorsFG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][2], 128 ); // Get the player's data pl_info = &g_PlayerInfoList[ m_iSortedRows[row] ]; // Set background color if ( pl_info->thisplayer ) // if it is their name, draw it a different color { // Highlight this player m_pLabel->setFgColor(Scheme::sc_white); m_pLabel->setBgColor( ScoreColorsBG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][0], ScoreColorsBG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][1], ScoreColorsBG[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ][2], 196 ); } else if ( m_iSortedRows[row] == m_iLastKilledBy && m_fLastKillTime && m_fLastKillTime > gHUD.m_flTime ) { // Killer's name m_pLabel->setBgColor( 255,0,0, 255 - ((float)15 * (float)(m_fLastKillTime - gHUD.m_flTime)) ); } else { m_pLabel->setBgColor( 0,0,0, 255 ); } } // Align if (column <= 1) { if ( m_iIsATeam[row] ) m_pLabel->setContentAlignment( vgui::Label::a_southwest ); else m_pLabel->setContentAlignment( vgui::Label::a_west ); } else { if ( m_iIsATeam[row] ) m_pLabel->setContentAlignment( vgui::Label::a_south ); else m_pLabel->setContentAlignment( vgui::Label::a_center ); } // Fill out with the correct data if ( m_iIsATeam[row] ) { int i; char sz2[128]; strcpy(sz, ""); switch (column) { case 0: if ( m_iIsATeam[row] == TEAM_UNASSIGNED ) { sprintf( sz2, CHudTextMessage::BufferedLocaliseTextString( "#Unassigned" ) ); } else if ( m_iIsATeam[row] == TEAM_SPECTATORS ) { sprintf( sz2, CHudTextMessage::BufferedLocaliseTextString( "#Spectators" ) ); } else { sprintf( sz2, CHudTextMessage::BufferedLocaliseTextString( team_info->name ) ); } // Uppercase it for (i = 0; i < (int)strlen(sz2); i++) { if ( *(sz2 + i) ) sz[i] = toupper( *(sz2 + i) ); } sz[i] = '\0'; // Append the number of players if ( m_iIsATeam[row] == TEAM_YES ) { if (team_info->players == 1) sprintf(sz, "%s (1 player)", sz ); else sprintf(sz, "%s (%d players)", sz, team_info->players ); } break; case 1: // No class for teams break; case 2: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->frags ); break; case 3: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->deaths ); break; case 4: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->ping ); break; default: break; } m_pLabel->setText(sz); } else { bool bShowClass = false; switch (column) { case 0: sprintf(sz, " %s", pl_info->name); break; case 1: // No class for other team's members (unless allied or spectator) if ( gViewPort && EV_TFC_IsAllyTeam( g_iTeamNumber, g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ) ) bShowClass = true; // Don't show classes if this client hasnt picked a team yet if ( g_iTeamNumber == 0 ) bShowClass = false; if ( g_iUser1 ) bShowClass = true; if (bShowClass) { // Only print Civilian if this team are all civilians bool bNoClass = false; if ( g_PlayerExtraInfo[ m_iSortedRows[row] ].playerclass == 0 ) { if ( gViewPort->GetValidClasses( g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ) != -1 ) bNoClass = true; } if (bNoClass) sprintf(sz, ""); else sprintf( sz, "%s", CHudTextMessage::BufferedLocaliseTextString( sLocalisedClasses[ g_PlayerExtraInfo[ m_iSortedRows[row] ].playerclass ] ) ); } else { strcpy(sz, ""); } break; case 2: sprintf(sz, "%d", g_PlayerExtraInfo[ m_iSortedRows[row] ].frags ); break; case 3: sprintf(sz, "%d", g_PlayerExtraInfo[ m_iSortedRows[row] ].deaths ); break; case 4: sprintf(sz, "%d", g_PlayerInfoList[ m_iSortedRows[row] ].ping ); break; default: strcpy(sz, ""); } m_pLabel->setText(sz); } return m_pLabel; }
void ScorePanel::FillGrid() { CSchemeManager *pSchemes = gViewPort->GetSchemeManager(); SchemeHandle_t hScheme = pSchemes->getSchemeHandle("Scoreboard Text"); SchemeHandle_t hTitleScheme = pSchemes->getSchemeHandle("Scoreboard Title Text"); SchemeHandle_t hSmallScheme = pSchemes->getSchemeHandle("Scoreboard Small Text"); Font *sfont = pSchemes->getFont(hScheme); Font *tfont = pSchemes->getFont(hTitleScheme); Font *smallfont = pSchemes->getFont(hSmallScheme); // update highlight position int x, y; getApp()->getCursorPos(x, y); cursorMoved(x, y, this); // remove highlight row if we're not in squelch mode if (!GetClientVoiceMgr()->IsInSquelchMode()) { m_iHighlightRow = -1; } bool bNextRowIsGap = false; for(int row=0; row < NUM_ROWS; row++) { CGrid *pGridRow = &m_PlayerGrids[row]; pGridRow->SetRowUnderline(0, false, 0, 0, 0, 0, 0); if(row >= m_iRows) { for(int col=0; col < NUM_COLUMNS; col++) m_PlayerEntries[col][row].setVisible(false); continue; } bool bRowIsGap = false; if (bNextRowIsGap) { bNextRowIsGap = false; bRowIsGap = true; } for(int col=0; col < NUM_COLUMNS; col++) { CLabelHeader *pLabel = &m_PlayerEntries[col][row]; pLabel->setVisible(true); pLabel->setText2(""); pLabel->setImage(NULL); pLabel->setFont(sfont); pLabel->setTextOffset(0, 0); int rowheight = 13; if (ScreenHeight > 480) { rowheight = YRES(rowheight); } else { // more tweaking, make sure icons fit at low res rowheight = 15; } pLabel->setSize(pLabel->getWide(), rowheight); pLabel->setBgColor(0, 0, 0, 255); char sz[128]; hud_player_info_t *pl_info = NULL; team_info_t *team_info = NULL; if (m_iIsATeam[row] == TEAM_BLANK) { pLabel->setText(" "); continue; } else if ( m_iIsATeam[row] == TEAM_YES ) { // Get the team's data team_info = &g_TeamInfo[ m_iSortedRows[row] ]; // team color text for team names pLabel->setFgColor( iTeamColors[team_info->teamnumber % iNumberOfTeamColors][0], iTeamColors[team_info->teamnumber % iNumberOfTeamColors][1], iTeamColors[team_info->teamnumber % iNumberOfTeamColors][2], 0 ); // different height for team header rows rowheight = 20; if (ScreenHeight >= 480) { rowheight = YRES(rowheight); } pLabel->setSize(pLabel->getWide(), rowheight); pLabel->setFont(tfont); pGridRow->SetRowUnderline( 0, true, YRES(3), iTeamColors[team_info->teamnumber % iNumberOfTeamColors][0], iTeamColors[team_info->teamnumber % iNumberOfTeamColors][1], iTeamColors[team_info->teamnumber % iNumberOfTeamColors][2], 0 ); } else if ( m_iIsATeam[row] == TEAM_SPECTATORS ) { // grey text for spectators pLabel->setFgColor(100, 100, 100, 0); // different height for team header rows rowheight = 20; if (ScreenHeight >= 480) { rowheight = YRES(rowheight); } pLabel->setSize(pLabel->getWide(), rowheight); pLabel->setFont(tfont); pGridRow->SetRowUnderline(0, true, YRES(3), 100, 100, 100, 0); } else { // team color text for player names pLabel->setFgColor( iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][0], iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][1], iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][2], 0 ); // Get the player's data pl_info = &g_PlayerInfoList[ m_iSortedRows[row] ]; // Set background color if ( pl_info->thisplayer ) // if it is their name, draw it a different color { // Highlight this player pLabel->setFgColor(Scheme::sc_white); pLabel->setBgColor( iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][0], iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][1], iTeamColors[ g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber % iNumberOfTeamColors ][2], 196 ); } else if ( m_iSortedRows[row] == m_iLastKilledBy && m_fLastKillTime && m_fLastKillTime > gHUD.m_flTime ) { // Killer's name pLabel->setBgColor( 255,0,0, 255 - ((float)15 * (float)(m_fLastKillTime - gHUD.m_flTime)) ); } } // Align if (col == COLUMN_NAME || col == COLUMN_CLASS) { pLabel->setContentAlignment( vgui::Label::a_west ); } else if (col == COLUMN_TRACKER) { pLabel->setContentAlignment( vgui::Label::a_center ); } else { pLabel->setContentAlignment( vgui::Label::a_east ); } // Fill out with the correct data strcpy(sz, ""); if ( m_iIsATeam[row] ) { char sz2[128]; switch (col) { case COLUMN_NAME: if ( m_iIsATeam[row] == TEAM_SPECTATORS ) { sprintf( sz2, CHudTextMessage::BufferedLocaliseTextString( "#Spectators" ) ); } else { sprintf( sz2, gViewPort->GetTeamName(team_info->teamnumber) ); } strcpy(sz, sz2); // Append the number of players if ( m_iIsATeam[row] == TEAM_YES ) { if (team_info->players == 1) { sprintf(sz2, "(%d %s)", team_info->players, CHudTextMessage::BufferedLocaliseTextString( "#Player" ) ); } else { sprintf(sz2, "(%d %s)", team_info->players, CHudTextMessage::BufferedLocaliseTextString( "#Player_plural" ) ); } pLabel->setText2(sz2); pLabel->setFont2(smallfont); } break; case COLUMN_VOICE: break; case COLUMN_CLASS: break; case COLUMN_KILLS: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->frags ); break; case COLUMN_DEATHS: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->deaths ); break; case COLUMN_LATENCY: if ( m_iIsATeam[row] == TEAM_YES ) sprintf(sz, "%d", team_info->ping ); break; default: break; } } else { bool bShowClass = false; switch (col) { case COLUMN_NAME: sprintf(sz, "%s ", pl_info->name); break; case COLUMN_VOICE: sz[0] = 0; // in HLTV mode allow spectator to turn on/off commentator voice if (!pl_info->thisplayer || gEngfuncs.IsSpectateOnly() ) { GetClientVoiceMgr()->UpdateSpeakerImage(pLabel, m_iSortedRows[row]); } break; case COLUMN_CLASS: // No class for other team's members (unless allied or spectator) if ( gViewPort && EV_TFC_IsAllyTeam( g_iTeamNumber, g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ) ) bShowClass = true; // Don't show classes if this client hasnt picked a team yet if ( g_iTeamNumber == 0 ) bShowClass = false; if (bShowClass) { // Only print Civilian if this team are all civilians bool bNoClass = false; if ( g_PlayerExtraInfo[ m_iSortedRows[row] ].playerclass == 0 ) { if ( gViewPort->GetValidClasses( g_PlayerExtraInfo[ m_iSortedRows[row] ].teamnumber ) != -1 ) bNoClass = true; } if (bNoClass) sprintf(sz, ""); else sprintf( sz, "%s", CHudTextMessage::BufferedLocaliseTextString( sLocalisedClasses[ g_PlayerExtraInfo[ m_iSortedRows[row] ].playerclass ] ) ); } else { strcpy(sz, ""); } break; case COLUMN_TRACKER: break; case COLUMN_KILLS: sprintf(sz, "%d", g_PlayerExtraInfo[ m_iSortedRows[row] ].frags ); break; case COLUMN_DEATHS: sprintf(sz, "%d", g_PlayerExtraInfo[ m_iSortedRows[row] ].deaths ); break; case COLUMN_LATENCY: sprintf(sz, "%d", g_PlayerInfoList[ m_iSortedRows[row] ].ping ); break; default: break; } } pLabel->setText(sz); } } for(row=0; row < NUM_ROWS; row++) { CGrid *pGridRow = &m_PlayerGrids[row]; pGridRow->AutoSetRowHeights(); pGridRow->setSize(PanelWidth(pGridRow), pGridRow->CalcDrawHeight()); pGridRow->RepositionContents(); } // hack, for the thing to resize m_PlayerList.getSize(x, y); m_PlayerList.setSize(x, y); }