summaryrefslogtreecommitdiff
path: root/game/client/hud_basechat.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/hud_basechat.h')
-rw-r--r--game/client/hud_basechat.h439
1 files changed, 439 insertions, 0 deletions
diff --git a/game/client/hud_basechat.h b/game/client/hud_basechat.h
new file mode 100644
index 0000000..cf5c3f1
--- /dev/null
+++ b/game/client/hud_basechat.h
@@ -0,0 +1,439 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef HUD_BASECHAT_H
+#define HUD_BASECHAT_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "hudelement.h"
+#include <vgui_controls/Panel.h>
+#include "vgui_basepanel.h"
+#include "vgui_controls/Frame.h"
+#include <vgui_controls/TextEntry.h>
+#include <vgui_controls/RichText.h>
+#include <vgui_controls/Button.h>
+#include <vgui_controls/CheckButton.h>
+
+class CBaseHudChatInputLine;
+class CBaseHudChatEntry;
+class CHudChatFilterPanel;
+
+namespace vgui
+{
+ class IScheme;
+};
+
+#define CHATLINE_NUM_FLASHES 8.0f
+#define CHATLINE_FLASH_TIME 5.0f
+#define CHATLINE_FADE_TIME 1.0f
+
+#define CHAT_HISTORY_FADE_TIME 0.25f
+#define CHAT_HISTORY_IDLE_TIME 15.0f
+#define CHAT_HISTORY_IDLE_FADE_TIME 2.5f
+#define CHAT_HISTORY_ALPHA 127
+
+extern Color g_ColorBlue;
+extern Color g_ColorRed;
+extern Color g_ColorGreen;
+extern Color g_ColorDarkGreen;
+extern Color g_ColorYellow;
+extern Color g_ColorGrey;
+
+extern ConVar cl_showtextmsg;
+
+enum ChatFilters
+{
+ CHAT_FILTER_NONE = 0,
+ CHAT_FILTER_JOINLEAVE = 0x000001,
+ CHAT_FILTER_NAMECHANGE = 0x000002,
+ CHAT_FILTER_PUBLICCHAT = 0x000004,
+ CHAT_FILTER_SERVERMSG = 0x000008,
+ CHAT_FILTER_TEAMCHANGE = 0x000010,
+ //=============================================================================
+ // HPE_BEGIN:
+ // [tj]Added a filter for achievement announce
+ //=============================================================================
+
+ CHAT_FILTER_ACHIEVEMENT = 0x000020,
+
+ //=============================================================================
+ // HPE_END
+ //=============================================================================
+};
+
+
+//-----------------------------------------------------------------------------
+enum TextColor
+{
+ COLOR_NORMAL = 1,
+ COLOR_USEOLDCOLORS = 2,
+ COLOR_PLAYERNAME = 3,
+ COLOR_LOCATION = 4,
+ COLOR_ACHIEVEMENT = 5,
+ COLOR_CUSTOM = 6, // Will use the most recently SetCustomColor()
+ COLOR_HEXCODE = 7, // Reads the color from the next six characters
+ COLOR_HEXCODE_ALPHA = 8,// Reads the color and alpha from the next eight characters
+ COLOR_MAX
+};
+
+//--------------------------------------------------------------------------------------------------------------
+struct TextRange
+{
+ TextRange() { preserveAlpha = false; }
+ int start;
+ int end;
+ Color color;
+ bool preserveAlpha;
+};
+
+void StripEndNewlineFromString( char *str );
+void StripEndNewlineFromString( wchar_t *str );
+
+char* ConvertCRtoNL( char *str );
+wchar_t* ConvertCRtoNL( wchar_t *str );
+wchar_t* ReadLocalizedString( bf_read &msg, OUT_Z_BYTECAP(outSizeInBytes) wchar_t *pOut, int outSizeInBytes, bool bStripNewline, OUT_Z_CAP(originalSize) char *originalString = NULL, int originalSize = 0 );
+wchar_t* ReadChatTextString( bf_read &msg, OUT_Z_BYTECAP(outSizeInBytes) wchar_t *pOut, int outSizeInBytes );
+char* RemoveColorMarkup( char *str );
+
+//--------------------------------------------------------------------------------------------------------
+/**
+ * Simple utility function to allocate memory and duplicate a wide string
+ */
+inline wchar_t *CloneWString( const wchar_t *str )
+{
+ const int nLen = V_wcslen(str)+1;
+ wchar_t *cloneStr = new wchar_t [ nLen ];
+ const int nSize = nLen * sizeof( wchar_t );
+ V_wcsncpy( cloneStr, str, nSize );
+ return cloneStr;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: An output/display line of the chat interface
+//-----------------------------------------------------------------------------
+class CBaseHudChatLine : public vgui::RichText
+{
+ typedef vgui::RichText BaseClass;
+
+public:
+ CBaseHudChatLine( vgui::Panel *parent, const char *panelName );
+ ~CBaseHudChatLine();
+
+ void SetExpireTime( void );
+
+ bool IsReadyToExpire( void );
+
+ void Expire( void );
+
+ float GetStartTime( void );
+
+ int GetCount( void );
+
+ virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
+
+ vgui::HFont GetFont() { return m_hFont; }
+
+ Color GetTextColor( void ) { return m_clrText; }
+ void SetNameLength( int iLength ) { m_iNameLength = iLength; }
+ void SetNameColor( Color cColor ){ m_clrNameColor = cColor; }
+
+ virtual void PerformFadeout( void );
+ virtual void InsertAndColorizeText( wchar_t *buf, int clientIndex );
+ virtual void Colorize( int alpha = 255 ); ///< Re-inserts the text in the appropriate colors at the given alpha
+
+
+ void SetNameStart( int iStart ) { m_iNameStart = iStart; }
+
+protected:
+ int m_iNameLength;
+ vgui::HFont m_hFont;
+
+ Color m_clrText;
+ Color m_clrNameColor;
+
+ float m_flExpireTime;
+
+ CUtlVector< TextRange > m_textRanges;
+ wchar_t *m_text;
+
+ int m_iNameStart;
+
+private:
+ float m_flStartTime;
+ int m_nCount;
+
+ vgui::HFont m_hFontMarlett;
+
+
+private:
+ CBaseHudChatLine( const CBaseHudChatLine & ); // not defined, not accessible
+};
+
+
+class CHudChatHistory : public vgui::RichText
+{
+ DECLARE_CLASS_SIMPLE( CHudChatHistory, vgui::RichText );
+public:
+
+ CHudChatHistory( vgui::Panel *pParent, const char *panelName );
+
+ virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
+};
+
+class CHudChatFilterButton : public vgui::Button
+{
+ DECLARE_CLASS_SIMPLE( CHudChatFilterButton, vgui::Button );
+
+public:
+
+ CHudChatFilterButton( vgui::Panel *pParent, const char *pName, const char *pText );
+
+ virtual void DoClick( void );
+};
+
+class CHudChatFilterCheckButton : public vgui::CheckButton
+{
+ DECLARE_CLASS_SIMPLE( CHudChatFilterCheckButton, vgui::CheckButton );
+
+public:
+
+ CHudChatFilterCheckButton( vgui::Panel *pParent, const char *pName, const char *pText, int iFlag );
+
+ int GetFilterFlag( void ) { return m_iFlag; }
+
+private:
+
+ int m_iFlag;
+};
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+class CBaseHudChat : public CHudElement, public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CBaseHudChat, vgui::EditablePanel );
+public:
+ DECLARE_MULTIPLY_INHERITED();
+
+ enum
+ {
+ CHAT_INTERFACE_LINES = 6,
+ MAX_CHARS_PER_LINE = 128
+ };
+
+ CBaseHudChat( const char *pElementName );
+
+ virtual void CreateChatInputLine( void );
+ virtual void CreateChatLines( void );
+
+ virtual void Init( void );
+
+ void LevelInit( const char *newmap );
+ void LevelShutdown( void );
+
+ void MsgFunc_TextMsg(const char *pszName, int iSize, void *pbuf);
+
+ virtual void Printf( int iFilter, PRINTF_FORMAT_STRING const char *fmt, ... );
+ virtual void ChatPrintf( int iPlayerIndex, int iFilter, PRINTF_FORMAT_STRING const char *fmt, ... ) FMTFUNCTION( 4, 5 );
+
+ virtual void StartMessageMode( int iMessageModeType );
+ virtual void StopMessageMode( void );
+ void Send( void );
+
+ MESSAGE_FUNC( OnChatEntrySend, "ChatEntrySend" );
+ MESSAGE_FUNC( OnChatEntryStopMessageMode, "ChatEntryStopMessageMode" );
+
+ virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
+ virtual void Paint( void );
+ virtual void OnTick( void );
+ virtual void Reset();
+#ifdef _XBOX
+ virtual bool ShouldDraw();
+#endif
+ vgui::Panel *GetInputPanel( void );
+
+ static int m_nLineCounter;
+
+ virtual int GetChatInputOffset( void );
+
+ // IGameEventListener interface:
+ virtual void FireGameEvent( IGameEvent *event);
+
+ CHudChatHistory *GetChatHistory();
+
+ void FadeChatHistory();
+ float m_flHistoryFadeTime;
+ float m_flHistoryIdleTime;
+
+ virtual void MsgFunc_SayText( bf_read &msg );
+ virtual void MsgFunc_SayText2( bf_read &msg );
+ virtual void MsgFunc_TextMsg( bf_read &msg );
+ virtual void MsgFunc_VoiceSubtitle( bf_read &msg );
+
+
+ CBaseHudChatInputLine *GetChatInput( void ) { return m_pChatInput; }
+ CHudChatFilterPanel *GetChatFilterPanel( void );
+
+ virtual int GetFilterFlags( void ) { return m_iFilterFlags; }
+ void SetFilterFlag( int iFilter );
+
+ //-----------------------------------------------------------------------------
+ virtual Color GetDefaultTextColor( void );
+ virtual Color GetTextColorForClient( TextColor colorNum, int clientIndex );
+ virtual Color GetClientColor( int clientIndex );
+
+ virtual int GetFilterForString( const char *pString );
+
+ virtual const char *GetDisplayedSubtitlePlayerName( int clientIndex );
+
+ bool IsVoiceSubtitle( void ) { return m_bEnteringVoice; }
+ void SetVoiceSubtitleState( bool bState ) { m_bEnteringVoice = bState; }
+ int GetMessageMode( void ) { return m_nMessageMode; }
+
+ void SetCustomColor( Color colNew ) { m_ColorCustom = colNew; }
+ void SetCustomColor( const char *pszColorName );
+
+protected:
+ CBaseHudChatLine *FindUnusedChatLine( void );
+
+ CBaseHudChatInputLine *m_pChatInput;
+ CBaseHudChatLine *m_ChatLine;
+ int m_iFontHeight;
+
+ CHudChatHistory *m_pChatHistory;
+
+ CHudChatFilterButton *m_pFiltersButton;
+ CHudChatFilterPanel *m_pFilterPanel;
+
+ Color m_ColorCustom;
+
+private:
+ void Clear( void );
+
+ int ComputeBreakChar( int width, const char *text, int textlen );
+
+ int m_nMessageMode;
+
+ int m_nVisibleHeight;
+
+ vgui::HFont m_hChatFont;
+
+ int m_iFilterFlags;
+ bool m_bEnteringVoice;
+
+};
+
+class CBaseHudChatEntry : public vgui::TextEntry
+{
+ typedef vgui::TextEntry BaseClass;
+public:
+ CBaseHudChatEntry( vgui::Panel *parent, char const *panelName, vgui::Panel *pChat )
+ : BaseClass( parent, panelName )
+ {
+ SetCatchEnterKey( true );
+ SetAllowNonAsciiCharacters( true );
+ SetDrawLanguageIDAtLeft( true );
+ m_pHudChat = pChat;
+ }
+
+ virtual void ApplySchemeSettings( vgui::IScheme *pScheme )
+ {
+ BaseClass::ApplySchemeSettings(pScheme);
+
+ SetPaintBorderEnabled( false );
+ }
+
+ virtual void OnKeyCodeTyped(vgui::KeyCode code)
+ {
+ if ( code == KEY_ENTER || code == KEY_PAD_ENTER || code == KEY_ESCAPE )
+ {
+ if ( code != KEY_ESCAPE )
+ {
+ if ( m_pHudChat )
+ {
+ PostMessage( m_pHudChat, new KeyValues("ChatEntrySend") );
+ }
+ }
+
+ // End message mode.
+ if ( m_pHudChat )
+ {
+ PostMessage( m_pHudChat, new KeyValues("ChatEntryStopMessageMode") );
+ }
+ }
+ else if ( code == KEY_TAB )
+ {
+ // Ignore tab, otherwise vgui will screw up the focus.
+ return;
+ }
+ else
+ {
+ BaseClass::OnKeyCodeTyped( code );
+ }
+ }
+
+private:
+ vgui::Panel *m_pHudChat;
+};
+
+//-----------------------------------------------------------------------------
+// Purpose: The prompt and text entry area for chat messages
+//-----------------------------------------------------------------------------
+class CBaseHudChatInputLine : public vgui::Panel
+{
+ typedef vgui::Panel BaseClass;
+
+public:
+ CBaseHudChatInputLine( vgui::Panel *parent, char const *panelName );
+
+ void SetPrompt( const wchar_t *prompt );
+ void ClearEntry( void );
+ void SetEntry( const wchar_t *entry );
+ void GetMessageText( OUT_Z_BYTECAP(buffersizebytes) wchar_t *buffer, int buffersizebytes );
+
+ virtual void PerformLayout();
+ virtual void ApplySchemeSettings(vgui::IScheme *pScheme);
+
+ vgui::Panel *GetInputPanel( void );
+ virtual vgui::VPANEL GetCurrentKeyFocus() { return m_pInput->GetVPanel(); }
+
+ virtual void Paint()
+ {
+ BaseClass::Paint();
+ }
+
+ vgui::Label *GetPrompt( void ) { return m_pPrompt; }
+
+protected:
+ vgui::Label *m_pPrompt;
+ CBaseHudChatEntry *m_pInput;
+};
+
+
+class CHudChatFilterPanel : public vgui::EditablePanel
+{
+ DECLARE_CLASS_SIMPLE( CHudChatFilterPanel, vgui::EditablePanel );
+
+public:
+
+ CHudChatFilterPanel( vgui::Panel *pParent, const char *pName );
+
+ virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
+ MESSAGE_FUNC_PTR( OnFilterButtonChecked, "CheckButtonChecked", panel );
+
+ CBaseHudChat *GetChatParent( void ) { return dynamic_cast < CBaseHudChat * > ( GetParent() ); }
+
+ virtual void SetVisible(bool state);
+
+private:
+
+};
+
+#endif // HUD_BASECHAT_H