From 2a659693bc54e2c473f71c3ac89905bd9384d8b9 Mon Sep 17 00:00:00 2001 From: MacDue Date: Sun, 2 Apr 2023 22:56:45 +0100 Subject: [PATCH] LibWeb: Add EdgeStyleValue This represents a single edge and offset, this will be needed for the values of background-position-x/y. --- Userland/Libraries/LibWeb/CMakeLists.txt | 1 + Userland/Libraries/LibWeb/CSS/StyleValue.cpp | 7 +++ Userland/Libraries/LibWeb/CSS/StyleValue.h | 4 ++ .../LibWeb/CSS/StyleValues/EdgeStyleValue.cpp | 30 +++++++++++++ .../LibWeb/CSS/StyleValues/EdgeStyleValue.h | 44 +++++++++++++++++++ Userland/Libraries/LibWeb/Forward.h | 1 + 6 files changed, 87 insertions(+) create mode 100644 Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.cpp create mode 100644 Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.h diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index a66c0eb03b..c7bea9da41 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -78,6 +78,7 @@ set(SOURCES CSS/StyleValues/ColorStyleValue.cpp CSS/StyleValues/ConicGradientStyleValue.cpp CSS/StyleValues/ContentStyleValue.cpp + CSS/StyleValues/EdgeStyleValue.cpp CSS/StyleValues/FilterValueListStyleValue.cpp CSS/StyleValues/FlexFlowStyleValue.cpp CSS/StyleValues/FlexStyleValue.cpp diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp index cd7d9406c0..6e13c798d9 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -138,6 +139,12 @@ ContentStyleValue const& StyleValue::as_content() const return static_cast(*this); } +EdgeStyleValue const& StyleValue::as_edge() const +{ + VERIFY(is_edge()); + return static_cast(*this); +} + FilterValueListStyleValue const& StyleValue::as_filter_value_list() const { VERIFY(is_filter_value_list()); diff --git a/Userland/Libraries/LibWeb/CSS/StyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValue.h index 5cb19c7431..ebb8cdd8f6 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleValue.h +++ b/Userland/Libraries/LibWeb/CSS/StyleValue.h @@ -99,6 +99,7 @@ public: Color, ConicGradient, Content, + Edge, FilterValueList, Flex, FlexFlow, @@ -148,6 +149,7 @@ public: bool is_color() const { return type() == Type::Color; } bool is_conic_gradient() const { return type() == Type::ConicGradient; } bool is_content() const { return type() == Type::Content; } + bool is_edge() const { return type() == Type::Edge; } bool is_filter_value_list() const { return type() == Type::FilterValueList; } bool is_flex() const { return type() == Type::Flex; } bool is_flex_flow() const { return type() == Type::FlexFlow; } @@ -195,6 +197,7 @@ public: ColorStyleValue const& as_color() const; ConicGradientStyleValue const& as_conic_gradient() const; ContentStyleValue const& as_content() const; + EdgeStyleValue const& as_edge() const; FilterValueListStyleValue const& as_filter_value_list() const; FlexFlowStyleValue const& as_flex_flow() const; FlexStyleValue const& as_flex() const; @@ -240,6 +243,7 @@ public: ColorStyleValue& as_color() { return const_cast(const_cast(*this).as_color()); } ConicGradientStyleValue& as_conic_gradient() { return const_cast(const_cast(*this).as_conic_gradient()); } ContentStyleValue& as_content() { return const_cast(const_cast(*this).as_content()); } + EdgeStyleValue& as_edge() { return const_cast(const_cast(*this).as_edge()); } FilterValueListStyleValue& as_filter_value_list() { return const_cast(const_cast(*this).as_filter_value_list()); } FlexFlowStyleValue& as_flex_flow() { return const_cast(const_cast(*this).as_flex_flow()); } FlexStyleValue& as_flex() { return const_cast(const_cast(*this).as_flex()); } diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.cpp b/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.cpp new file mode 100644 index 0000000000..2eed8db3db --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.cpp @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "EdgeStyleValue.h" + +namespace Web::CSS { + +ErrorOr EdgeStyleValue::to_string() const +{ + auto to_string = [](PositionEdge edge) { + switch (edge) { + case PositionEdge::Left: + return "left"; + case PositionEdge::Right: + return "right"; + case PositionEdge::Top: + return "top"; + case PositionEdge::Bottom: + return "bottom"; + } + VERIFY_NOT_REACHED(); + }; + + return String::formatted("{} {}", to_string(m_properties.edge), TRY(m_properties.offset.to_string())); +} + +} diff --git a/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.h b/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.h new file mode 100644 index 0000000000..ca23e9174d --- /dev/null +++ b/Userland/Libraries/LibWeb/CSS/StyleValues/EdgeStyleValue.h @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2023, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +namespace Web::CSS { + +class EdgeStyleValue final : public StyleValueWithDefaultOperators { +public: + static ValueComparingNonnullRefPtr create(PositionEdge edge, LengthPercentage const& offset) + { + return adopt_ref(*new EdgeStyleValue(edge, offset)); + } + virtual ~EdgeStyleValue() override = default; + + PositionEdge edge() const { return m_properties.edge; } + LengthPercentage const& offset() const { return m_properties.offset; } + + virtual ErrorOr to_string() const override; + + bool properties_equal(EdgeStyleValue const& other) const { return m_properties == other.m_properties; } + +private: + EdgeStyleValue(PositionEdge edge, LengthPercentage const& offset) + : StyleValueWithDefaultOperators(Type::Edge) + , m_properties { .edge = edge, .offset = offset } + { + } + + struct Properties { + PositionEdge edge; + LengthPercentage offset; + bool operator==(Properties const&) const = default; + } m_properties; +}; + +} diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 28f4d2ed68..692ee6bca4 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -53,6 +53,7 @@ class CSSStyleRule; class CSSStyleSheet; class CSSSupportsRule; class Display; +class EdgeStyleValue; class ElementInlineCSSStyleDeclaration; class ExplicitGridTrack; class FilterValueListStyleValue;