#include "cbase.h" #include "ChatEchoPanel.h" #include #include "ienginevgui.h" #include #include #include "hud_element_helper.h" #include "hud_basechat.h" #include "asw_hud_chat.h" #include "vgui_controls/AnimationController.h" #include #include "clientmode_asw.h" class CHudChat; // memdbgon must be the last include file in a .cpp file!!! #include CASWChatHistoryEcho::CASWChatHistoryEcho( vgui::Panel *pParent, const char *panelName ) : BaseClass( pParent, "HudChatHistory" ) { vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/SwarmSchemeNew.res", "SwarmSchemeNew"); SetScheme(scheme); InsertFade( -1, -1 ); } void CASWChatHistoryEcho::ApplySchemeSettings( vgui::IScheme *pScheme ) { BaseClass::ApplySchemeSettings( pScheme ); SetPaintBackgroundEnabled(false); SetFont( pScheme->GetFont( "Default", IsProportional() ) ); SetAlpha( 255 ); Msg( "set history echo to %d\n", IsProportional() ); } ChatEchoPanel::ChatEchoPanel(vgui::Panel *parent, const char *name) : vgui::Panel(parent, name) { m_pChatInputLine = new vgui::RichText(this, "EchoChatInputLine"); //m_pChatHistory = new CASWChatHistoryEcho(this, "EchoChatHistory"); m_pChatHistory = NULL; if (m_pChatHistory) { m_pChatHistory->SetMaximumCharCount( 127 * 100 ); } m_InputBuffer[0] = '\0'; m_hFont = vgui::INVALID_FONT; SetMouseInputEnabled(true); // hijack the chat! CHudChat *pHUDChat = dynamic_cast(GET_HUDELEMENT( CHudChat )); if (pHUDChat) { //pHUDChat->HijackChat(this); } } ChatEchoPanel::~ChatEchoPanel() { // give it back CHudChat *pHUDChat = dynamic_cast(GET_HUDELEMENT( CHudChat )); if (pHUDChat) { //pHUDChat->ReturnChat(this); } } void asw_return_chat_f() { ChatEchoPanel *pEcho = dynamic_cast(GetClientMode()->GetViewport()->FindChildByName("ChatEchoPanel", true)); if (!pEcho) { Msg("failed to find echo panel\n"); return; } // give it back CHudChat *pHUDChat = dynamic_cast(GET_HUDELEMENT( CHudChat )); if (pHUDChat) { //pHUDChat->ReturnChat(pEcho); } } ConCommand asw_return_chat("asw_return_chat", asw_return_chat_f); void ChatEchoPanel::ApplySchemeSettings(vgui::IScheme *pScheme) { BaseClass::ApplySchemeSettings(pScheme); m_hFont = pScheme->GetFont( "Default", IsProportional() ); m_pChatInputLine->SetFont(m_hFont); int line_tall = vgui::surface()->GetFontTall(m_hFont); m_pChatInputLine->SetTall(line_tall); m_pChatInputLine->SetVerticalScrollbar(false); m_pChatInputLine->SetVisible(false); } bool ChatEchoPanel::AddCursorToBuffer(wchar_t *buffer, int &iCursorPos, bool bFlash) { int integer_time = gpGlobals->curtime; if (!bFlash || (fabs(gpGlobals->curtime - integer_time) < 0.25f || (fabs(gpGlobals->curtime - integer_time) > 0.5f && fabs(gpGlobals->curtime - integer_time) < 0.75f))) { buffer[iCursorPos] = L'|'; iCursorPos++; return true; } return false; } void ChatEchoPanel::OnThink() { CBaseHudChat *pHUDChat = (CBaseHudChat *)GET_HUDELEMENT( CHudChat ); if (!pHUDChat) return; // ASWTODO - Unprotect all the hud chat stuff so this code below works - or figure out a better way of showing the chat during the various frames // copying the chat input line CBaseHudChatInputLine *pChatInput = pHUDChat->GetChatInput(); if ( pChatInput) { vgui::TextEntry *pTextEntry = dynamic_cast(pChatInput->GetInputPanel()); vgui::Label *pPrompt = pChatInput->GetPrompt(); if (pTextEntry) { wchar_t buffer[256]; pTextEntry->GetText(buffer, sizeof(buffer)); bool bInputVisible = (pChatInput->IsVisible() && pTextEntry->IsVisible() && pChatInput->GetAlpha() > 200 && pTextEntry->GetAlpha() > 200); //if (Q_strcmp(buffer, m_InputBuffer)) { pTextEntry->GetText(m_InputBuffer, sizeof(m_InputBuffer)); if (bInputVisible) { // grab our prompt (or use a default) wchar_t prompt[64]; if (pPrompt) pPrompt->GetText(prompt, sizeof(prompt)); else { char promptbuffer[8]; Q_snprintf(promptbuffer, sizeof(promptbuffer), "Say: "); g_pVGuiLocalize->ConvertANSIToUnicode(promptbuffer, prompt, sizeof( prompt )); } // copy x chars around the cursor into our echo const int max_copy_chars = 54; int line_length = wcslen(m_InputBuffer); int cursor_pos = 0; if (pTextEntry) cursor_pos = pTextEntry->GetTextCursorPos(); int copy_start = MAX((cursor_pos + 20) - max_copy_chars, 0); int copy_end = copy_start + max_copy_chars; if (copy_end > line_length) { int diff = copy_end - line_length; copy_start = MAX(copy_start - diff, 0); copy_end = MIN(copy_start + max_copy_chars, line_length); } // copy the prompt over int prompt_len = wcslen(prompt); int iCopyCursor = 0; for (int i=0;i= 253) // make sure we don't go over out limit for safety (never should though) iCopyCursor = 253; buffer[iCopyCursor] = m_InputBuffer[i]; iCopyCursor++; if (i == (cursor_pos-1)) { bAddedCursor |= AddCursorToBuffer(buffer, iCopyCursor, (cursor_pos == copy_end)); // if cursor is at the end, we can flash it } } // make sure we've added the cursor if (!bAddedCursor) AddCursorToBuffer(buffer, iCopyCursor, true); //if (copy_start == copy_end) //{ //if (fabs(gpGlobals->curtime - integer_time) < 0.25f || //(fabs(gpGlobals->curtime - integer_time) > 0.5f //&& fabs(gpGlobals->curtime - integer_time) < 0.75f)) //{ //buffer[iCopyCursor] = L'|'; //iCopyCursor++; //} //} buffer[iCopyCursor] = L'\0'; //if //Q_snprintf(buffer, sizeof(buffer), "%s %s", prompt, m_InputBuffer); //else //Q_snprintf(buffer, sizeof(buffer), "%s %s|", prompt, m_InputBuffer); m_pChatInputLine->SetText(buffer); m_pChatInputLine->SetVisible(true); } else { m_pChatInputLine->SetText(m_InputBuffer); } } if (m_pChatInputLine->IsVisible() != bInputVisible) m_pChatInputLine->SetVisible(bInputVisible); } else { if (m_pChatInputLine->IsVisible()) m_pChatInputLine->SetVisible(false); } } /* // copying the chat history if ( pHUDChat->GetChatHistory() ) { CHudChatHistory *pHistory = pHUDChat->GetChatHistory(); //pHistory->GetText(0, m_InputBuffer, sizeof(m_InputBuffer) * sizeof(wchar_t)); pHistory->GetEndOfText(ASW_CHAT_ECHO_HISTORY_WCHARS-1, m_InputBuffer, ASW_CHAT_ECHO_HISTORY_WCHARS); if (m_pChatHistory) { if (pHistory->IsVisible()) { m_pChatHistory->SetText(m_InputBuffer); m_pChatHistory->SetVisible(true); m_pChatHistory->SetPaintBorderEnabled( false ); m_pChatHistory->GotoTextEnd(); m_pChatHistory->SetMouseInputEnabled( false ); } else { m_pChatHistory->SetVisible(false); } } } */ } void ChatEchoPanel::PerformLayout() { float history_w = ScreenWidth() * 0.625f; float w = ScreenWidth() * 0.86f; int iLines = 4; if (ScreenHeight() <= 480) iLines = 3; //else if (ScreenHeight() <= 600) int line_tall = ScreenHeight() * 0.02f; if (m_hFont != vgui::INVALID_FONT) { line_tall = vgui::surface()->GetFontTall(m_hFont); } float h = line_tall * (iLines + 1.75f); SetSize(w, h); //Msg("ChatEchoPanel::PerformLayout line_tall=%d h=%f ScreenHeight=%d inputliney=%f\n", //line_tall, h, ScreenHeight(), float(line_tall) * (iLines + 0.5f)); int x, y; GetPos(x, y); SetPos(x, ScreenHeight() - h); // centre the input line in whatever gap is left beneath our 4 chat lines m_pChatInputLine->SetBounds(0, line_tall * (iLines + 0.5f), w, line_tall+10); //Resize the History Panel so it fits more lines depending on the screen resolution. int iChatHistoryX, iChatHistoryY, iChatHistoryW, iChatHistoryH; if (m_pChatHistory) { m_pChatHistory->GetBounds( iChatHistoryX, iChatHistoryY, iChatHistoryW, iChatHistoryH ); iChatHistoryH = line_tall * iLines; m_pChatHistory->SetBounds( 0, (h - line_tall) - iChatHistoryH, history_w, iChatHistoryH ); } }