Files
2015-10-19 14:59:05 +02:00

131 lines
2.9 KiB
C++

#ifndef GUI_SLIDER_H__
#define GUI_SLIDER_H__
#include "GUI/TextureFrame.h"
#include "GUI/Button.h"
#include "GUI/EButtonPress.h"
#include "GUI/EButtonRelease.h"
#include "GUI/ESliderUpdate.h"
#include "Core/EMouseMove.h"
#include "Sound/EPlaySound.h"
namespace dd
{
namespace GUI
{
class Slider : public TextureFrame
{
public:
Slider(Frame* parent, std::string name)
: TextureFrame(parent, name)
{
m_SliderButton = new GUI::Button(this, "SliderButton");
m_SliderButton->DisableScissor();
EVENT_SUBSCRIBE_MEMBER(m_EButtonPress, &Slider::OnButtonPress);
EVENT_SUBSCRIBE_MEMBER(m_EButtonRelease, &Slider::OnButtonRelease);
EVENT_SUBSCRIBE_MEMBER(m_EMouseMove, &Slider::OnMouseMove);
}
float Percentage() const { return m_Percentage; }
void SetPercentage(const float percentage)
{
m_Percentage = percentage;
m_SliderButton->X = percentage * (Width - m_SliderButton->Width);
}
void SetTextureHover(std::string resourceName)
{
m_SliderButton->SetTextureHover(resourceName);
}
void SetTextureReleased(std::string resourceName)
{
m_SliderButton->SetTextureReleased(resourceName);
}
void SetTexturePressed(std::string resourceName)
{
m_SliderButton->SetTexturePressed(resourceName);
}
void AlignVertically()
{
m_SliderButton->Y = (Height / 2) - (m_SliderButton->Height / 2);
}
~Slider()
{
if (m_SliderButton != nullptr) {
delete m_SliderButton;
m_SliderButton = nullptr;
}
}
virtual void Update(double dt) override
{
}
private:
Button* m_SliderButton = nullptr;
bool m_IsGrabbed = false;
float m_Percentage = 0.f;
EventRelay<Frame, Events::ButtonPress> m_EButtonPress;
EventRelay<Frame, Events::ButtonRelease> m_EButtonRelease;
EventRelay<Frame, Events::MouseMove> m_EMouseMove;
virtual bool OnButtonPress(const Events::ButtonPress& event)
{
if (event.Button == m_SliderButton) {
m_IsGrabbed = true;
}
else {
Events::PlaySound e;
e.FilePath = "Sounds/GUI/click-n.wav";
EventBroker->Publish(e);
}
return true;
}
virtual bool OnButtonRelease(const Events::ButtonRelease& event)
{
if (event.Button == m_SliderButton) {
m_IsGrabbed = false;
}
return true;
}
virtual bool OnMouseMove(const Events::MouseMove& event)
{
if (m_IsGrabbed) {
// Set horizontal position
m_SliderButton->X += event.DeltaX;
if (m_SliderButton->Left() < Left()) {
m_SliderButton->SetLeft(Left());
} else if (m_SliderButton->Right() > Right()) {
m_SliderButton->SetRight(Right());
}
// Update percentage
float newPercentage = m_SliderButton->X / (float)(Width - m_SliderButton->Width);
Events::SliderUpdate e;
e.FrameName = Name();
e.Slider = this;
e.Percentage = newPercentage;
e.DeltaPercentage = newPercentage - m_Percentage;
EventBroker->Publish(e);
m_Percentage = newPercentage;
}
return true;
}
};
}
}
#endif