GridTrackSize.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright (c) 2022, Martin Falisse <mfalisse@outlook.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Vector.h>
  8. #include <LibWeb/CSS/Length.h>
  9. #include <LibWeb/CSS/Percentage.h>
  10. namespace Web::CSS {
  11. class GridTrackSize {
  12. public:
  13. enum class Type {
  14. Length,
  15. Percentage,
  16. FlexibleLength,
  17. // TODO: MinMax
  18. // TODO: Max-Content
  19. };
  20. GridTrackSize(Length);
  21. GridTrackSize(Percentage);
  22. GridTrackSize(float);
  23. ~GridTrackSize();
  24. static GridTrackSize make_auto();
  25. Type type() const { return m_type; }
  26. bool is_length() const { return m_type == Type::Length; }
  27. bool is_percentage() const { return m_type == Type::Percentage; }
  28. bool is_flexible_length() const { return m_type == Type::FlexibleLength; }
  29. Length length() const;
  30. Percentage percentage() const { return m_percentage; }
  31. float flexible_length() const { return m_flexible_length; }
  32. // https://drafts.csswg.org/css-grid/#layout-algorithm
  33. // Intrinsic sizing function - min-content, max-content, auto, fit-content()
  34. // FIXME: Add missing properties once implemented.
  35. bool is_intrinsic_track_sizing() const
  36. {
  37. return (m_type == Type::Length && m_length.is_auto());
  38. }
  39. String to_string() const;
  40. bool operator==(GridTrackSize const& other) const
  41. {
  42. return m_type == other.type()
  43. && m_length == other.length()
  44. && m_percentage == other.percentage()
  45. && m_flexible_length == other.flexible_length();
  46. }
  47. private:
  48. Type m_type;
  49. // Length includes a RefPtr<CalculatedStyleValue> member, but we can't include the header StyleValue.h as it includes
  50. // this file already. To break the cyclic dependency, we must initialize m_length in the constructor.
  51. Length m_length;
  52. Percentage m_percentage { Percentage(0) };
  53. float m_flexible_length { 0 };
  54. };
  55. class MetaGridTrackSize {
  56. public:
  57. MetaGridTrackSize(CSS::GridTrackSize);
  58. GridTrackSize grid_track_size() const& { return m_min_grid_track_size; }
  59. GridTrackSize min_grid_track_size() const& { return m_min_grid_track_size; }
  60. GridTrackSize max_grid_track_size() const& { return m_max_grid_track_size; }
  61. String to_string() const;
  62. bool operator==(MetaGridTrackSize const& other) const
  63. {
  64. return m_min_grid_track_size == other.min_grid_track_size()
  65. && m_max_grid_track_size == other.max_grid_track_size();
  66. }
  67. private:
  68. GridTrackSize m_min_grid_track_size;
  69. GridTrackSize m_max_grid_track_size;
  70. };
  71. class ExplicitTrackSizing {
  72. public:
  73. ExplicitTrackSizing();
  74. ExplicitTrackSizing(Vector<CSS::MetaGridTrackSize>);
  75. ExplicitTrackSizing(Vector<CSS::MetaGridTrackSize>, int repeat_count);
  76. static ExplicitTrackSizing make_auto() { return ExplicitTrackSizing(); };
  77. bool is_repeat() const { return m_is_repeat; }
  78. int repeat_count() const { return m_repeat_count; }
  79. Vector<CSS::MetaGridTrackSize> meta_grid_track_sizes() const& { return m_meta_grid_track_sizes; }
  80. String to_string() const;
  81. bool operator==(ExplicitTrackSizing const& other) const
  82. {
  83. return m_meta_grid_track_sizes == other.meta_grid_track_sizes();
  84. }
  85. private:
  86. Vector<CSS::MetaGridTrackSize> m_meta_grid_track_sizes;
  87. bool m_is_repeat { false };
  88. int m_repeat_count { 0 };
  89. };
  90. }