From 23bf673f9582d7bc99eb6440be1df0cf5c43b725 Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 25 Jul 2020 23:57:16 +0800 Subject: Implement ScrollRenderObject::ScrollToContain . --- src/ui/render/ScrollRenderObject.cpp | 43 ++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'src/ui/render/ScrollRenderObject.cpp') diff --git a/src/ui/render/ScrollRenderObject.cpp b/src/ui/render/ScrollRenderObject.cpp index 533a269a..08ce744b 100644 --- a/src/ui/render/ScrollRenderObject.cpp +++ b/src/ui/render/ScrollRenderObject.cpp @@ -67,12 +67,47 @@ void ScrollRenderObject::SetScrollOffset(const Point& offset) { InvalidateLayout(); } +void ScrollRenderObject::SetScrollOffset(std::optional x, + std::optional y) { + bool dirty = false; + + if (x.has_value()) { + dirty = true; + scroll_offset_.x = *x; + } + + if (y.has_value()) { + dirty = true; + scroll_offset_.y = *y; + } + + if (dirty) InvalidateLayout(); +} + void ScrollRenderObject::ScrollToContain(const Rect& rect, const Thickness& margin) { - // TODO: Implement this. - CRU_UNUSED(rect); - CRU_UNUSED(margin); - throw std::runtime_error("Not implemented."); + std::optional new_scroll_x; + std::optional new_scroll_y; + + Rect real_rect = rect.Expand(margin); + + Rect view_rect = GetViewRect(); + + // horizontal + if (real_rect.left < view_rect.left) { + new_scroll_x = real_rect.left; + } else if (real_rect.GetRight() > view_rect.GetRight()) { + new_scroll_x = real_rect.GetRight() - view_rect.width; + } + + // vertical + if (real_rect.top < view_rect.top) { + new_scroll_y = real_rect.top; + } else if (real_rect.GetBottom() > view_rect.GetBottom()) { + new_scroll_y = real_rect.GetBottom() - view_rect.height; + } + + SetScrollOffset(new_scroll_x, new_scroll_y); } Size ScrollRenderObject::OnMeasureContent(const MeasureRequirement& requirement, -- cgit v1.2.3