diff --git a/src/librssguard/3rd-party/qlitehtml/qlitehtmlwidget.cpp b/src/librssguard/3rd-party/qlitehtml/qlitehtmlwidget.cpp index b5db89205..3fb711150 100755 --- a/src/librssguard/3rd-party/qlitehtml/qlitehtmlwidget.cpp +++ b/src/librssguard/3rd-party/qlitehtml/qlitehtmlwidget.cpp @@ -31,15 +31,16 @@ #include "container_qpainter.h" #include -#include #include +#include #include #include const int kScrollBarStep = 40; // TODO copied from litehtml/include/master.css -const char mastercss[] = R"RAW( +const char mastercss[] = + R"RAW( html { display: block; height:100%; @@ -84,74 +85,16 @@ display:block; margin-bottom:1em; } -b, strong { -display:inline; - font-weight:bold; -} - -i, em { -display:inline; - font-style:italic; -} - center { text-align:center; display:block; } -a:link -{ - text-decoration: underline; -color: #00f; -cursor: pointer; -} - h1, h2, h3, h4, h5, h6, div { display:block; } -h1 { - font-weight:bold; - margin-top:0.67em; - margin-bottom:0.67em; - font-size: 2em; -} - -h2 { - font-weight:bold; - margin-top:0.83em; - margin-bottom:0.83em; - font-size: 1.5em; -} - -h3 { - font-weight:bold; - margin-top:1em; - margin-bottom:1em; - font-size:1.17em; -} - -h4 { - font-weight:bold; - margin-top:1.33em; - margin-bottom:1.33em -} - -h5 { - font-weight:bold; - margin-top:1.67em; - margin-bottom:1.67em; - font-size:.83em; -} - -h6 { - font-weight:bold; - margin-top:2.33em; - margin-bottom:2.33em; - font-size:.67em; -} - br { display:inline-block; } @@ -171,14 +114,6 @@ br[clear="right"] clear:right; } -span { - display:inline -} - -img { -display: inline-block; -} - img[align="right"] { float: right; @@ -188,188 +123,11 @@ img[align="left"] { float: left; } - -hr { -display: block; - margin-top: 0.5em; - margin-bottom: 0.5em; - margin-left: auto; - margin-right: auto; - border-style: inset; - border-width: 1px -} - - -/***************** TABLES ********************/ - -table { -display: table; - border-collapse: separate; - border-spacing: 2px; - border-top-color:gray; - border-left-color:gray; - border-bottom-color:black; - border-right-color:black; -} - -tbody, tfoot, thead { -display:table-row-group; - vertical-align:middle; -} - -tr { -display: table-row; - vertical-align: inherit; - border-color: inherit; -} - -td, th { -display: table-cell; - vertical-align: inherit; - border-width:1px; -padding:1px; -} - -th { - font-weight: bold; -} - -table[border] { - border-style:solid; -} - -table[border|=0] { - border-style:none; -} - -table[border] td, table[border] th { - border-style:solid; - border-top-color:black; - border-left-color:black; - border-bottom-color:gray; - border-right-color:gray; -} - -table[border|=0] td, table[border|=0] th { - border-style:none; -} - -caption { -display: table-caption; -} - -td[nowrap], th[nowrap] { - white-space:nowrap; -} - -tt, code, kbd, samp { - font-family: monospace -} -pre, xmp, plaintext, listing { -display: block; - font-family: monospace; - white-space: pre; -margin: 1em 0 -} - -/***************** LISTS ********************/ - -ul, menu, dir { -display: block; - list-style-type: disc; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px -} - -ol { -display: block; - list-style-type: decimal; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; - padding-left: 40px -} - -li { -display: list-item; -} - -ul ul, ol ul { - list-style-type: circle; -} - -ol ol ul, ol ul ul, ul ol ul, ul ul ul { - list-style-type: square; -} - -dd { -display: block; - margin-left: 40px; -} - -dl { -display: block; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 0; - margin-right: 0; -} - -dt { -display: block; -} - -ol ul, ul ol, ul ul, ol ol { - margin-top: 0; - margin-bottom: 0 -} - -blockquote { -display: block; - margin-top: 1em; - margin-bottom: 1em; - margin-left: 40px; - margin-left: 40px; -} - -/*********** FORM ELEMENTS ************/ - -form { -display: block; - margin-top: 0em; -} - -option { -display: none; -} - -input, textarea, keygen, select, button, isindex { -margin: 0em; -color: initial; - line-height: normal; - text-transform: none; - text-indent: 0; - text-shadow: none; -display: inline-block; -} -input[type="hidden"] { -display: none; -} - - -article, aside, footer, header, hgroup, nav, section -{ -display: block; -} )RAW"; class QLiteHtmlWidgetPrivate { -public: + public: QString html; DocumentContainerContext context; QUrl url; @@ -378,338 +136,393 @@ public: QUrl lastHighlightedLink; }; -QLiteHtmlWidget::QLiteHtmlWidget(QWidget *parent) - : QAbstractScrollArea(parent) - , d(new QLiteHtmlWidgetPrivate) +QLiteHtmlWidget::QLiteHtmlWidget(QWidget* parent) + : QAbstractScrollArea(parent) + , d(new QLiteHtmlWidgetPrivate) { - setMouseTracking(true); - horizontalScrollBar()->setSingleStep(kScrollBarStep); - verticalScrollBar()->setSingleStep(kScrollBarStep); + setMouseTracking(true); + horizontalScrollBar()->setSingleStep(kScrollBarStep); + verticalScrollBar()->setSingleStep(kScrollBarStep); - d->documentContainer.setCursorCallback([this](const QCursor &c) { viewport()->setCursor(c); }); - d->documentContainer.setPaletteCallback([this] { return palette(); }); - d->documentContainer.setLinkCallback([this](const QUrl &url) { - QUrl fullUrl = url; - if (url.isRelative() && url.path(QUrl::FullyEncoded).isEmpty()) { // fragment/anchor only - fullUrl = d->url; - fullUrl.setFragment(url.fragment(QUrl::FullyEncoded)); - } - // delay because document may not be changed directly during this callback - QMetaObject::invokeMethod(this, [this, fullUrl] { emit linkClicked(fullUrl); }, - Qt::QueuedConnection); - }); - d->documentContainer.setClipboardCallback([this](bool yes) { emit copyAvailable(yes); }); + d->documentContainer.setCursorCallback([this](const QCursor& c) { + viewport()->setCursor(c); + }); + d->documentContainer.setPaletteCallback([this] { + return palette(); + }); + d->documentContainer.setLinkCallback([this](const QUrl& url) { + QUrl fullUrl = url; + if (url.isRelative() && url.path(QUrl::FullyEncoded).isEmpty()) { // fragment/anchor only + fullUrl = d->url; + fullUrl.setFragment(url.fragment(QUrl::FullyEncoded)); + } - // TODO adapt mastercss to palette (default text & background color) - d->context.setMasterStyleSheet(mastercss); + // delay because document may not be changed directly during this callback + QMetaObject::invokeMethod(this, [this, fullUrl] { + emit linkClicked(fullUrl); + }, + Qt::QueuedConnection); + }); + d->documentContainer.setClipboardCallback([this](bool yes) { + emit copyAvailable(yes); + }); + + // TODO adapt mastercss to palette (default text & background color) + d->context.setMasterStyleSheet(mastercss); } QLiteHtmlWidget::~QLiteHtmlWidget() { - delete d; + delete d; } -void QLiteHtmlWidget::setUrl(const QUrl &url) +void QLiteHtmlWidget::setUrl(const QUrl& url) { - d->url = url; - QUrl baseUrl = url; - baseUrl.setFragment({}); - const QString path = baseUrl.path(QUrl::FullyEncoded); - const int lastSlash = path.lastIndexOf('/'); - const QString basePath = lastSlash >= 0 ? path.left(lastSlash) : QString(); - baseUrl.setPath(basePath); - d->documentContainer.setBaseUrl(baseUrl.toString(QUrl::FullyEncoded)); - QMetaObject::invokeMethod(this, [this] { updateHightlightedLink(); }, - Qt::QueuedConnection); + d->url = url; + QUrl baseUrl = url; + + baseUrl.setFragment({}); + const QString path = baseUrl.path(QUrl::FullyEncoded); + const int lastSlash = path.lastIndexOf('/'); + const QString basePath = lastSlash >= 0 ? path.left(lastSlash) : QString(); + + baseUrl.setPath(basePath); + d->documentContainer.setBaseUrl(baseUrl.toString(QUrl::FullyEncoded)); + QMetaObject::invokeMethod(this, [this] { + updateHightlightedLink(); + }, + Qt::QueuedConnection); } QUrl QLiteHtmlWidget::url() const { - return d->url; + return d->url; } -void QLiteHtmlWidget::setHtml(const QString &content) +void QLiteHtmlWidget::setHtml(const QString& content) { - d->html = content; - d->documentContainer.setPaintDevice(viewport()); - d->documentContainer.setDocument(content.toUtf8(), &d->context); - verticalScrollBar()->setValue(0); - horizontalScrollBar()->setValue(0); - render(); - QMetaObject::invokeMethod(this, [this] { updateHightlightedLink(); }, - Qt::QueuedConnection); + d->html = content; + d->documentContainer.setPaintDevice(viewport()); + d->documentContainer.setDocument(content.toUtf8(), &d->context); + verticalScrollBar()->setValue(0); + horizontalScrollBar()->setValue(0); + render(); + QMetaObject::invokeMethod(this, [this] { + updateHightlightedLink(); + }, + Qt::QueuedConnection); } QString QLiteHtmlWidget::html() const { - return d->html; + return d->html; } QString QLiteHtmlWidget::title() const { - return d->documentContainer.caption(); + return d->documentContainer.caption(); } void QLiteHtmlWidget::setZoomFactor(qreal scale) { - Q_ASSERT(scale != 0); - d->zoomFactor = scale; - withFixedTextPosition([this] { render(); }); + Q_ASSERT(scale != 0); + d->zoomFactor = scale; + withFixedTextPosition([this] { + render(); + }); } qreal QLiteHtmlWidget::zoomFactor() const { - return d->zoomFactor; + return d->zoomFactor; } -bool QLiteHtmlWidget::findText(const QString &text, +bool QLiteHtmlWidget::findText(const QString& text, QTextDocument::FindFlags flags, bool incremental, - bool *wrapped) + bool* wrapped) { - bool success = false; - QVector oldSelection; - QVector newSelection; - d->documentContainer - .findText(text, flags, incremental, wrapped, &success, &oldSelection, &newSelection); - // scroll to search result position and/or redraw as necessary - QRect newSelectionCombined; - for (const QRect &r : qAsConst(newSelection)) - newSelectionCombined = newSelectionCombined.united(r); - QScrollBar *vBar = verticalScrollBar(); - const int top = newSelectionCombined.top(); - const int bottom = newSelectionCombined.bottom() - toVirtual(viewport()->size()).height(); - if (success && top < vBar->value() && vBar->minimum() <= top) { - vBar->setValue(top); - } else if (success && vBar->value() < bottom && bottom <= vBar->maximum()) { - vBar->setValue(bottom); - } else { - viewport()->update(fromVirtual(newSelectionCombined.translated(-scrollPosition()))); - for (const QRect &r : qAsConst(oldSelection)) - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); - } - return success; + bool success = false; + QVector oldSelection; + QVector newSelection; + + d->documentContainer + .findText(text, flags, incremental, wrapped, &success, &oldSelection, &newSelection); + + // scroll to search result position and/or redraw as necessary + QRect newSelectionCombined; + + for (const QRect& r : qAsConst(newSelection)) + newSelectionCombined = newSelectionCombined.united(r); + + QScrollBar* vBar = verticalScrollBar(); + const int top = newSelectionCombined.top(); + const int bottom = newSelectionCombined.bottom() - toVirtual(viewport()->size()).height(); + + if (success && top < vBar->value() && vBar->minimum() <= top) { + vBar->setValue(top); + } + else if (success && vBar->value() < bottom && bottom <= vBar->maximum()) { + vBar->setValue(bottom); + } + else { + viewport()->update(fromVirtual(newSelectionCombined.translated(-scrollPosition()))); + for (const QRect& r : qAsConst(oldSelection)) + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + } + + return success; } -void QLiteHtmlWidget::setDefaultFont(const QFont &font) +void QLiteHtmlWidget::setDefaultFont(const QFont& font) { - withFixedTextPosition([this, &font] { - d->documentContainer.setDefaultFont(font); - render(); - }); + withFixedTextPosition([this, &font] { + d->documentContainer.setDefaultFont(font); + render(); + }); } QFont QLiteHtmlWidget::defaultFont() const { - return d->documentContainer.defaultFont(); + return d->documentContainer.defaultFont(); } -void QLiteHtmlWidget::scrollToAnchor(const QString &name) +void QLiteHtmlWidget::scrollToAnchor(const QString& name) { - if (!d->documentContainer.hasDocument()) - return; - horizontalScrollBar()->setValue(0); - if (name.isEmpty()) { - verticalScrollBar()->setValue(0); - return; - } - const int y = d->documentContainer.anchorY(name); - if (y >= 0) - verticalScrollBar()->setValue(std::min(y, verticalScrollBar()->maximum())); + if (!d->documentContainer.hasDocument()) + return; + + horizontalScrollBar()->setValue(0); + if (name.isEmpty()) { + verticalScrollBar()->setValue(0); + return; + } + + const int y = d->documentContainer.anchorY(name); + + if (y >= 0) + verticalScrollBar()->setValue(std::min(y, verticalScrollBar()->maximum())); } -void QLiteHtmlWidget::setResourceHandler(const QLiteHtmlWidget::ResourceHandler &handler) +void QLiteHtmlWidget::setResourceHandler(const QLiteHtmlWidget::ResourceHandler& handler) { - d->documentContainer.setDataCallback(handler); + d->documentContainer.setDataCallback(handler); } QString QLiteHtmlWidget::selectedText() const { - return d->documentContainer.selectedText(); + return d->documentContainer.selectedText(); } -void QLiteHtmlWidget::paintEvent(QPaintEvent *event) +void QLiteHtmlWidget::paintEvent(QPaintEvent* event) { - if (!d->documentContainer.hasDocument()) - return; - d->documentContainer.setScrollPosition(scrollPosition()); - QPainter p(viewport()); - p.setWorldTransform(QTransform().scale(d->zoomFactor, d->zoomFactor)); - p.setRenderHint(QPainter::SmoothPixmapTransform, true); - p.setRenderHint(QPainter::Antialiasing, true); - d->documentContainer.draw(&p, toVirtual(event->rect())); + if (!d->documentContainer.hasDocument()) + return; + + d->documentContainer.setScrollPosition(scrollPosition()); + QPainter p(viewport()); + + p.setWorldTransform(QTransform().scale(d->zoomFactor, d->zoomFactor)); + p.setRenderHint(QPainter::SmoothPixmapTransform, true); + p.setRenderHint(QPainter::Antialiasing, true); + d->documentContainer.draw(&p, toVirtual(event->rect())); } -void QLiteHtmlWidget::resizeEvent(QResizeEvent *event) +void QLiteHtmlWidget::resizeEvent(QResizeEvent* event) { - withFixedTextPosition([this, event] { - QAbstractScrollArea::resizeEvent(event); - render(); - }); + withFixedTextPosition([this, event] { + QAbstractScrollArea::resizeEvent(event); + render(); + }); } -void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent *event) +void QLiteHtmlWidget::mouseMoveEvent(QMouseEvent* event) { - QPoint viewportPos; - QPoint pos; - htmlPos(event->pos(), &viewportPos, &pos); - const QVector areas = d->documentContainer.mouseMoveEvent(pos, viewportPos); - for (const QRect &r : areas) - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + QPoint viewportPos; + QPoint pos; - updateHightlightedLink(); + htmlPos(event->pos(), &viewportPos, &pos); + const QVector areas = d->documentContainer.mouseMoveEvent(pos, viewportPos); + + for (const QRect& r : areas) + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + + updateHightlightedLink(); } -void QLiteHtmlWidget::mousePressEvent(QMouseEvent *event) +void QLiteHtmlWidget::mousePressEvent(QMouseEvent* event) { - QPoint viewportPos; - QPoint pos; - htmlPos(event->pos(), &viewportPos, &pos); - const QVector areas = d->documentContainer.mousePressEvent(pos, viewportPos, event->button()); - for (const QRect &r : areas) - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + QPoint viewportPos; + QPoint pos; + + htmlPos(event->pos(), &viewportPos, &pos); + const QVector areas = d->documentContainer.mousePressEvent(pos, viewportPos, event->button()); + + for (const QRect& r : areas) + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); } -void QLiteHtmlWidget::mouseReleaseEvent(QMouseEvent *event) +void QLiteHtmlWidget::mouseReleaseEvent(QMouseEvent* event) { - QPoint viewportPos; - QPoint pos; - htmlPos(event->pos(), &viewportPos, &pos); - const QVector areas = d->documentContainer.mouseReleaseEvent(pos, viewportPos, event->button()); - for (const QRect &r : areas) - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + QPoint viewportPos; + QPoint pos; + + htmlPos(event->pos(), &viewportPos, &pos); + const QVector areas = d->documentContainer.mouseReleaseEvent(pos, viewportPos, event->button()); + + for (const QRect& r : areas) + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); } -void QLiteHtmlWidget::mouseDoubleClickEvent(QMouseEvent *event) +void QLiteHtmlWidget::mouseDoubleClickEvent(QMouseEvent* event) { - QPoint viewportPos; - QPoint pos; - htmlPos(event->pos(), &viewportPos, &pos); - const QVector areas = d->documentContainer.mouseDoubleClickEvent(pos, viewportPos, event->button()); - for (const QRect &r : areas) { - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); - } + QPoint viewportPos; + QPoint pos; + + htmlPos(event->pos(), &viewportPos, &pos); + const QVector areas = d->documentContainer.mouseDoubleClickEvent(pos, viewportPos, event->button()); + + for (const QRect& r : areas) { + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + } } -void QLiteHtmlWidget::leaveEvent(QEvent *event) +void QLiteHtmlWidget::leaveEvent(QEvent* event) { - Q_UNUSED(event) - const QVector areas = d->documentContainer.leaveEvent(); - for (const QRect &r : areas) - viewport()->update(fromVirtual(r.translated(-scrollPosition()))); - setHightlightedLink(QUrl()); + Q_UNUSED(event) + const QVector areas = d->documentContainer.leaveEvent(); + + for (const QRect& r : areas) + viewport()->update(fromVirtual(r.translated(-scrollPosition()))); + + setHightlightedLink(QUrl()); } -void QLiteHtmlWidget::contextMenuEvent(QContextMenuEvent *event) +void QLiteHtmlWidget::contextMenuEvent(QContextMenuEvent* event) { - QPoint viewportPos; - QPoint pos; - htmlPos(event->pos(), &viewportPos, &pos); - emit contextMenuRequested(event->pos(), d->documentContainer.linkAt(pos, viewportPos)); + QPoint viewportPos; + QPoint pos; + + htmlPos(event->pos(), &viewportPos, &pos); + emit contextMenuRequested(event->pos(), d->documentContainer.linkAt(pos, viewportPos)); } static QAbstractSlider::SliderAction getSliderAction(int key) { - if (key == Qt::Key_Home) - return QAbstractSlider::SliderToMinimum; - if (key == Qt::Key_End) - return QAbstractSlider::SliderToMaximum; - if (key == Qt::Key_PageUp) - return QAbstractSlider::SliderPageStepSub; - if (key == Qt::Key_PageDown) - return QAbstractSlider::SliderPageStepAdd; - return QAbstractSlider::SliderNoAction; + if (key == Qt::Key_Home) + return QAbstractSlider::SliderToMinimum; + + if (key == Qt::Key_End) + return QAbstractSlider::SliderToMaximum; + + if (key == Qt::Key_PageUp) + return QAbstractSlider::SliderPageStepSub; + + if (key == Qt::Key_PageDown) + return QAbstractSlider::SliderPageStepAdd; + + return QAbstractSlider::SliderNoAction; } -void QLiteHtmlWidget::keyPressEvent(QKeyEvent *event) +void QLiteHtmlWidget::keyPressEvent(QKeyEvent* event) { - if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier) { - const QAbstractSlider::SliderAction sliderAction = getSliderAction(event->key()); - if (sliderAction != QAbstractSlider::SliderNoAction) { - verticalScrollBar()->triggerAction(sliderAction); - event->accept(); - } - } + if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::KeypadModifier) { + const QAbstractSlider::SliderAction sliderAction = getSliderAction(event->key()); - QAbstractScrollArea::keyPressEvent(event); + if (sliderAction != QAbstractSlider::SliderNoAction) { + verticalScrollBar()->triggerAction(sliderAction); + event->accept(); + } + } + + QAbstractScrollArea::keyPressEvent(event); } void QLiteHtmlWidget::updateHightlightedLink() { - QPoint viewportPos; - QPoint pos; - htmlPos(mapFromGlobal(QCursor::pos()), &viewportPos, &pos); - setHightlightedLink(d->documentContainer.linkAt(pos, viewportPos)); + QPoint viewportPos; + QPoint pos; + + htmlPos(mapFromGlobal(QCursor::pos()), &viewportPos, &pos); + setHightlightedLink(d->documentContainer.linkAt(pos, viewportPos)); } -void QLiteHtmlWidget::setHightlightedLink(const QUrl &url) +void QLiteHtmlWidget::setHightlightedLink(const QUrl& url) { - if (d->lastHighlightedLink == url) - return; - d->lastHighlightedLink = url; - emit linkHighlighted(d->lastHighlightedLink); + if (d->lastHighlightedLink == url) + return; + + d->lastHighlightedLink = url; + emit linkHighlighted(d->lastHighlightedLink); } -void QLiteHtmlWidget::withFixedTextPosition(const std::function &action) +void QLiteHtmlWidget::withFixedTextPosition(const std::function& action) { - // remember element to which to scroll after re-rendering - QPoint viewportPos; - QPoint pos; - htmlPos({}, &viewportPos, &pos); // top-left - const int y = d->documentContainer.withFixedElementPosition(pos.y(), action); - if (y >= 0) - verticalScrollBar()->setValue(std::min(y, verticalScrollBar()->maximum())); + // remember element to which to scroll after re-rendering + QPoint viewportPos; + QPoint pos; + + htmlPos({}, &viewportPos, &pos); // top-left + const int y = d->documentContainer.withFixedElementPosition(pos.y(), action); + + if (y >= 0) + verticalScrollBar()->setValue(std::min(y, verticalScrollBar()->maximum())); } void QLiteHtmlWidget::render() { - if (!d->documentContainer.hasDocument()) - return; - const int fullWidth = width() / d->zoomFactor; - const QSize vViewportSize = toVirtual(viewport()->size()); - const int scrollbarWidth = style()->pixelMetric(QStyle::PM_ScrollBarExtent, nullptr, this); - const int w = fullWidth - scrollbarWidth - 2; - d->documentContainer.render(w, vViewportSize.height()); - // scroll bars reflect virtual/scaled size of html document - horizontalScrollBar()->setPageStep(vViewportSize.width()); - horizontalScrollBar()->setRange(0, std::max(0, d->documentContainer.documentWidth() - w)); - verticalScrollBar()->setPageStep(vViewportSize.height()); - verticalScrollBar() - ->setRange(0, std::max(0, d->documentContainer.documentHeight() - vViewportSize.height())); - viewport()->update(); + if (!d->documentContainer.hasDocument()) + return; + + const int fullWidth = width() / d->zoomFactor; + const QSize vViewportSize = toVirtual(viewport()->size()); + const int scrollbarWidth = style()->pixelMetric(QStyle::PM_ScrollBarExtent, nullptr, this); + const int w = fullWidth - scrollbarWidth - 2; + + d->documentContainer.render(w, vViewportSize.height()); + + // scroll bars reflect virtual/scaled size of html document + horizontalScrollBar()->setPageStep(vViewportSize.width()); + horizontalScrollBar()->setRange(0, std::max(0, d->documentContainer.documentWidth() - w)); + verticalScrollBar()->setPageStep(vViewportSize.height()); + verticalScrollBar() + ->setRange(0, std::max(0, d->documentContainer.documentHeight() - vViewportSize.height())); + viewport()->update(); } QPoint QLiteHtmlWidget::scrollPosition() const { - return {horizontalScrollBar()->value(), verticalScrollBar()->value()}; + return { horizontalScrollBar()->value(), verticalScrollBar()->value() }; } -void QLiteHtmlWidget::htmlPos(const QPoint &pos, QPoint *viewportPos, QPoint *htmlPos) const +void QLiteHtmlWidget::htmlPos(const QPoint& pos, QPoint* viewportPos, QPoint* htmlPos) const { - *viewportPos = toVirtual(viewport()->mapFromParent(pos)); - *htmlPos = *viewportPos + scrollPosition(); + *viewportPos = toVirtual(viewport()->mapFromParent(pos)); + *htmlPos = *viewportPos + scrollPosition(); } -QPoint QLiteHtmlWidget::toVirtual(const QPoint &p) const +QPoint QLiteHtmlWidget::toVirtual(const QPoint& p) const { - return {int(p.x() / d->zoomFactor), int(p.y() / d->zoomFactor)}; + return { int(p.x() / d->zoomFactor), int(p.y() / d->zoomFactor) }; } -QSize QLiteHtmlWidget::toVirtual(const QSize &s) const +QSize QLiteHtmlWidget::toVirtual(const QSize& s) const { - return {int(s.width() / d->zoomFactor), int(s.height() / d->zoomFactor)}; + return { int(s.width() / d->zoomFactor), int(s.height() / d->zoomFactor) }; } -QRect QLiteHtmlWidget::toVirtual(const QRect &r) const +QRect QLiteHtmlWidget::toVirtual(const QRect& r) const { - return {toVirtual(r.topLeft()), toVirtual(r.size())}; + return { toVirtual(r.topLeft()), toVirtual(r.size()) }; } -QRect QLiteHtmlWidget::fromVirtual(const QRect &r) const +QRect QLiteHtmlWidget::fromVirtual(const QRect& r) const { - const QPoint tl{int(r.x() * d->zoomFactor), int(r.y() * d->zoomFactor)}; - // round size up, and add one since the topleft point was rounded down - const QSize s{int(r.width() * d->zoomFactor + 0.5) + 1, - int(r.height() * d->zoomFactor + 0.5) + 1}; - return {tl, s}; + const QPoint tl{ int(r.x() * d->zoomFactor), int(r.y() * d->zoomFactor) }; + + // round size up, and add one since the topleft point was rounded down + const QSize s{ int(r.width() * d->zoomFactor + 0.5) + 1, + int(r.height() * d->zoomFactor + 0.5) + 1 }; + + return { tl, s }; } diff --git a/src/librssguard/gui/webbrowser.cpp b/src/librssguard/gui/webbrowser.cpp index 7b925ebdd..5f8625552 100644 --- a/src/librssguard/gui/webbrowser.cpp +++ b/src/librssguard/gui/webbrowser.cpp @@ -44,7 +44,7 @@ WebBrowser::WebBrowser(WebViewer* viewer, QWidget* parent) : TabContent(parent), this)) { if (m_webView == nullptr) { #if !defined(USE_WEBENGINE) - m_webView = new LiteHtmlViewer(this), + m_webView = new LiteHtmlViewer(this); #else if (qApp->forcedNoWebEngine()) { m_webView = new LiteHtmlViewer(this);