You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
245 lines
8.1 KiB
245 lines
8.1 KiB
3 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include <vgui_controls/EditablePanel.h>
|
||
|
#include <vgui_controls/ImagePanel.h>
|
||
|
#include <vgui/ISurface.h>
|
||
|
#include <KeyValues.h>
|
||
|
#include "dodcornercutpanel.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CDoDCutEditablePanel::CDoDCutEditablePanel( vgui::Panel *parent, const char *name ) : vgui::EditablePanel( parent, name )
|
||
|
{
|
||
|
m_nCornerToCut = DOD_CORNERCUT_PANEL_BOTTOMRIGHT;
|
||
|
m_nCornerCutSize = 1;
|
||
|
|
||
|
memset( m_szBackgroundTexture, 0, sizeof( m_szBackgroundTexture ) );
|
||
|
memset( m_szBackgroudColor, 0, sizeof( m_szBackgroudColor ) );
|
||
|
memset( m_szBorderColor, 0, sizeof( m_szBorderColor ) );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::SetBorder( vgui::IBorder *border )
|
||
|
{
|
||
|
BaseClass::SetBorder( border );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::ApplySettings( KeyValues *inResourceData )
|
||
|
{
|
||
|
BaseClass::ApplySettings( inResourceData );
|
||
|
|
||
|
// check to see if we have a new name assigned
|
||
|
Q_strncpy( m_szBackgroundTexture, inResourceData->GetString( "BackgroundTexture", "vgui/white" ), sizeof( m_szBackgroundTexture ) );
|
||
|
Q_strncpy( m_szBackgroudColor, inResourceData->GetString( "BackgroundColor", "HudPanelForeground" ), sizeof( m_szBackgroudColor ) );
|
||
|
Q_strncpy( m_szBorderColor, inResourceData->GetString( "BackgroundBorder", "HudPanelBorder" ), sizeof( m_szBorderColor ) );
|
||
|
|
||
|
m_iBackgroundTexture = vgui::surface()->DrawGetTextureId( m_szBackgroundTexture );
|
||
|
if ( m_iBackgroundTexture == -1 )
|
||
|
{
|
||
|
m_iBackgroundTexture = vgui::surface()->CreateNewTextureID();
|
||
|
}
|
||
|
|
||
|
vgui::surface()->DrawSetTextureFile( m_iBackgroundTexture, m_szBackgroundTexture, true, true );
|
||
|
|
||
|
m_nCornerCutSize = inResourceData->GetInt( "CornerCutSize", 1 );
|
||
|
|
||
|
// scale the cut size to our screen co-ords
|
||
|
if ( IsProportional() )
|
||
|
{
|
||
|
m_nCornerCutSize = vgui::scheme()->GetProportionalScaledValueEx( GetScheme(), m_nCornerCutSize );
|
||
|
}
|
||
|
|
||
|
const char *pszCorner = inResourceData->GetString( "CornerToCut", "" );
|
||
|
if ( pszCorner )
|
||
|
{
|
||
|
if ( !Q_strcmp( pszCorner, "bottom_right" ) )
|
||
|
{
|
||
|
m_nCornerToCut = DOD_CORNERCUT_PANEL_BOTTOMRIGHT;
|
||
|
}
|
||
|
else if ( !Q_strcmp( pszCorner, "bottom_left" ) )
|
||
|
{
|
||
|
m_nCornerToCut = DOD_CORNERCUT_PANEL_BOTTOMLEFT;
|
||
|
}
|
||
|
else if ( !Q_strcmp( pszCorner, "top_right" ) )
|
||
|
{
|
||
|
m_nCornerToCut = DOD_CORNERCUT_PANEL_TOPRIGHT;
|
||
|
|
||
|
}
|
||
|
else if ( !Q_strcmp( pszCorner, "top_left" ) )
|
||
|
{
|
||
|
m_nCornerToCut = DOD_CORNERCUT_PANEL_TOPLEFT;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
InvalidateLayout( false, true );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::GetSettings( KeyValues *outResourceData )
|
||
|
{
|
||
|
BaseClass::GetSettings( outResourceData );
|
||
|
|
||
|
outResourceData->SetString( "BackgroundTexture", m_szBackgroundTexture);
|
||
|
outResourceData->SetString( "BackgroundColor", m_szBackgroudColor);
|
||
|
outResourceData->SetString( "BackgroundBorder", m_szBorderColor);
|
||
|
outResourceData->SetFloat( "CornerCutSize", m_nCornerCutSize );
|
||
|
|
||
|
const char *pszCorner = NULL;
|
||
|
switch( m_nCornerToCut )
|
||
|
{
|
||
|
case DOD_CORNERCUT_PANEL_TOPLEFT:
|
||
|
pszCorner = "top_left";
|
||
|
break;
|
||
|
case DOD_CORNERCUT_PANEL_TOPRIGHT:
|
||
|
pszCorner = "top_right";
|
||
|
break;
|
||
|
case DOD_CORNERCUT_PANEL_BOTTOMLEFT:
|
||
|
pszCorner = "bottom_left";
|
||
|
break;
|
||
|
case DOD_CORNERCUT_PANEL_BOTTOMRIGHT:
|
||
|
default:
|
||
|
pszCorner = "bottom_right";
|
||
|
break;
|
||
|
}
|
||
|
outResourceData->SetString( "CornerToCut", pszCorner );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::ApplySchemeSettings( vgui::IScheme *pScheme )
|
||
|
{
|
||
|
BaseClass::ApplySchemeSettings( pScheme );
|
||
|
|
||
|
SetBorder( NULL );
|
||
|
|
||
|
m_clrBackground = pScheme->GetColor( m_szBackgroudColor, GetFgColor() );
|
||
|
m_clrBorder = pScheme->GetColor( m_szBorderColor, GetBgColor() );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::PaintBackground()
|
||
|
{
|
||
|
vgui::Vertex_t lineverts[5];
|
||
|
vgui::Vertex_t verts[5];
|
||
|
|
||
|
int nwide, ntall;
|
||
|
GetSize( nwide, ntall );
|
||
|
|
||
|
int wide = nwide - 1; // -1 because we can't draw all the way out to the width of our panel (it gets clipped), we can only draw to width - 1
|
||
|
int tall = ntall - 1; // (same as above)
|
||
|
|
||
|
switch ( m_nCornerToCut )
|
||
|
{
|
||
|
case DOD_CORNERCUT_PANEL_TOPLEFT:
|
||
|
verts[0].Init( Vector2D( m_nCornerCutSize, 0 ) );
|
||
|
verts[1].Init( Vector2D( wide, 0 ) );
|
||
|
verts[2].Init( Vector2D( wide, tall ) );
|
||
|
verts[3].Init( Vector2D( 0, tall ) );
|
||
|
verts[4].Init( Vector2D( 0, m_nCornerCutSize ) );
|
||
|
|
||
|
lineverts[0].Init( Vector2D( m_nCornerCutSize-1, 0 ) );
|
||
|
lineverts[1].Init( Vector2D( wide, 0 ) );
|
||
|
lineverts[2].Init( Vector2D( wide, tall ) );
|
||
|
lineverts[3].Init( Vector2D( 0, tall ) );
|
||
|
lineverts[4].Init( Vector2D( 0, m_nCornerCutSize-1 ) );
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DOD_CORNERCUT_PANEL_TOPRIGHT:
|
||
|
verts[0].Init( Vector2D( 0, 0 ) );
|
||
|
verts[1].Init( Vector2D( wide - m_nCornerCutSize, 0 ) );
|
||
|
verts[2].Init( Vector2D( wide, m_nCornerCutSize ) );
|
||
|
verts[3].Init( Vector2D( wide, tall ) );
|
||
|
verts[4].Init( Vector2D( 0, tall ) );
|
||
|
|
||
|
lineverts[0].Init( Vector2D( 0, 0 ) );
|
||
|
lineverts[1].Init( Vector2D( wide - m_nCornerCutSize, 0 ) );
|
||
|
lineverts[2].Init( Vector2D( wide, m_nCornerCutSize ) );
|
||
|
lineverts[3].Init( Vector2D( wide, tall ) );
|
||
|
lineverts[4].Init( Vector2D( 0, tall ) );
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DOD_CORNERCUT_PANEL_BOTTOMLEFT:
|
||
|
verts[0].Init( Vector2D( 0, 0 ) );
|
||
|
verts[1].Init( Vector2D( wide, 0 ) );
|
||
|
verts[2].Init( Vector2D( wide, tall ) );
|
||
|
verts[3].Init( Vector2D( m_nCornerCutSize, tall ) );
|
||
|
verts[4].Init( Vector2D( 0, tall - m_nCornerCutSize ) );
|
||
|
|
||
|
lineverts[0].Init( Vector2D( 0, 0 ) );
|
||
|
lineverts[1].Init( Vector2D( wide, 0 ) );
|
||
|
lineverts[2].Init( Vector2D( wide, tall ) );
|
||
|
lineverts[3].Init( Vector2D( m_nCornerCutSize, tall ) );
|
||
|
lineverts[4].Init( Vector2D( 0, tall - m_nCornerCutSize ) );
|
||
|
|
||
|
break;
|
||
|
|
||
|
case DOD_CORNERCUT_PANEL_BOTTOMRIGHT:
|
||
|
default:
|
||
|
verts[0].Init( Vector2D( 0, 0 ) );
|
||
|
verts[1].Init( Vector2D( wide, 0 ) );
|
||
|
verts[2].Init( Vector2D( wide, tall - m_nCornerCutSize + 1 ) );
|
||
|
verts[3].Init( Vector2D( wide - m_nCornerCutSize + 1, tall ) );
|
||
|
verts[4].Init( Vector2D( 0, tall ) );
|
||
|
|
||
|
lineverts[0].Init( Vector2D( 0, 0 ) );
|
||
|
lineverts[1].Init( Vector2D( wide, 0 ) );
|
||
|
lineverts[2].Init( Vector2D( wide, tall - m_nCornerCutSize ) );
|
||
|
lineverts[3].Init( Vector2D( wide - m_nCornerCutSize, tall ) );
|
||
|
lineverts[4].Init( Vector2D( 0, tall ) );
|
||
|
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
vgui::surface()->DrawSetTexture( m_iBackgroundTexture );
|
||
|
vgui::surface()->DrawSetColor( m_clrBackground );
|
||
|
vgui::surface()->DrawTexturedPolygon( 5, verts );
|
||
|
|
||
|
vgui::surface()->DrawSetColor( m_clrBorder );
|
||
|
vgui::surface()->DrawTexturedPolyLine( lineverts, 5 );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::SetBackGroundColor( const char *pszNewColor )
|
||
|
{
|
||
|
if ( !pszNewColor )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Q_strncpy( m_szBackgroudColor, pszNewColor, sizeof( m_szBackgroudColor ) );
|
||
|
InvalidateLayout( false, true );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CDoDCutEditablePanel::SetBorderColor( const char *pszNewColor )
|
||
|
{
|
||
|
if ( !pszNewColor )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Q_strncpy( m_szBorderColor, pszNewColor, sizeof( m_szBorderColor ) );
|
||
|
InvalidateLayout( false, true );
|
||
|
}
|