From 307f90b675379870af6ca51b1afcce747237e46c Mon Sep 17 00:00:00 2001 From: Tobias Christiansen Date: Wed, 15 Sep 2021 18:27:20 +0200 Subject: [PATCH] LibWeb: Add proper parsing of the AlignItems property This teaches all the relevant places about 'align-items'. --- .../Libraries/LibWeb/CSS/ComputedValues.h | 3 +++ .../Libraries/LibWeb/CSS/StyleProperties.cpp | 21 +++++++++++++++++++ .../Libraries/LibWeb/CSS/StyleProperties.h | 1 + Userland/Libraries/LibWeb/CSS/StyleValue.h | 8 +++++++ Userland/Libraries/LibWeb/Layout/Node.cpp | 4 ++++ 5 files changed, 37 insertions(+) diff --git a/Userland/Libraries/LibWeb/CSS/ComputedValues.h b/Userland/Libraries/LibWeb/CSS/ComputedValues.h index d328ad71c81..18a4fe07e97 100644 --- a/Userland/Libraries/LibWeb/CSS/ComputedValues.h +++ b/Userland/Libraries/LibWeb/CSS/ComputedValues.h @@ -69,6 +69,7 @@ public: FlexBasisData flex_basis() const { return m_noninherited.flex_basis; } Optional flex_grow_factor() const { return m_noninherited.flex_grow_factor; } Optional flex_shrink_factor() const { return m_noninherited.flex_shrink_factor; } + CSS::AlignItems align_items() const { return m_noninherited.align_items; } Optional opacity() const { return m_noninherited.opacity; } CSS::JustifyContent justify_content() const { return m_noninherited.justify_content; } Optional box_shadow() const { return m_noninherited.box_shadow; } @@ -152,6 +153,7 @@ protected: CSS::FlexBasisData flex_basis {}; Optional flex_grow_factor; Optional flex_shrink_factor; + CSS::AlignItems align_items; CSS::JustifyContent justify_content { InitialValues::justify_content() }; CSS::Overflow overflow_x { InitialValues::overflow() }; CSS::Overflow overflow_y { InitialValues::overflow() }; @@ -204,6 +206,7 @@ public: void set_flex_basis(FlexBasisData value) { m_noninherited.flex_basis = value; } void set_flex_grow_factor(Optional value) { m_noninherited.flex_grow_factor = value; } void set_flex_shrink_factor(Optional value) { m_noninherited.flex_shrink_factor = value; } + void set_align_items(CSS::AlignItems value) { m_noninherited.align_items = value; } void set_opacity(Optional value) { m_noninherited.opacity = value; } void set_justify_content(CSS::JustifyContent value) { m_noninherited.justify_content = value; } void set_box_shadow(Optional value) { m_noninherited.box_shadow = move(value); } diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp index 807c624b074..05984f2ac4f 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.cpp @@ -424,6 +424,27 @@ Optional StyleProperties::justify_content() const } } +Optional StyleProperties::align_items() const +{ + auto value = property(CSS::PropertyID::AlignItems); + if (!value.has_value()) + return {}; + switch (value.value()->to_identifier()) { + case CSS::ValueID::FlexStart: + return CSS::AlignItems::FlexStart; + case CSS::ValueID::FlexEnd: + return CSS::AlignItems::FlexEnd; + case CSS::ValueID::Center: + return CSS::AlignItems::Center; + case CSS::ValueID::Baseline: + return CSS::AlignItems::Baseline; + case CSS::ValueID::Stretch: + return CSS::AlignItems::Stretch; + default: + return {}; + } +} + Optional StyleProperties::position() const { auto value = property(CSS::PropertyID::Position); diff --git a/Userland/Libraries/LibWeb/CSS/StyleProperties.h b/Userland/Libraries/LibWeb/CSS/StyleProperties.h index cc68d4cd78d..e4296851f3a 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleProperties.h +++ b/Userland/Libraries/LibWeb/CSS/StyleProperties.h @@ -55,6 +55,7 @@ public: Optional flex_basis() const; Optional flex_grow_factor() const; Optional flex_shrink_factor() const; + Optional align_items() const; Optional opacity() const; Optional justify_content() const; Optional overflow_x() const; diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index ceb00da0290..9d17b400d1a 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -211,6 +211,14 @@ enum class JustifyContent { SpaceAround, }; +enum class AlignItems { + FlexStart, + FlexEnd, + Center, + Baseline, + Stretch, +}; + class StyleValue : public RefCounted { public: virtual ~StyleValue(); diff --git a/Userland/Libraries/LibWeb/Layout/Node.cpp b/Userland/Libraries/LibWeb/Layout/Node.cpp index 8284060552c..84a4f38af98 100644 --- a/Userland/Libraries/LibWeb/Layout/Node.cpp +++ b/Userland/Libraries/LibWeb/Layout/Node.cpp @@ -269,6 +269,10 @@ void NodeWithStyle::apply_style(const CSS::StyleProperties& specified_style) if (justify_content.has_value()) computed_values.set_justify_content(justify_content.value()); + auto align_items = specified_style.align_items(); + if (align_items.has_value()) + computed_values.set_align_items(align_items.value()); + auto position = specified_style.position(); if (position.has_value()) { computed_values.set_position(position.value());