From d5ea403f8d184ca3b131b54c15491a11e08cac7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20Bj=C3=B8rlykke?= Date: Mon, 30 Nov 2020 12:31:55 +0100 Subject: [PATCH] Qt: Fix packet bytes hover rectangle position For Qt 5.11 and newer use horizontalAdvance() instead of boundingRect().width() to calculate the width of a QString to position the hover rectangle position, and to select which byte(s) to highlight. Closes #17033. (cherry picked from commit cb3b469d7fa25b5e0cd288c1bc2fbfad11242b1f) --- ui/qt/widgets/byte_view_text.cpp | 21 +++++++++++++++------ ui/qt/widgets/byte_view_text.h | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/ui/qt/widgets/byte_view_text.cpp b/ui/qt/widgets/byte_view_text.cpp index d847d16e36..abf292c50d 100644 --- a/ui/qt/widgets/byte_view_text.cpp +++ b/ui/qt/widgets/byte_view_text.cpp @@ -341,6 +341,15 @@ void ByteViewText::contextMenuEvent(QContextMenuEvent *event) const int ByteViewText::separator_interval_ = DataPrinter::separatorInterval(); +int ByteViewText::stringWidth(const QString &line) +{ +#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)) + return fontMetrics().horizontalAdvance(line); +#else + return fontMetrics().boundingRect(line).width(); +#endif +} + // Draw a line of byte view text for a given offset. // Text highlighting is handled using QTextLayout::FormatRange. void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y) @@ -366,7 +375,7 @@ void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y if (show_offset_) { line = QString(" %1 ").arg(offset, offsetChars(false), 16, QChar('0')); if (build_x_pos) { - x_pos_to_column_.fill(-1, fontMetrics().boundingRect(line).width()); + x_pos_to_column_.fill(-1, stringWidth(line)); } } @@ -401,19 +410,19 @@ void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y break; } if (build_x_pos) { - x_pos_to_column_ += QVector().fill(tvb_pos - offset, fontMetrics().boundingRect(line).width() - x_pos_to_column_.size() + slop); + x_pos_to_column_ += QVector().fill(tvb_pos - offset, stringWidth(line) - x_pos_to_column_.size() + slop); } if (tvb_pos == hovered_byte_offset_ || tvb_pos == marked_byte_offset_) { int ho_len = recent.gui_bytes_view == BYTES_HEX ? 2 : 8; QRect ho_rect = painter->boundingRect(QRect(), Qt::AlignHCenter|Qt::AlignVCenter, line.right(ho_len)); - ho_rect.moveRight(fontMetrics().boundingRect(line).width()); + ho_rect.moveRight(stringWidth(line)); ho_rect.moveTop(row_y); hover_outlines_.append(ho_rect); } } line += QString(ascii_start - line.length(), ' '); if (build_x_pos) { - x_pos_to_column_ += QVector().fill(-1, fontMetrics().boundingRect(line).width() - x_pos_to_column_.size()); + x_pos_to_column_ += QVector().fill(-1, stringWidth(line) - x_pos_to_column_.size()); } addHexFormatRange(fmt_list, proto_start_, proto_len_, offset, max_tvb_pos, ModeProtocol); @@ -462,11 +471,11 @@ void ByteViewText::drawLine(QPainter *painter, const int offset, const int row_y } } if (build_x_pos) { - x_pos_to_column_ += QVector().fill(tvb_pos - offset, fontMetrics().boundingRect(line).width() - x_pos_to_column_.size()); + x_pos_to_column_ += QVector().fill(tvb_pos - offset, stringWidth(line) - x_pos_to_column_.size()); } if (tvb_pos == hovered_byte_offset_ || tvb_pos == marked_byte_offset_) { QRect ho_rect = painter->boundingRect(QRect(), 0, line.right(1)); - ho_rect.moveRight(fontMetrics().boundingRect(line).width()); + ho_rect.moveRight(stringWidth(line)); ho_rect.moveTop(row_y); hover_outlines_.append(ho_rect); } diff --git a/ui/qt/widgets/byte_view_text.h b/ui/qt/widgets/byte_view_text.h index 301d267955..f2deb134cd 100644 --- a/ui/qt/widgets/byte_view_text.h +++ b/ui/qt/widgets/byte_view_text.h @@ -77,6 +77,7 @@ private: QTextLayout *layout_; const QByteArray data_; + int stringWidth(const QString &line); void drawLine(QPainter *painter, const int offset, const int row_y); bool addFormatRange(QList &fmt_list, int start, int length, HighlightMode mode); bool addHexFormatRange(QList &fmt_list, int mark_start, int mark_length, int tvb_offset, int max_tvb_pos, HighlightMode mode);