diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-04-22 06:07:59 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2024-04-22 06:07:59 +1000 |
commit | ca1426eabc873f781eb0dd389d45634b7d183250 (patch) | |
tree | 15ea83658ca3824232f14fe4b32ec714e0aa05c6 /source/windowing | |
parent | d5f5fb5ddf0d4a9f0b0e6ac012121926d2fcd949 (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.cpp | 27 | ||||
-rw-r--r-- | source/windowing/StarButtonWidget.hpp | 4 | ||||
-rw-r--r-- | source/windowing/StarCanvasWidget.cpp | 29 | ||||
-rw-r--r-- | source/windowing/StarCanvasWidget.hpp | 5 | ||||
-rw-r--r-- | source/windowing/StarFuelWidget.cpp | 7 | ||||
-rw-r--r-- | source/windowing/StarFuelWidget.hpp | 3 | ||||
-rw-r--r-- | source/windowing/StarGuiContext.cpp | 14 | ||||
-rw-r--r-- | source/windowing/StarGuiContext.hpp | 3 | ||||
-rw-r--r-- | source/windowing/StarItemSlotWidget.cpp | 12 | ||||
-rw-r--r-- | source/windowing/StarItemSlotWidget.hpp | 4 | ||||
-rw-r--r-- | source/windowing/StarLabelWidget.cpp | 62 | ||||
-rw-r--r-- | source/windowing/StarLabelWidget.hpp | 7 | ||||
-rw-r--r-- | source/windowing/StarPane.cpp | 9 | ||||
-rw-r--r-- | source/windowing/StarPane.hpp | 3 | ||||
-rw-r--r-- | source/windowing/StarTextBoxWidget.cpp | 52 | ||||
-rw-r--r-- | source/windowing/StarTextBoxWidget.hpp | 7 |
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; |