//========= Copyright © 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");
	}
}