aboutsummaryrefslogtreecommitdiff
path: root/src/ui/render
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2020-07-04 16:43:49 +0800
committercrupest <crupest@outlook.com>2020-07-04 16:43:49 +0800
commite10ef322e5f6268aec5d7717a82fceb42607a000 (patch)
treecb635f26fb9caa86d0486ca91a146bff77fad44d /src/ui/render
parent5a1c45f69b858f8c578806df54d276d5084d032b (diff)
downloadcru-e10ef322e5f6268aec5d7717a82fceb42607a000.tar.gz
cru-e10ef322e5f6268aec5d7717a82fceb42607a000.tar.bz2
cru-e10ef322e5f6268aec5d7717a82fceb42607a000.zip
...
Diffstat (limited to 'src/ui/render')
-rw-r--r--src/ui/render/ScrollRenderObject.cpp48
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