forked from valve/halflife-sdk
319 lines
6.2 KiB
C++
319 lines
6.2 KiB
C++
//========= Copyright © 1996-2001, Valve LLC, All rights reserved. ============
|
|
//
|
|
// Purpose:
|
|
//
|
|
// $NoKeywords: $
|
|
//=============================================================================
|
|
|
|
#ifndef SCOREPANEL_H
|
|
#define SCOREPANEL_H
|
|
|
|
#include<VGUI_Panel.h>
|
|
#include<VGUI_TablePanel.h>
|
|
#include<VGUI_HeaderPanel.h>
|
|
#include<VGUI_TextGrid.h>
|
|
#include<VGUI_Label.h>
|
|
#include<VGUI_TextImage.h>
|
|
#include "..\game_shared\vgui_listbox.h"
|
|
|
|
#include <ctype.h>
|
|
|
|
#define MAX_SCORES 10
|
|
#define MAX_SCOREBOARD_TEAMS 5
|
|
|
|
// Scoreboard cells
|
|
#define COLUMN_TRACKER 0
|
|
#define COLUMN_NAME 1
|
|
#define COLUMN_KILLS 2
|
|
#define COLUMN_DEATHS 3
|
|
#define COLUMN_LATENCY 4
|
|
#define COLUMN_VOICE 5
|
|
#define COLUMN_BLANK 6
|
|
#define NUM_COLUMNS 7
|
|
#define NUM_ROWS (MAX_PLAYERS + (MAX_SCOREBOARD_TEAMS * 2))
|
|
|
|
using namespace vgui;
|
|
|
|
class CTextImage2 : public Image
|
|
{
|
|
public:
|
|
CTextImage2()
|
|
{
|
|
_image[0] = new TextImage("");
|
|
_image[1] = new TextImage("");
|
|
}
|
|
|
|
~CTextImage2()
|
|
{
|
|
delete _image[0];
|
|
delete _image[1];
|
|
}
|
|
|
|
TextImage *GetImage(int image)
|
|
{
|
|
return _image[image];
|
|
}
|
|
|
|
void getSize(int &wide, int &tall)
|
|
{
|
|
int w1, w2, t1, t2;
|
|
_image[0]->getTextSize(w1, t1);
|
|
_image[1]->getTextSize(w2, t2);
|
|
|
|
wide = w1 + w2;
|
|
tall = max(t1, t2);
|
|
setSize(wide, tall);
|
|
}
|
|
|
|
void doPaint(Panel *panel)
|
|
{
|
|
_image[0]->doPaint(panel);
|
|
_image[1]->doPaint(panel);
|
|
}
|
|
|
|
void setPos(int x, int y)
|
|
{
|
|
_image[0]->setPos(x, y);
|
|
|
|
int swide, stall;
|
|
_image[0]->getSize(swide, stall);
|
|
|
|
int wide, tall;
|
|
_image[1]->getSize(wide, tall);
|
|
_image[1]->setPos(x + wide, y + (stall * 0.9) - tall);
|
|
}
|
|
|
|
void setColor(Color color)
|
|
{
|
|
_image[0]->setColor(color);
|
|
}
|
|
|
|
void setColor2(Color color)
|
|
{
|
|
_image[1]->setColor(color);
|
|
}
|
|
|
|
private:
|
|
TextImage *_image[2];
|
|
|
|
};
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Custom label for cells in the Scoreboard's Table Header
|
|
//-----------------------------------------------------------------------------
|
|
class CLabelHeader : public Label
|
|
{
|
|
public:
|
|
CLabelHeader() : Label("")
|
|
{
|
|
_dualImage = new CTextImage2();
|
|
_dualImage->setColor2(Color(255, 170, 0, 0));
|
|
_row = -2;
|
|
_useFgColorAsImageColor = true;
|
|
_offset[0] = 0;
|
|
_offset[1] = 0;
|
|
}
|
|
|
|
~CLabelHeader()
|
|
{
|
|
delete _dualImage;
|
|
}
|
|
|
|
void setRow(int row)
|
|
{
|
|
_row = row;
|
|
}
|
|
|
|
void setFgColorAsImageColor(bool state)
|
|
{
|
|
_useFgColorAsImageColor = state;
|
|
}
|
|
|
|
virtual void setText(int textBufferLen, const char* text)
|
|
{
|
|
_dualImage->GetImage(0)->setText(text);
|
|
|
|
// calculate the text size
|
|
Font *font = _dualImage->GetImage(0)->getFont();
|
|
_gap = 0;
|
|
for (const char *ch = text; *ch != 0; ch++)
|
|
{
|
|
int a, b, c;
|
|
font->getCharABCwide(*ch, a, b, c);
|
|
_gap += (a + b + c);
|
|
}
|
|
|
|
_gap += XRES(5);
|
|
}
|
|
|
|
virtual void setText(const char* text)
|
|
{
|
|
// strip any non-alnum characters from the end
|
|
char buf[512];
|
|
strcpy(buf, text);
|
|
|
|
int len = strlen(buf);
|
|
while (len && isspace(buf[--len]))
|
|
{
|
|
buf[len] = 0;
|
|
}
|
|
|
|
CLabelHeader::setText(0, buf);
|
|
}
|
|
|
|
void setText2(const char *text)
|
|
{
|
|
_dualImage->GetImage(1)->setText(text);
|
|
}
|
|
|
|
void getTextSize(int &wide, int &tall)
|
|
{
|
|
_dualImage->getSize(wide, tall);
|
|
}
|
|
|
|
void setFgColor(int r,int g,int b,int a)
|
|
{
|
|
Label::setFgColor(r,g,b,a);
|
|
Color color(r,g,b,a);
|
|
_dualImage->setColor(color);
|
|
_dualImage->setColor2(color);
|
|
if (_image && _useFgColorAsImageColor)
|
|
{
|
|
_image->setColor(color);
|
|
}
|
|
repaint();
|
|
}
|
|
|
|
void setFgColor(Scheme::SchemeColor sc)
|
|
{
|
|
Label::setFgColor(sc);
|
|
_dualImage->setColor(sc);
|
|
}
|
|
|
|
void setFont(Font *font)
|
|
{
|
|
_dualImage->GetImage(0)->setFont(font);
|
|
}
|
|
|
|
void setFont2(Font *font)
|
|
{
|
|
_dualImage->GetImage(1)->setFont(font);
|
|
}
|
|
|
|
// this adjust the absolute position of the text after alignment is calculated
|
|
void setTextOffset(int x, int y)
|
|
{
|
|
_offset[0] = x;
|
|
_offset[1] = y;
|
|
}
|
|
|
|
void paint();
|
|
void paintBackground();
|
|
void calcAlignment(int iwide, int itall, int &x, int &y);
|
|
|
|
private:
|
|
CTextImage2 *_dualImage;
|
|
int _row;
|
|
int _gap;
|
|
int _offset[2];
|
|
bool _useFgColorAsImageColor;
|
|
};
|
|
|
|
class ScoreTablePanel;
|
|
|
|
#include "..\game_shared\vgui_grid.h"
|
|
#include "..\game_shared\vgui_defaultinputsignal.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: Scoreboard back panel
|
|
//-----------------------------------------------------------------------------
|
|
class ScorePanel : public Panel, public vgui::CDefaultInputSignal
|
|
{
|
|
private:
|
|
// Default panel implementation doesn't forward mouse messages when there is no cursor and we need them.
|
|
class HitTestPanel : public Panel
|
|
{
|
|
public:
|
|
virtual void internalMousePressed(MouseCode code);
|
|
};
|
|
|
|
|
|
private:
|
|
|
|
Label m_TitleLabel;
|
|
|
|
// Here is how these controls are arranged hierarchically.
|
|
// m_HeaderGrid
|
|
// m_HeaderLabels
|
|
|
|
// m_PlayerGridScroll
|
|
// m_PlayerGrid
|
|
// m_PlayerEntries
|
|
|
|
CGrid m_HeaderGrid;
|
|
CLabelHeader m_HeaderLabels[NUM_COLUMNS]; // Labels above the
|
|
CLabelHeader *m_pCurrentHighlightLabel;
|
|
int m_iHighlightRow;
|
|
|
|
vgui::CListBox m_PlayerList;
|
|
CGrid m_PlayerGrids[NUM_ROWS]; // The grid with player and team info.
|
|
CLabelHeader m_PlayerEntries[NUM_COLUMNS][NUM_ROWS]; // Labels for the grid entries.
|
|
// WastesBitmapTGA *m_pBackground;
|
|
Label *m_pBackgroundLabel;
|
|
|
|
ScorePanel::HitTestPanel m_HitTestPanel;
|
|
|
|
CLabelHeader* GetPlayerEntry(int x, int y) {return &m_PlayerEntries[x][y];}
|
|
|
|
public:
|
|
|
|
int m_iNumTeams;
|
|
int m_iPlayerNum;
|
|
int m_iShowscoresHeld;
|
|
|
|
int m_iRows;
|
|
int m_iSortedRows[NUM_ROWS];
|
|
int m_iIsATeam[NUM_ROWS];
|
|
bool m_bHasBeenSorted[MAX_PLAYERS];
|
|
int m_iLastKilledBy;
|
|
int m_fLastKillTime;
|
|
|
|
public:
|
|
|
|
ScorePanel(int x,int y,int wide,int tall);
|
|
~ScorePanel()
|
|
{
|
|
// if(m_pBackground != NULL)
|
|
// delete m_pBackground;
|
|
// if(m_pBackgroundLabel != NULL)
|
|
// delete m_pBackgroundLabel;
|
|
|
|
Panel::~Panel();
|
|
}
|
|
|
|
void Update( void );
|
|
|
|
void SortTeams( void );
|
|
void SortPlayers( int iTeam, char *team );
|
|
void RebuildTeams( void );
|
|
|
|
void FillGrid();
|
|
|
|
void DeathMsg( int killer, int victim );
|
|
|
|
void Initialize( void );
|
|
|
|
void Open( void );
|
|
|
|
void MouseOverCell(int row, int col);
|
|
|
|
// InputSignal overrides.
|
|
public:
|
|
|
|
virtual void mousePressed(MouseCode code, Panel* panel);
|
|
virtual void cursorMoved(int x, int y, Panel *panel);
|
|
|
|
friend CLabelHeader;
|
|
};
|
|
|
|
#endif
|