From 22fec1a25026c72823079fca857d263470889147 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 1 Jul 2019 07:28:37 +0200 Subject: [PATCH] LibHTML: Start fleshing out block layout. The basic idea of block layout is: width, then children based on width, then height based on height of children. --- LibHTML/Layout/LayoutBlock.cpp | 12 ++++++++++++ LibHTML/Layout/LayoutBlock.h | 4 ++++ LibHTML/Layout/LayoutDocument.h | 4 ++-- LibHTML/Layout/LayoutNode.cpp | 10 ++++++++++ LibHTML/Layout/LayoutNode.h | 4 ++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/LibHTML/Layout/LayoutBlock.cpp b/LibHTML/Layout/LayoutBlock.cpp index fd47af1ed0..ffcca02f15 100644 --- a/LibHTML/Layout/LayoutBlock.cpp +++ b/LibHTML/Layout/LayoutBlock.cpp @@ -12,7 +12,19 @@ LayoutBlock::~LayoutBlock() void LayoutBlock::layout() { + compute_width(); + LayoutNode::layout(); + compute_height(); +} + +void LayoutBlock::compute_width() +{ + +} + +void LayoutBlock::compute_height() +{ } diff --git a/LibHTML/Layout/LayoutBlock.h b/LibHTML/Layout/LayoutBlock.h index cc8a283245..86a117feb2 100644 --- a/LibHTML/Layout/LayoutBlock.h +++ b/LibHTML/Layout/LayoutBlock.h @@ -14,4 +14,8 @@ public: virtual void layout() override; private: + virtual bool is_block() const override { return true; } + + void compute_width(); + void compute_height(); }; diff --git a/LibHTML/Layout/LayoutDocument.h b/LibHTML/Layout/LayoutDocument.h index a06e9f470b..11e1e48330 100644 --- a/LibHTML/Layout/LayoutDocument.h +++ b/LibHTML/Layout/LayoutDocument.h @@ -1,9 +1,9 @@ #pragma once -#include +#include #include -class LayoutDocument final : public LayoutNode { +class LayoutDocument final : public LayoutBlock { public: explicit LayoutDocument(const Document&); virtual ~LayoutDocument() override; diff --git a/LibHTML/Layout/LayoutNode.cpp b/LibHTML/Layout/LayoutNode.cpp index 22ba3097aa..ba1f8ae896 100644 --- a/LibHTML/Layout/LayoutNode.cpp +++ b/LibHTML/Layout/LayoutNode.cpp @@ -1,3 +1,4 @@ +#include #include LayoutNode::LayoutNode(const Node* node) @@ -15,3 +16,12 @@ void LayoutNode::layout() child.layout(); }); } + +const LayoutBlock* LayoutNode::containing_block() const +{ + for (auto* ancestor = parent(); ancestor; ancestor = ancestor->parent()) { + if (ancestor->is_block()) + return static_cast(ancestor); + } + return nullptr; +} diff --git a/LibHTML/Layout/LayoutNode.h b/LibHTML/Layout/LayoutNode.h index 9c665bf3f7..49a7b84746 100644 --- a/LibHTML/Layout/LayoutNode.h +++ b/LibHTML/Layout/LayoutNode.h @@ -7,6 +7,7 @@ #include class Node; +class LayoutBlock; class LayoutNode : public TreeNode { public: @@ -38,9 +39,12 @@ public: virtual const char* class_name() const { return "LayoutNode"; } virtual bool is_text() const { return false; } + virtual bool is_block() const { return false; } virtual void layout(); + const LayoutBlock* containing_block() const; + protected: explicit LayoutNode(const Node*);