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.
244 lines
7.0 KiB
244 lines
7.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: The main manager of the UI |
|
// |
|
// $Revision: $ |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
|
|
#include "uimanager.h" |
|
#include "legion.h" |
|
#include "appframework/vguimatsysapp.h" |
|
#include "vgui/IVGui.h" |
|
#include "vgui/ISurface.h" |
|
#include "VGuiMatSurface/IMatSystemSurface.h" |
|
#include "vgui_controls/controls.h" |
|
#include "vgui/ILocalize.h" |
|
#include "vgui_controls/EditablePanel.h" |
|
#include "vgui_controls/AnimationController.h" |
|
#include "filesystem.h" |
|
#include "tier3/tier3.h" |
|
#include "vgui_controls/consoledialog.h" |
|
#include "inputmanager.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Console dialog for use in legion |
|
//----------------------------------------------------------------------------- |
|
class CLegionConsoleDialog : public vgui::CConsoleDialog |
|
{ |
|
DECLARE_CLASS_SIMPLE( CLegionConsoleDialog, vgui::CConsoleDialog ); |
|
|
|
public: |
|
CLegionConsoleDialog( vgui::Panel *pParent, const char *pName ); |
|
virtual ~CLegionConsoleDialog(); |
|
|
|
virtual void OnClose(); |
|
MESSAGE_FUNC_CHARPTR( OnCommandSubmitted, "CommandSubmitted", command ); |
|
}; |
|
|
|
|
|
CLegionConsoleDialog::CLegionConsoleDialog( vgui::Panel *pParent, const char *pName ) : BaseClass ( pParent, pName ) |
|
{ |
|
AddActionSignalTarget( this ); |
|
} |
|
|
|
CLegionConsoleDialog::~CLegionConsoleDialog() |
|
{ |
|
g_pUIManager->HideConsole( ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// A command was sent by the console |
|
//----------------------------------------------------------------------------- |
|
void CLegionConsoleDialog::OnCommandSubmitted( const char *pCommand ) |
|
{ |
|
g_pInputManager->AddCommand( pCommand ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Deals with close |
|
//----------------------------------------------------------------------------- |
|
void CLegionConsoleDialog::OnClose() |
|
{ |
|
g_pUIManager->HideConsole( ); |
|
} |
|
|
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Singleton accessor |
|
//----------------------------------------------------------------------------- |
|
static CUIManager s_UIManager; |
|
extern CUIManager *g_pUIManager = &s_UIManager; |
|
|
|
|
|
static const char *s_pRootPanelNames[UI_ROOT_PANEL_COUNT] = |
|
{ |
|
"RootGamePanel", |
|
"RootMenuPanel", |
|
"RootToolsPanel", |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Constructor |
|
//----------------------------------------------------------------------------- |
|
CUIManager::CUIManager() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Init, shutdown |
|
//----------------------------------------------------------------------------- |
|
bool CUIManager::Init() |
|
{ |
|
COMPILE_TIME_ASSERT( sizeof(s_pRootPanelNames) / sizeof(const char*) == UI_ROOT_PANEL_COUNT ); |
|
|
|
// load the base localization file |
|
if (! vgui::scheme()->LoadSchemeFromFile("resource/legion.res", "Legion" ) ) |
|
return false; |
|
|
|
vgui::filesystem()->AddSearchPath( "platform", "PLATFORM" ); |
|
vgui::localize()->AddFile( vgui::filesystem(), "Resource/vgui_%language%.txt" ); |
|
|
|
// start vgui |
|
g_pVGui->Start(); |
|
|
|
// Run a frame to get the embedded panel to be the right size |
|
g_pVGui->RunFrame(); |
|
|
|
int w, h; |
|
m_hEmbeddedPanel = g_pVGuiSurface->GetEmbeddedPanel(); |
|
vgui::ipanel()->GetSize( m_hEmbeddedPanel, w, h ); |
|
|
|
// add our root panels |
|
for ( int i = 0; i < UI_ROOT_PANEL_COUNT; ++i ) |
|
{ |
|
m_pRootPanels[i] = new vgui::EditablePanel( NULL, s_pRootPanelNames[i] ); |
|
m_pRootPanels[i]->SetParent( m_hEmbeddedPanel ); |
|
m_pRootPanels[i]->SetZPos( i ); |
|
m_pRootPanels[i]->SetBounds( 0, 0, w, h ); |
|
m_pRootPanels[i]->SetPaintBorderEnabled( false ); |
|
m_pRootPanels[i]->SetPaintBackgroundEnabled( false ); |
|
m_pRootPanels[i]->SetPaintEnabled( false ); |
|
m_pRootPanels[i]->SetKeyBoardInputEnabled( i != UI_ROOT_GAME ); |
|
m_pRootPanels[i]->SetMouseInputEnabled( i != UI_ROOT_GAME ); |
|
m_pRootPanels[i]->SetVisible( false ); |
|
m_pRootPanels[i]->SetCursor( vgui::dc_crosshair ); |
|
m_pRootPanels[i]->SetAutoResize( vgui::Panel::PIN_TOPLEFT, vgui::Panel::AUTORESIZE_DOWNANDRIGHT, 0, 0, 0, 0 ); |
|
} |
|
|
|
m_hConsole = NULL; |
|
|
|
vgui::surface()->Invalidate( m_hEmbeddedPanel ); |
|
return true; |
|
} |
|
|
|
void CUIManager::Shutdown() |
|
{ |
|
g_pVGui->Stop(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Sets particular root panels to be visible |
|
//----------------------------------------------------------------------------- |
|
void CUIManager::EnablePanel( UIRootPanel_t id, bool bEnable ) |
|
{ |
|
m_pRootPanels[id]->SetVisible( bEnable ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Toggles the console |
|
//----------------------------------------------------------------------------- |
|
void CUIManager::ToggleConsole( const CCommand &args ) |
|
{ |
|
if ( !m_hConsole.Get() ) |
|
{ |
|
m_hConsole = new CLegionConsoleDialog( m_pRootPanels[UI_ROOT_TOOLS], "Console" ); |
|
|
|
// set the console to taking up most of the right-half of the screen |
|
int swide, stall; |
|
vgui::surface()->GetScreenSize(swide, stall); |
|
int offset = vgui::scheme()->GetProportionalScaledValue(16); |
|
|
|
m_hConsole->SetBounds( |
|
swide / 2 - (offset * 4), |
|
offset, |
|
(swide / 2) + (offset * 3), |
|
stall - (offset * 8)); |
|
|
|
m_hConsole->SetVisible( false ); |
|
} |
|
|
|
bool bMakeVisible = !m_hConsole->IsVisible(); |
|
EnablePanel( UI_ROOT_TOOLS, bMakeVisible ); |
|
if ( bMakeVisible ) |
|
{ |
|
m_hConsole->Activate(); |
|
} |
|
else |
|
{ |
|
m_hConsole->Hide(); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Hides the console |
|
//----------------------------------------------------------------------------- |
|
void CUIManager::HideConsole() |
|
{ |
|
EnablePanel( UI_ROOT_TOOLS, false ); |
|
if ( m_hConsole.Get() ) |
|
{ |
|
m_hConsole->SetVisible( false ); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Per-frame update |
|
//----------------------------------------------------------------------------- |
|
void CUIManager::Update( ) |
|
{ |
|
vgui::GetAnimationController()->UpdateAnimations( IGameManager::CurrentTime() ); |
|
g_pVGui->RunFrame(); |
|
if ( !g_pVGui->IsRunning() ) |
|
{ |
|
IGameManager::Stop(); |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Attempt to process an input event, return true if it sholdn't be chained to the rest of the game |
|
//----------------------------------------------------------------------------- |
|
bool CUIManager::ProcessInputEvent( const InputEvent_t& event ) |
|
{ |
|
return g_pMatSystemSurface->HandleInputEvent( event ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Draws the UI |
|
//----------------------------------------------------------------------------- |
|
void CUIManager::DrawUI() |
|
{ |
|
g_pVGuiSurface->PaintTraverseEx( m_hEmbeddedPanel, true ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Push, pop menus |
|
//----------------------------------------------------------------------------- |
|
vgui::Panel *CUIManager::GetRootPanel( UIRootPanel_t id ) |
|
{ |
|
return m_pRootPanels[id]; |
|
} |
|
|
|
|