csgo-2018-source/public/maya/vsvguiwindow.h
2021-07-24 21:11:47 -07:00

196 lines
5.4 KiB
C++

//===== 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