import elements.BaseGuiElement; import elements.GuiCheckbox; import elements.GuiText; import elements.GuiScrollbar; import elements.GuiSpinbox; import elements.GuiTextbox; import elements.GuiDropdown; class GuiToggleOption : BaseGuiElement { GuiCheckbox@ check; GuiToggleOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos); _GuiToggleOption(text); } GuiToggleOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos); _GuiToggleOption(text); } void _GuiToggleOption(const string& text) { @check = GuiCheckbox(this, Alignment_Fill(), text); updateAbsolutePosition(); } bool onGuiEvent(const GuiEvent& event) { if(event.caller is check && event.type == GUI_Changed) { emitChanged(); if(check.checked) check.textColor = colors::White; else check.textColor = Color(0x888888ff); return true; } return BaseGuiElement::onGuiEvent(event); } bool get() { return check.checked; } void set(bool value) { check.checked = value; if(check.checked) check.textColor = colors::White; else check.textColor = Color(0x888888ff); } }; funcdef void settingChanged(); class GuiSliderOption : BaseGuiElement { GuiScrollbar@ bar; GuiText@ label; GuiText@ value; settingChanged@ onChanged; GuiSliderOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos); _GuiSliderOption(text); } GuiSliderOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos); _GuiSliderOption(text); } void _GuiSliderOption(const string& text) { @label = GuiText(this, recti(), text); @label.alignment = Alignment(Left, Top, Left+0.4f, Bottom); @value = GuiText(this, recti()); @value.alignment = Alignment(Right-74, Top, Right-0.0f-4, Bottom); value.horizAlign = 1.0; @bar = GuiScrollbar(this, recti()); @bar.alignment = Alignment(Left+0.4f+4, Top+1, Right-0.0f-78, Bottom-1); bar.up.visible = false; bar.down.visible = false; bar.orientation = SO_Horizontal; updateAbsolutePosition(); } bool onGuiEvent(const GuiEvent& event) { if(event.caller is bar && event.type == GUI_Changed) { value.text = toString(bar.pos, 1); if(onChanged !is null) onChanged(); emitChanged(); return true; } return BaseGuiElement::onGuiEvent(event); } double get() { return round(bar.pos * 10.0) / 10.0; } void set(double val) { bar.pos = val; value.text = toString(bar.pos, 1); } void setMin(double val) { bar.start = val; } void setMax(double val) { bar.end = val; bar.page = 0.0; bar.bar = (bar.end - bar.start) / 10.0; bar.scroll = 0.1; } }; class GuiOccuranceOption : BaseGuiElement { GuiScrollbar@ bar; GuiCheckbox@ label; GuiText@ value; double defaultValue = 1.0; GuiOccuranceOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos); _(text); } GuiOccuranceOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos); _(text); } void _(const string& text) { @label = GuiCheckbox(this, recti(), text); @label.alignment = Alignment(Left, Top, Left+0.4f, Bottom); @value = GuiText(this, recti()); @value.alignment = Alignment(Right-74, Top, Right-0.0f-4, Bottom); value.horizAlign = 1.0; @bar = GuiScrollbar(this, recti()); @bar.alignment = Alignment(Left+0.4f+4, Top+1, Right-0.0f-78, Bottom-1); bar.up.visible = false; bar.down.visible = false; bar.orientation = SO_Horizontal; updateAbsolutePosition(); label.emitClicked(); } bool onGuiEvent(const GuiEvent& event) { if(event.caller is bar && event.type == GUI_Changed) { value.text = toString(bar.pos*100.0, 0)+"%"; label.checked = bar.pos != 0.0; label.emitClicked(); emitChanged(); return true; } if(event.caller is label) { Color color; FontType font = FT_Normal; double v = get(); if(!label.checked) { color = Color(0x888888ff); } else if(v > defaultValue*1.1) { font = FT_Bold; color = colors::Green; } else if(v < defaultValue*0.9) { font = FT_Bold; color = colors::Red; } label.textColor = color; value.color = color; label.font = font; value.font = font; if(event.type == GUI_Changed) { emitChanged(); return true; } } return BaseGuiElement::onGuiEvent(event); } double get() { return label.checked ? round(bar.pos*100.0) / 100.0 : 0.0; } void set(double val) { bar.pos = val; value.text = toString(bar.pos*100.0, 0)+"%"; label.checked = val != 0.0; label.emitClicked(); } void setMin(double val) { bar.start = val; } void setMax(double val) { bar.end = val; bar.bar = 0.25; bar.page = 0.0; bar.scroll = 0.1; } }; class GuiFrequencyOption : GuiSliderOption { double defaultValue = 1.0; GuiFrequencyOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos, text); } GuiFrequencyOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos, text); } double get() { return round(bar.pos*100.0) / 100.0; } bool onGuiEvent(const GuiEvent& event) { if(event.caller is bar && event.type == GUI_Changed) { value.text = toString(bar.pos*100.0, 0)+"%"; Color color; FontType font = FT_Normal; double v = get(); if(v > defaultValue*1.1) { font = FT_Bold; color = colors::Green; } else if(v < defaultValue*0.9) { font = FT_Bold; color = colors::Red; } label.color = color; label.font = font; value.color = color; value.font = font; emitChanged(); return true; } return BaseGuiElement::onGuiEvent(event); } void set(double val) { bar.pos = val; bar.emitChanged(); } }; class GuiNumberOption : BaseGuiElement { GuiSpinbox@ value; GuiText@ label; bool changed = false; GuiNumberOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos); _GuiNumberOption(text); } GuiNumberOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos); _GuiNumberOption(text); } void _GuiNumberOption(const string& text) { @label = GuiText(this, recti(), text); @label.alignment = Alignment(Left, Top, Left+0.4f, Bottom); @value = GuiSpinbox(this, recti()); @value.alignment = Alignment(Left+0.4f+2, Top+2, Right-0.0f-2, Bottom-2); value.min = 0.0; updateAbsolutePosition(); } bool onGuiEvent(const GuiEvent& event) { if(event.caller is value){ if(event.type == GUI_Changed) { emitChanged(); return true; } } return BaseGuiElement::onGuiEvent(event); } void set_step(double step) { value.step = step; } void set_decimals(int dec) { value.decimals = dec; } double get() { return value.value; } void set(double val) { value.value = val; } void setMin(double val) { value.min = val; } void setMax(double val) { value.max = val; } }; class GuiDropdownOption : BaseGuiElement { GuiDropdown@ box; GuiText@ label; bool changed = false; GuiDropdownOption(BaseGuiElement@ parent, const recti& pos, const string&in text) { super(parent, pos); _GuiDropdownOption(text); } GuiDropdownOption(BaseGuiElement@ parent, Alignment@ pos, const string& text) { super(parent, pos); _GuiDropdownOption(text); } void _GuiDropdownOption(const string& text) { @label = GuiText(this, recti(), text); @label.alignment = Alignment(Left, Top, Left+0.4f, Bottom); @box = GuiDropdown(this, recti()); @box.alignment = Alignment(Left+0.5f+2, Top, Right-0.0f-2, Bottom); updateAbsolutePosition(); } bool onGuiEvent(const GuiEvent& event) { if(event.caller is box){ if(event.type == GUI_Changed) { emitChanged(); return true; } } return BaseGuiElement::onGuiEvent(event); } };