|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: CLCD Manages the Logitech G-Series Gaming Keyboard LCD
//
// $NoKeywords: $
//=============================================================================//
#ifndef HUD_LCD_H
#define HUD_LCD_H
#ifdef _WIN32
#pragma once
#endif
#include "tier1/utlvector.h"
#include "tier1/utlstring.h"
#include "tier1/utldict.h"
#include "ihudlcd.h"
class KeyValues; class IG15; class C_BasePlayer;
enum { LCDITEM_UNKNOWN = 0, LCDITEM_PAGE, LCDITEM_TEXT, LCDITEM_ICON, LCDITEM_AGGREGATE, // Made up of subitems
};
// Aggregate item types
enum { AGGTYPE_UNKNOWN = 0, AGGTYPE_PERPLAYER, AGGTYPE_PERTEAM, };
class CLCDItem { public: CLCDItem() : m_bActive( true ), m_nSubPage( 0 ), m_Type( LCDITEM_UNKNOWN ), m_Handle( 0 ), x( 0 ), y( 0 ), w( 0 ), h( 0 ) { }
virtual ~CLCDItem() {}
virtual void Create( IG15 *lcd ) = 0; virtual void Wipe( IG15 *lcd );
bool m_bActive; int m_Type; void *m_Handle; int x, y, w, h;
int m_nSubPage;
CUtlVector< CLCDItem * > m_Children; };
class CLCDItemText : public CLCDItem { typedef CLCDItem BaseClass; public: CLCDItemText() : m_bHasWildcard( false ), m_iSize( 0 ), m_iAlign( 0 ) { m_Type = LCDITEM_TEXT; }
virtual void Create( IG15 *lcd );
CUtlString m_OriginalText; bool m_bHasWildcard; int m_iSize; int m_iAlign; };
class CLCDItemIcon : public CLCDItem { typedef CLCDItem BaseClass;
public: CLCDItemIcon() : m_icon( NULL ) { m_Type = LCDITEM_ICON; }
virtual void Create( IG15 *lcd );
CUtlString m_IconName; void *m_icon; };
class CLCDItemAggregate : public CLCDItem { typedef CLCDItem BaseClass;
public: CLCDItemAggregate() : m_AggType( AGGTYPE_UNKNOWN ), m_dwNextUpdateTime( 0 ), m_yincrement( 0 ) { m_Type = LCDITEM_AGGREGATE; }
virtual void Create( IG15 *lcd ); virtual void Wipe( IG15 *lcd );
void WipeChildrenOnly( IG15 *lcd );
unsigned int m_dwNextUpdateTime; int m_AggType; int m_yincrement;
// Representative row
CUtlVector< CLCDItem * > m_Definition; };
class CLCDPage : public CLCDItem { public: CLCDPage() : m_bSubItem( false ), m_bTitlePage( false ), m_bRequiresPlayer( false ), m_nSubPageCount( 1 ) { m_Type = LCDITEM_PAGE; }
~CLCDPage() { }
virtual void Create( IG15 *lcd ) { }
CLCDItem *Alloc( int type ) { CLCDItem *item = NULL;
switch ( type ) { default: break; case LCDITEM_PAGE: // This shouldn't occur
break; case LCDITEM_TEXT: item = new CLCDItemText(); break; case LCDITEM_ICON: item = new CLCDItemIcon(); break; case LCDITEM_AGGREGATE: item = new CLCDItemAggregate(); break; }
if ( item ) { return item; }
Assert( 0 ); return NULL; }
void InitFromKeyValues( KeyValues *kv );
bool m_bSubItem; bool m_bTitlePage; bool m_bRequiresPlayer; int m_nSubPageCount; };
//-----------------------------------------------------------------------------
// Purpose: Manages the Logitech G-Series Gaming Keyboard LCD
//-----------------------------------------------------------------------------
class CLCD : public IHudLCD { public: CLCD(); ~CLCD();
// Implement IHudLCD
virtual void SetGlobalStat( char const *name, char const *value ); virtual void AddChatLine( char const *txt );
// Exposed as a ConCommand
void Reload(); void DumpPlayer();
public:
// Init's called when the HUD's created at DLL load
void Init( void ); void Shutdown(); void Update( void ); bool IsConnected() const;
private:
CLCDItemIcon *ParseItemIcon( CLCDPage *page, bool bCreateHandles, KeyValues *sub ); CLCDItemText *ParseItemText( CLCDPage *page, bool bCreateHandles, KeyValues *sub ); void ParseItems_R( CLCDPage *page, bool bCreateHandles, KeyValues *kv, CUtlVector< CLCDItem * >& list );
void ParsePage( KeyValues *kv ); void ParseIconMappings( KeyValues *kv ); void ParseReplacements( KeyValues *kv ); void DisplayCurrentPage( unsigned int dwCurTime );
void ShowItems_R( CLCDPage *page, unsigned int dwCurTime, CUtlVector< CLCDItem * >& list, bool show );
int FindTitlePage(); void BuildUpdatedText( char const *in, CUtlString& out ); void LookupToken( char const *token, CUtlString& value ); bool ExtractArrayIndex( char *str, size_t bufsize, int *index );
bool Replace( CUtlString& str, char const *search, char const *replace ); void DoGlobalReplacements( CUtlString& str ); void ReduceParentheses( CUtlString& str );
bool IsPageValid( int currentPage, C_BasePlayer *player ); void UpdateChat();
IG15 *m_lcd ;
CUtlString m_Title; int m_Size[ 2 ]; CUtlVector< CLCDPage * > m_Pages; int m_nCurrentPage; int m_nSubPage; int m_nMaxChatHistory;
CUtlDict< int, int > m_TextSizes; CUtlDict< int, int > m_TextAlignments; struct IconInfo_t { void *m_handle; };
CUtlDict< IconInfo_t, int > m_Icons; bool m_bHadPlayer;
CUtlDict< CUtlString, int > m_GlobalStats; CUtlVector< CUtlString > m_ChatHistory;
unsigned int m_dwNextUpdateTime; CSysModule *m_pG15Module; CreateInterfaceFn m_G15Factory; };
extern CLCD gLCD;
#endif // HUD_LCD_H
|