Files
starruler-linux/scripts/toolkit/elements/GuiSpinbox.as
T
2018-07-17 14:15:37 +02:00

153 lines
3.4 KiB
ActionScript

import elements.BaseGuiElement;
import elements.GuiTextbox;
import elements.GuiButton;
export GuiSpinbox;
class GuiSpinbox : BaseGuiElement {
GuiTextbox@ textbox;
GuiButton@ upButton;
GuiButton@ downButton;
double step;
int decimals;
double min;
double max;
GuiSpinbox(IGuiElement@ ParentElement, const recti& Rectangle, double num) {
super(ParentElement, Rectangle);
_GuiSpinbox(num);
}
GuiSpinbox(IGuiElement@ ParentElement, Alignment@ align, double num) {
super(ParentElement, align);
_GuiSpinbox(num);
}
GuiSpinbox(IGuiElement@ ParentElement, Alignment@ align, double num, double min, double max, double step, int decimals) {
super(ParentElement, align);
_GuiSpinbox(num);
this.min = min;
this.max = max;
this.step = step;
this.decimals = decimals;
}
GuiSpinbox(IGuiElement@ ParentElement, const recti& pos, double num, double min, double max, double step, int decimals) {
super(ParentElement, pos);
_GuiSpinbox(num);
this.min = min;
this.max = max;
this.step = step;
this.decimals = decimals;
}
GuiSpinbox(IGuiElement@ ParentElement, const recti& Rectangle) {
super(ParentElement, Rectangle);
_GuiSpinbox(0.0);
}
GuiSpinbox(IGuiElement@ ParentElement, Alignment@ align) {
super(ParentElement, align);
_GuiSpinbox(0.0);
}
void set_disabled(bool value) {
upButton.visible = !value;
downButton.visible = !value;
textbox.disabled = value;
}
double get_value() {
return clamp(toDouble(textbox.text), min, max);
}
void set_value(double val) {
textbox.text = toString(clamp(val, min, max), decimals);
}
void set_maximum(double val) {
max = val;
if(!textbox.Focused)
value = value;
}
void set_minimum(double val) {
min = val;
if(!textbox.Focused)
value = value;
}
void set_font(FontType ft) {
textbox.font = ft;
}
void set_color(const Color& color) {
textbox.bgColor = color;
}
void _GuiSpinbox(double num) {
step = 1.0;
decimals = 0;
min = -INFINITY;
max = INFINITY;
@textbox = GuiTextbox(this, Alignment(Left, Top, Right-20, Bottom));
@upButton = GuiButton(this, Alignment(Right-20, Top, Right, Bottom-0.5f));
upButton.style = SS_SpinButton;
@downButton = GuiButton(this, Alignment(Right-20, Bottom-0.5f, Right, Bottom));
downButton.style = SS_SpinButton;
value = num;
updateAbsolutePosition();
}
void updateAbsolutePosition() {
int h = size.height / 2;
textbox.alignment.right.pixels = h;
upButton.alignment.left.pixels = h;
downButton.alignment.left.pixels = h;
BaseGuiElement::updateAbsolutePosition();
}
bool onGuiEvent(const GuiEvent& event) {
if(event.caller is upButton) {
if(event.type == GUI_Clicked) {
value = value + step;
emitClicked();
emitChanged();
return true;
}
}
else if(event.caller is downButton) {
if(event.type == GUI_Clicked) {
value = value - step;
emitClicked();
emitChanged();
return true;
}
}
else if(event.caller is textbox) {
GuiEvent evt = event;
@evt.caller = this;
return BaseGuiElement::onGuiEvent(evt);
}
return BaseGuiElement::onGuiEvent(event);
}
bool onMouseEvent(const MouseEvent& event, IGuiElement@ source) {
if(source is this || source.isChildOf(this)) {
switch(event.type) {
case MET_Scrolled:
value = value + event.y * step;
emitClicked();
emitChanged();
return true;
}
}
return BaseGuiElement::onMouseEvent(event, source);
}
};