FlexFormattingContext.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibWeb/Layout/FormattingContext.h>
  8. namespace Web::Layout {
  9. struct FlexItem;
  10. struct FlexLine;
  11. class FlexFormattingContext final : public FormattingContext {
  12. public:
  13. FlexFormattingContext(Box& flex_container, FormattingContext* parent);
  14. ~FlexFormattingContext();
  15. virtual bool inhibits_floating() const override { return true; }
  16. virtual void run(Box&, LayoutMode) override;
  17. private:
  18. bool has_definite_main_size(Box const&) const;
  19. bool has_definite_cross_size(Box const&) const;
  20. float specified_main_size(Box const&) const;
  21. float specified_cross_size(Box const&) const;
  22. bool has_main_min_size(Box const&) const;
  23. bool has_cross_min_size(Box const&) const;
  24. bool cross_size_is_absolute_or_resolved_nicely(NodeWithStyle const&) const;
  25. float specified_main_max_size(Box const&) const;
  26. float specified_cross_max_size(Box const&) const;
  27. float calculated_main_size(Box const&) const;
  28. bool is_cross_auto(Box const&) const;
  29. bool is_main_axis_margin_first_auto(Box const&) const;
  30. bool is_main_axis_margin_second_auto(Box const&) const;
  31. float specified_main_size_of_child_box(Box const& flex_container, Box const& child_box) const;
  32. float specified_main_min_size(Box const&) const;
  33. float specified_cross_min_size(Box const&) const;
  34. bool has_main_max_size(Box const&) const;
  35. bool has_cross_max_size(Box const&) const;
  36. float sum_of_margin_padding_border_in_main_axis(Box const&) const;
  37. void set_main_size(Box&, float size);
  38. void set_cross_size(Box&, float size);
  39. void set_offset(Box&, float main_offset, float cross_offset);
  40. void set_main_axis_first_margin(Box&, float margin);
  41. void set_main_axis_second_margin(Box&, float margin);
  42. void generate_anonymous_flex_items(Box& flex_container, Vector<FlexItem>&);
  43. struct AvailableSpace {
  44. float main { 0 };
  45. float cross { 0 };
  46. };
  47. AvailableSpace determine_available_main_and_cross_space(Box const& flex_container, bool& main_size_is_infinite, bool& main_is_constrained, bool& cross_is_constrained, float& main_min_size, float& main_max_size, float& cross_min_size, float& cross_max_size) const;
  48. float layout_for_maximum_main_size(Box&);
  49. void determine_flex_base_size_and_hypothetical_main_size(Box const& flex_container, FlexItem&);
  50. void determine_main_size_of_flex_container(Box& flex_container, Vector<FlexItem>&, bool main_is_constrained, bool main_size_is_infinite, float& main_available_size, float main_min_size, float main_max_size);
  51. Vector<FlexLine> collect_flex_items_into_flex_lines(Box const& flex_container, Vector<FlexItem>&, float main_available_size);
  52. bool is_row_layout() const { return m_flex_direction == CSS::FlexDirection::Row || m_flex_direction == CSS::FlexDirection::RowReverse; }
  53. CSS::FlexDirection m_flex_direction {};
  54. };
  55. }