Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/windowing
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2024-04-22 06:07:59 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2024-04-22 06:07:59 +1000
commitca1426eabc873f781eb0dd389d45634b7d183250 (patch)
tree15ea83658ca3824232f14fe4b32ec714e0aa05c6 /source/windowing
parentd5f5fb5ddf0d4a9f0b0e6ac012121926d2fcd949 (diff)
Lua chat callbacks + better font styling
golly gee whiz!! i hope i didn't fuck something up
Diffstat (limited to 'source/windowing')
-rw-r--r--source/windowing/StarButtonWidget.cpp27
-rw-r--r--source/windowing/StarButtonWidget.hpp4
-rw-r--r--source/windowing/StarCanvasWidget.cpp29
-rw-r--r--source/windowing/StarCanvasWidget.hpp5
-rw-r--r--source/windowing/StarFuelWidget.cpp7
-rw-r--r--source/windowing/StarFuelWidget.hpp3
-rw-r--r--source/windowing/StarGuiContext.cpp14
-rw-r--r--source/windowing/StarGuiContext.hpp3
-rw-r--r--source/windowing/StarItemSlotWidget.cpp12
-rw-r--r--source/windowing/StarItemSlotWidget.hpp4
-rw-r--r--source/windowing/StarLabelWidget.cpp62
-rw-r--r--source/windowing/StarLabelWidget.hpp7
-rw-r--r--source/windowing/StarPane.cpp9
-rw-r--r--source/windowing/StarPane.hpp3
-rw-r--r--source/windowing/StarTextBoxWidget.cpp52
-rw-r--r--source/windowing/StarTextBoxWidget.hpp7
16 files changed, 105 insertions, 143 deletions
diff --git a/source/windowing/StarButtonWidget.cpp b/source/windowing/StarButtonWidget.cpp
index a8c8a85..258ac55 100644
--- a/source/windowing/StarButtonWidget.cpp
+++ b/source/windowing/StarButtonWidget.cpp
@@ -24,14 +24,11 @@ ButtonWidget::ButtonWidget() {
auto interfaceConfig = assets->json("/interface.config");
m_pressedOffset = jsonToVec2I(interfaceConfig.get("buttonPressedOffset"));
- m_fontSize = interfaceConfig.query("font.buttonSize").toInt();
- m_fontDirectives = interfaceConfig.queryString("font.defaultDirectives", "");
- m_font = interfaceConfig.query("font.defaultFont").toString();
-
- m_clickSounds = jsonToStringList(assets->json("/interface.config:buttonClickSound"));
- m_releaseSounds = jsonToStringList(assets->json("/interface.config:buttonReleaseSound"));
- m_hoverSounds = jsonToStringList(assets->json("/interface.config:buttonHoverSound"));
- m_hoverOffSounds = jsonToStringList(assets->json("/interface.config:buttonHoverOffSound"));
+ m_textStyle = interfaceConfig.get("buttonTextStyle");
+ m_clickSounds = jsonToStringList(interfaceConfig.get("buttonClickSound"));
+ m_releaseSounds = jsonToStringList(interfaceConfig.get("buttonReleaseSound"));
+ m_hoverSounds = jsonToStringList(interfaceConfig.get("buttonHoverSound"));
+ m_hoverOffSounds = jsonToStringList(interfaceConfig.get("buttonHoverOffSound"));
}
ButtonWidget::ButtonWidget(WidgetCallbackFunc callback,
@@ -95,19 +92,15 @@ void ButtonWidget::renderImpl() {
if (!m_text.empty()) {
auto& guiContext = GuiContext::singleton();
- guiContext.setFontProcessingDirectives(m_fontDirectives);
- guiContext.setFontSize(m_fontSize);
- guiContext.setFont(m_font);
+ guiContext.setTextStyle(m_textStyle);
if (m_disabled)
guiContext.setFontColor(m_fontColorDisabled.toRgba());
else if (m_fontColorChecked && m_checked)
guiContext.setFontColor(m_fontColorChecked.value().toRgba());
else
guiContext.setFontColor(m_fontColor.toRgba());
- guiContext.setFontMode(FontMode::Shadow);
guiContext.renderInterfaceText(m_text, {textPosition, m_hTextAnchor, VerticalAnchor::VMidAnchor});
- guiContext.setFontMode(FontMode::Normal);
- guiContext.setFontProcessingDirectives("");
+ guiContext.clearTextStyle();
}
}
@@ -323,11 +316,11 @@ void ButtonWidget::setText(String const& text) {
}
void ButtonWidget::setFontSize(int size) {
- m_fontSize = size;
+ m_textStyle.fontSize = size;
}
void ButtonWidget::setFontDirectives(String directives) {
- m_fontDirectives = directives;
+ m_textStyle.directives = directives;
}
void ButtonWidget::setTextOffset(Vec2I textOffset) {
@@ -339,7 +332,7 @@ void ButtonWidget::setTextAlign(HorizontalAnchor hAnchor) {
}
void ButtonWidget::setFontColor(Color color) {
- m_fontColor = color;
+ m_textStyle.color = (m_fontColor = color).toRgba();
}
void ButtonWidget::setFontColorDisabled(Color color) {
diff --git a/source/windowing/StarButtonWidget.hpp b/source/windowing/StarButtonWidget.hpp
index 69335d8..bace69b 100644
--- a/source/windowing/StarButtonWidget.hpp
+++ b/source/windowing/StarButtonWidget.hpp
@@ -121,9 +121,7 @@ protected:
Vec2I m_pressedOffset;
Vec2U m_buttonBoundSize;
- int m_fontSize;
- String m_font;
- String m_fontDirectives;
+ TextStyle m_textStyle;
String m_text;
Vec2I m_textOffset;
diff --git a/source/windowing/StarCanvasWidget.cpp b/source/windowing/StarCanvasWidget.cpp
index 16ec994..b4a3cbf 100644
--- a/source/windowing/StarCanvasWidget.cpp
+++ b/source/windowing/StarCanvasWidget.cpp
@@ -68,7 +68,18 @@ void CanvasWidget::drawTriangles(List<tuple<Vec2F, Vec2F, Vec2F>> const& triangl
}
void CanvasWidget::drawText(String s, TextPositioning position, unsigned fontSize, Vec4B const& color, FontMode mode, float lineSpacing, String font, String processingDirectives) {
- m_renderOps.append(make_tuple(std::move(s), std::move(position), fontSize, color, mode, lineSpacing, std::move(font), std::move(processingDirectives)));
+ TextStyle style;
+ style.fontSize = fontSize;
+ style.color = color;
+ style.shadow = fontModeToColor(mode).toRgba();
+ style.lineSpacing = lineSpacing;
+ style.font = font;
+ style.directives = processingDirectives;
+ m_renderOps.append(make_tuple(std::move(s), std::move(position), std::move(style)));
+}
+
+void CanvasWidget::drawText(String s, TextPositioning position, TextStyle style) {
+ m_renderOps.append(make_tuple(std::move(s), std::move(position), std::move(style)));
}
Vec2I CanvasWidget::mousePosition() const {
@@ -145,7 +156,7 @@ void CanvasWidget::renderImpl() {
if (auto args = op.ptr<TrianglesOp>())
tupleUnpackFunction(bind(&CanvasWidget::renderTriangles, this, renderingOffset, _1, _2), *args);
if (auto args = op.ptr<TextOp>())
- tupleUnpackFunction(bind(&CanvasWidget::renderText, this, renderingOffset, _1, _2, _3, _4, _5, _6, _7, _8), *args);
+ tupleUnpackFunction(bind(&CanvasWidget::renderText, this, renderingOffset, _1, _2, _3), *args);
}
}
@@ -256,14 +267,9 @@ void CanvasWidget::renderTriangles(Vec2F const& renderingOffset, List<tuple<Vec2
context.drawInterfaceTriangles(translated, color);
}
-void CanvasWidget::renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, unsigned fontSize, Vec4B const& color, FontMode mode, float lineSpacing, String const& font, String const& directives) {
+void CanvasWidget::renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, TextStyle const& style) {
auto& context = GuiContext::singleton();
- context.setFontProcessingDirectives(directives);
- context.setFontSize(fontSize, m_ignoreInterfaceScale ? 1 : context.interfaceScale());
- context.setFontColor(color);
- context.setFontMode(mode);
- context.setFont(font);
- context.setLineSpacing(lineSpacing);
+ context.setTextStyle(style, m_ignoreInterfaceScale ? 1 : context.interfaceScale());
TextPositioning translatedPosition = position;
translatedPosition.pos += renderingOffset;
@@ -272,10 +278,7 @@ void CanvasWidget::renderText(Vec2F const& renderingOffset, String const& s, Tex
else
context.renderInterfaceText(s, translatedPosition);
- context.setDefaultLineSpacing();
- context.setDefaultFont();
- context.setFontMode(FontMode::Normal);
- context.setFontProcessingDirectives("");
+ context.clearTextStyle();
}
}
diff --git a/source/windowing/StarCanvasWidget.hpp b/source/windowing/StarCanvasWidget.hpp
index e160160..a13cc2c 100644
--- a/source/windowing/StarCanvasWidget.hpp
+++ b/source/windowing/StarCanvasWidget.hpp
@@ -67,6 +67,7 @@ public:
void drawTriangles(List<tuple<Vec2F, Vec2F, Vec2F>> const& poly, Vec4B const& color = Vec4B(255, 255, 255, 255));
void drawText(String s, TextPositioning position, unsigned fontSize, Vec4B const& color = Vec4B(255, 255, 255, 255), FontMode mode = FontMode::Normal, float lineSpacing = Star::DefaultLineSpacing, String font = "", String processingDirectives = "");
+ void drawText(String s, TextPositioning position, TextStyle style);
protected:
void renderImpl() override;
@@ -79,7 +80,7 @@ protected:
void renderRect(Vec2F const& renderingOffset, RectF const& coords, Vec4B const& color);
void renderPoly(Vec2F const& renderingOffset, PolyF poly, Vec4B const& color, float lineWidth);
void renderTriangles(Vec2F const& renderingOffset, List<tuple<Vec2F, Vec2F, Vec2F>> const& triangles, Vec4B const& color);
- void renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, unsigned fontSize, Vec4B const& color, FontMode mode, float lineSpacing, String const& font, String const& directives);
+ void renderText(Vec2F const& renderingOffset, String const& s, TextPositioning const& position, TextStyle const& style);
private:
bool m_ignoreInterfaceScale;
@@ -97,7 +98,7 @@ private:
typedef tuple<Vec2F, Vec2F, Vec4B, float> LineOp;
typedef tuple<PolyF, Vec4B, float> PolyOp;
typedef tuple<List<tuple<Vec2F, Vec2F, Vec2F>>, Vec4B> TrianglesOp;
- typedef tuple<String, TextPositioning, unsigned, Vec4B, FontMode, float, String, String> TextOp;
+ typedef tuple<String, TextPositioning, TextStyle> TextOp;
typedef MVariant<RectOp, ImageOp, ImageRectOp, DrawableOp, TiledImageOp, LineOp, PolyOp, TrianglesOp, TextOp> RenderOp;
List<RenderOp> m_renderOps;
diff --git a/source/windowing/StarFuelWidget.cpp b/source/windowing/StarFuelWidget.cpp
index d7028f8..8f2d93d 100644
--- a/source/windowing/StarFuelWidget.cpp
+++ b/source/windowing/StarFuelWidget.cpp
@@ -9,8 +9,8 @@ namespace Star {
FuelWidget::FuelWidget() {
auto assets = Root::singleton().assets();
- m_fontSize = assets->json("/interface.config:font.buttonSize").toInt();
- m_font = assets->json("/interface.config:font.defaultFont").toString();
+ m_textStyle.fontSize = assets->json("/interface.config:font.buttonSize").toInt();
+ m_textStyle.loadJson(assets->json("/interface.config:textStyle"));
m_fuelLevel = 0;
m_maxLevel = 0;
@@ -72,8 +72,7 @@ void FuelWidget::renderImpl() {
context()->drawInterfaceQuad("/interface/fuel/fuelgaugemarkings.png", shift(0, 1, entireTex), shift(0, 1, entirePosition));
auto& guiContext = GuiContext::singleton();
- guiContext.setFontSize(m_fontSize);
- guiContext.setFont(m_font);
+ guiContext.setTextStyle(m_textStyle);
if (m_potential != 0) {
guiContext.setFontColor(Color::White.toRgba());
} else if (m_fuelLevel == 0) {
diff --git a/source/windowing/StarFuelWidget.hpp b/source/windowing/StarFuelWidget.hpp
index c057b9a..21f0f6c 100644
--- a/source/windowing/StarFuelWidget.hpp
+++ b/source/windowing/StarFuelWidget.hpp
@@ -30,8 +30,7 @@ protected:
float m_pingTimeout;
- unsigned m_fontSize;
- String m_font;
+ TextStyle m_textStyle;
private:
};
diff --git a/source/windowing/StarGuiContext.cpp b/source/windowing/StarGuiContext.cpp
index d1be94a..492f08e 100644
--- a/source/windowing/StarGuiContext.cpp
+++ b/source/windowing/StarGuiContext.cpp
@@ -377,6 +377,20 @@ void GuiContext::setDefaultFont() {
textPainter()->setFont("");
}
+TextStyle& GuiContext::setTextStyle(TextStyle const& textStyle, int pixelRatio) {
+ TextStyle& setStyle = textPainter()->setTextStyle(textStyle);
+ setStyle.fontSize *= pixelRatio;
+ return setStyle;
+}
+
+TextStyle& GuiContext::setTextStyle(TextStyle const& textStyle) {
+ return setTextStyle(textStyle, interfaceScale());
+}
+
+void GuiContext::clearTextStyle() {
+ textPainter()->clearTextStyle();
+}
+
void GuiContext::setLineSpacing(float lineSpacing) {
textPainter()->setLineSpacing(lineSpacing);
}
diff --git a/source/windowing/StarGuiContext.hpp b/source/windowing/StarGuiContext.hpp
index ef14619..cb0051c 100644
--- a/source/windowing/StarGuiContext.hpp
+++ b/source/windowing/StarGuiContext.hpp
@@ -106,6 +106,9 @@ public:
void setFontProcessingDirectives(String const& directives);
void setFont(String const& font);
void setDefaultFont();
+ TextStyle& setTextStyle(TextStyle const& textStyle, int pixelRatio);
+ TextStyle& setTextStyle(TextStyle const& textStyle);
+ void clearTextStyle();
void setLineSpacing(float lineSpacing);
void setDefaultLineSpacing();
diff --git a/source/windowing/StarItemSlotWidget.cpp b/source/windowing/StarItemSlotWidget.cpp
index 93d95d3..4ba3425 100644
--- a/source/windowing/StarItemSlotWidget.cpp
+++ b/source/windowing/StarItemSlotWidget.cpp
@@ -14,16 +14,13 @@ ItemSlotWidget::ItemSlotWidget(ItemPtr const& item, String const& backingImage)
: m_item(item), m_backingImage(backingImage) {
m_drawBackingImageWhenFull = false;
m_drawBackingImageWhenEmpty = true;
- m_fontSize = 0;
m_progress = 1;
auto assets = Root::singleton().assets();
auto interfaceConfig = assets->json("/interface.config");
m_countPosition = TextPositioning(jsonToVec2F(interfaceConfig.get("itemCountRightAnchor")), HorizontalAnchor::RightAnchor);
m_countFontMode = FontMode::Normal;
- m_fontSize = interfaceConfig.query("font.itemSize").toInt();
- m_font = interfaceConfig.query("font.defaultFont").toString();
- m_fontColor = Color::rgb(jsonToVec3B(interfaceConfig.query("font.defaultColor")));
+ m_textStyle = interfaceConfig.get("itemSlotTextStyle");
m_itemDraggableArea = jsonToRectI(interfaceConfig.get("itemDraggableArea"));
m_durabilityOffset = jsonToVec2I(interfaceConfig.get("itemIconDurabilityOffset"));
@@ -192,13 +189,10 @@ void ItemSlotWidget::renderImpl() {
context()->drawInterfaceQuad(String(strf("/interface/cooldown.png:{}", frame)), Vec2F(screenPosition()));
if (m_item->count() > 1 && m_showCount) { // we don't need to tell people that there's only 1 of something
- context()->setFont(m_font);
- context()->setFontSize(m_fontSize);
- context()->setFontColor(m_fontColor.toRgba());
+ context()->setTextStyle(m_textStyle);
context()->setFontMode(m_countFontMode);
context()->renderInterfaceText(toString(m_item->count()), m_countPosition.translated(Vec2F(screenPosition())));
- context()->setFontMode(FontMode::Normal);
- context()->setDefaultFont();
+ context()->clearTextStyle();
}
} else if (m_drawBackingImageWhenEmpty && m_backingImage != "") {
diff --git a/source/windowing/StarItemSlotWidget.hpp b/source/windowing/StarItemSlotWidget.hpp
index aaa4c9c..3827048 100644
--- a/source/windowing/StarItemSlotWidget.hpp
+++ b/source/windowing/StarItemSlotWidget.hpp
@@ -56,9 +56,7 @@ private:
Vec2I m_durabilityOffset;
RectI m_itemDraggableArea;
- int m_fontSize;
- String m_font;
- Color m_fontColor;
+ TextStyle m_textStyle;
WidgetCallbackFunc m_callback;
WidgetCallbackFunc m_rightClickCallback;
diff --git a/source/windowing/StarLabelWidget.cpp b/source/windowing/StarLabelWidget.cpp
index 35f8618..3c1be8e 100644
--- a/source/windowing/StarLabelWidget.cpp
+++ b/source/windowing/StarLabelWidget.cpp
@@ -10,17 +10,14 @@ LabelWidget::LabelWidget(String text,
VerticalAnchor const& vAnchor,
Maybe<unsigned> wrapWidth,
Maybe<float> lineSpacing)
- : m_fontMode(FontMode::Normal),
- m_color(color),
- m_hAnchor(hAnchor),
+ : m_hAnchor(hAnchor),
m_vAnchor(vAnchor),
- m_wrapWidth(std::move(wrapWidth)),
- m_lineSpacing(std::move(lineSpacing)) {
+ m_wrapWidth(std::move(wrapWidth)) {
auto assets = Root::singleton().assets();
- auto fontConfig = assets->json("/interface.config:font");
- m_fontSize = fontConfig.getInt("baseSize");
- m_processingDirectives = fontConfig.getString("defaultDirectives");
- m_font = fontConfig.queryString("defaultFont", "");
+ m_style = assets->json("/interface.config:labelTextStyle");
+ m_style.color = color.toRgba();
+ if (lineSpacing)
+ m_style.lineSpacing = *lineSpacing;
setText(std::move(text));
}
@@ -38,16 +35,16 @@ void LabelWidget::setText(String newText) {
}
void LabelWidget::setFontSize(int fontSize) {
- m_fontSize = fontSize;
+ m_style.fontSize = fontSize;
updateTextRegion();
}
void LabelWidget::setFontMode(FontMode fontMode) {
- m_fontMode = fontMode;
+ m_style.shadow = fontModeToColor(fontMode).toRgba();
}
void LabelWidget::setColor(Color newColor) {
- m_color = std::move(newColor);
+ m_style.color = newColor.toRgba();
}
void LabelWidget::setAnchor(HorizontalAnchor hAnchor, VerticalAnchor vAnchor) {
@@ -62,12 +59,12 @@ void LabelWidget::setWrapWidth(Maybe<unsigned> wrapWidth) {
}
void LabelWidget::setLineSpacing(Maybe<float> lineSpacing) {
- m_lineSpacing = std::move(lineSpacing);
+ m_style.lineSpacing = lineSpacing.value(DefaultLineSpacing);
updateTextRegion();
}
void LabelWidget::setDirectives(String const& directives) {
- m_processingDirectives = directives;
+ m_style.directives = directives;
updateTextRegion();
}
@@ -76,6 +73,12 @@ void LabelWidget::setTextCharLimit(Maybe<unsigned> charLimit) {
updateTextRegion();
}
+void LabelWidget::setTextStyle(TextStyle const& textStyle) {
+ m_style = textStyle;
+ updateTextRegion();
+}
+
+
RectI LabelWidget::relativeBoundRect() const {
return RectI(m_textRegion).translated(relativePosition());
}
@@ -85,41 +88,14 @@ RectI LabelWidget::getScissorRect() const {
}
void LabelWidget::renderImpl() {
- context()->setFont(m_font);
- context()->setFontSize(m_fontSize);
- context()->setFontMode(m_fontMode);
- context()->setFontColor(m_color.toRgba());
- context()->setFontProcessingDirectives(m_processingDirectives);
-
- if (m_lineSpacing)
- context()->setLineSpacing(*m_lineSpacing);
- else
- context()->setDefaultLineSpacing();
-
+ context()->setTextStyle(m_style);
context()->renderInterfaceText(m_text, {Vec2F(screenPosition()), m_hAnchor, m_vAnchor, m_wrapWidth, m_textCharLimit});
-
- context()->setDefaultFont();
- context()->setFontMode(FontMode::Normal);
- context()->setFontProcessingDirectives("");
- context()->setDefaultLineSpacing();
}
void LabelWidget::updateTextRegion() {
- context()->setFontSize(m_fontSize);
- context()->setFontColor(m_color.toRgba());
- context()->setFontProcessingDirectives(m_processingDirectives);
- context()->setFont(m_font);
- if (m_lineSpacing)
- context()->setLineSpacing(*m_lineSpacing);
- else
- context()->setDefaultLineSpacing();
-
+ context()->setTextStyle(m_style);
m_textRegion = RectI(context()->determineInterfaceTextSize(m_text, {Vec2F(), m_hAnchor, m_vAnchor, m_wrapWidth, m_textCharLimit}));
setSize(m_textRegion.size());
-
- context()->setDefaultFont();
- context()->setFontProcessingDirectives("");
- context()->setDefaultLineSpacing();
}
}
diff --git a/source/windowing/StarLabelWidget.hpp b/source/windowing/StarLabelWidget.hpp
index a25e531..da65fb3 100644
--- a/source/windowing/StarLabelWidget.hpp
+++ b/source/windowing/StarLabelWidget.hpp
@@ -25,6 +25,7 @@ public:
void setLineSpacing(Maybe<float> lineSpacing);
void setDirectives(String const& directives);
void setTextCharLimit(Maybe<unsigned> charLimit);
+ void setTextStyle(TextStyle const& style);
RectI relativeBoundRect() const override;
@@ -36,13 +37,9 @@ private:
void updateTextRegion();
String m_text;
- int m_fontSize;
- FontMode m_fontMode;
- Color m_color;
+ TextStyle m_style;
HorizontalAnchor m_hAnchor;
VerticalAnchor m_vAnchor;
- String m_processingDirectives;
- String m_font;
Maybe<unsigned> m_wrapWidth;
Maybe<float> m_lineSpacing;
Maybe<unsigned> m_textCharLimit;
diff --git a/source/windowing/StarPane.cpp b/source/windowing/StarPane.cpp
index 36e8435..9e1cd4f 100644
--- a/source/windowing/StarPane.cpp
+++ b/source/windowing/StarPane.cpp
@@ -32,8 +32,7 @@ Pane::Pane() {
m_hasDisplayed = false;
auto assets = Root::singleton().assets();
- m_fontSize = assets->json("/interface.config:font.baseSize").toInt();
- m_font = assets->json("/interface.config:font.defaultFont").toString();
+ m_textStyle = assets->json("/interface.config:paneTextStyle");
m_iconOffset = jsonToVec2I(assets->json("/interface.config:paneIconOffset"));
m_titleOffset = jsonToVec2I(assets->json("/interface.config:paneTitleOffset"));
m_subTitleOffset = jsonToVec2I(assets->json("/interface.config:paneSubTitleOffset"));
@@ -436,15 +435,13 @@ void Pane::renderImpl() {
m_context->resetInterfaceScissorRect();
}
- m_context->setFont(m_font);
- m_context->setFontSize(m_fontSize);
+ m_context->setTextStyle(m_textStyle);
m_context->setFontColor(m_titleColor.toRgba());
m_context->setFontMode(FontMode::Shadow);
m_context->renderInterfaceText(m_title, {headerPos + Vec2F(m_titleOffset)});
m_context->setFontColor(m_subTitleColor.toRgba());
m_context->renderInterfaceText(m_subTitle, {headerPos + Vec2F(m_subTitleOffset)});
- m_context->setFontMode(FontMode::Normal);
- m_context->setDefaultFont();
+ m_context->clearTextStyle();
}
}
diff --git a/source/windowing/StarPane.hpp b/source/windowing/StarPane.hpp
index 1d1fc2a..c5ed505 100644
--- a/source/windowing/StarPane.hpp
+++ b/source/windowing/StarPane.hpp
@@ -117,8 +117,7 @@ protected:
WidgetPtr m_icon;
String m_title;
String m_subTitle;
- String m_font;
- unsigned m_fontSize;
+ TextStyle m_textStyle;
Vec2I m_iconOffset;
Vec2I m_titleOffset;
Vec2I m_subTitleOffset;
diff --git a/source/windowing/StarTextBoxWidget.cpp b/source/windowing/StarTextBoxWidget.cpp
index 984021d..41b4696 100644
--- a/source/windowing/StarTextBoxWidget.cpp
+++ b/source/windowing/StarTextBoxWidget.cpp
@@ -23,14 +23,11 @@ TextBoxWidget::TextBoxWidget(String const& startingText, String const& hint, Wid
m_overfillMode = true;
m_maxWidth = assets->json("/interface.config:textBoxDefaultWidth").toInt();
- auto fontConfig = assets->json("/interface.config:font");
- m_fontSize = fontConfig.getInt("baseSize");
- m_processingDirectives = fontConfig.getString("defaultDirectives");
- m_font = fontConfig.queryString("defaultFont", "");
- m_color = Color::rgb(jsonToVec3B(fontConfig.getArray("defaultColor")));
+ auto fontConfig = assets->json("/interface.config:textBoxTextStyle");
+ m_textStyle = fontConfig;
// Meh, padding is hard-coded here
- setSize({m_maxWidth + 6, m_fontSize + 2});
+ setSize({m_maxWidth + 6, m_textStyle.fontSize + 2});
m_cursorHoriz = jsonToVec2I(assets->json("/interface.config:textboxCursorHorizontal"));
m_cursorVert = jsonToVec2I(assets->json("/interface.config:textboxCursorVertical"));
}
@@ -48,20 +45,17 @@ void TextBoxWidget::renderImpl() {
else if (m_hAnchor == HorizontalAnchor::RightAnchor)
pos += Vec2F(size()[0], 0);
- context()->setFont(m_font);
+ context()->setTextStyle(m_textStyle);
if ((m_maxWidth != -1) && m_overfillMode) {
- context()->setFontSize(m_fontSize);
int shift = std::max(0, getCursorOffset() - m_maxWidth);
pos += Vec2F(-shift, 0);
}
- context()->setFontSize(m_fontSize);
- context()->setFontProcessingDirectives(m_processingDirectives);
if (m_text.empty()) {
- context()->setFontColor(m_color.mix(Color::rgbf(0.3f, 0.3f, 0.3f), 0.8f).mix(Color::rgbf(0.0f, 0.0f, 1.0f), blueRate).toRgba());
+ context()->setFontColor(Color::rgba(m_textStyle.color).mix(Color::rgbf(0.3f, 0.3f, 0.3f), 0.8f).mix(Color::rgbf(0.0f, 0.0f, 1.0f), blueRate).toRgba());
context()->renderInterfaceText(m_hint, {pos, m_hAnchor, m_vAnchor});
} else {
- context()->setFontColor(m_color.mix(Color::rgbf(0, 0, 1), blueRate).toRgba());
+ context()->setFontColor(Color::rgba(m_textStyle.color).mix(Color::rgbf(0, 0, 1), blueRate).toRgba());
if (m_textHidden) {
String hiddenText('*', m_text.length());
context()->renderInterfaceText(hiddenText, { pos, m_hAnchor, m_vAnchor });
@@ -69,22 +63,21 @@ void TextBoxWidget::renderImpl() {
else
context()->renderInterfaceText(m_text, { pos, m_hAnchor, m_vAnchor });
}
- context()->setDefaultFont();
- context()->setFontProcessingDirectives("");
- context()->setFontColor(Vec4B::filled(255));
+ context()->clearTextStyle();
if (hasFocus()) {
// render cursor
float cc = 0.6f + 0.4f * std::sin((double)Time::monotonicMilliseconds() / 300.0);
Color cursorColor = Color::rgbf(cc, cc, cc);
+ float fontSize = m_textStyle.fontSize;
context()->drawInterfaceLine(
- pos + Vec2F(getCursorOffset(), m_fontSize * m_cursorVert[0]),
- pos + Vec2F(getCursorOffset(), m_fontSize * m_cursorVert[1]),
+ pos + Vec2F(getCursorOffset(), fontSize * m_cursorVert[0]),
+ pos + Vec2F(getCursorOffset(), fontSize * m_cursorVert[1]),
cursorColor.toRgba());
context()->drawInterfaceLine(
- pos + Vec2F(getCursorOffset() + m_fontSize * m_cursorHoriz[0], m_fontSize * m_cursorVert[0]),
- pos + Vec2F(getCursorOffset() + m_fontSize * m_cursorHoriz[1], m_fontSize * m_cursorVert[0]),
+ pos + Vec2F(getCursorOffset() + fontSize * m_cursorHoriz[0], fontSize * m_cursorVert[0]),
+ pos + Vec2F(getCursorOffset() + fontSize * m_cursorHoriz[1], fontSize * m_cursorVert[0]),
cursorColor.toRgba());
}
@@ -94,8 +87,7 @@ void TextBoxWidget::renderImpl() {
int TextBoxWidget::getCursorOffset() { // horizontal only
float scale;
- context()->setFont(m_font);
- context()->setFontSize(m_fontSize);
+ context()->setTextStyle(m_textStyle);
if (m_hAnchor == HorizontalAnchor::LeftAnchor) {
scale = 1.0;
} else if (m_hAnchor == HorizontalAnchor::HMidAnchor) {
@@ -158,7 +150,7 @@ String const& TextBoxWidget::getText() const {
return m_text;
}
-bool TextBoxWidget::setText(String const& text, bool callback) {
+bool TextBoxWidget::setText(String const& text, bool callback, bool moveCursor) {
if (m_text == text)
return true;
@@ -166,7 +158,10 @@ bool TextBoxWidget::setText(String const& text, bool callback) {
return false;
m_text = text;
- m_cursorOffset = m_text.size();
+ size_t size = m_text.size();
+ if (moveCursor || m_cursorOffset > size)
+ m_cursorOffset = size;
+
m_repeatCode = SpecialRepeatKeyCodes::None;
if (callback)
m_callback(this);
@@ -190,20 +185,20 @@ void TextBoxWidget::setRegex(String const& regex) {
}
void TextBoxWidget::setColor(Color const& color) {
- m_color = color;
+ m_textStyle.color = color.toRgba();
}
void TextBoxWidget::setDirectives(String const& directives) {
- m_processingDirectives = directives;
+ m_textStyle.directives = directives;
}
void TextBoxWidget::setFontSize(int fontSize) {
- m_fontSize = fontSize;
+ m_textStyle.fontSize = fontSize;
}
void TextBoxWidget::setMaxWidth(int maxWidth) {
m_maxWidth = maxWidth;
- setSize({m_maxWidth + 6, m_fontSize + 2});
+ setSize({m_maxWidth + 6, m_textStyle.fontSize + 2});
}
void TextBoxWidget::setOverfillMode(bool overtype) {
@@ -426,8 +421,7 @@ bool TextBoxWidget::newTextValid(String const& text) const {
if (!text.regexMatch(m_regex))
return false;
if ((m_maxWidth != -1) && !m_overfillMode) {
- context()->setFont(m_font);
- context()->setFontSize(m_fontSize);
+ context()->setTextStyle(m_textStyle);
return context()->stringInterfaceWidth(text) <= m_maxWidth;
}
return true;
diff --git a/source/windowing/StarTextBoxWidget.hpp b/source/windowing/StarTextBoxWidget.hpp
index 12294d5..5fed88e 100644
--- a/source/windowing/StarTextBoxWidget.hpp
+++ b/source/windowing/StarTextBoxWidget.hpp
@@ -14,7 +14,7 @@ public:
virtual void update(float dt) override;
String const& getText() const;
- bool setText(String const& text, bool callback = true);
+ bool setText(String const& text, bool callback = true, bool moveCursor = true);
bool getHidden() const;
void setHidden(bool hidden);
@@ -64,10 +64,7 @@ private:
String m_regex;
HorizontalAnchor m_hAnchor;
VerticalAnchor m_vAnchor;
- Color m_color;
- String m_processingDirectives;
- String m_font;
- int m_fontSize;
+ TextStyle m_textStyle;
int m_maxWidth;
int m_cursorOffset;
bool m_isHover;