summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-09-20 11:04:21 +0200
committerEike Ziller <eike.ziller@qt.io>2019-09-20 12:57:08 +0000
commitf5e624feaad4849944a88d1434d8a6cef16c107a (patch)
treeb843fee49316ea46999bdcbe35695c7f82fb51e6
parentfe6ba084c4f91265531905e031094a832600f091 (diff)
downloadqt-creator-f5e624feaad4849944a88d1434d8a6cef16c107a.tar.gz
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 <hjk@qt.io>
-rw-r--r--src/plugins/help/qlitehtml/qlitehtmlwidget.cpp32
1 files changed, 32 insertions, 0 deletions
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<litehtml::element::ptr(int, litehtml::element::ptr)> 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)