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