diff options
author | Eike Ziller <eike.ziller@qt.io> | 2019-09-24 13:51:41 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2019-09-24 11:57:37 +0000 |
commit | 88d759d50f6bacaa48100be3edf5a5d5130da1b2 (patch) | |
tree | 14f898a37e2d633d8c562ce702b5ac6599b3bffb /src/plugins/help | |
parent | 1e9b1dcaec31884725daa0c200a2f6cb862febf3 (diff) |
Help/litehtml: Keep top position also when zooming
Change-Id: I65e12d4fca33719bc1a3ae08f7871d08d8d9c449
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/help')
-rw-r--r-- | src/plugins/help/qlitehtml/qlitehtmlwidget.cpp | 31 | ||||
-rw-r--r-- | src/plugins/help/qlitehtml/qlitehtmlwidget.h | 1 |
2 files changed, 20 insertions, 12 deletions
diff --git a/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp b/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp index 1196e698ad..509bf3602f 100644 --- a/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp +++ b/src/plugins/help/qlitehtml/qlitehtmlwidget.cpp @@ -439,7 +439,7 @@ void QLiteHtmlWidget::setZoomFactor(qreal scale) { Q_ASSERT(scale != 0); d->zoomFactor = scale; - render(); + withFixedTextPosition([this] { render(); }); } qreal QLiteHtmlWidget::zoomFactor() const @@ -559,17 +559,10 @@ static litehtml::element::ptr elementForY(int y, const litehtml::document::ptr & 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())); - } + withFixedTextPosition([this, event] { + QAbstractScrollArea::resizeEvent(event); + render(); + }); } void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent *event) @@ -625,6 +618,20 @@ void QLiteHtmlWidget::contextMenuEvent(QContextMenuEvent *event) emit contextMenuRequested(event->pos(), d->documentContainer.linkAt(pos, viewportPos)); } +void QLiteHtmlWidget::withFixedTextPosition(const std::function<void()> &action) +{ + // 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()); + action(); + if (element) { + verticalScrollBar()->setValue( + std::min(element->get_placement().y, verticalScrollBar()->maximum())); + } +} + void QLiteHtmlWidget::render() { if (!d->documentContainer.document()) diff --git a/src/plugins/help/qlitehtml/qlitehtmlwidget.h b/src/plugins/help/qlitehtml/qlitehtmlwidget.h index 97f5be6c63..a79e5824b0 100644 --- a/src/plugins/help/qlitehtml/qlitehtmlwidget.h +++ b/src/plugins/help/qlitehtml/qlitehtmlwidget.h @@ -77,6 +77,7 @@ protected: void contextMenuEvent(QContextMenuEvent *event) override; private: + void withFixedTextPosition(const std::function<void()> &action); void render(); QPoint scrollPosition() const; void htmlPos(const QPoint &pos, QPoint *viewportPos, QPoint *htmlPos) const; |