mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-03 05:49:41 +03:00
1
This commit is contained in:
270
vgui2/src/Border.cpp
Normal file
270
vgui2/src/Border.cpp
Normal file
@@ -0,0 +1,270 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
// Purpose:
|
||||
//
|
||||
// $NoKeywords: $
|
||||
//=============================================================================//
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "vgui/IPanel.h"
|
||||
#include "vgui/IScheme.h"
|
||||
#include "vgui/ISurface.h"
|
||||
|
||||
#include "VGUI_Border.h"
|
||||
#include "vgui_internal.h"
|
||||
#include "VPanel.h"
|
||||
#include "KeyValues.h"
|
||||
|
||||
// memdbgon must be the last include file in a .cpp file!!!
|
||||
#include "tier0/memdbgon.h"
|
||||
|
||||
using namespace vgui;
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Constructor
|
||||
//-----------------------------------------------------------------------------
|
||||
Border::Border()
|
||||
{
|
||||
_inset[0]=0;
|
||||
_inset[1]=0;
|
||||
_inset[2]=0;
|
||||
_inset[3]=0;
|
||||
_name = NULL;
|
||||
m_eBackgroundType = IBorder::BACKGROUND_FILLED;
|
||||
|
||||
memset(_sides, 0, sizeof(_sides));
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Destructor
|
||||
//-----------------------------------------------------------------------------
|
||||
Border::~Border()
|
||||
{
|
||||
delete [] _name;
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
delete [] _sides[i].lines;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::SetInset(int left,int top,int right,int bottom)
|
||||
{
|
||||
_inset[SIDE_LEFT] = left;
|
||||
_inset[SIDE_TOP] = top;
|
||||
_inset[SIDE_RIGHT] = right;
|
||||
_inset[SIDE_BOTTOM] = bottom;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::GetInset(int& left,int& top,int& right,int& bottom)
|
||||
{
|
||||
left = _inset[SIDE_LEFT];
|
||||
top = _inset[SIDE_TOP];
|
||||
right = _inset[SIDE_RIGHT];
|
||||
bottom = _inset[SIDE_BOTTOM];
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::Paint(int x, int y, int wide, int tall)
|
||||
{
|
||||
Paint(x, y, wide, tall, -1, 0, 0);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: Draws the border with the specified size
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::Paint(int x, int y, int wide, int tall, int breakSide, int breakStart, int breakEnd)
|
||||
{
|
||||
// iterate through and draw all lines
|
||||
// draw left
|
||||
int i;
|
||||
for (i = 0; i < _sides[SIDE_LEFT].count; i++)
|
||||
{
|
||||
line_t *line = &(_sides[SIDE_LEFT].lines[i]);
|
||||
g_pSurface->DrawSetColor(line->col[0], line->col[1], line->col[2], line->col[3]);
|
||||
|
||||
if (breakSide == SIDE_LEFT)
|
||||
{
|
||||
// split into two section
|
||||
if (breakStart > 0)
|
||||
{
|
||||
// draw before the break Start
|
||||
g_pSurface->DrawFilledRect(x + i, y + line->startOffset, x + i + 1, y + breakStart);
|
||||
}
|
||||
|
||||
if (breakEnd < (tall - line->endOffset))
|
||||
{
|
||||
// draw after break end
|
||||
g_pSurface->DrawFilledRect(x + i, y + breakEnd + 1, x + i + 1, tall - line->endOffset);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_pSurface->DrawFilledRect(x + i, y + line->startOffset, x + i + 1, tall - line->endOffset);
|
||||
}
|
||||
}
|
||||
|
||||
// draw top
|
||||
for (i = 0; i < _sides[SIDE_TOP].count; i++)
|
||||
{
|
||||
line_t *line = &(_sides[SIDE_TOP].lines[i]);
|
||||
g_pSurface->DrawSetColor(line->col[0], line->col[1], line->col[2], line->col[3]);
|
||||
|
||||
if (breakSide == SIDE_TOP)
|
||||
{
|
||||
// split into two section
|
||||
if (breakStart > 0)
|
||||
{
|
||||
// draw before the break Start
|
||||
g_pSurface->DrawFilledRect(x + line->startOffset, y + i, x + breakStart, y + i + 1);
|
||||
}
|
||||
|
||||
if (breakEnd < (wide - line->endOffset))
|
||||
{
|
||||
// draw after break end
|
||||
g_pSurface->DrawFilledRect(x + breakEnd + 1, y + i, wide - line->endOffset, y + i + 1);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
g_pSurface->DrawFilledRect(x + line->startOffset, y + i, wide - line->endOffset, y + i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// draw right
|
||||
for (i = 0; i < _sides[SIDE_RIGHT].count; i++)
|
||||
{
|
||||
line_t *line = &(_sides[SIDE_RIGHT].lines[i]);
|
||||
g_pSurface->DrawSetColor(line->col[0], line->col[1], line->col[2], line->col[3]);
|
||||
g_pSurface->DrawFilledRect(wide - (i+1), y + line->startOffset, (wide - (i+1)) + 1, tall - line->endOffset);
|
||||
}
|
||||
|
||||
// draw bottom
|
||||
for (i = 0; i < _sides[SIDE_BOTTOM].count; i++)
|
||||
{
|
||||
line_t *line = &(_sides[SIDE_BOTTOM].lines[i]);
|
||||
g_pSurface->DrawSetColor(line->col[0], line->col[1], line->col[2], line->col[3]);
|
||||
g_pSurface->DrawFilledRect(x + line->startOffset, tall - (i+1), wide - line->endOffset, (tall - (i+1)) + 1);
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::Paint(VPANEL panel)
|
||||
{
|
||||
// get panel size
|
||||
int wide, tall;
|
||||
((VPanel *)panel)->GetSize(wide, tall);
|
||||
Paint(0, 0, wide, tall, -1, 0, 0);
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::ApplySchemeSettings(IScheme *pScheme, KeyValues *inResourceData)
|
||||
{
|
||||
// load inset information
|
||||
const char *insetString = inResourceData->GetString("inset", "0 0 0 0");
|
||||
|
||||
int left, top, right, bottom;
|
||||
GetInset(left, top, right, bottom);
|
||||
sscanf(insetString, "%d %d %d %d", &left, &top, &right, &bottom);
|
||||
SetInset(left, top, right, bottom);
|
||||
|
||||
// get the border information from the scheme
|
||||
ParseSideSettings(SIDE_LEFT, inResourceData->FindKey("Left"),pScheme);
|
||||
ParseSideSettings(SIDE_TOP, inResourceData->FindKey("Top"),pScheme);
|
||||
ParseSideSettings(SIDE_RIGHT, inResourceData->FindKey("Right"),pScheme);
|
||||
ParseSideSettings(SIDE_BOTTOM, inResourceData->FindKey("Bottom"),pScheme);
|
||||
|
||||
m_eBackgroundType = (backgroundtype_e)inResourceData->GetInt("backgroundtype");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: parses scheme data
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::ParseSideSettings(int side_index, KeyValues *inResourceData, IScheme *pScheme)
|
||||
{
|
||||
if (!inResourceData)
|
||||
return;
|
||||
|
||||
// count the numeber of lines in the side
|
||||
int count = 0;
|
||||
KeyValues *kv;
|
||||
for (kv = inResourceData->GetFirstSubKey(); kv != NULL; kv = kv->GetNextKey())
|
||||
{
|
||||
count++;
|
||||
}
|
||||
|
||||
// allocate memory
|
||||
_sides[side_index].count = count;
|
||||
_sides[side_index].lines = new line_t[count];
|
||||
|
||||
// iterate through the keys
|
||||
//!! this loads in order, ignoring key names
|
||||
int index = 0;
|
||||
for (kv = inResourceData->GetFirstSubKey(); kv != NULL; kv = kv->GetNextKey())
|
||||
{
|
||||
line_t *line = &(_sides[side_index].lines[index]);
|
||||
|
||||
// this is the color name, get that from the color table
|
||||
const char *col = kv->GetString("color", NULL);
|
||||
line->col = pScheme->GetColor(col, Color(0, 0, 0, 0));
|
||||
|
||||
col = kv->GetString("offset", NULL);
|
||||
int Start = 0, end = 0;
|
||||
if (col)
|
||||
{
|
||||
sscanf(col, "%d %d", &Start, &end);
|
||||
}
|
||||
line->startOffset = Start;
|
||||
line->endOffset = end;
|
||||
|
||||
index++;
|
||||
}
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: data accessor
|
||||
//-----------------------------------------------------------------------------
|
||||
const char *Border::GetName()
|
||||
{
|
||||
if (_name)
|
||||
return _name;
|
||||
return "";
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: data accessor
|
||||
//-----------------------------------------------------------------------------
|
||||
void Border::SetName(const char *name)
|
||||
{
|
||||
if (_name)
|
||||
{
|
||||
delete [] _name;
|
||||
}
|
||||
|
||||
int len = Q_strlen(name) + 1;
|
||||
_name = new char[ len ];
|
||||
Q_strncpy( _name, name, len );
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
IBorder::backgroundtype_e Border::GetBackgroundType()
|
||||
{
|
||||
return m_eBackgroundType;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user