//========= Copyright (c) 1996-2002, Valve LLC, All rights reserved. ============ // // Purpose: // // $NoKeywords: $ //============================================================================= #include "../cl_dll/hud.h" #include "../cl_dll/cl_util.h" #include "../cl_dll/vgui_teamfortressviewport.h" #include "vgui_actionsignal.h" #include "voice_vgui_tweakdlg.h" #include "voice_vgui_tweakdlg.h" #include "vgui_panel.h" #include "vgui_scrollbar.h" #include "vgui_slider.h" #include "ivoicetweak.h" #include "vgui_button.h" #include "vgui_checkbutton2.h" #include "vgui_helpers.h" #define ITEM_BORDER 40 // Border between text and scrollbars on left and right. #define VOICETWEAK_TRANSPARENCY 150 class TweakScroller { public: TweakScroller(); void Init( Panel *pParent, char *pText, int yPos ); // Get/set value. Values are 0-1. float GetValue(); void SetValue( float val ); public: Label m_Label; ScrollBar m_Scroll; Slider m_Slider; }; class CVoiceVGUITweakDlg : public CMenuPanel, public ICheckButton2Handler { typedef CMenuPanel BaseClass; public: CVoiceVGUITweakDlg(); ~CVoiceVGUITweakDlg(); // CMenuPanel overrides. virtual void Open(); virtual void Close(); // ICheckButton2Handler overrides. virtual void StateChanged(CCheckButton2 *pButton); // Panel overrides. virtual void paintBackground(); private: int m_DlgWidth; int m_DlgHeight; Label m_Label; IVoiceTweak *m_pVoiceTweak; // Engine voice tweak API. TweakScroller m_MicVolume; TweakScroller m_SpeakerVolume; CCheckButton2 m_VoiceModEnable; Button m_Button_OK; }; bool g_bTweakDlgOpen = false; bool IsTweakDlgOpen() { return g_bTweakDlgOpen; } // ------------------------------------------------------------------------ // // Global functions. // ------------------------------------------------------------------------ // static CVoiceVGUITweakDlg g_VoiceTweakDlg; CMenuPanel *GetVoiceTweakDlg() { return &g_VoiceTweakDlg; } class CVoiceTweakOKButton : public ActionSignal { public: virtual void actionPerformed( Panel *pPanel ) { gViewPort->HideVGUIMenu(); } }; CVoiceTweakOKButton g_OKButtonSignal; // ------------------------------------------------------------------------ // // TweakScroller // ------------------------------------------------------------------------ // TweakScroller::TweakScroller() : m_Label( "" ), m_Scroll( 0, 0, 0, 0, false ), m_Slider( 0, 0, 10, 10, false ) { } void TweakScroller::Init( Panel *pParent, char *pText, int yPos ) { int parentWidth, parentHeight; pParent->getSize( parentWidth, parentHeight ); // Setup the volume scroll bar. m_Label.setParent( pParent ); m_Label.setFont( Scheme::sf_primary1 ); m_Label.setContentAlignment( vgui::Label::a_northwest ); m_Label.setBgColor( 0, 0, 0, 255 ); m_Label.setFgColor( 255, 255, 255, 0 ); m_Label.setPos( ITEM_BORDER, yPos ); m_Label.setSize( parentWidth / 2 - ITEM_BORDER, 20 ); m_Label.setText( pText ); m_Label.setVisible( true ); m_Slider.setRangeWindow( 10 ); m_Slider.setRangeWindowEnabled( true ); m_Scroll.setPos( parentWidth / 2 + ITEM_BORDER, yPos ); m_Scroll.setSize( parentWidth / 2 - ITEM_BORDER * 2, 20 ); m_Scroll.setSlider( &m_Slider ); m_Scroll.setParent( pParent ); m_Scroll.setRange( 0, 100 ); m_Scroll.setFgColor( 255, 255, 255, 0 ); m_Scroll.setBgColor( 255, 255, 255, 0 ); } float TweakScroller::GetValue() { return m_Scroll.getValue() / 100.0f; } void TweakScroller::SetValue( float val ) { m_Scroll.setValue( (int)( val * 100.0f ) ); } // ------------------------------------------------------------------------ // // CVoiceVGUITweakDlg implementation. // ------------------------------------------------------------------------ // CVoiceVGUITweakDlg::CVoiceVGUITweakDlg() : CMenuPanel( VOICETWEAK_TRANSPARENCY, false, 0, 0, 0, 0 ), m_Button_OK( "", 0, 0 ), m_Label( "" ) { m_pVoiceTweak = NULL; m_Button_OK.addActionSignal( &g_OKButtonSignal ); m_Label.setBgColor( 255, 255, 255, 200 ); } CVoiceVGUITweakDlg::~CVoiceVGUITweakDlg() { } void CVoiceVGUITweakDlg::Open() { if( g_bTweakDlgOpen ) return; g_bTweakDlgOpen = true; m_DlgWidth = ScreenWidth; m_DlgHeight = ScreenHeight; m_pVoiceTweak = gEngfuncs.pVoiceTweak; // Tell the engine to start voice tweak mode (pipe voice output right to speakers). m_pVoiceTweak->StartVoiceTweakMode(); // Set our size. setPos( ( ScreenWidth - m_DlgWidth ) / 2, ( ScreenHeight - m_DlgHeight ) / 2 ); setSize( m_DlgWidth, m_DlgHeight ); int curY = ITEM_BORDER; m_MicVolume.Init( this, gHUD.m_TextMessage.BufferedLocaliseTextString( "#Mic_Volume" ), curY ); m_MicVolume.SetValue( m_pVoiceTweak->GetControlFloat( MicrophoneVolume ) ); curY = PanelBottom( &m_MicVolume.m_Label ); m_SpeakerVolume.Init( this, gHUD.m_TextMessage.BufferedLocaliseTextString( "#Speaker_Volume" ), curY ); m_SpeakerVolume.SetValue( m_pVoiceTweak->GetControlFloat( OtherSpeakerScale ) ); curY = PanelBottom( &m_SpeakerVolume.m_Label ); m_VoiceModEnable.setParent( this ); m_VoiceModEnable.SetImages( "gfx/vgui/checked.tga", "gfx/vgui/unchecked.tga" ); m_VoiceModEnable.SetText( "Enable Voice In This Mod" ); m_VoiceModEnable.setPos( ITEM_BORDER, curY ); m_VoiceModEnable.SetCheckboxLeft( false ); m_VoiceModEnable.SetChecked( !!gEngfuncs.pfnGetCvarFloat( "voice_modenable" ) ); m_VoiceModEnable.SetHandler( this ); // Setup the OK button. int buttonWidth, buttonHeight; m_Button_OK.setText( gHUD.m_TextMessage.BufferedLocaliseTextString( "#Menu_OK" ) ); m_Button_OK.getSize( buttonWidth, buttonHeight ); m_Button_OK.setPos(( m_DlgWidth - buttonWidth ) / 2, m_DlgHeight - buttonHeight - 3 ); m_Button_OK.setParent( this ); // Put the label on the top. m_Label.setBgColor( 0, 0, 0, 255 ); m_Label.setFgColor( 255, 255, 255, 0 ); m_Label.setText( gHUD.m_TextMessage.BufferedLocaliseTextString( "#Voice_Properties" ) ); int labelWidth, labelHeight; m_Label.getSize( labelWidth, labelHeight ); m_Label.setPos( ( m_DlgWidth - labelWidth ) / 2, 5 ); m_Label.setParent( this ); BaseClass::Open(); } void CVoiceVGUITweakDlg::Close() { m_pVoiceTweak->EndVoiceTweakMode(); g_bTweakDlgOpen = false; BaseClass::Close(); } void CVoiceVGUITweakDlg::paintBackground() { BaseClass::paintBackground(); // Draw our border. int w, h; getSize( w, h ); drawSetColor( 128, 128, 128, 1 ); drawOutlinedRect( 0, 0, w, h ); float volume = m_MicVolume.GetValue(); m_pVoiceTweak->SetControlFloat( MicrophoneVolume, volume ); m_pVoiceTweak->SetControlFloat( OtherSpeakerScale, m_SpeakerVolume.GetValue() ); } void CVoiceVGUITweakDlg::StateChanged( CCheckButton2 *pButton ) { if( pButton == &m_VoiceModEnable ) { if( pButton->IsChecked() ) gEngfuncs.pfnClientCmd( "voice_modenable 1" ); else gEngfuncs.pfnClientCmd( "voice_modenable 0" ); } }