//----------------------------------------------------------------------------- // Purpose: Text chat input/output hud element //----------------------------------------------------------------------------- CBaseHudChat::CBaseHudChat( const char *pElementName ) : CHudElement( pElementName ), BaseClass( NULL, "HudChat" ) { vgui::Panel *pParent = g_pClientMode->GetViewport(); SetParent( pParent ); vgui::HScheme scheme = vgui::scheme()->LoadSchemeFromFileEx( enginevgui->GetPanel( PANEL_CLIENTDLL ), "resource/ClientScheme.res", "ClientScheme"); SetScheme(scheme); m_nMessageMode = 0; CBaseHudChatLine *line = m_ChatLines[ 0 ]; if ( line ) { vgui::HFont font = line->GetFont(); m_iFontHeight = vgui::surface()->GetFontTall( font ) + 2; // Put input area at bottom int w, h; GetSize( w, h ); m_pChatInput->SetBounds( 1, h - m_iFontHeight - 1, w-2, m_iFontHeight ); } if ( IsPC() ) { vgui::ivgui()->AddTickSignal( GetVPanel() ); } // (We don't actually want input until they bring up the chat line). MakePopup(); SetZPos( -30 ); SetHiddenBits( HIDEHUD_CHAT ); }
//----------------------------------------------------------------------------- // Purpose: // Input : width - // *text - // textlen - // Output : int //----------------------------------------------------------------------------- int CBaseHudChat::ComputeBreakChar( int width, const char *text, int textlen ) { #ifndef _XBOX CBaseHudChatLine *line = m_ChatLine; vgui::HFont font = line->GetFont(); int currentlen = 0; int lastbreak = textlen; for (int i = 0; i < textlen ; i++) { char ch = text[i]; if ( ch <= 32 ) { lastbreak = i; } wchar_t wch[2]; g_pVGuiLocalize->ConvertANSIToUnicode( &ch, wch, sizeof( wch ) ); int a,b,c; vgui::surface()->GetCharABCwide(font, wch[0], a, b, c); currentlen += a + b + c; if ( currentlen >= width ) { // If we haven't found a whitespace char to break on before getting // to the end, but it's still too long, break on the character just before // this one if ( lastbreak == textlen ) { lastbreak = max( 0, i - 1 ); } break; } } if ( currentlen >= width ) { return lastbreak; } return textlen; #else return 0; #endif }
//----------------------------------------------------------------------------- // Purpose: Do respositioning here to avoid latency due to repositioning of vgui // voice manager icon panel //----------------------------------------------------------------------------- void CBaseHudChat::OnTick( void ) { #ifndef _XBOX m_nVisibleHeight = 0; CBaseHudChatLine *line = m_ChatLine; if ( line ) { vgui::HFont font = line->GetFont(); m_iFontHeight = vgui::surface()->GetFontTall( font ) + 2; // Put input area at bottom int iChatX, iChatY, iChatW, iChatH; int iInputX, iInputY, iInputW, iInputH; m_pChatInput->GetBounds( iInputX, iInputY, iInputW, iInputH ); GetBounds( iChatX, iChatY, iChatW, iChatH ); m_pChatInput->SetBounds( iInputX, iChatH - (m_iFontHeight * 1.75), iInputW, m_iFontHeight ); //Resize the History Panel so it fits more lines depending on the screen resolution. int iChatHistoryX, iChatHistoryY, iChatHistoryW, iChatHistoryH; GetChatHistory()->GetBounds( iChatHistoryX, iChatHistoryY, iChatHistoryW, iChatHistoryH ); iChatHistoryH = (iChatH - (m_iFontHeight * 2.25)) - iChatHistoryY; GetChatHistory()->SetBounds( iChatHistoryX, iChatHistoryY, iChatHistoryW, iChatHistoryH ); } FadeChatHistory(); #endif }
//----------------------------------------------------------------------------- // Purpose: Do respositioning here to avoid latency due to repositioning of vgui // voice manager icon panel //----------------------------------------------------------------------------- void CBaseHudChat::OnTick( void ) { #ifndef _XBOX int i; for ( i = 0; i < CHAT_INTERFACE_LINES; i++ ) { CBaseHudChatLine *line = m_ChatLines[ i ]; if ( !line ) continue; if ( !line->IsVisible() ) continue; if ( !line->IsReadyToExpire() ) continue; line->Expire(); } int w, h; GetSize( w, h ); CBaseHudChatLine *line = m_ChatLines[ 0 ]; if ( line ) { vgui::HFont font = line->GetFont(); if ( font ) { m_iFontHeight = vgui::surface()->GetFontTall( font ) + 2; // Put input area at bottom int w, h; GetSize( w, h ); m_pChatInput->SetBounds( 1, h - m_iFontHeight - 1, w-2, m_iFontHeight ); } } // Sort chat lines qsort( m_ChatLines, CHAT_INTERFACE_LINES, sizeof( CBaseHudChatLine * ), SortLines ); // Step backward from bottom int currentY = h - m_iFontHeight - 1; int startY = currentY; int ystep = m_iFontHeight; currentY -= GetChatInputOffset(); // Walk backward for ( i = CHAT_INTERFACE_LINES - 1; i >= 0 ; i-- ) { CBaseHudChatLine *line = m_ChatLines[ i ]; if ( !line ) continue; if ( !line->IsVisible() ) { line->SetSize( w, m_iFontHeight ); continue; } line->PerformFadeout(); line->SetSize( w, m_iFontHeight * line->GetNumLines() ); line->SetPos( 0, ( currentY+m_iFontHeight) - m_iFontHeight * line->GetNumLines() ); currentY -= ystep * line->GetNumLines(); } if ( currentY != startY ) { m_nVisibleHeight = startY - currentY + 2; } else { m_nVisibleHeight = 0; } vgui::surface()->MovePopupToBack( GetVPanel() ); #endif }