Modules/WidgetsNew/private/layouts/ScrollableLayout.cpp
2024-10-18 00:31:04 +03:00

53 lines
1.6 KiB
C++

#include "ScrollableLayout.hpp"
// fixme : this dependency should be removed
#include "ScrollableWidget.hpp"
using namespace tp;
void ScrollableLayout::updateLayout(bool vertical) {
if (vertical) return;
// TODO : make better interface to get scroller and content widget
if (children().size() != 2) return;
auto scroller = dynamic_cast<ScrollableBarWidget*>(children().front());
auto content = children().back();
if (!scroller || !content) return;
updateWidgetRects(getArea().relative(), content, scroller);
}
void ScrollableLayout::updateWidgetRects(const RectF& area, Widget* content, ScrollableBarWidget* scroller) const {
bool dir = scroller->getDirection();
// update content
// auto contentItems = content->getLayout()->getChildrenEnclosure();
// content->getLayout()->setArea(contentItems.shrinkFromCenter(-10, true));
content->getLayout()->pickRect(dir);
auto sizeFactor = (area.size[dir] / content->getLayout()->getArea().size[dir]);
auto splitFactor = 1 - ((sizeFactor > 1.f) ? 0 : mScrollerSize / area.size[!dir]);
auto holderArea = area.splitByFactorHL(splitFactor);
auto contentArea = content->getLayout()->getArea();
auto scrollerArea = area.splitByFactorHR(splitFactor);
scroller->updateSizeFactor(sizeFactor);
contentArea.pos[dir] = -scroller->getPosFactor() * contentArea.size[dir];
contentArea.size[!dir] = holderArea.size[!dir];
contentArea.pos[!dir] = 0;
scroller->getLayout()->setArea(scrollerArea);
content->getLayout()->setArea(contentArea);
}
RectF ScrollableLayout::getAvailableChildArea() const {
auto out = getArea();
// dont constrain on scroll axis
out.pos = -FLT_MAX / 4;
out.size = FLT_MAX / 2;
return out;
}