From f5e624feaad4849944a88d1434d8a6cef16c107a Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 20 Sep 2019 11:04:21 +0200 Subject: Help/litehtml: Keep top element visible when resizing This implicitly fixes behavior of scrolling of context help when the side-by-side help panel is not yet visible. Task-number: QTCREATORBUG-4756 Change-Id: I28dd89b56fe7dfa2a3473f21740571c27a955e14 Reviewed-by: hjk --- src/plugins/help/qlitehtml/qlitehtmlwidget.cpp | 32 ++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp b/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp index 1d83413f4d..1196e698ad 100644 --- a/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp +++ b/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp @@ -534,10 +534,42 @@ void QLiteHtmlWidget::paintEvent(QPaintEvent *event) &clip); } +static litehtml::element::ptr elementForY(int y, const litehtml::document::ptr &document) +{ + if (!document) + return {}; + + const std::function recursion = + [&recursion](int y, const litehtml::element::ptr &element) { + litehtml::element::ptr result; + const int subY = y - element->get_position().y; + if (subY <= 0) + return element; + for (int i = 0; i < int(element->get_children_count()); ++i) { + const litehtml::element::ptr child = element->get_child(i); + result = recursion(subY, child); + if (result) + return result; + } + return result; + }; + + return recursion(y, document->root()); +} + void QLiteHtmlWidget::resizeEvent(QResizeEvent *event) { + // remember element to which to scroll after re-rendering + QPoint viewportPos; + QPoint pos; + htmlPos({}, &viewportPos, &pos); // top-left + const litehtml::element::ptr element = elementForY(pos.y(), d->documentContainer.document()); QAbstractScrollArea::resizeEvent(event); render(); + if (element) { + verticalScrollBar()->setValue( + std::min(element->get_placement().y, verticalScrollBar()->maximum())); + } } void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent *event) -- cgit v1.2.1