//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Order window // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "hud_orders.h" #include "hud.h" #include "c_basetfplayer.h" #include "clientmode_tfnormal.h" #include "VGUI_BasePanel.h" #include // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudLabel::SetSelected( bool bSelected ) { m_bSelected = bSelected; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudOrderList *GetHudOrderList( void ) { return GET_HUDELEMENT( CHudOrderList ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudOrder::CHudOrder( int x,int y,int wide,int tall ) : vgui::Panel( NULL, "CHudOrder") { SetBounds( x, y, wide, tall ); SetAutoDelete( false ); m_pOrder = NULL; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudOrder::~CHudOrder( void ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrder::Init( void ) { SetSize( ORDERS_ELEMENT_WIDTH, ORDERS_ELEMENT_HEIGHT ); } //----------------------------------------------------------------------------- // Purpose: Called every frame //----------------------------------------------------------------------------- void CHudOrder::Paint( void ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrder::SetOrder( C_Order *pOrder ) { // If we had an order, tell it to clean up if ( m_pOrder ) { m_pOrder->DestroyStatus(); } m_pOrder = pOrder; // Tell the order to create it's elements if ( m_pOrder ) { m_pOrder->CreateStatus( this ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_Order *CHudOrder::GetOrder( void ) { return m_pOrder; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrder::UpdateOrder( void ) { if ( m_pOrder == NULL ) return; } //----------------------------------------------------------------------------- // Purpose: Our order has been deleted. //----------------------------------------------------------------------------- void CHudOrder::OrderRemoved( void ) { m_pOrder = NULL; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrder::ApplySchemeSettings(vgui::IScheme *pScheme) { Panel::ApplySchemeSettings(pScheme); if ( m_pOrder && m_pOrder->IsPersonalOrder() ) { SetBgColor( GetSchemeColor("HudStatusSelectedBgColor", pScheme) ); } else { SetBgColor( GetSchemeColor("HudStatusBgColor", pScheme) ); } } //================================================================================================================ // LARGE STATUS PANEL. //================================================================================================================ // Purpose: //----------------------------------------------------------------------------- CHudOrderList::CHudOrderList( const char *pElementName ) : CHudElement( pElementName ), vgui::Panel( NULL, "HudOrderList" ) { vgui::Panel *pParent = g_pClientMode->GetViewport(); SetParent( pParent ); SetPaintBackgroundEnabled( false ); for (int i = 0; i < MAX_HUD_ORDERS; i++) { m_pOrderPanels[i] = NULL; m_pOrderLabels[i] = NULL; } SetHiddenBits( HIDEHUD_MISCSTATUS | HIDEHUD_PLAYERDEAD ); } DECLARE_HUDELEMENT( CHudOrderList ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CHudOrderList::~CHudOrderList( void ) { for (int i = 0; i < MAX_HUD_ORDERS; i++) { if ( m_pOrderPanels[i] ) { delete m_pOrderPanels[i]; delete m_pOrderLabels[i]; } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrderList::LevelInit( void ) { SetPos( ORDERS_LEFT, ORDERS_TOP ); SetSize( ORDERS_WIDTH, ORDERS_HEIGHT ); for ( int i = 0; i < MAX_HUD_ORDERS; i++ ) { m_pOrderPanels[i] = new CHudOrder( ORDERS_ELEMENT_LEFT - ORDERS_LEFT, ORDERS_ELEMENT_HEIGHT * i, ORDERS_ELEMENT_WIDTH, ORDERS_ELEMENT_HEIGHT ); m_pOrderPanels[i]->Init(); m_pOrderLabels[i] = new CHudLabel( NULL, "orderlabels", " " ); m_pOrderLabels[i]->SetBounds( 0, ORDERS_ELEMENT_HEIGHT * i, ORDERS_ELEMENT_LEFT - ORDERS_LEFT, ORDERS_ELEMENT_HEIGHT ); m_pOrderLabels[i]->SetContentAlignment( vgui::Label::a_northwest ); m_pOrderLabels[i]->SetTextInset( 4, 0 ); // Start all of them hidden m_pOrderPanels[i]->SetParent( (vgui::Panel *)NULL ); m_pOrderLabels[i]->SetParent( (vgui::Panel *)NULL ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrderList::LevelShutdown( void ) { for ( int i = 0; i < MAX_HUD_ORDERS; i++ ) { delete m_pOrderPanels[i]; m_pOrderPanels[i] = NULL; delete m_pOrderLabels[i]; m_pOrderLabels[i] = NULL; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrderList::OnThink( void ) { // Call update for all active objects for (int i = 0; i < MAX_HUD_ORDERS; i++) { if ( m_pOrderPanels[i] && m_pOrderPanels[i]->GetOrder() ) { m_pOrderPanels[i]->UpdateOrder(); } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CHudOrderList::Paint( void ) { // vgui::surface()->DrawSetColor( 255,0,0, 64 ); // vgui::surface()->DrawOutlinedRect( 0,0, GetWide(), GetTall() ); } //----------------------------------------------------------------------------- // Purpose: Insert the specified order into the slot //----------------------------------------------------------------------------- void CHudOrderList::InsertOrder( C_Order *pOrder, int iSlot ) { // Personal Orders don't have selection keys if ( pOrder->IsPersonalOrder() ) { m_pOrderLabels[iSlot]->SetText(""); } else { // Check the key binding char binding[64]; Q_snprintf(binding, sizeof( binding ), "order %d", iSlot+1); const char *pBinding = engine->Key_LookupBinding( binding ); if ( pBinding && strcmp(pBinding,"") ) { m_pOrderLabels[iSlot]->SetText( pBinding ); } } // Only insert it if it's not there already if ( m_pOrderPanels[iSlot]->GetOrder() != pOrder ) { m_pOrderPanels[iSlot]->SetOrder( pOrder ); m_pOrderPanels[iSlot]->SetParent( this ); m_pOrderLabels[iSlot]->SetParent( this ); m_pOrderLabels[iSlot]->SetSelected( pOrder->IsPersonalOrder() ); } } //----------------------------------------------------------------------------- // Purpose: We've received a new order, or a modified old one. Figure out what to do. //----------------------------------------------------------------------------- void CHudOrderList::RecalculateOrderList( void ) { C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer(); // Does this player have a personal order? C_Order *pOrder = pPlayer->PersonalOrder(); if( pOrder ) { // Highlight the selected order (and the personal order always) m_pOrderPanels[0]->SetBgColor( Color( 0,0,0, 192) ); m_pOrderLabels[0]->SetBgColor( Color( 0,0,0, 192) ); } }