Open source Star Ruler 2 source code!

This commit is contained in:
Lucas de Vries
2018-07-17 14:15:37 +02:00
commit cc307720ff
4342 changed files with 2365070 additions and 0 deletions
+166
View File
@@ -0,0 +1,166 @@
import elements.WordWrap;
import elements.BaseGuiElement;
export GuiText;
class GuiText : BaseGuiElement {
string Text;
WordWrap@ WordWrap;
double HorizAlign = 0.0;
double VertAlign = 0.5;
bool flex = false;
FontType TextFont = FT_Normal;
vec2i textOffset;
Color color;
Color stroke(0x00000000);
int strokeWidth = 1;
GuiText(IGuiElement@ ParentElement, const recti& Rectangle) {
super(ParentElement, Rectangle);
updateAbsolutePosition();
}
GuiText(IGuiElement@ ParentElement, const recti& Rectangle, const string &in Txt, FontType font = FT_Normal) {
super(ParentElement, Rectangle);
TextFont = font;
text = Txt;
}
GuiText(IGuiElement@ ParentElement, Alignment@ Align) {
super(ParentElement, Align);
updateAbsolutePosition();
}
GuiText(IGuiElement@ ParentElement, Alignment@ Align, const string& Txt, FontType font = FT_Normal) {
super(ParentElement, Align);
TextFont = font;
text = Txt;
}
void set_wordWrap(bool wrap) {
if(wrap) {
@WordWrap = WordWrap();
@WordWrap.font = skin.getFont(TextFont);
WordWrap.text = Text;
WordWrap.width = absolutePosition.width;
WordWrap.update();
}
else {
@WordWrap = null;
}
updateAbsolutePosition();
}
bool get_wordWrap() {
return WordWrap !is null;
}
void set_text(const string& txt) {
Text = txt;
if(WordWrap !is null) {
WordWrap.text = Text;
WordWrap.update();
}
updateAbsolutePosition();
}
string get_text() {
return Text;
}
void set_horizAlign(double align) {
if(HorizAlign == align)
return;
HorizAlign = align;
updateAbsolutePosition();
}
void set_vertAlign(double align) {
if(VertAlign == align)
return;
VertAlign = align;
updateAbsolutePosition();
}
void set_font(FontType type) {
if(TextFont == type)
return;
TextFont = type;
if(WordWrap !is null) {
@WordWrap.font = skin.getFont(TextFont);
WordWrap.update();
}
updateAbsolutePosition();
}
FontType get_font() {
return TextFont;
}
int get_lineCount() {
if(WordWrap !is null) {
return WordWrap.lines.length();
}
else {
return 1;
}
}
vec2i getTextDimension() {
const Font@ font = skin.getFont(TextFont);
if(WordWrap !is null) {
return vec2i(
WordWrap.maxWidth,
WordWrap.lines.length() * font.getLineHeight());
}
else {
return font.getDimension(Text);
}
}
void updateAbsolutePosition() {
BaseGuiElement::updateAbsolutePosition();
if(skin is null)
return;
const Font@ font = skin.getFont(TextFont);
vec2i textSize;
if(WordWrap !is null) {
WordWrap.width = absolutePosition.width;
WordWrap.update();
textSize.x = WordWrap.maxWidth;
textSize.y = WordWrap.lines.length() * font.getLineHeight();
}
else {
textSize = font.getDimension(Text);
}
if(flex) {
textOffset = vec2i();
textOffset.y += (font.getLineHeight() - font.getBaseline()) / 2;
textSize.y = font.getLineHeight() + textOffset.y;
size = textSize;
}
else {
textOffset = (Position.size - textSize);
textOffset.y += (font.getLineHeight() - font.getBaseline()) / 2;
textOffset.x *= HorizAlign;
textOffset.y *= VertAlign;
}
}
void draw() {
if(stroke.a != 0) {
//LORD HAVE MERCY ON MY SOUL
skin.draw(TextFont, AbsolutePosition.topLeft + textOffset + vec2i(strokeWidth, strokeWidth), Text, stroke);
skin.draw(TextFont, AbsolutePosition.topLeft + textOffset + vec2i(-strokeWidth, -strokeWidth), Text, stroke);
skin.draw(TextFont, AbsolutePosition.topLeft + textOffset + vec2i(strokeWidth, -strokeWidth), Text, stroke);
skin.draw(TextFont, AbsolutePosition.topLeft + textOffset + vec2i(-strokeWidth, strokeWidth), Text, stroke);
}
skin.draw(TextFont, AbsolutePosition.topLeft + textOffset, Text, color);
BaseGuiElement::draw();
}
};