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.
183 lines
5.5 KiB
183 lines
5.5 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "ObjectControlPanel.h" |
|
#include <vgui_controls/Controls.h> |
|
#include <vgui_controls/Label.h> |
|
#include "vgui_bitmapbutton.h" |
|
#include <vgui/ISurface.h> |
|
#include <vgui/IVGui.h> |
|
#include "c_tf_player.h" |
|
#include "clientmode_tf.h" |
|
#include <vgui/IScheme.h> |
|
#include <vgui_controls/Slider.h> |
|
#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<C_BaseObject*>(pObj) ); |
|
return static_cast<C_BaseObject*>(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 ); |
|
} |
|
|
|
|