diff options
author | crupest <crupest@outlook.com> | 2020-11-10 15:52:15 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-11-10 15:52:15 +0800 |
commit | 2d4a5df468f8bc13fbb657e010c393365ef79bda (patch) | |
tree | 4ee7865663348ede1a961209c980fd614d727859 /src/ui | |
parent | 02ed6999e9db0c20c3f55ab9c695f939aacb110c (diff) | |
download | cru-2d4a5df468f8bc13fbb657e010c393365ef79bda.tar.gz cru-2d4a5df468f8bc13fbb657e010c393365ef79bda.tar.bz2 cru-2d4a5df468f8bc13fbb657e010c393365ef79bda.zip |
...
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/controls/TextBox.cpp | 2 | ||||
-rw-r--r-- | src/ui/controls/TextControlService.hpp | 26 | ||||
-rw-r--r-- | src/ui/host/LayoutPaintCycler.cpp | 4 |
3 files changed, 27 insertions, 5 deletions
diff --git a/src/ui/controls/TextBox.cpp b/src/ui/controls/TextBox.cpp index 4a8d6658..6ba6ecb2 100644 --- a/src/ui/controls/TextBox.cpp +++ b/src/ui/controls/TextBox.cpp @@ -10,9 +10,7 @@ namespace cru::ui::controls { using render::BorderRenderObject; -using render::CanvasRenderObject; using render::ScrollRenderObject; -using render::StackLayoutRenderObject; using render::TextRenderObject; TextBox::TextBox() diff --git a/src/ui/controls/TextControlService.hpp b/src/ui/controls/TextControlService.hpp index 92a66f5e..d50621ea 100644 --- a/src/ui/controls/TextControlService.hpp +++ b/src/ui/controls/TextControlService.hpp @@ -298,6 +298,24 @@ class TextControlService : public Object { selection.GetStart(), selection.GetEnd()); } + void UpdateInputMethodPosition() { + if (auto input_method_context = this->GetInputMethodContext()) { + Point right_bottom = + this->GetTextRenderObject()->GetTotalOffset() + + this->GetTextRenderObject()->GetCaretRect().GetRightBottom(); + right_bottom.x += 5; + right_bottom.y += 5; + + if constexpr (debug_flags::text_service) { + log::TagDebug(log_tag, + u"Calculate input method candidate window position: {}.", + right_bottom.ToDebugString()); + } + + input_method_context->SetCandidateWindowPosition(right_bottom); + } + } + template <typename TArgs> void SetupOneHandler(event::RoutedEvent<TArgs>* (Control::*event)(), void (TextControlService::*handler)( @@ -449,6 +467,12 @@ class TextControlService : public Object { if (text == u"\b") return; this->ReplaceSelectedText(text); }); + + host::WindowHost* window_host = control_->GetWindowHost(); + if (window_host) + input_method_context_event_guard_ += + window_host->AfterLayoutEvent()->AddHandler( + [this](auto) { this->UpdateInputMethodPosition(); }); } } @@ -481,5 +505,5 @@ class TextControlService : public Object { // nullopt means not selecting std::optional<MouseButton> select_down_button_; -}; // namespace cru::ui::controls +}; } // namespace cru::ui::controls diff --git a/src/ui/host/LayoutPaintCycler.cpp b/src/ui/host/LayoutPaintCycler.cpp index 9b319da4..fd581e00 100644 --- a/src/ui/host/LayoutPaintCycler.cpp +++ b/src/ui/host/LayoutPaintCycler.cpp @@ -29,7 +29,7 @@ void LayoutPaintCycler::OnCycle() { host_->Repaint(); } } - layout_dirty_ = true; - paint_dirty_ = true; + layout_dirty_ = false; + paint_dirty_ = false; } } // namespace cru::ui::host |