/*
	GWEN
	Copyright (c) 2010 Facepunch Studios
	See license in Gwen.h
*/

#pragma once
#ifndef GWEN_CONTROLS_SLIDER_H
#define GWEN_CONTROLS_SLIDER_H

#include "Gwen/Controls/Base.h"
#include "Gwen/Controls/Button.h"
#include "Gwen/Controls/Dragger.h"
#include "Gwen/Gwen.h"
#include "Gwen/Skin.h"

namespace Gwen
{
namespace ControlsInternal
{
class GWEN_EXPORT SliderBar : public ControlsInternal::Dragger
{
	GWEN_CONTROL(SliderBar, ControlsInternal::Dragger);

	virtual void Render(Skin::Base* skin);
};
}  // namespace ControlsInternal

namespace Controls
{
class GWEN_EXPORT Slider : public Base
{
	GWEN_CONTROL(Slider, Base);

	virtual void Render(Skin::Base* skin) = 0;
	virtual void Layout(Skin::Base* skin);

	virtual void SetClampToNotches(bool bClamp) { m_bClampToNotches = bClamp; }

	virtual void SetNotchCount(int num) { m_iNumNotches = num; }
	virtual int GetNotchCount() { return m_iNumNotches; }

	virtual void SetRange(float fMin, float fMax);
	virtual float GetRangeMin() const
	{
		return m_fMin;
	}
	virtual float GetRangeMax() const
	{
		return m_fMax;
	}
	virtual float GetValue();
	virtual void SetValue(float val, bool forceUpdate = true);

	virtual float CalculateValue();
	virtual void OnMoved(Controls::Base* control);

	virtual void OnMouseClickLeft(int /*x*/, int /*y*/, bool /*bDown*/){};

	virtual bool OnKeyRight(bool bDown)
	{
		if (bDown) SetValue(GetValue() + 1, true);
		return true;
	}
	virtual bool OnKeyLeft(bool bDown)
	{
		if (bDown) SetValue(GetValue() - 1, true);
		return true;
	}
	virtual bool OnKeyUp(bool bDown)
	{
		if (bDown) SetValue(GetValue() + 1, true);
		return true;
	}
	virtual bool OnKeyDown(bool bDown)
	{
		if (bDown) SetValue(GetValue() - 1, true);
		return true;
	}

	virtual void RenderFocus(Gwen::Skin::Base* skin);

	Gwen::Event::Caller onValueChanged;

protected:
	virtual void SetValueInternal(float fVal);
	virtual void UpdateBarFromValue() = 0;

	ControlsInternal::SliderBar* m_SliderBar;
	bool m_bClampToNotches;
	int m_iNumNotches;
	float m_fValue;

	float m_fMin;
	float m_fMax;
};
}  // namespace Controls

}  // namespace Gwen
#endif
