diff options
Diffstat (limited to 'source/windowing/StarLabelWidget.cpp')
-rw-r--r-- | source/windowing/StarLabelWidget.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/source/windowing/StarLabelWidget.cpp b/source/windowing/StarLabelWidget.cpp new file mode 100644 index 0000000..f9a5110 --- /dev/null +++ b/source/windowing/StarLabelWidget.cpp @@ -0,0 +1,112 @@ +#include "StarLabelWidget.hpp" +#include "StarRoot.hpp" +#include "StarAssets.hpp" + +namespace Star { + +LabelWidget::LabelWidget(String text, + Color const& color, + HorizontalAnchor const& hAnchor, + VerticalAnchor const& vAnchor, + Maybe<unsigned> wrapWidth, + Maybe<float> lineSpacing) + : m_color(color), + m_hAnchor(hAnchor), + m_vAnchor(vAnchor), + m_wrapWidth(move(wrapWidth)), + m_lineSpacing(move(lineSpacing)) { + auto assets = Root::singleton().assets(); + m_fontSize = assets->json("/interface.config:font").getInt("baseSize"); + setText(move(text)); +} + +String const& LabelWidget::text() const { + return m_text; +} + +Maybe<unsigned> LabelWidget::getTextCharLimit() const { + return m_textCharLimit; +} + +void LabelWidget::setText(String newText) { + m_text = move(newText); + updateTextRegion(); +} + +void LabelWidget::setFontSize(int fontSize) { + m_fontSize = fontSize; + updateTextRegion(); +} + +void LabelWidget::setColor(Color newColor) { + m_color = move(newColor); +} + +void LabelWidget::setAnchor(HorizontalAnchor hAnchor, VerticalAnchor vAnchor) { + m_hAnchor = hAnchor; + m_vAnchor = vAnchor; + updateTextRegion(); +} + +void LabelWidget::setWrapWidth(Maybe<unsigned> wrapWidth) { + m_wrapWidth = move(wrapWidth); + updateTextRegion(); +} + +void LabelWidget::setLineSpacing(Maybe<float> lineSpacing) { + m_lineSpacing = move(lineSpacing); + updateTextRegion(); +} + +void LabelWidget::setDirectives(String const& directives) { + m_processingDirectives = directives; + updateTextRegion(); +} + +void LabelWidget::setTextCharLimit(Maybe<unsigned> charLimit) { + m_textCharLimit = charLimit; + updateTextRegion(); +} + +RectI LabelWidget::relativeBoundRect() const { + return RectI(m_textRegion).translated(relativePosition()); +} + +RectI LabelWidget::getScissorRect() const { + return noScissor(); +} + +void LabelWidget::renderImpl() { + context()->setFontSize(m_fontSize); + context()->setFontColor(m_color.toRgba()); + context()->setFontProcessingDirectives(m_processingDirectives); + + if (m_lineSpacing) + context()->setLineSpacing(*m_lineSpacing); + else + context()->setDefaultLineSpacing(); + + context()->renderInterfaceText(m_text, {Vec2F(screenPosition()), m_hAnchor, m_vAnchor, m_wrapWidth, m_textCharLimit}); + + context()->setFontProcessingDirectives(""); + context()->setDefaultLineSpacing(); +} + +void LabelWidget::updateTextRegion() { + context()->setFontSize(m_fontSize); + context()->setFontColor(m_color.toRgba()); + context()->setFontProcessingDirectives(m_processingDirectives); + + if (m_lineSpacing) + context()->setLineSpacing(*m_lineSpacing); + else + context()->setDefaultLineSpacing(); + + m_textRegion = RectI(context()->determineInterfaceTextSize(m_text, {Vec2F(), m_hAnchor, m_vAnchor, m_wrapWidth, m_textCharLimit})); + setSize(m_textRegion.size()); + + context()->setFontProcessingDirectives(""); + context()->setDefaultLineSpacing(); +} + +} |