|
31 | 31 | #include <LibWeb/Painting/ChromeMetrics.h> |
32 | 32 | #include <LibWeb/Painting/DisplayListRecorder.h> |
33 | 33 | #include <LibWeb/Painting/DisplayListRecordingContext.h> |
| 34 | +#include <LibWeb/Painting/FlexboxInspectorOverlay.h> |
34 | 35 | #include <LibWeb/Painting/GridInspectorOverlay.h> |
35 | 36 | #include <LibWeb/Painting/PaintableBox.h> |
36 | 37 | #include <LibWeb/Painting/ResizeHandle.h> |
@@ -1320,6 +1321,75 @@ void PaintableBox::paint_grid_inspector_overlay(DisplayListRecordingContext& con |
1320 | 1321 | }); |
1321 | 1322 | } |
1322 | 1323 |
|
| 1324 | +void PaintableBox::paint_flexbox_inspector_overlay(DisplayListRecordingContext& context, FlexboxInspectorOverlayOptions const& options) const |
| 1325 | +{ |
| 1326 | + if (!m_flex_layout_data) |
| 1327 | + return; |
| 1328 | + |
| 1329 | + paint_with_inspector_overlay_context(context, [&] { |
| 1330 | + auto content_rect = absolute_united_content_rect(); |
| 1331 | + auto const origin = content_rect.location(); |
| 1332 | + auto const viewport_rect = document().viewport_rect(); |
| 1333 | + auto const& color = options.color; |
| 1334 | + auto line_color = color.with_alpha(220); |
| 1335 | + auto container_fill_color = color.with_alpha(28); |
| 1336 | + auto line_fill_color = color.with_alpha(18); |
| 1337 | + auto item_fill_color = color.with_alpha(32); |
| 1338 | + auto line_thickness = CSSPixels(1); |
| 1339 | + auto main_axis_is_horizontal = m_flex_layout_data->flex_direction == CSS::FlexDirection::Row |
| 1340 | + || m_flex_layout_data->flex_direction == CSS::FlexDirection::RowReverse; |
| 1341 | + |
| 1342 | + auto paint_rect = [&](CSSPixelRect const& rect, Gfx::Color rect_color) { |
| 1343 | + auto visible_rect = rect.intersected(viewport_rect); |
| 1344 | + if (visible_rect.is_empty()) |
| 1345 | + return; |
| 1346 | + context.display_list_recorder().fill_rect(context.enclosing_device_rect(visible_rect).to_type<int>(), rect_color); |
| 1347 | + }; |
| 1348 | + |
| 1349 | + auto paint_outline = [&](CSSPixelRect const& rect, Gfx::Color rect_color) { |
| 1350 | + auto visible_rect = rect.intersected(viewport_rect); |
| 1351 | + if (visible_rect.is_empty()) |
| 1352 | + return; |
| 1353 | + context.display_list_recorder().draw_rect(context.enclosing_device_rect(visible_rect).to_type<int>(), rect_color); |
| 1354 | + }; |
| 1355 | + |
| 1356 | + paint_rect(content_rect, container_fill_color); |
| 1357 | + paint_outline(content_rect, line_color); |
| 1358 | + |
| 1359 | + for (auto const& line : m_flex_layout_data->lines) { |
| 1360 | + auto line_rect = main_axis_is_horizontal |
| 1361 | + ? CSSPixelRect { content_rect.x(), origin.y() + line.cross_start, content_rect.width(), line.cross_size } |
| 1362 | + : CSSPixelRect { origin.x() + line.cross_start, content_rect.y(), line.cross_size, content_rect.height() }; |
| 1363 | + |
| 1364 | + paint_rect(line_rect, line_fill_color); |
| 1365 | + paint_outline(line_rect, line_color); |
| 1366 | + |
| 1367 | + for (auto const& item : line.items) { |
| 1368 | + auto item_rect = item.rect.translated(origin); |
| 1369 | + paint_rect(item_rect, item_fill_color); |
| 1370 | + paint_outline(item_rect, line_color); |
| 1371 | + } |
| 1372 | + } |
| 1373 | + |
| 1374 | + // Repaint the container border last so adjacent flex lines and items do not obscure it. |
| 1375 | + paint_outline(content_rect, line_color); |
| 1376 | + |
| 1377 | + if (main_axis_is_horizontal) { |
| 1378 | + for (auto const& line : m_flex_layout_data->lines) { |
| 1379 | + auto y = origin.y() + line.cross_start; |
| 1380 | + paint_rect({ content_rect.x(), y, content_rect.width(), line_thickness }, line_color); |
| 1381 | + paint_rect({ content_rect.x(), y + line.cross_size, content_rect.width(), line_thickness }, line_color); |
| 1382 | + } |
| 1383 | + } else { |
| 1384 | + for (auto const& line : m_flex_layout_data->lines) { |
| 1385 | + auto x = origin.x() + line.cross_start; |
| 1386 | + paint_rect({ x, content_rect.y(), line_thickness, content_rect.height() }, line_color); |
| 1387 | + paint_rect({ x + line.cross_size, content_rect.y(), line_thickness, content_rect.height() }, line_color); |
| 1388 | + } |
| 1389 | + } |
| 1390 | + }); |
| 1391 | +} |
| 1392 | + |
1323 | 1393 | void PaintableBox::set_stacking_context(NonnullRefPtr<StackingContext> stacking_context) |
1324 | 1394 | { |
1325 | 1395 | m_stacking_context = move(stacking_context); |
|
0 commit comments