aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/help
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2019-09-24 13:51:41 +0200
committerEike Ziller <eike.ziller@qt.io>2019-09-24 11:57:37 +0000
commit88d759d50f6bacaa48100be3edf5a5d5130da1b2 (patch)
tree14f898a37e2d633d8c562ce702b5ac6599b3bffb /src/plugins/help
parent1e9b1dcaec31884725daa0c200a2f6cb862febf3 (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.cpp31
-rw-r--r--src/plugins/help/qlitehtml/qlitehtmlwidget.h1
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;