Changeset View
Changeset View
Standalone View
Standalone View
source/gui/ObjectTypes/CSlider.cpp
Show All 25 Lines | |||||
CSlider::CSlider(CGUI& pGUI) | CSlider::CSlider(CGUI& pGUI) | ||||
: IGUIObject(pGUI), | : IGUIObject(pGUI), | ||||
IGUIButtonBehavior(*static_cast<IGUIObject*>(this)), | IGUIButtonBehavior(*static_cast<IGUIObject*>(this)), | ||||
m_ButtonSide(), | m_ButtonSide(), | ||||
m_CellID(), | m_CellID(), | ||||
m_MaxValue(), | m_MaxValue(), | ||||
m_MinValue(), | m_MinValue(), | ||||
m_StepSize(), | |||||
m_Sprite(), | m_Sprite(), | ||||
m_SpriteBar(), | m_SpriteBar(), | ||||
m_Value() | m_Value() | ||||
{ | { | ||||
RegisterSetting("button_width", m_ButtonSide); | RegisterSetting("button_width", m_ButtonSide); | ||||
RegisterSetting("cell_id", m_CellID); | RegisterSetting("cell_id", m_CellID); | ||||
RegisterSetting("max_value", m_MaxValue); | RegisterSetting("max_value", m_MaxValue); | ||||
RegisterSetting("min_value", m_MinValue); | RegisterSetting("min_value", m_MinValue); | ||||
RegisterSetting("step_size", m_StepSize); | |||||
RegisterSetting("sprite", m_Sprite); | RegisterSetting("sprite", m_Sprite); | ||||
RegisterSetting("sprite_bar", m_SpriteBar); | RegisterSetting("sprite_bar", m_SpriteBar); | ||||
RegisterSetting("value", m_Value); | RegisterSetting("value", m_Value); | ||||
m_Value = Clamp(m_Value, m_MinValue, m_MaxValue); | m_Value = Clamp(m_Value, m_MinValue, m_MaxValue); | ||||
} | } | ||||
CSlider::~CSlider() | CSlider::~CSlider() | ||||
{ | { | ||||
} | } | ||||
void CSlider::ResetStates() | void CSlider::ResetStates() | ||||
{ | { | ||||
IGUIObject::ResetStates(); | IGUIObject::ResetStates(); | ||||
IGUIButtonBehavior::ResetStates(); | IGUIButtonBehavior::ResetStates(); | ||||
} | } | ||||
float CSlider::GetSliderRatio() const | void CSlider::IncrementallyChangeValue(const double difference) | ||||
{ | { | ||||
return (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); | UpdateValue(Clamp(m_Value + difference, m_MinValue, m_MaxValue)); | ||||
} | |||||
void CSlider::IncrementallyChangeValue(const float difference) | |||||
{ | |||||
m_Value = Clamp(m_Value + difference, m_MinValue, m_MaxValue); | |||||
UpdateValue(); | |||||
} | } | ||||
void CSlider::HandleMessage(SGUIMessage& Message) | void CSlider::HandleMessage(SGUIMessage& Message) | ||||
{ | { | ||||
IGUIObject::HandleMessage(Message); | IGUIObject::HandleMessage(Message); | ||||
IGUIButtonBehavior::HandleMessage(Message); | IGUIButtonBehavior::HandleMessage(Message); | ||||
switch (Message.type) | switch (Message.type) | ||||
{ | { | ||||
case GUIM_SETTINGS_UPDATED: | case GUIM_SETTINGS_UPDATED: | ||||
{ | { | ||||
m_Value = Clamp(m_Value, m_MinValue, m_MaxValue); | m_Value = Clamp(m_Value, m_MinValue, m_MaxValue); | ||||
break; | break; | ||||
} | } | ||||
case GUIM_MOUSE_WHEEL_DOWN: | case GUIM_MOUSE_WHEEL_DOWN: | ||||
{ | { | ||||
if (m_Pressed) | if (m_Pressed) | ||||
break; | break; | ||||
IncrementallyChangeValue(-0.01f); | IncrementallyChangeValue(-m_StepSize); | ||||
nani: What if stepSize is 0? Ideally it should then displace a width of 1 pixel screen in slider… | |||||
Done Inline Actionsm_StepSize is the distance between two adjacent values, so it must (will have to) be != 0 elexis: m_StepSize is the distance between two adjacent values, so it must (will have to) be != 0 | |||||
break; | break; | ||||
} | } | ||||
case GUIM_MOUSE_WHEEL_UP: | case GUIM_MOUSE_WHEEL_UP: | ||||
{ | { | ||||
if (m_Pressed) | if (m_Pressed) | ||||
break; | break; | ||||
IncrementallyChangeValue(0.01f); | IncrementallyChangeValue(+m_StepSize); | ||||
break; | break; | ||||
} | } | ||||
case GUIM_MOUSE_PRESS_LEFT: | case GUIM_MOUSE_PRESS_LEFT: | ||||
FALLTHROUGH; | FALLTHROUGH; | ||||
case GUIM_MOUSE_MOTION: | case GUIM_MOUSE_MOTION: | ||||
{ | { | ||||
if (m_Pressed) | if (m_Pressed) | ||||
{ | { | ||||
m_Mouse = m_pGUI.GetMousePos(); | const double ratio = (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); | ||||
IncrementallyChangeValue((m_Mouse.x - GetButtonRect().CenterPoint().x) * GetSliderRatio()); | const double value = ((m_pGUI.GetMousePos().x - m_CachedActualSize.left - m_ButtonSide / 2.f) * ratio) + m_MinValue; | ||||
const double valueStep = round(value / m_StepSize) * m_StepSize; | |||||
UpdateValue(Clamp(valueStep, m_MinValue, m_MaxValue)); | |||||
} | } | ||||
Not Done Inline ActionsShould it update (send event) if the value remains the same ? nani: Should it update (send event) if the value remains the same ? | |||||
Done Inline Actionsyes elexis: yes | |||||
break; | break; | ||||
} | } | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
void CSlider::Draw() | void CSlider::Draw() | ||||
{ | { | ||||
CRect slider_line(m_CachedActualSize); | CRect slider_line(m_CachedActualSize); | ||||
slider_line.left += m_ButtonSide / 2.0f; | slider_line.left += m_ButtonSide / 2.0f; | ||||
slider_line.right -= m_ButtonSide / 2.0f; | slider_line.right -= m_ButtonSide / 2.0f; | ||||
float bz = GetBufferedZ(); | float bz = GetBufferedZ(); | ||||
m_pGUI.DrawSprite(m_SpriteBar, m_CellID, bz, slider_line); | m_pGUI.DrawSprite(m_SpriteBar, m_CellID, bz, slider_line); | ||||
m_pGUI.DrawSprite(m_Sprite, m_CellID, bz, GetButtonRect()); | m_pGUI.DrawSprite(m_Sprite, m_CellID, bz, GetButtonRect()); | ||||
} | } | ||||
void CSlider::UpdateValue() | void CSlider::UpdateValue(const double value) | ||||
{ | { | ||||
SetSetting<float>("value", m_Value, true); | if (value == m_Value) | ||||
return; | |||||
const float numPlaces = -round(log10(m_StepSize)); | |||||
const float num = std::max(1.f, pow(10.f, numPlaces)); | |||||
SetSetting<double>("value", round(value * num) / num, true); | |||||
ScriptEvent(EventNameValueChange); | ScriptEvent(EventNameValueChange); | ||||
} | } | ||||
CRect CSlider::GetButtonRect() const | CRect CSlider::GetButtonRect() const | ||||
{ | { | ||||
float ratio = m_MaxValue > m_MinValue ? (m_Value - m_MinValue) / (m_MaxValue - m_MinValue) : 0.0f; | const double ratio = m_MaxValue > m_MinValue ? (m_Value - m_MinValue) / (m_MaxValue - m_MinValue) : 0.0f; | ||||
float x = m_CachedActualSize.left + ratio * (m_CachedActualSize.GetWidth() - m_ButtonSide); | const double x = m_CachedActualSize.left + ratio * (m_CachedActualSize.GetWidth() - m_ButtonSide); | ||||
float y = m_CachedActualSize.top + (m_CachedActualSize.GetHeight() - m_ButtonSide) / 2.0; | const double y = m_CachedActualSize.top + (m_CachedActualSize.GetHeight() - m_ButtonSide) / 2.0; | ||||
return CRect(x, y, x + m_ButtonSide, y + m_ButtonSide); | return CRect(x, y, x + m_ButtonSide, y + m_ButtonSide); | ||||
} | } | ||||
Not Done Inline Actionsconst float is rather inconsistent with the rest of the C++ codebase and seems to bring little. wraitii: `const float` is rather inconsistent with the rest of the C++ codebase and seems to bring… |
Wildfire Games · Phabricator
What if stepSize is 0? Ideally it should then displace a width of 1 pixel screen in slider coordinates?