diff options
Diffstat (limited to 'mp/src/vgui2/vgui_controls/BitmapImagePanel.cpp')
| -rw-r--r-- | mp/src/vgui2/vgui_controls/BitmapImagePanel.cpp | 364 |
1 files changed, 364 insertions, 0 deletions
diff --git a/mp/src/vgui2/vgui_controls/BitmapImagePanel.cpp b/mp/src/vgui2/vgui_controls/BitmapImagePanel.cpp new file mode 100644 index 00000000..e6f40128 --- /dev/null +++ b/mp/src/vgui2/vgui_controls/BitmapImagePanel.cpp @@ -0,0 +1,364 @@ +//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include <stdio.h>
+
+#include "vgui_controls/BitmapImagePanel.h"
+#include "vgui/ISurface.h"
+#include "vgui/IScheme.h"
+#include "vgui/IBorder.h"
+#include "KeyValues.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+#ifndef min
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+
+using namespace vgui;
+
+//-----------------------------------------------------------------------------
+/**
+ * Simple utility function to allocate memory and duplicate a string
+ */
+static inline char *CloneString( const char *str )
+{
+ char *cloneStr = new char [ strlen(str)+1 ];
+ strcpy( cloneStr, str );
+ return cloneStr;
+}
+
+DECLARE_BUILD_FACTORY_DEFAULT_TEXT( CBitmapImagePanel, BitmapImagePanel );
+
+//-----------------------------------------------------------------------------
+// Purpose: Constructor
+//-----------------------------------------------------------------------------
+CBitmapImagePanel::CBitmapImagePanel( Panel *parent, char const *panelName,
+ char const *filename /*= NULL*/ ) : Panel( parent, panelName )
+{
+ m_pImage = NULL;
+
+ SetBounds( 0, 0, 100, 100 );
+
+ m_pszImageName = NULL;
+ m_pszColorName = NULL;
+
+ m_hardwareFiltered = false;
+ m_preserveAspectRatio = false;
+ m_contentAlignment = Label::a_center;
+
+ if ( filename && filename[ 0 ] )
+ {
+ m_pImage = scheme()->GetImage( filename, NULL );
+ m_pszImageName = CloneString( filename );
+ }
+
+ m_bgColor = Color(255, 255, 255, 255);
+}
+CBitmapImagePanel::~CBitmapImagePanel()
+{
+ delete [] m_pszImageName;
+ delete [] m_pszColorName;
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::ComputeImagePosition(int &x, int &y, int &w, int &h)
+{
+ if (!m_pImage)
+ {
+ x = y = w = h = 0;
+ return;
+ }
+
+ if ( !m_preserveAspectRatio )
+ {
+ x = y = 0;
+ GetSize( w, h );
+ return;
+ }
+
+ int panelWide, panelTall;
+ GetSize( panelWide, panelTall );
+
+ int imageWide, imageTall;
+ m_pImage->GetSize( imageWide, imageTall );
+
+ if ( panelWide > 0 && panelTall > 0 && imageWide > 0 && imageTall > 0 )
+ {
+ float xScale = (float)panelWide / (float)imageWide;
+ float yScale = (float)panelTall / (float)imageTall;
+ float scale = min( xScale, yScale );
+
+ w = (int) (imageWide * scale);
+ h = (int) (imageTall * scale);
+
+ switch (m_contentAlignment)
+ {
+ case Label::a_northwest:
+ x = y = 0;
+ break;
+ case Label::a_north:
+ x = (panelWide - w) / 2;
+ y = 0;
+ break;
+ case Label::a_northeast:
+ x = (panelWide - w);
+ y = 0;
+ break;
+ case Label::a_west:
+ x = 0;
+ y = (panelTall - h) / 2;
+ break;
+ case Label::a_center:
+ x = (panelWide - w) / 2;
+ y = (panelTall - h) / 2;
+ break;
+ case Label::a_east:
+ x = (panelWide - w);
+ y = (panelTall - h) / 2;
+ break;
+ case Label::a_southwest:
+ x = (panelWide - w);
+ y = 0;
+ break;
+ case Label::a_south:
+ x = (panelWide - w);
+ y = (panelTall - h) / 2;
+ break;
+ case Label::a_southeast:
+ x = (panelWide - w);
+ y = (panelTall - h);
+ break;
+ default:
+ x = y = 0;
+ break;
+ }
+ }
+ else
+ {
+ x = y = 0;
+ w = panelWide;
+ h = panelTall;
+ return;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::PaintBorder()
+{
+ int x, y, w, h;
+ ComputeImagePosition(x, y, w, h);
+
+ IBorder *pBorder = GetBorder();
+ if ( pBorder )
+ pBorder->Paint( x, y, x+w, y+h, -1, 0, 0 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::PaintBackground()
+{
+ if (!m_pImage)
+ return;
+
+ int x, y, w, h;
+ ComputeImagePosition(x, y, w, h);
+
+ m_pImage->SetPos(x, y);
+ m_pImage->SetSize( w, h );
+ m_pImage->SetColor( m_bgColor );
+ surface()->DrawSetColor( m_bgColor );
+ m_pImage->Paint();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::setTexture( char const *filename, bool hardwareFiltered )
+{
+ m_hardwareFiltered = hardwareFiltered;
+
+ if ( m_pszImageName )
+ {
+ delete[] m_pszImageName;
+ m_pszImageName = NULL;
+ }
+ if ( filename && filename[ 0 ] )
+ {
+ m_pImage = scheme()->GetImage( filename, m_hardwareFiltered );
+ m_pszImageName = CloneString( filename );
+ }
+ else
+ {
+ m_pImage = NULL;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::SetContentAlignment(Label::Alignment alignment)
+{
+ m_contentAlignment=alignment;
+ Repaint();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Gets control settings for editing
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::GetSettings(KeyValues *outResourceData)
+{
+ BaseClass::GetSettings(outResourceData);
+ if (m_pszImageName)
+ {
+ outResourceData->SetString("image", m_pszImageName);
+ }
+ if (m_pszColorName)
+ {
+ outResourceData->SetString("imagecolor", m_pszColorName);
+ }
+ const char *alignmentString = "";
+ switch ( m_contentAlignment )
+ {
+ case Label::a_northwest: alignmentString = "north-west"; break;
+ case Label::a_north: alignmentString = "north"; break;
+ case Label::a_northeast: alignmentString = "north-east"; break;
+ case Label::a_center: alignmentString = "center"; break;
+ case Label::a_east: alignmentString = "east"; break;
+ case Label::a_southwest: alignmentString = "south-west"; break;
+ case Label::a_south: alignmentString = "south"; break;
+ case Label::a_southeast: alignmentString = "south-east"; break;
+ case Label::a_west:
+ default: alignmentString = "center"; break;
+ }
+ outResourceData->SetString( "imageAlignment", alignmentString );
+ outResourceData->SetInt("preserveAspectRatio", m_preserveAspectRatio);
+ outResourceData->SetInt("filtered", m_hardwareFiltered);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Applies designer settings from res file
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::ApplySettings(KeyValues *inResourceData)
+{
+ if ( m_pszImageName )
+ {
+ delete[] m_pszImageName;
+ m_pszImageName = NULL;
+ }
+
+ if ( m_pszColorName )
+ {
+ delete[] m_pszColorName;
+ m_pszColorName = NULL;
+ }
+
+ const char *imageName = inResourceData->GetString("image", "");
+ if (*imageName)
+ {
+ setTexture( imageName );
+ }
+
+ const char *colorName = inResourceData->GetString("imagecolor", "");
+ if (*colorName)
+ {
+ m_pszColorName = CloneString( colorName );
+ InvalidateLayout(false,true); // force ApplySchemeSettings to run
+ }
+
+ const char *keyString = inResourceData->GetString("imageAlignment", "");
+ if (keyString && *keyString)
+ {
+ int align = -1;
+
+ if ( !stricmp(keyString, "north-west") )
+ {
+ align = Label::a_northwest;
+ }
+ else if ( !stricmp(keyString, "north") )
+ {
+ align = Label::a_north;
+ }
+ else if ( !stricmp(keyString, "north-east") )
+ {
+ align = Label::a_northeast;
+ }
+ else if ( !stricmp(keyString, "west") )
+ {
+ align = Label::a_west;
+ }
+ else if ( !stricmp(keyString, "center") )
+ {
+ align = Label::a_center;
+ }
+ else if ( !stricmp(keyString, "east") )
+ {
+ align = Label::a_east;
+ }
+ else if ( !stricmp(keyString, "south-west") )
+ {
+ align = Label::a_southwest;
+ }
+ else if ( !stricmp(keyString, "south") )
+ {
+ align = Label::a_south;
+ }
+ else if ( !stricmp(keyString, "south-east") )
+ {
+ align = Label::a_southeast;
+ }
+
+ if ( align != -1 )
+ {
+ SetContentAlignment( (Label::Alignment)align );
+ }
+ }
+
+ keyString = inResourceData->GetString("preserveAspectRatio", "");
+ if (keyString && *keyString)
+ {
+ m_preserveAspectRatio = atoi( keyString ) != 0;
+ }
+
+ keyString = inResourceData->GetString("filtered", "");
+ if (keyString && *keyString)
+ {
+ m_hardwareFiltered = atoi( keyString ) != 0;
+ }
+
+ BaseClass::ApplySettings(inResourceData);
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: load the image, this is done just before this control is displayed
+//-----------------------------------------------------------------------------
+void CBitmapImagePanel::ApplySchemeSettings( IScheme *pScheme )
+{
+ BaseClass::ApplySchemeSettings(pScheme);
+
+ if ( m_pszColorName )
+ {
+ setImageColor( pScheme->GetColor( m_pszColorName, m_bgColor ) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Describes editing details
+//-----------------------------------------------------------------------------
+const char *CBitmapImagePanel::GetDescription()
+{
+ static char buf[1024];
+ _snprintf(buf, sizeof(buf), "%s, string image, string imagecolor, alignment imageAlignment, int preserveAspectRatio, int filtered", BaseClass::GetDescription());
+ return buf;
+}
|