aboutsummaryrefslogtreecommitdiff
path: root/src/ui/controls/TextBox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/controls/TextBox.cpp')
-rw-r--r--src/ui/controls/TextBox.cpp70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/ui/controls/TextBox.cpp b/src/ui/controls/TextBox.cpp
new file mode 100644
index 00000000..64fd4c60
--- /dev/null
+++ b/src/ui/controls/TextBox.cpp
@@ -0,0 +1,70 @@
+#include "cru/ui/controls/TextBox.hpp"
+
+#include "cru/ui/render/BorderRenderObject.hpp"
+#include "cru/ui/render/CanvasRenderObject.hpp"
+#include "cru/ui/render/StackLayoutRenderObject.hpp"
+#include "cru/ui/render/TextRenderObject.hpp"
+#include "cru/ui/UiManager.hpp"
+#include "TextControlService.hpp"
+
+namespace cru::ui::controls {
+using render::BorderRenderObject;
+using render::CanvasRenderObject;
+using render::StackLayoutRenderObject;
+using render::TextRenderObject;
+
+TextBox::TextBox() : border_render_object_(new BorderRenderObject()) {
+ const auto theme_resources = UiManager::GetInstance()->GetThemeResources();
+
+ border_style_ = theme_resources->text_box_border_style;
+
+ text_render_object_ = std::make_unique<TextRenderObject>(
+ theme_resources->text_brush, theme_resources->default_font,
+ theme_resources->text_selection_brush, theme_resources->caret_brush);
+
+ border_render_object_->AddChild(text_render_object_.get(), 0);
+
+ border_render_object_->SetAttachedControl(this);
+ text_render_object_->SetAttachedControl(this);
+
+ service_ = std::make_unique<TextControlService<TextBox>>(this);
+ service_->SetEnabled(true);
+ service_->SetCaretVisible(true);
+
+ GainFocusEvent()->Direct()->AddHandler([this](event::FocusChangeEventArgs&) {
+ this->service_->SetEnabled(true);
+ this->UpdateBorderStyle();
+ });
+
+ LoseFocusEvent()->Direct()->AddHandler([this](event::FocusChangeEventArgs&) {
+ this->service_->SetEnabled(false);
+ this->UpdateBorderStyle();
+ });
+}
+
+TextBox::~TextBox() {}
+
+render::RenderObject* TextBox::GetRenderObject() const {
+ return border_render_object_.get();
+}
+
+render::TextRenderObject* TextBox::GetTextRenderObject() {
+ return text_render_object_.get();
+}
+
+const TextBoxBorderStyle& TextBox::GetBorderStyle() { return border_style_; }
+
+void TextBox::SetBorderStyle(TextBoxBorderStyle border_style) {
+ border_style_ = std::move(border_style);
+}
+
+void TextBox::OnMouseHoverChange(bool) { UpdateBorderStyle(); }
+
+void TextBox::UpdateBorderStyle() {
+ const auto focus = HasFocus();
+ const auto hover = IsMouseOver();
+ border_render_object_->SetBorderStyle(
+ focus ? (hover ? border_style_.focus_hover : border_style_.focus)
+ : (hover ? border_style_.hover : border_style_.normal));
+}
+} // namespace cru::ui::controls