diff --git a/doc/src/linux-mobile/linuxdev.qdoc b/doc/src/linux-mobile/linuxdev.qdoc index 7f711192e03..eefce112f1a 100644 --- a/doc/src/linux-mobile/linuxdev.qdoc +++ b/doc/src/linux-mobile/linuxdev.qdoc @@ -66,6 +66,10 @@ authentication. If you do not have an SSH key, you can use the ssh-keygen tool to create it in \QC. For more information, see \l {Generating SSH Keys}. + \note \QC does not store passwords, so if you use password authentication, + you may need to enter the password on every connection to the device, + or, if caching is enabled, at every \QC restart. + To configure connections between \QC and an embedded Linux device and to specify build and run settings for the device: diff --git a/src/plugins/help/textbrowserhelpviewer.cpp b/src/plugins/help/textbrowserhelpviewer.cpp index eba428e2a50..e5289839ab5 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::withFixedTopPosition(const std::function &action) +{ + const int topTextPosition = cursorForPosition({width() / 2, 0}).position(); + action(); + scrollToTextPosition(topTextPosition); +} + +void TextBrowserHelpWidget::scrollToTextPosition(int position) +{ + 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() { - if (zoomCount < 10) { - zoomCount++; - forceFont = true; - zoomIn(); - forceFont = false; - } + 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) @@ -427,6 +451,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); diff --git a/src/plugins/help/textbrowserhelpviewer.h b/src/plugins/help/textbrowserhelpviewer.h index 08644317878..10bbfa6ab2e 100644 --- a/src/plugins/help/textbrowserhelpviewer.h +++ b/src/plugins/help/textbrowserhelpviewer.h @@ -94,14 +94,18 @@ public: void setSource(const QUrl &name) override; + void withFixedTopPosition(const std::function &action); + protected: void contextMenuEvent(QContextMenuEvent *event) override; bool eventFilter(QObject *obj, QEvent *event) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; + void resizeEvent(QResizeEvent *e) override; private: - QString linkAt(const QPoint& pos); + QString linkAt(const QPoint &pos); + void scrollToTextPosition(int position); int zoomCount; bool forceFont;