GridTrackSize.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. /*
  2. * Copyright (c) 2022, Martin Falisse <mfalisse@outlook.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "GridTrackSize.h"
  7. #include <AK/String.h>
  8. #include <LibWeb/CSS/Length.h>
  9. #include <LibWeb/CSS/Percentage.h>
  10. #include <LibWeb/CSS/StyleValue.h>
  11. namespace Web::CSS {
  12. GridSize::GridSize(Length length)
  13. : m_type(Type::Length)
  14. , m_length(length)
  15. {
  16. }
  17. GridSize::GridSize(Percentage percentage)
  18. : m_type(Type::Percentage)
  19. , m_length { Length::make_px(0) }
  20. , m_percentage(percentage)
  21. {
  22. }
  23. GridSize::GridSize(float flexible_length)
  24. : m_type(Type::FlexibleLength)
  25. , m_length { Length::make_px(0) }
  26. , m_flexible_length(flexible_length)
  27. {
  28. }
  29. GridSize::GridSize(Type type)
  30. : m_length { Length::make_auto() }
  31. {
  32. VERIFY(type == Type::MinContent || type == Type::MaxContent);
  33. m_type = type;
  34. }
  35. GridSize::GridSize()
  36. : m_length { Length::make_auto() }
  37. {
  38. }
  39. GridSize::~GridSize() = default;
  40. GridSize GridSize::make_auto()
  41. {
  42. return GridSize(CSS::Length::make_auto());
  43. }
  44. ErrorOr<String> GridSize::to_string() const
  45. {
  46. switch (m_type) {
  47. case Type::Length:
  48. return m_length.to_string();
  49. case Type::Percentage:
  50. return m_percentage.to_string();
  51. case Type::FlexibleLength:
  52. return String::formatted("{}fr", m_flexible_length);
  53. case Type::MaxContent:
  54. return "max-content"_string;
  55. case Type::MinContent:
  56. return "min-content"_string;
  57. }
  58. VERIFY_NOT_REACHED();
  59. }
  60. Length GridSize::length() const
  61. {
  62. return m_length;
  63. }
  64. GridMinMax::GridMinMax(GridSize min_grid_size, GridSize max_grid_size)
  65. : m_min_grid_size(min_grid_size)
  66. , m_max_grid_size(max_grid_size)
  67. {
  68. }
  69. ErrorOr<String> GridMinMax::to_string() const
  70. {
  71. StringBuilder builder;
  72. builder.append("minmax("sv);
  73. builder.appendff("{}", TRY(m_min_grid_size.to_string()));
  74. builder.append(", "sv);
  75. builder.appendff("{}", TRY(m_max_grid_size.to_string()));
  76. builder.append(")"sv);
  77. return builder.to_string();
  78. }
  79. GridRepeat::GridRepeat(GridTrackSizeList grid_track_size_list, int repeat_count)
  80. : m_type(Type::Default)
  81. , m_grid_track_size_list(grid_track_size_list)
  82. , m_repeat_count(repeat_count)
  83. {
  84. }
  85. GridRepeat::GridRepeat(GridTrackSizeList grid_track_size_list, Type type)
  86. : m_type(type)
  87. , m_grid_track_size_list(grid_track_size_list)
  88. {
  89. }
  90. GridRepeat::GridRepeat()
  91. {
  92. }
  93. ErrorOr<String> GridRepeat::to_string() const
  94. {
  95. StringBuilder builder;
  96. builder.append("repeat("sv);
  97. switch (m_type) {
  98. case Type::AutoFit:
  99. builder.append("auto-fill"sv);
  100. break;
  101. case Type::AutoFill:
  102. builder.append("auto-fit"sv);
  103. break;
  104. case Type::Default:
  105. builder.appendff("{}", m_repeat_count);
  106. break;
  107. default:
  108. VERIFY_NOT_REACHED();
  109. }
  110. builder.append(", "sv);
  111. builder.appendff("{}", TRY(m_grid_track_size_list.to_string()));
  112. builder.append(")"sv);
  113. return builder.to_string();
  114. }
  115. ExplicitGridTrack::ExplicitGridTrack(CSS::GridMinMax grid_minmax)
  116. : m_type(Type::MinMax)
  117. , m_grid_minmax(grid_minmax)
  118. {
  119. }
  120. ExplicitGridTrack::ExplicitGridTrack(CSS::GridRepeat grid_repeat)
  121. : m_type(Type::Repeat)
  122. , m_grid_repeat(grid_repeat)
  123. {
  124. }
  125. ExplicitGridTrack::ExplicitGridTrack(CSS::GridSize grid_size)
  126. : m_type(Type::Default)
  127. , m_grid_size(grid_size)
  128. {
  129. }
  130. ErrorOr<String> ExplicitGridTrack::to_string() const
  131. {
  132. switch (m_type) {
  133. case Type::MinMax:
  134. return m_grid_minmax.to_string();
  135. case Type::Repeat:
  136. return m_grid_repeat.to_string();
  137. case Type::Default:
  138. return m_grid_size.to_string();
  139. default:
  140. VERIFY_NOT_REACHED();
  141. }
  142. }
  143. GridTrackSizeList::GridTrackSizeList(Vector<CSS::ExplicitGridTrack> track_list, Vector<Vector<String>> line_names)
  144. : m_track_list(track_list)
  145. , m_line_names(line_names)
  146. {
  147. }
  148. GridTrackSizeList::GridTrackSizeList()
  149. : m_track_list({})
  150. , m_line_names({})
  151. {
  152. }
  153. GridTrackSizeList GridTrackSizeList::make_auto()
  154. {
  155. return GridTrackSizeList();
  156. }
  157. ErrorOr<String> GridTrackSizeList::to_string() const
  158. {
  159. StringBuilder builder;
  160. auto print_line_names = [&](size_t index) -> void {
  161. builder.append("["sv);
  162. for (size_t y = 0; y < m_line_names[index].size(); ++y) {
  163. builder.append(m_line_names[index][y]);
  164. if (y != m_line_names[index].size() - 1)
  165. builder.append(" "sv);
  166. }
  167. builder.append("]"sv);
  168. };
  169. for (size_t i = 0; i < m_track_list.size(); ++i) {
  170. if (m_line_names[i].size() > 0) {
  171. print_line_names(i);
  172. builder.append(" "sv);
  173. }
  174. builder.append(TRY(m_track_list[i].to_string()));
  175. if (i < m_track_list.size() - 1)
  176. builder.append(" "sv);
  177. }
  178. if (m_line_names[m_track_list.size()].size() > 0) {
  179. builder.append(" "sv);
  180. print_line_names(m_track_list.size());
  181. }
  182. return builder.to_string();
  183. }
  184. }