Open source Star Ruler 2 source code!
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
import elements.BaseGuiElement;
|
||||
|
||||
export GuiCheckbox;
|
||||
|
||||
interface onCheckboxChange {
|
||||
bool onChange(GuiCheckbox@ btn);
|
||||
};
|
||||
|
||||
class GuiCheckbox : BaseGuiElement {
|
||||
string text;
|
||||
FontType font = FT_Normal;
|
||||
Color textColor;
|
||||
int vertPadding = 2;
|
||||
int separation = 8;
|
||||
bool checked;
|
||||
bool Hovered = false;
|
||||
bool Focused = false;
|
||||
|
||||
SkinStyle style = SS_Checkbox;
|
||||
onCheckboxChange@ onChange;
|
||||
|
||||
GuiCheckbox(IGuiElement@ ParentElement, const recti& Rectangle, const string &in txt, bool Default = false) {
|
||||
checked = Default;
|
||||
text = txt;
|
||||
super(ParentElement, Rectangle);
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
GuiCheckbox(IGuiElement@ ParentElement, Alignment@ align, const string& txt, bool Default = false) {
|
||||
checked = Default;
|
||||
text = txt;
|
||||
super(ParentElement, align);
|
||||
updateAbsolutePosition();
|
||||
}
|
||||
|
||||
void emitChange() {
|
||||
if(onChange !is null && onChange.onChange(this))
|
||||
return;
|
||||
GuiEvent evt;
|
||||
evt.type = GUI_Changed;
|
||||
@evt.caller = this;
|
||||
onGuiEvent(evt);
|
||||
}
|
||||
|
||||
bool onMouseEvent(const MouseEvent& event, IGuiElement@ source) {
|
||||
if(source is this) {
|
||||
switch(event.type) {
|
||||
case MET_Button_Down:
|
||||
return true;
|
||||
case MET_Button_Up:
|
||||
if(Focused) {
|
||||
if(event.button == 0) {
|
||||
if(Hovered) {
|
||||
checked = !checked;
|
||||
emitChange();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onMouseEvent(event, source);
|
||||
}
|
||||
|
||||
bool onGuiEvent(const GuiEvent& event) {
|
||||
if(event.caller is this) {
|
||||
switch(event.type) {
|
||||
case GUI_Mouse_Entered:
|
||||
Hovered = true; break;
|
||||
case GUI_Mouse_Left:
|
||||
Hovered = false; break;
|
||||
case GUI_Focused:
|
||||
Focused = true;
|
||||
break;
|
||||
case GUI_Focus_Lost:
|
||||
Focused = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onGuiEvent(event);
|
||||
}
|
||||
|
||||
bool onKeyEvent(const KeyboardEvent& event, IGuiElement@ source) {
|
||||
if(source is this && event.type == KET_Key_Up) {
|
||||
if(event.key == KEY_ENTER) {
|
||||
checked = !checked;
|
||||
emitChange();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return BaseGuiElement::onKeyEvent(event, source);
|
||||
}
|
||||
|
||||
void draw() {
|
||||
const Font@ fnt = skin.getFont(font);
|
||||
|
||||
//Draw checkbox
|
||||
uint flags = SF_Normal;
|
||||
if(checked)
|
||||
flags |= SF_Active;
|
||||
if(Hovered)
|
||||
flags |= SF_Hovered;
|
||||
|
||||
int size = AbsolutePosition.height - vertPadding * 2;
|
||||
recti box = recti_area(
|
||||
AbsolutePosition.topLeft + vec2i(0, vertPadding),
|
||||
vec2i(size, size));
|
||||
|
||||
skin.draw(style, flags, box);
|
||||
|
||||
//Draw text
|
||||
int center = (AbsolutePosition.height - fnt.getBaseline()) / 2;
|
||||
vec2i pos = vec2i(size + separation, center);
|
||||
skin.draw(font, pos + AbsolutePosition.topLeft, text, textColor);
|
||||
|
||||
BaseGuiElement::draw();
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user