diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/tf/vgui/ObjectControlPanel.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/tf/vgui/ObjectControlPanel.cpp')
| -rw-r--r-- | game/client/tf/vgui/ObjectControlPanel.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/game/client/tf/vgui/ObjectControlPanel.cpp b/game/client/tf/vgui/ObjectControlPanel.cpp new file mode 100644 index 0000000..da24fd2 --- /dev/null +++ b/game/client/tf/vgui/ObjectControlPanel.cpp @@ -0,0 +1,183 @@ +//========= 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 ); +} + |