diff options
-rw-r--r-- | include/cru/ui/controls/TextHostControlService.hpp | 5 | ||||
-rw-r--r-- | src/ui/controls/TextHostControlService.cpp | 20 |
2 files changed, 23 insertions, 2 deletions
diff --git a/include/cru/ui/controls/TextHostControlService.hpp b/include/cru/ui/controls/TextHostControlService.hpp index 274d092b..f63a45c2 100644 --- a/include/cru/ui/controls/TextHostControlService.hpp +++ b/include/cru/ui/controls/TextHostControlService.hpp @@ -86,6 +86,10 @@ class TextHostControlService : public Object { bool IsEditable() { return this->editable_; } void SetEditable(bool editable); + bool IsMultiLine() { return this->multi_line_; } + // If text contains line feed characters, it will be converted to space. + void SetMultiLine(bool multi_line); + String GetText() { return this->text_; } StringView GetTextView() { return this->text_; } void SetText(String text, bool stop_composition = false); @@ -169,6 +173,7 @@ class TextHostControlService : public Object { bool enable_ = false; bool editable_ = false; + bool multi_line_ = false; bool caret_visible_ = false; platform::gui::TimerAutoCanceler caret_timer_canceler_; diff --git a/src/ui/controls/TextHostControlService.cpp b/src/ui/controls/TextHostControlService.cpp index 3fb10a95..740fa447 100644 --- a/src/ui/controls/TextHostControlService.cpp +++ b/src/ui/controls/TextHostControlService.cpp @@ -150,6 +150,18 @@ void TextHostControlService::SetEditable(bool editable) { if (!editable) CancelComposition(); } +void TextHostControlService::SetMultiLine(bool multi_line) { + this->multi_line_ = multi_line; + + if (!multi_line) { + auto text = GetText(); + for (auto& c : text) { + if (c == u'\n') c = u' '; + } + SetText(text); + } +} + void TextHostControlService::SetText(String text, bool stop_composition) { this->text_ = std::move(text); CoerceSelection(); @@ -433,8 +445,12 @@ void TextHostControlService::GainFocusHandler( input_method_context_event_guard_ += input_method_context->CompositionEndEvent()->AddHandler(sync); input_method_context_event_guard_ += - input_method_context->TextEvent()->AddHandler( - [this](StringView text) { this->ReplaceSelectedText(text); }); + input_method_context->TextEvent()->AddHandler([this](StringView text) { + if (!multi_line_ && text == u"\n") { + return; + } + this->ReplaceSelectedText(text); + }); host::WindowHost* window_host = control_->GetWindowHost(); if (window_host) |