diff options
author | crupest <crupest@outlook.com> | 2020-07-04 16:43:49 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2020-07-04 16:43:49 +0800 |
commit | e10ef322e5f6268aec5d7717a82fceb42607a000 (patch) | |
tree | cb635f26fb9caa86d0486ca91a146bff77fad44d /src/ui/render | |
parent | 5a1c45f69b858f8c578806df54d276d5084d032b (diff) | |
download | cru-e10ef322e5f6268aec5d7717a82fceb42607a000.tar.gz cru-e10ef322e5f6268aec5d7717a82fceb42607a000.tar.bz2 cru-e10ef322e5f6268aec5d7717a82fceb42607a000.zip |
...
Diffstat (limited to 'src/ui/render')
-rw-r--r-- | src/ui/render/ScrollRenderObject.cpp | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/src/ui/render/ScrollRenderObject.cpp b/src/ui/render/ScrollRenderObject.cpp index aab8c003..a367afd9 100644 --- a/src/ui/render/ScrollRenderObject.cpp +++ b/src/ui/render/ScrollRenderObject.cpp @@ -69,30 +69,34 @@ void ScrollRenderObject::SetScrollOffset(const Point& offset) { Size ScrollRenderObject::OnMeasureContent(const MeasureRequirement& requirement, const MeasureSize& preferred_size) { - // TODO: Rewrite this. - CRU_UNUSED(requirement); - CRU_UNUSED(preferred_size); - throw std::runtime_error("Not implemented."); - - // if (const auto child = GetSingleChild()) { - // child->Measure(MeasureRequirement::Infinate()); - // const auto preferred_size = child->GetMeasuredSize(); - // return Min(preferred_size, requirement.GetMaxSize()); - // } else { - // return Size{}; - // } + if (const auto child = GetSingleChild()) { + child->Measure(MeasureRequirement{MeasureSize::NotSpecified(), + MeasureSize::NotSpecified()}, + MeasureSize::NotSpecified()); + + Size result = requirement.Coerce(child->GetSize()); + if (preferred_size.width.IsSpecified()) { + result.width = preferred_size.width.GetLengthOrUndefined(); + } + if (preferred_size.height.IsSpecified()) { + result.height = preferred_size.height.GetLengthOrUndefined(); + } + return result; + } else { + Size result{preferred_size.width.IsSpecified() + ? preferred_size.width.GetLengthOrUndefined() + : requirement.min.width.GetLengthOr0(), + preferred_size.height.IsSpecified() + ? preferred_size.height.GetLengthOrUndefined() + : requirement.min.height.GetLengthOr0()}; + return result; + } } // namespace cru::ui::render void ScrollRenderObject::OnLayoutContent(const Rect& content_rect) { - // TODO: Rewrite this. - CRU_UNUSED(content_rect); - throw std::runtime_error("Not implemented."); - - // if (const auto child = GetSingleChild()) { - // const auto child_size = child->GetMeasuredSize(); - // const auto true_scroll = - // CoerceScroll(scroll_offset_, content_rect.GetSize(), child_size); - // child->Layout(Rect{content_rect.GetLeftTop() - true_scroll, child_size}); - // } + if (const auto child = GetSingleChild()) { + const auto child_size = child->GetSize(); + child->Layout(content_rect.GetLeftTop() - GetScrollOffset()); + } } } // namespace cru::ui::render |