//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: This is a panel which is rendered image on top of an entity // // $Revision: $ // $NoKeywords: $ //=============================================================================// #include "cbase.h" #pragma warning (disable: 4514) #include "vgui_bitmappanel.h" #include #include "panelmetaclassmgr.h" #include "vgui_bitmapimage.h" #ifdef INVASION_CLIENT_DLL #include "hud_commander_statuspanel.h" #endif // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" DECLARE_BUILD_FACTORY( CBitmapPanel ); //----------------------------------------------------------------------------- // Constructor //----------------------------------------------------------------------------- CBitmapPanel::CBitmapPanel( ) : BaseClass( NULL, "CBitmapPanel" ), m_pImage(0) { SetPaintBackgroundEnabled( false ); m_szMouseOverText[ 0 ] = 0; m_r = m_g = m_b = m_a = 255; m_bOwnsImage = true; } CBitmapPanel::CBitmapPanel( vgui::Panel *pParent, const char *pName ) : BaseClass( pParent, pName ), m_pImage(0) { SetPaintBackgroundEnabled( false ); m_szMouseOverText[ 0 ] = 0; m_r = m_g = m_b = m_a = 255; m_bOwnsImage = true; } CBitmapPanel::~CBitmapPanel() { if (m_pImage && m_bOwnsImage) { delete m_pImage; m_pImage = NULL; } } //----------------------------------------------------------------------------- // initialization //----------------------------------------------------------------------------- bool CBitmapPanel::Init( KeyValues* pInitData ) { Assert( pInitData ); // modulation color if (!ParseRGBA( pInitData, "color", m_r, m_g, m_b, m_a )) return false; int x, y, w, h; if (!ParseRect( pInitData, "position", x, y, w, h )) return false; const char *mouseover = pInitData->GetString( "mousehint", "" ); if ( mouseover && mouseover[ 0 ] ) { Q_strncpy( m_szMouseOverText, mouseover, sizeof( m_szMouseOverText ) ); } // Set the size... SetPos( x, y ); SetSize( w, h ); char const* pClassImage = pInitData->GetString( "material" ); if ( !pClassImage || !pClassImage[ 0 ] ) return false; // hook in the bitmap m_pImage = new BitmapImage( GetVPanel(), pClassImage ); m_bOwnsImage = true; return true; } //----------------------------------------------------------------------------- // initialization from build-mode dialog style .res files //----------------------------------------------------------------------------- void CBitmapPanel::ApplySettings(KeyValues *pInitData) { BaseClass::ApplySettings(pInitData); if (m_pImage && m_bOwnsImage) { delete m_pImage; m_pImage = NULL; } // modulation color. Can't use ParseRGBA since this uses a vgui::KeyValues (feh) m_r = m_g = m_b = m_a = 255; const char *pColorString = pInitData->GetString( "color", "255 255 255 255" ); if ( pColorString && pColorString[ 0 ] ) { // Try and scan them in int r = 0, g = 0, b = 0, a = 0; int scanned; scanned = sscanf( pColorString, "%i %i %i %i", &r, &g, &b, &a ); if ( scanned == 4 ) { m_r = r; m_g = g; m_b = b; m_a = a; } else { Warning( "Couldn't scan four color values from %s\n", pColorString ); } } m_szMouseOverText[0] = 0; char const* pClassImage = pInitData->GetString( "material" ); if ( pClassImage && pClassImage[ 0 ] && m_bOwnsImage ) { // hook in the bitmap m_pImage = new BitmapImage( GetVPanel(), pClassImage ); } } //----------------------------------------------------------------------------- // Draws the puppy //----------------------------------------------------------------------------- void CBitmapPanel::Paint( void ) { if ( !m_pImage ) return; Color color; color.SetColor( m_r, m_g, m_b, m_a ); m_pImage->SetColor( color ); m_pImage->DoPaint( GetVPanel() ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBitmapPanel::OnCursorEntered() { #ifdef INVASION_CLIENT_DLL if ( m_szMouseOverText[ 0 ] ) { StatusPrint( TYPE_HINT, "%s", m_szMouseOverText ); } #endif } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBitmapPanel::OnCursorExited() { #ifdef INVASION_CLIENT_DLL if ( m_szMouseOverText[ 0 ] ) { StatusClear(); } #endif } //----------------------------------------------------------------------------- // Purpose: // Output : char const //----------------------------------------------------------------------------- const char *CBitmapPanel::GetMouseOverText( void ) { return m_szMouseOverText; } //----------------------------------------------------------------------------- // Purpose: Sets up the panel // Used by panels that aren't created by the commander overlay factory (i.e. aren't parsed from a keyvalues file) //----------------------------------------------------------------------------- void CBitmapPanel::SetImage( BitmapImage *pImage ) { m_pImage = pImage; m_bOwnsImage = (pImage == NULL); // Get the color from the image if ( m_pImage ) { m_pImage->GetColor( m_r, m_g, m_b, m_a ); } } //----------------------------------------------------------------------------- // Purpose: Set image data directly //----------------------------------------------------------------------------- void CBitmapPanel::SetBitmap( const Bitmap_t &bitmap ) { // Make sure we have an image that we own if ( m_pImage == NULL || !m_bOwnsImage ) { delete m_pImage; m_pImage = new BitmapImage( GetVPanel(), NULL ); m_bOwnsImage = true; } // Set the bitmap m_pImage->SetBitmap( bitmap ); }