class OptionSelectorSlider extends OptionSelectorSliderSetup
{
protected bool m_Changed;
protected EditBoxWidget m_ValueText;
protected bool m_ShowEditbox;
protected float m_LastValue;
void OptionSelectorSlider(Widget parent, float value, ScriptedWidgetEventHandler parent_menu, bool disabled, float min, float max, bool showEditbox = false)
{
if (!showEditbox)
{
m_Root = g_Game.GetWorkspace().CreateWidgets("gui/layouts/new_ui/option_slider.layout", parent);
}
else
{
m_Root = g_Game.GetWorkspace().CreateWidgets("gui/layouts/new_ui/option_slider_editbox.layout", parent);
m_ValueText = EditBoxWidget.Cast(m_Root.FindAnyWidget("option_value_text"));
m_ValueText.Enable(false);
#ifdef PLATFORM_CONSOLE
m_ValueText.SetFlags(WidgetFlags.IGNOREPOINTER);
#endif
}
#ifdef PLATFORM_CONSOLE
m_Parent = parent.GetParent().GetParent();
#else
#ifdef PLATFORM_WINDOWS
m_Parent = parent.GetParent();
#endif
#endif
m_MinValue = min;
m_MaxValue = max;
m_SelectorType = 1;
m_ParentClass = parent_menu;
m_Slider = SliderWidget.Cast(m_Root.FindAnyWidget("option_value"));
SetValue(value);
m_LastValue = GetValue();
m_ShowEditbox = showEditbox;
Enable();
if (showEditbox)
{
SetValueText();
}
m_Parent.SetHandler(this);
}
void SetValueText()
{
float percentage = Math.Round(GetRangePercantageByValue());
m_ValueText.SetText(percentage.ToString());
}
void Refresh(float defaultValue = -1)
{
if (m_ShowEditbox)
{
if (m_ValueText.GetText() == "" && defaultValue > -1)
{
SetValue(defaultValue);
SetValueText();
}
}
m_Changed = false;
}
float GetRangePercantageByValue()
{
float percentage = ((GetValue() - m_MinValue) * 100) / (m_MaxValue - m_MinValue);
return percentage;
}
override bool OnChange(Widget w, int x, int y, bool finished)
{
float value;
if (w == m_Slider)
{
if (m_ShowEditbox)
{
SetValueText();
}
value = GetValue();
m_OptionChanged.Invoke(value);
m_LastValue = value;
return true;
}
else if (m_ShowEditbox && w == m_ValueText)
{
if (IsValidEditboxValue(m_ValueText.GetText()))
{
value = (m_ValueText.GetText().ToFloat() * (m_MaxValue - m_MinValue) / 100) + m_MinValue;
m_Slider.SetCurrent(NormalizeInput(value));
m_OptionChanged.Invoke(GetValue());
return true;
}
else
{
m_ValueText.SetText("");
Refresh();
return true;
}
}
return false;
}
bool Changed()
{
return m_Changed;
}
bool IsValidEditboxValue(string text)
{
TStringArray allowedCharacters = {"0","1","2","3","4","5","6","7","8","9"};
for (int i = 0; i < text.Length(); i++)
{
int foundIndex = allowedCharacters.Find(text.Get(i));
if (foundIndex == -1)
return false;
// make sure user input value can not contain zeros only
if (i > 0 && text.ToInt() == 0)
{
return false;
}
}
// make sure user input value is in valid percantage range (0 - 100)
if (text.ToInt() > 100 || text.ToInt() < 0)
{
return false;
}
return true;
}
override bool OnDoubleClick(Widget w, int x, int y, int button)
{
#ifndef PLATFORM_CONSOLE
if (m_ShowEditbox && w == m_ValueText)
{
m_ValueText.Enable(true);
SetFocus(m_ValueText);
m_LastValue = GetValue();
m_ValueText.SetText("");
m_ValueText.SetTextColor(ARGB(255, 255, 0, 0));
SetActiveOption();
return true;
}
#endif
return false;
}
override bool OnFocus(Widget w, int x, int y)
{
if (m_ShowEditbox)
{
m_LastValue = GetValue();
UpdateActiveOption();
SetActiveOption();
}
#ifdef PLATFORM_CONSOLE
return super.OnFocus(m_Parent, x, y);
#else
return false;
#endif
}
override bool OnFocusLost(Widget w, int x, int y)
{
if (m_ShowEditbox && w == m_ValueText)
{
m_ValueText.Enable(false);
UpdateActiveOption();
}
return super.OnFocusLost(w, x, y);
}
override bool IsFocusable(Widget w)
{
if (m_ShowEditbox && w)
{
return (w == m_Parent || w == m_Slider || w == m_ValueText);
}
return super.IsFocusable(w);
}
override bool OnMouseLeave(Widget w, Widget enterW, int x, int y)
{
#ifdef PLATFORM_CONSOLE
if (ButtonWidget.Cast(w))
{
ColorNormalConsole(w);
}
#else
if (m_ShowEditbox && m_ValueText.GetText() == "")
{
Refresh(m_LastValue);
}
#endif
return super.OnMouseLeave(w, enterW, x, y);
}
void SetActiveOption()
{
OptionsMenuControls menuControls = OptionsMenuControls.Cast(m_ParentClass);
if (menuControls)
{
menuControls.SetActiveOption(this);
}
}
void UpdateActiveOption()
{
OptionsMenuControls menuControls = OptionsMenuControls.Cast(m_ParentClass);
if (menuControls && menuControls.GetActiveOption())
{
OptionSelectorSlider optionSlider = OptionSelectorSlider.Cast(menuControls.GetActiveOption());
if (!optionSlider || !optionSlider.IsValueTextVisible())
return;
optionSlider.Update();
}
}
void Update()
{
m_ValueText.SetTextColor(ARGB(255, 255, 255, 255));
if (m_ValueText.GetText() == "")
Refresh(m_LastValue);
}
bool IsValueTextVisible()
{
return m_ShowEditbox;
}
}