//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "ObjectControlPanel.h" #include #include #include "vgui_bitmapbutton.h" #include #include #include "c_tf_player.h" #include "clientmode_tf.h" #include #include #include "vgui_rotation_slider.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" #define DISMANTLE_WAIT_TIME 5.0 //----------------------------------------------------------------------------- // Standard VGUI panel for objects //----------------------------------------------------------------------------- DECLARE_VGUI_SCREEN_FACTORY( CObjectControlPanel, "object_control_panel" ); //----------------------------------------------------------------------------- // Constructor: //----------------------------------------------------------------------------- CObjectControlPanel::CObjectControlPanel( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, panelName, NULL ) { // Make some high-level panels to group stuff we want to activate/deactivate m_pActivePanel = new CCommandChainingPanel( this, "ActivePanel" ); SetCursor( vgui::dc_none ); // don't draw a VGUI cursor for this panel, and for its children // Make sure these are behind everything m_pActivePanel->SetZPos( -1 ); } //----------------------------------------------------------------------------- // Initialization //----------------------------------------------------------------------------- bool CObjectControlPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ) { // Make sure we get ticked... vgui::ivgui()->AddTickSignal( GetVPanel() ); if (!BaseClass::Init(pKeyValues, pInitData)) return false; SetCursor( vgui::dc_none ); // don't draw a VGUI cursor for this panel, and for its children // Make the bounds of the sub-panels match int x, y, w, h; GetBounds( x, y, w, h ); m_pActivePanel->SetBounds( x, y, w, h ); // Make em all invisible m_pActivePanel->SetVisible( false ); m_pCurrentPanel = m_pActivePanel; return true; } //----------------------------------------------------------------------------- // Returns the object it's attached to //----------------------------------------------------------------------------- C_BaseObject *CObjectControlPanel::GetOwningObject() const { C_BaseEntity *pScreenEnt = GetEntity(); if (!pScreenEnt) return NULL; C_BaseEntity *pObj = pScreenEnt->GetOwnerEntity(); if (!pObj) return NULL; Assert( dynamic_cast(pObj) ); return static_cast(pObj); } //----------------------------------------------------------------------------- // Ticks the panel when its in its various states //----------------------------------------------------------------------------- void CObjectControlPanel::OnTickActive( C_BaseObject *pObj, C_TFPlayer *pLocalPlayer ) { //ShowDismantleButton( !(pObj->GetFlags() & OF_CANNOT_BE_DISMANTLED) && pObj->GetOwner() == pLocalPlayer ); } vgui::Panel* CObjectControlPanel::TickCurrentPanel() { C_TFPlayer *pLocalPlayer = C_TFPlayer::GetLocalTFPlayer(); C_BaseObject *pObj = GetOwningObject(); m_pCurrentPanel = GetActivePanel(); OnTickActive(pObj, pLocalPlayer); return m_pCurrentPanel; } void CObjectControlPanel::SendToServerObject( const char *pMsg ) { C_BaseObject *pObj = GetOwningObject(); if (pObj) { pObj->SendClientCommand( pMsg ); } } //----------------------------------------------------------------------------- // Frame-based update //----------------------------------------------------------------------------- void CObjectControlPanel::OnTick() { BaseClass::OnTick(); C_BaseObject *pObj = GetOwningObject(); if (!pObj) return; if ( IsVisible() ) { // Update the current subpanel m_pCurrentPanel->SetVisible( false ); m_pCurrentPanel = TickCurrentPanel(); m_pCurrentPanel->SetVisible( true ); } } //----------------------------------------------------------------------------- // Button click handlers //----------------------------------------------------------------------------- void CObjectControlPanel::OnCommand( const char *command ) { BaseClass::OnCommand(command); } DECLARE_VGUI_SCREEN_FACTORY( CRotatingObjectControlPanel, "rotating_object_control_panel" ); //----------------------------------------------------------------------------- // This is a panel for an object that has rotational controls //----------------------------------------------------------------------------- CRotatingObjectControlPanel::CRotatingObjectControlPanel( vgui::Panel *parent, const char *panelName ) : BaseClass( parent, panelName ) { } bool CRotatingObjectControlPanel::Init( KeyValues* pKeyValues, VGuiScreenInitData_t* pInitData ) { // Grab ahold of certain well-known controls m_pRotationSlider = new CRotationSlider( GetActivePanel(), "RotationSlider" ); m_pRotationLabel = new vgui::Label( GetActivePanel(), "RotationLabel", "Rotation Control" ); if (!BaseClass::Init(pKeyValues, pInitData)) return false; m_pRotationSlider->SetControlledObject( GetOwningObject() ); return true; } void CRotatingObjectControlPanel::OnTickActive( C_BaseObject *pObj, C_TFPlayer *pLocalPlayer ) { BaseClass::OnTickActive( pObj, pLocalPlayer ); bool bEnable = (pObj->GetOwner() == pLocalPlayer); m_pRotationSlider->SetVisible( bEnable ); m_pRotationLabel->SetVisible( bEnable ); }