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>
This commit is contained in:
Eike Ziller
2019-09-20 11:04:21 +02:00
parent fe6ba084c4
commit f5e624feaa

View File

@@ -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)