diff options
author | crupest <crupest@outlook.com> | 2021-02-28 14:58:20 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-02-28 14:58:20 +0800 |
commit | 38a5b9eddb75e07695ee38f0bd41d3fd76341a15 (patch) | |
tree | 181d5c797e7b3930e3ef33267429aff97c72e8e6 /src/ui/render/ScrollBar.cpp | |
parent | 568abec9c267d072b03f3fbb27b4bda33307f244 (diff) | |
download | cru-38a5b9eddb75e07695ee38f0bd41d3fd76341a15.tar.gz cru-38a5b9eddb75e07695ee38f0bd41d3fd76341a15.tar.bz2 cru-38a5b9eddb75e07695ee38f0bd41d3fd76341a15.zip |
...
Diffstat (limited to 'src/ui/render/ScrollBar.cpp')
-rw-r--r-- | src/ui/render/ScrollBar.cpp | 160 |
1 files changed, 87 insertions, 73 deletions
diff --git a/src/ui/render/ScrollBar.cpp b/src/ui/render/ScrollBar.cpp index 70255752..00deb479 100644 --- a/src/ui/render/ScrollBar.cpp +++ b/src/ui/render/ScrollBar.cpp @@ -73,82 +73,96 @@ void ScrollBar::Draw(platform::graphics::IPainter* painter) { void ScrollBar::InstallHandlers(controls::Control* control) { event_guard_.Clear(); if (control != nullptr) { - event_guard_ += control->MouseDownEvent()->Bubble()->AddHandler( - [control, this](event::MouseButtonEventArgs& event) { - if (event.GetButton() == mouse_buttons::left && IsEnabled() && - IsExpanded()) { - auto hit_test_result = - ExpandedHitTest(event.GetPoint(render_object_)); - if (!hit_test_result) return; - - switch (*hit_test_result) { - case ScrollBarAreaKind::UpArrow: - this->scroll_attempt_event_.Raise( - {GetDirection(), ScrollKind::Line, -1}); - event.SetHandled(); - break; - case ScrollBarAreaKind::DownArrow: - this->scroll_attempt_event_.Raise( - {GetDirection(), ScrollKind::Line, 1}); - event.SetHandled(); - break; - case ScrollBarAreaKind::UpSlot: - this->scroll_attempt_event_.Raise( - {GetDirection(), ScrollKind::Page, -1}); - event.SetHandled(); - break; - case ScrollBarAreaKind::DownSlot: - this->scroll_attempt_event_.Raise( - {GetDirection(), ScrollKind::Page, 1}); + event_guard_ += + control->MouseDownEvent()->Bubble()->PrependShortCircuitHandler( + [control, this](event::MouseButtonEventArgs& event) { + if (event.GetButton() == mouse_buttons::left && IsEnabled() && + IsExpanded()) { + auto hit_test_result = + ExpandedHitTest(event.GetPoint(render_object_)); + if (!hit_test_result) return false; + + switch (*hit_test_result) { + case ScrollBarAreaKind::UpArrow: + this->scroll_attempt_event_.Raise( + {GetDirection(), ScrollKind::Line, -1}); + event.SetHandled(); + return true; + case ScrollBarAreaKind::DownArrow: + this->scroll_attempt_event_.Raise( + {GetDirection(), ScrollKind::Line, 1}); + event.SetHandled(); + return true; + case ScrollBarAreaKind::UpSlot: + this->scroll_attempt_event_.Raise( + {GetDirection(), ScrollKind::Page, -1}); + event.SetHandled(); + return true; + case ScrollBarAreaKind::DownSlot: + this->scroll_attempt_event_.Raise( + {GetDirection(), ScrollKind::Page, 1}); + event.SetHandled(); + return true; + case ScrollBarAreaKind::Thumb: { + auto thumb_rect = + GetExpandedAreaRect(ScrollBarAreaKind::Thumb); + assert(thumb_rect); + + if (!control->CaptureMouse()) break; + move_thumb_thumb_original_rect_ = *thumb_rect; + move_thumb_start_ = event.GetPoint(); + event.SetHandled(); + return true; + } + default: + break; + } + } + + return false; + }); + + event_guard_ += + control->MouseUpEvent()->Bubble()->PrependShortCircuitHandler( + [control, this](event::MouseButtonEventArgs& event) { + if (event.GetButton() == mouse_buttons::left && + move_thumb_start_) { + move_thumb_start_ = std::nullopt; + control->ReleaseMouse(); event.SetHandled(); - break; - case ScrollBarAreaKind::Thumb: { - auto thumb_rect = GetExpandedAreaRect(ScrollBarAreaKind::Thumb); - assert(thumb_rect); - - if (!control->CaptureMouse()) break; - move_thumb_thumb_original_rect_ = *thumb_rect; - move_thumb_start_ = event.GetPoint(); + return true; + } + return false; + }); + + event_guard_ += + control->MouseMoveEvent()->Bubble()->PrependShortCircuitHandler( + [this](event::MouseEventArgs& event) { + if (move_thumb_start_) { + auto new_scroll_position = CalculateNewScrollPosition( + move_thumb_thumb_original_rect_, + event.GetPoint() - *move_thumb_start_); + + this->scroll_attempt_event_.Raise({GetDirection(), + ScrollKind::Absolute, + new_scroll_position}); event.SetHandled(); - break; + return true; } - default: - break; - } - } - }); - - event_guard_ += control->MouseUpEvent()->Bubble()->AddHandler( - [control, this](event::MouseButtonEventArgs& event) { - if (event.GetButton() == mouse_buttons::left && move_thumb_start_) { - move_thumb_start_ = std::nullopt; - control->ReleaseMouse(); - event.SetHandled(); - } - }); - - event_guard_ += control->MouseMoveEvent()->Bubble()->AddHandler( - [this](event::MouseEventArgs& event) { - if (move_thumb_start_) { - auto new_scroll_position = CalculateNewScrollPosition( - move_thumb_thumb_original_rect_, - event.GetPoint() - *move_thumb_start_); - - this->scroll_attempt_event_.Raise( - {GetDirection(), ScrollKind::Absolute, new_scroll_position}); - event.SetHandled(); - return; - } - - if (IsEnabled() && !IsExpanded()) { - auto trigger_expand_area = GetCollapsedTriggerExpandAreaRect(); - if (trigger_expand_area && - trigger_expand_area->IsPointInside( - event.GetPoint(this->render_object_))) - SetExpanded(true); - event.SetHandled(); - } - }); + + if (IsEnabled() && !IsExpanded()) { + auto trigger_expand_area = GetCollapsedTriggerExpandAreaRect(); + if (trigger_expand_area && + trigger_expand_area->IsPointInside( + event.GetPoint(this->render_object_))) { + SetExpanded(true); + event.SetHandled(); + return true; + } + } + + return false; + }); } } |