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

summaryrefslogtreecommitdiff
path: root/source/windowing/StarLabelWidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/windowing/StarLabelWidget.cpp')
-rw-r--r--source/windowing/StarLabelWidget.cpp112
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();
+}
+
+}