forked from qt-creator/qt-creator
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:
@@ -534,10 +534,42 @@ void QLiteHtmlWidget::paintEvent(QPaintEvent *event)
|
|||||||
&clip);
|
&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)
|
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);
|
QAbstractScrollArea::resizeEvent(event);
|
||||||
render();
|
render();
|
||||||
|
if (element) {
|
||||||
|
verticalScrollBar()->setValue(
|
||||||
|
std::min(element->get_placement().y, verticalScrollBar()->maximum()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent *event)
|
void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
Reference in New Issue
Block a user