153 lines
3.4 KiB
ActionScript
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);
|
|
}
|
|
};
|