summaryrefslogtreecommitdiff
path: root/vgui2/src/Border.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /vgui2/src/Border.cpp
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'vgui2/src/Border.cpp')
-rw-r--r--vgui2/src/Border.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/vgui2/src/Border.cpp b/vgui2/src/Border.cpp
new file mode 100644
index 0000000..de7cfff
--- /dev/null
+++ b/vgui2/src/Border.cpp
@@ -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;
+}
+