Index: source/gui/CSlider.h =================================================================== --- source/gui/CSlider.h +++ source/gui/CSlider.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2019 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -53,6 +53,10 @@ CPos m_Mouse; float m_ButtonSide; + + float GetSliderRatio() const; + + void IncrementallyChangeValue(float value); }; #endif // INCLUDED_CSLIDER Index: source/gui/CSlider.cpp =================================================================== --- source/gui/CSlider.cpp +++ source/gui/CSlider.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2017 Wildfire Games. +/* Copyright (C) 2019 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -44,6 +44,17 @@ { } +float CSlider::GetSliderRatio() const +{ + return (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); +} + +void CSlider::IncrementallyChangeValue(float difference) +{ + m_Value = Clamp(m_Value + difference, m_MinValue, m_MaxValue); + UpdateValue(); +} + void CSlider::HandleMessage(SGUIMessage& Message) { switch (Message.type) @@ -75,11 +86,10 @@ } case GUIM_MOUSE_PRESS_LEFT: { - if (GetButtonRect().PointInside(GetMousePos())) - { - m_Mouse = GetMousePos(); - m_IsPressed = true; - } + m_Mouse = GetMousePos(); + m_IsPressed = true; + + IncrementallyChangeValue((m_Mouse.x - GetButtonRect().CenterPoint().x) * GetSliderRatio()); break; } case GUIM_MOUSE_RELEASE_LEFT: @@ -93,11 +103,9 @@ m_IsPressed = false; if (m_IsPressed) { - float ratio = (m_MaxValue - m_MinValue) / (m_CachedActualSize.GetWidth() - m_ButtonSide); - float difference = float(GetMousePos().x - m_Mouse.x) * ratio; + float difference = float(GetMousePos().x - m_Mouse.x) * GetSliderRatio(); m_Mouse = GetMousePos(); - m_Value = Clamp(m_Value + difference, m_MinValue, m_MaxValue); - UpdateValue(); + IncrementallyChangeValue(difference); } break; } @@ -127,7 +135,7 @@ } void CSlider::UpdateValue() -{ +{ GUI::SetSetting(this, "value", m_Value); ScriptEvent("valuechange"); }