Browse Source

Ladybird: Basic scrolling support

Andreas Kling 3 years ago
parent
commit
80526625e8
3 changed files with 27 additions and 3 deletions
  1. 15 3
      Ladybird/WebView.cpp
  2. 6 0
      Ladybird/WebView.h
  3. 6 0
      Ladybird/main.cpp

+ 15 - 3
Ladybird/WebView.cpp

@@ -1,5 +1,6 @@
 /*
  * Copyright (c) 2022, Dex♪ <dexes.ttp@gmail.com>
+ * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -49,6 +50,7 @@
 #include <LibWebSocket/WebSocket.h>
 #include <QPaintEvent>
 #include <QPainter>
+#include <QScrollBar>
 
 class HeadlessBrowserPageClient final : public Web::PageClient {
 public:
@@ -198,6 +200,16 @@ public:
 
     virtual void page_did_layout() override
     {
+        auto* layout_root = this->layout_root();
+        VERIFY(layout_root);
+        Gfx::IntSize content_size;
+        if (layout_root->paint_box()->has_overflow())
+            content_size = enclosing_int_rect(layout_root->paint_box()->scrollable_overflow_rect().value()).size();
+        else
+            content_size = enclosing_int_rect(layout_root->paint_box()->absolute_rect()).size();
+
+        m_view.verticalScrollBar()->setMaximum(content_size.height() - m_viewport_rect.height());
+        m_view.horizontalScrollBar()->setMaximum(content_size.width() - m_viewport_rect.width());
     }
 
     virtual void page_did_request_scroll_into_view(Gfx::IntRect const&) override
@@ -273,10 +285,10 @@ void WebView::paintEvent(QPaintEvent* event)
     painter.setClipRect(event->rect());
 
     auto output_rect = m_page_client->viewport_rect();
+    output_rect.set_x(horizontalScrollBar()->value());
+    output_rect.set_y(verticalScrollBar()->value());
     auto output_bitmap = MUST(Gfx::Bitmap::try_create(Gfx::BitmapFormat::BGRx8888, output_rect.size()));
 
-    dbgln("paintEvent: {}", output_rect);
-
     m_page_client->paint(output_rect, output_bitmap);
 
     QImage q_image(output_bitmap->scanline_u8(0), output_bitmap->width(), output_bitmap->height(), QImage::Format_RGB32);
@@ -285,7 +297,7 @@ void WebView::paintEvent(QPaintEvent* event)
 
 void WebView::resizeEvent(QResizeEvent* event)
 {
-    Gfx::IntRect rect(0, 0, event->size().width(), event->size().height());
+    Gfx::IntRect rect(horizontalScrollBar()->value(), verticalScrollBar()->value(), event->size().width(), event->size().height());
     m_page_client->set_viewport_rect(rect);
 }
 

+ 6 - 0
Ladybird/WebView.h

@@ -1,3 +1,9 @@
+/*
+ * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
 #pragma once
 
 #define AK_DONT_REPLACE_STD

+ 6 - 0
Ladybird/main.cpp

@@ -1,3 +1,9 @@
+/*
+ * Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
 #include "WebView.h"
 #include <LibCore/ArgsParser.h>
 #include <LibCore/EventLoop.h>