GridTrackSize.cpp 4.6 KB

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