mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-10-30 07:46:03 +03:00
146 lines
3.7 KiB
C++
146 lines
3.7 KiB
C++
#include "ui/CSimpleSlider.hpp"
|
|
#include "math/Utils.hpp"
|
|
#include "ui/CSimpleSliderScript.hpp"
|
|
#include "util/Lua.hpp"
|
|
|
|
int32_t CSimpleSlider::s_metatable;
|
|
int32_t CSimpleSlider::s_objectType;
|
|
|
|
void CSimpleSlider::CreateScriptMetaTable() {
|
|
lua_State* L = FrameScript_GetContext();
|
|
int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleSlider::RegisterScriptMethods);
|
|
CSimpleSlider::s_metatable = ref;
|
|
}
|
|
|
|
int32_t CSimpleSlider::GetObjectType() {
|
|
if (!CSimpleSlider::s_objectType) {
|
|
CSimpleSlider::s_objectType = ++FrameScript_Object::s_objectTypes;
|
|
}
|
|
|
|
return CSimpleSlider::s_objectType;
|
|
}
|
|
|
|
void CSimpleSlider::RegisterScriptMethods(lua_State* L) {
|
|
CSimpleFrame::RegisterScriptMethods(L);
|
|
FrameScript_Object::FillScriptMethodTable(L, SimpleSliderMethods, NUM_SIMPLE_SLIDER_SCRIPT_METHODS);
|
|
}
|
|
|
|
FrameScript_Object::ScriptIx* CSimpleSlider::GetScriptByName(const char* name, ScriptData& data) {
|
|
auto parentScript = CSimpleFrame::GetScriptByName(name, data);
|
|
|
|
if (parentScript) {
|
|
return parentScript;
|
|
}
|
|
|
|
if (!SStrCmpI(name, "OnValueChanged", STORM_MAX_STR)) {
|
|
data.wrapper = "return function(self,value) %s end";
|
|
return &this->m_onValueChanged;
|
|
}
|
|
|
|
if (!SStrCmpI(name, "OnMinMaxChanged", STORM_MAX_STR)) {
|
|
data.wrapper = "return function(self,min,max) %s end";
|
|
return &this->m_onMinMaxChanged;
|
|
}
|
|
|
|
return nullptr;
|
|
}
|
|
|
|
int32_t CSimpleSlider::GetScriptMetaTable() {
|
|
return CSimpleSlider::s_metatable;
|
|
}
|
|
|
|
bool CSimpleSlider::IsA(int32_t type) {
|
|
return type == CSimpleSlider::s_objectType
|
|
|| type == CSimpleFrame::s_objectType
|
|
|| type == CScriptRegion::s_objectType
|
|
|| type == CScriptObject::s_objectType;
|
|
}
|
|
|
|
void CSimpleSlider::RunOnMinMaxChangedScript() {
|
|
if (!this->m_onMinMaxChanged.luaRef) {
|
|
return;
|
|
}
|
|
|
|
auto L = FrameScript_GetContext();
|
|
|
|
lua_pushnumber(L, this->m_baseValue);
|
|
lua_pushnumber(L, this->m_range + this->m_baseValue);
|
|
|
|
this->RunScript(this->m_onMinMaxChanged, 2, nullptr);
|
|
}
|
|
|
|
void CSimpleSlider::RunOnValueChangedScript() {
|
|
if (!this->m_onValueChanged.luaRef) {
|
|
return;
|
|
}
|
|
|
|
auto L = FrameScript_GetContext();
|
|
|
|
lua_pushnumber(L, this->m_value);
|
|
|
|
this->RunScript(this->m_onValueChanged, 1, nullptr);
|
|
}
|
|
|
|
void CSimpleSlider::SetMinMaxValues(float min, float max) {
|
|
float range = max - min;
|
|
|
|
if (this->m_rangeSet && AreEqual(this->m_range, range, WHOA_EPSILON_1) && AreEqual(this->m_baseValue, min, WHOA_EPSILON_1)) {
|
|
return;
|
|
}
|
|
|
|
this->m_baseValue = min;
|
|
this->m_range = range;
|
|
this->m_changed = 1;
|
|
this->m_rangeSet = 1;
|
|
|
|
this->RunOnMinMaxChangedScript();
|
|
|
|
if (this->m_valueSet) {
|
|
// Fit current value within range
|
|
this->SetValue(this->m_value);
|
|
}
|
|
}
|
|
|
|
void CSimpleSlider::SetValue(float value) {
|
|
if (!this->m_rangeSet) {
|
|
return;
|
|
}
|
|
|
|
auto v4 = value;
|
|
auto v5 = std::max(value, this->m_baseValue);
|
|
auto maxValue = this->m_range + this->m_baseValue;
|
|
|
|
if (maxValue >= v5) {
|
|
if (v4 < this->m_baseValue) {
|
|
v4 = this->m_baseValue;
|
|
}
|
|
} else {
|
|
v4 = maxValue;
|
|
}
|
|
|
|
auto newValue = this->Sub96BC10(v4);
|
|
|
|
// Clamp to max value
|
|
if (newValue + this->m_valueStep >= maxValue) {
|
|
newValue = maxValue;
|
|
}
|
|
|
|
// Clamp to base value
|
|
if (newValue - this->m_valueStep < this->m_baseValue) {
|
|
newValue = this->m_baseValue;
|
|
}
|
|
|
|
if (!this->m_valueSet || fabs(newValue - this->m_value) >= 0.00000023841858) {
|
|
this->m_value = newValue;
|
|
this->m_changed = 1;
|
|
this->m_valueSet = 1;
|
|
|
|
this->RunOnValueChangedScript();
|
|
}
|
|
}
|
|
|
|
float CSimpleSlider::Sub96BC10(float value) {
|
|
// TODO
|
|
return value;
|
|
}
|