summaryrefslogtreecommitdiff
path: root/src/plugins/help/textbrowserhelpviewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/help/textbrowserhelpviewer.cpp')
-rw-r--r--src/plugins/help/textbrowserhelpviewer.cpp105
1 files changed, 68 insertions, 37 deletions
diff --git a/src/plugins/help/textbrowserhelpviewer.cpp b/src/plugins/help/textbrowserhelpviewer.cpp
index 02afab8d4d..6eee633d7f 100644
--- a/src/plugins/help/textbrowserhelpviewer.cpp
+++ b/src/plugins/help/textbrowserhelpviewer.cpp
@@ -99,12 +99,14 @@ void TextBrowserHelpViewer::scaleDown()
void TextBrowserHelpViewer::resetScale()
{
- if (m_textBrowser->zoomCount != 0) {
- m_textBrowser->forceFont = true;
- m_textBrowser->zoomOut(m_textBrowser->zoomCount);
- m_textBrowser->forceFont = false;
- }
- m_textBrowser->zoomCount = 0;
+ m_textBrowser->withFixedTopPosition([this] {
+ if (m_textBrowser->zoomCount != 0) {
+ m_textBrowser->forceFont = true;
+ m_textBrowser->zoomOut(m_textBrowser->zoomCount);
+ m_textBrowser->forceFont = false;
+ }
+ m_textBrowser->zoomCount = 0;
+ });
}
qreal TextBrowserHelpViewer::scale() const
@@ -114,18 +116,20 @@ qreal TextBrowserHelpViewer::scale() const
void TextBrowserHelpViewer::setScale(qreal scale)
{
- m_textBrowser->forceFont = true;
- if (scale > 10)
- scale = 10;
- else if (scale < -5)
- scale = -5;
- int diff = int(scale) - m_textBrowser->zoomCount;
- if (diff > 0)
- m_textBrowser->zoomIn(diff);
- else if (diff < 0)
- m_textBrowser->zoomOut(-diff);
- m_textBrowser->zoomCount = int(scale);
- m_textBrowser->forceFont = false;
+ m_textBrowser->withFixedTopPosition([this, &scale] {
+ m_textBrowser->forceFont = true;
+ if (scale > 10)
+ scale = 10;
+ else if (scale < -5)
+ scale = -5;
+ int diff = int(scale) - m_textBrowser->zoomCount;
+ if (diff > 0)
+ m_textBrowser->zoomIn(diff);
+ else if (diff < 0)
+ m_textBrowser->zoomOut(-diff);
+ m_textBrowser->zoomCount = int(scale);
+ m_textBrowser->forceFont = false;
+ });
}
QString TextBrowserHelpViewer::title() const
@@ -145,13 +149,11 @@ void TextBrowserHelpViewer::setSource(const QUrl &url)
slotLoadStarted();
m_textBrowser->setSource(url);
- QTimer::singleShot(0, this, [this, url]() {
- if (!url.fragment().isEmpty())
- m_textBrowser->scrollToAnchor(url.fragment());
- if (QScrollBar *hScrollBar = m_textBrowser->horizontalScrollBar())
- hScrollBar->setValue(0);
- slotLoadFinished();
- });
+ if (!url.fragment().isEmpty())
+ m_textBrowser->scrollToAnchor(url.fragment());
+ if (QScrollBar *hScrollBar = m_textBrowser->horizontalScrollBar())
+ hScrollBar->setValue(0);
+ slotLoadFinished();
}
void TextBrowserHelpViewer::setHtml(const QString &html)
@@ -330,24 +332,46 @@ QString TextBrowserHelpWidget::linkAt(const QPoint &pos)
return anchor;
}
-void TextBrowserHelpWidget::scaleUp()
+void TextBrowserHelpWidget::withFixedTopPosition(const std::function<void()> &action)
+{
+ const int topTextPosition = cursorForPosition({width() / 2, 0}).position();
+ action();
+ scrollToTextPosition(topTextPosition);
+}
+
+void TextBrowserHelpWidget::scrollToTextPosition(int position)
{
- if (zoomCount < 10) {
- zoomCount++;
- forceFont = true;
- zoomIn();
- forceFont = false;
+ QTextCursor tc(document());
+ tc.setPosition(position);
+ const int dy = cursorRect(tc).top();
+ if (verticalScrollBar()) {
+ verticalScrollBar()->setValue(
+ std::min(verticalScrollBar()->value() + dy, verticalScrollBar()->maximum()));
}
}
+void TextBrowserHelpWidget::scaleUp()
+{
+ withFixedTopPosition([this] {
+ if (zoomCount < 10) {
+ zoomCount++;
+ forceFont = true;
+ zoomIn();
+ forceFont = false;
+ }
+ });
+}
+
void TextBrowserHelpWidget::scaleDown()
{
- if (zoomCount > -5) {
- zoomCount--;
- forceFont = true;
- zoomOut();
- forceFont = false;
- }
+ withFixedTopPosition([this] {
+ if (zoomCount > -5) {
+ zoomCount--;
+ forceFont = true;
+ zoomOut();
+ forceFont = false;
+ }
+ });
}
void TextBrowserHelpWidget::contextMenuEvent(QContextMenuEvent *event)
@@ -429,6 +453,13 @@ void TextBrowserHelpWidget::mouseReleaseEvent(QMouseEvent *e)
QTextBrowser::mouseReleaseEvent(e);
}
+void TextBrowserHelpWidget::resizeEvent(QResizeEvent *e)
+{
+ const int topTextPosition = cursorForPosition({width() / 2, 0}).position();
+ QTextBrowser::resizeEvent(e);
+ scrollToTextPosition(topTextPosition);
+}
+
void TextBrowserHelpWidget::setSource(const QUrl &name)
{
QTextBrowser::setSource(name);