Portable Half-Life SDK. GoldSource and Xash3D. Crossplatform.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
6.5 KiB

9 years ago
//========= Copyright <EFBFBD> 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.
public:
virtual void Open();
virtual void Close();
// ICheckButton2Handler overrides.
public:
virtual void StateChanged(CCheckButton2 *pButton);
// Panel overrides.
public:
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");
}
}