Counter Strike : Global Offensive Source Code
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.
|
|
//===== Copyright � 1996-2006, Valve Corporation, All rights reserved. ======//
//
// Base class for windows that draw vgui in Maya
//
//===========================================================================//
#ifndef VSVGUIWINDOW_H
#define VSVGUIWINDOW_H
#ifdef _WIN32
#pragma once
#endif
#include "imayavgui.h"
#include "vgui_controls/Frame.h"
#include "tier1/UtlMap.h"
#include "valveMaya.h"
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class IMayaVGui;
//-----------------------------------------------------------------------------
// The singleton is defined here twice just so we don't have to include valvemaya.h also
//-----------------------------------------------------------------------------
extern IMayaVGui *g_pMayaVGui;
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
namespace vgui { class EditablePanel; }
class CVsVGuiWindowBase { public: virtual void SetPeriod( float flPeriod ) = 0; virtual void StartTick() = 0; virtual void StartTick( float flPeriod ) = 0; virtual void StopTick() = 0; virtual void Tick( float flElapsedTime ) = 0; virtual void NonTimerTick() = 0; };
//-----------------------------------------------------------------------------
// Creates, destroys a maya vgui window
//-----------------------------------------------------------------------------
CVsVGuiWindowBase *CreateMayaVGuiWindow( vgui::EditablePanel *pRootPanel, const char *pPanelName ); void DestroyMayaVGuiWindow( const char *pPanelName );
//-----------------------------------------------------------------------------
// Factory used to install vgui windows easily
//-----------------------------------------------------------------------------
class CVsVguiWindowFactoryBase : public IMayaVguiWindowFactory { public: CVsVguiWindowFactoryBase( const char *pWindowTypeName, const char *pDccStartupCommand );
// Returns the DCC command
const char *GetDccStartupCommand() const;
// Registers/deregisters all vgui windows
static void RegisterAllVguiWindows( ); static void UnregisterAllVguiWindows( );
protected: const char *m_pWindowTypeName; const char *m_pDccStartupCommand;
private: CVsVguiWindowFactoryBase *m_pNext; static CVsVguiWindowFactoryBase *s_pFirstCommandFactory; };
template< class T > class CVsVguiWindowFactory : public CVsVguiWindowFactoryBase { typedef CVsVguiWindowFactoryBase BaseClass;
static bool StringLessFunc( const CUtlString &a, const CUtlString &b ) { return StringLessThan( a.Get(), b.Get() ); }
public: CVsVguiWindowFactory( const char *pWindowTypeName, const char *pDccCommand ) : BaseClass( pWindowTypeName, pDccCommand ) , m_panelMap( StringLessFunc ) { }
struct PanelMapElem_s { CVsVGuiWindowBase *m_pVGuiWindow; T *m_pPanel; };
typedef CUtlMap< CUtlString, PanelMapElem_s > PanelMap_t;
virtual void CreateVguiWindow( const char *pPanelName ) { T *pVGuiPanel = new T( NULL, pPanelName ); vgui::Frame *pFrame = dynamic_cast< vgui::Frame * >( pVGuiPanel );
if ( pFrame ) { pFrame->SetSizeable( false ); pFrame->SetCloseButtonVisible( false ); pFrame->SetMoveable( false );
CVsVGuiWindowBase *pVGuiWindow = CreateMayaVGuiWindow( pVGuiPanel, pPanelName );
const CUtlString panelName( pPanelName );
PanelMap_t::IndexType_t nIndex = m_panelMap.Find( panelName ); if ( m_panelMap.IsValidIndex( nIndex ) ) { merr << "[vsVguiWindow]: Panel \"" << pPanelName << "\" of Type: \"" << m_pWindowTypeName << "\" Already Exists!!!" << std::endl; } else { PanelMap_t::ElemType_t &element = m_panelMap.Element( m_panelMap.Insert( panelName ) ); element.m_pVGuiWindow = pVGuiWindow; element.m_pPanel = pVGuiPanel; } } }
virtual void DestroyVguiWindow( const char *pPanelName ) { PanelMap_t::IndexType_t nIndex = m_panelMap.Find( pPanelName ); if ( !m_panelMap.IsValidIndex( nIndex ) ) return;
PanelMap_t::ElemType_t &element = m_panelMap.Element( nIndex ); delete element.m_pPanel;
m_panelMap.Remove( CUtlString( pPanelName ) ); DestroyMayaVGuiWindow( pPanelName ); }
virtual vgui::Frame *GetVGuiPanel( const char *pPanelName = NULL ) { if ( pPanelName ) { PanelMap_t::IndexType_t nPanelIndex = m_panelMap.Find( CUtlString( pPanelName ) ); if ( m_panelMap.IsValidIndex( nPanelIndex ) ) return dynamic_cast< vgui::Frame * >( m_panelMap.Element( nPanelIndex ).m_pPanel ); } else if ( m_panelMap.Count() > 0 ) { return dynamic_cast< vgui::Frame * >( m_panelMap.Element( m_panelMap.FirstInorder() ).m_pPanel ); }
return NULL; }
virtual CVsVGuiWindowBase *GetVGuiWindow( const char *pPanelName = NULL ) { if ( pPanelName ) { PanelMap_t::IndexType_t nPanelIndex = m_panelMap.Find( CUtlString( pPanelName ) ); if ( m_panelMap.IsValidIndex( nPanelIndex ) ) return m_panelMap.Element( nPanelIndex ).m_pVGuiWindow; } else if ( m_panelMap.Count() > 0 ) { return m_panelMap.Element( m_panelMap.FirstInorder() ).m_pVGuiWindow; }
return NULL; }
private:
PanelMap_t m_panelMap; };
#define INSTALL_MAYA_VGUI_WINDOW( _className, _windowTypeName, _dccCommand ) \
static CVsVguiWindowFactory< _className > s_VsVguiWindowFactory##_className##( _windowTypeName, _dccCommand )
#endif // VSVGUIWINDOW_H
|