diff options
Diffstat (limited to 'CruUI/ui/controls')
| -rw-r--r-- | CruUI/ui/controls/text_block.cpp | 25 | ||||
| -rw-r--r-- | CruUI/ui/controls/text_block.h | 3 | 
2 files changed, 27 insertions, 1 deletions
| diff --git a/CruUI/ui/controls/text_block.cpp b/CruUI/ui/controls/text_block.cpp index c528d3ca..132bd3e7 100644 --- a/CruUI/ui/controls/text_block.cpp +++ b/CruUI/ui/controls/text_block.cpp @@ -111,6 +111,7 @@ namespace cru              {                  if (args.GetMouseButton() == MouseButton::Left)                  { +                    RequestFocus();                      const auto hit_test_result = TextLayoutHitTest(text_layout_.Get(), args.GetPoint(this), true);                      if (hit_test_result.has_value())                      { @@ -118,6 +119,10 @@ namespace cru                          is_selecting_ = true;                          GetWindow()->CaptureMouseFor(this);                      } +                    else +                    { +                        selected_range_ = std::nullopt; +                    }                  }                  Control::OnMouseDownCore(args);              } @@ -126,13 +131,17 @@ namespace cru              {                  if (is_selecting_)                  { +                    is_mouse_moved_ = true;                      const auto hit_test_result = TextLayoutHitTest(text_layout_.Get(), args.GetPoint(this), false).value();                      if (hit_test_result > mouse_down_position_)                          selected_range_ = TextRange(mouse_down_position_, hit_test_result - mouse_down_position_); -                    else +                    else if (hit_test_result < mouse_down_position_)                          selected_range_ = TextRange(hit_test_result, mouse_down_position_ - hit_test_result); +                    else +                        selected_range_ = std::nullopt;                      Repaint();                  } +                Control::OnMouseMoveCore(args);              }              void TextBlock::OnMouseUpCore(events::MouseButtonEventArgs& args) @@ -141,10 +150,24 @@ namespace cru                  {                      if (is_selecting_)                      { +                        if (!is_mouse_moved_) +                        { +                            selected_range_ = std::nullopt; +                            Repaint(); +                        } +                        is_mouse_moved_ = false;                          is_selecting_ = false;                          GetWindow()->ReleaseCurrentMouseCapture();                      }                  } +                Control::OnMouseUpCore(args); +            } + +            void TextBlock::OnLoseFocusCore(events::UiEventArgs& args) +            { +                selected_range_ = std::nullopt; +                Repaint(); +                Control::OnLoseFocusCore(args);              }              Size TextBlock::OnMeasure(const Size& available_size) diff --git a/CruUI/ui/controls/text_block.h b/CruUI/ui/controls/text_block.h index 1d1166a5..c817104e 100644 --- a/CruUI/ui/controls/text_block.h +++ b/CruUI/ui/controls/text_block.h @@ -104,6 +104,8 @@ namespace cru                  void OnMouseMoveCore(events::MouseEventArgs& args) override;                  void OnMouseUpCore(events::MouseButtonEventArgs& args) override; +                void OnLoseFocusCore(events::UiEventArgs& args) override; +                  Size OnMeasure(const Size& available_size) override;              private: @@ -124,6 +126,7 @@ namespace cru                  Vector<std::shared_ptr<TextLayoutHandler>> text_layout_handlers_;                  unsigned mouse_down_position_ = 0; +                bool is_mouse_moved_ = false;                  std::optional<TextRange> selected_range_ = std::nullopt;                  bool is_selecting_ = false; | 
