Files
Upsilon/poincare/src/layout_node.cpp

69 lines
1.5 KiB
C++

#include <poincare/layout_node.h>
#include <poincare/allocation_failed_layout_node.h>
#include <poincare/layout_reference.h>
namespace Poincare {
// Rendering
void LayoutNode::draw(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) {
for (LayoutNode * l : children()) {
l->draw(ctx, p, expressionColor, backgroundColor);
}
render(ctx, absoluteOrigin().translatedBy(p), expressionColor, backgroundColor);
}
KDPoint LayoutNode::origin() {
LayoutNode * p = parent();
if (p != nullptr) {
return absoluteOrigin();
} else {
return KDPoint(absoluteOrigin().x() - p->absoluteOrigin().x(),
absoluteOrigin().y() - p->absoluteOrigin().y());
}
}
KDPoint LayoutNode::absoluteOrigin() {
LayoutNode * p = parent();
if (!m_positioned) {
if (p != nullptr) {
m_frame.setOrigin(p->absoluteOrigin().translatedBy(p->positionOfChild(this)));
} else {
m_frame.setOrigin(KDPointZero);
}
m_positioned = true;
}
return m_frame.origin();
}
KDSize LayoutNode::layoutSize() {
if (!m_sized) {
computeSize();
}
return m_frame.size();
}
KDCoordinate LayoutNode::baseline() {
if (!m_baselined) {
computeBaseline();
}
return m_baseline;
}
void LayoutNode::invalidAllSizesPositionsAndBaselines() {
m_sized = false;
m_positioned = false;
m_baselined = false;
for (LayoutNode * l : children()) {
l->invalidAllSizesPositionsAndBaselines();
}
}
// TreeNode
TreeNode * LayoutNode::FailedAllocationStaticNode() {
return LayoutRef::FailedAllocationStaticNode();
}
}