litehtml: Fix selection artifacts with scaled view

If you zoom into a page (Ctrl-+) and then select, artifacts could be
left behind when dragging or removing the selection again.
Fiddle around with coordinate transformations (with regard to rounding)
to fix that.

Change-Id: I68c29d8e3559b90dbb3b93550338e483d14731bf
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
Eike Ziller
2020-03-13 14:06:47 +01:00
parent 11bd2f8deb
commit 038e8491ee
3 changed files with 7 additions and 14 deletions

View File

@@ -998,8 +998,9 @@ QVector<QRect> DocumentContainer::mouseMoveEvent(const QPoint &documentPos,
viewportPos, viewportPos,
m_selection.mode); m_selection.mode);
if (element.element) { if (element.element) {
redrawRects.append(
m_selection.boundingRect() /*.adjusted(-1, -1, +1, +1)*/); // redraw old selection area
m_selection.endElem = element; m_selection.endElem = element;
redrawRects.append(m_selection.boundingRect()); // redraw old selection area
m_selection.update(); m_selection.update();
redrawRects.append(m_selection.boundingRect()); redrawRects.append(m_selection.boundingRect());
} }

View File

@@ -664,21 +664,11 @@ 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)};
} }
QPoint QLiteHtmlWidget::fromVirtual(const QPoint &p) const
{
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)};
} }
QSize QLiteHtmlWidget::fromVirtual(const QSize &s) const
{
return {int(s.width() * d->zoomFactor + 0.5), int(s.height() * d->zoomFactor + 0.5)};
}
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())};
@@ -686,5 +676,9 @@ QRect QLiteHtmlWidget::toVirtual(const QRect &r) const
QRect QLiteHtmlWidget::fromVirtual(const QRect &r) const QRect QLiteHtmlWidget::fromVirtual(const QRect &r) const
{ {
return {fromVirtual(r.topLeft()), fromVirtual(r.size())}; 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};
} }

View File

@@ -82,9 +82,7 @@ private:
QPoint scrollPosition() const; QPoint scrollPosition() const;
void htmlPos(const QPoint &pos, QPoint *viewportPos, QPoint *htmlPos) const; void htmlPos(const QPoint &pos, QPoint *viewportPos, QPoint *htmlPos) const;
QPoint toVirtual(const QPoint &p) const; QPoint toVirtual(const QPoint &p) const;
QPoint fromVirtual(const QPoint &p) const;
QSize toVirtual(const QSize &s) const; QSize toVirtual(const QSize &s) const;
QSize fromVirtual(const QSize &s) const;
QRect toVirtual(const QRect &r) const; QRect toVirtual(const QRect &r) const;
QRect fromVirtual(const QRect &r) const; QRect fromVirtual(const QRect &r) const;