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 | |||||
{ | |||||
return (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); | |||||
} | |||||
void CSlider::IncrementallyChangeValue(const float difference) | void CSlider::IncrementallyChangeValue(const float difference) | ||||
{ | { | ||||
m_Value = Clamp(m_Value + difference, m_MinValue, m_MaxValue); | m_Value = Clamp(m_Value + difference, m_MinValue, m_MaxValue); | ||||
UpdateValue(); | 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… | |||||
elexisAuthorUnsubmitted 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 float ratio = (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); | ||||
IncrementallyChangeValue((m_Mouse.x - GetButtonRect().CenterPoint().x) * GetSliderRatio()); | const float value = ((m_pGUI.GetMousePos().x - m_CachedActualSize.left) * ratio); | ||||
const float valueStep = value - fmod(value , m_StepSize); | |||||
m_Value = Clamp(valueStep, m_MinValue, m_MaxValue); | |||||
UpdateValue(); | |||||
naniUnsubmitted 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 ? | |||||
elexisAuthorUnsubmitted Done Inline Actionsyes elexis: yes | |||||
} | } | ||||
break; | break; | ||||
} | } | ||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
Show All 10 Lines | |||||
void CSlider::UpdateValue() | void CSlider::UpdateValue() | ||||
{ | { | ||||
SetSetting<float>("value", m_Value, true); | SetSetting<float>("value", m_Value, 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 float 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 float x = m_CachedActualSize.left + ratio * (m_CachedActualSize.GetWidth() - m_ButtonSide); | ||||
float y = m_CachedActualSize.top + (m_CachedActualSize.GetHeight() - m_ButtonSide) / 2.0; | const float 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?