
This solves an awkward dependency cycle, where CalculatedStyleValue needs the definition of Percentage, but including that would also pull in PercentageOr, which in turn needs CalculatedStyleValue. Many places that previously included StyleValue.h no longer need to. :^)
93 lines
2.6 KiB
C++
93 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
|
* Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <LibWeb/CSS/Length.h>
|
|
#include <LibWeb/CSS/PercentageOr.h>
|
|
|
|
namespace Web::CSS {
|
|
|
|
class Size {
|
|
public:
|
|
enum class Type {
|
|
Auto,
|
|
Calculated,
|
|
Length,
|
|
Percentage,
|
|
MinContent,
|
|
MaxContent,
|
|
FitContent,
|
|
None, // NOTE: This is only valid for max-width and max-height.
|
|
};
|
|
|
|
static Size make_auto();
|
|
static Size make_px(CSSPixels);
|
|
static Size make_length(Length);
|
|
static Size make_percentage(Percentage);
|
|
static Size make_calculated(NonnullRefPtr<CalculatedStyleValue>);
|
|
static Size make_min_content();
|
|
static Size make_max_content();
|
|
static Size make_fit_content(Length available_space);
|
|
static Size make_none();
|
|
|
|
bool is_auto() const { return m_type == Type::Auto; }
|
|
bool is_calculated() const { return m_type == Type::Calculated; }
|
|
bool is_length() const { return m_type == Type::Length; }
|
|
bool is_percentage() const { return m_type == Type::Percentage; }
|
|
bool is_min_content() const { return m_type == Type::MinContent; }
|
|
bool is_max_content() const { return m_type == Type::MaxContent; }
|
|
bool is_fit_content() const { return m_type == Type::FitContent; }
|
|
bool is_none() const { return m_type == Type::None; }
|
|
|
|
// FIXME: This is a stopgap API that will go away once all layout code is aware of CSS::Size.
|
|
CSS::Length resolved(Layout::Node const&, Length const& reference_value) const;
|
|
|
|
bool contains_percentage() const;
|
|
|
|
CalculatedStyleValue const& calculated() const
|
|
{
|
|
VERIFY(is_calculated());
|
|
return m_length_percentage.calculated();
|
|
}
|
|
|
|
CSS::Length const& length() const
|
|
{
|
|
VERIFY(is_length());
|
|
return m_length_percentage.length();
|
|
}
|
|
|
|
CSS::Percentage const& percentage() const
|
|
{
|
|
VERIFY(is_percentage());
|
|
return m_length_percentage.percentage();
|
|
}
|
|
|
|
CSS::Length const& fit_content_available_space() const
|
|
{
|
|
VERIFY(is_fit_content());
|
|
return m_length_percentage.length();
|
|
}
|
|
|
|
ErrorOr<String> to_string() const;
|
|
|
|
private:
|
|
Size(Type type, LengthPercentage);
|
|
|
|
Type m_type {};
|
|
CSS::LengthPercentage m_length_percentage;
|
|
};
|
|
|
|
}
|
|
|
|
template<>
|
|
struct AK::Formatter<Web::CSS::Size> : Formatter<StringView> {
|
|
ErrorOr<void> format(FormatBuilder& builder, Web::CSS::Size const& size)
|
|
{
|
|
return Formatter<StringView>::format(builder, TRY(size.to_string()));
|
|
}
|
|
};
|