diff --git a/tools/chatgui/src/message_text.cpp b/tools/chatgui/src/message_text.cpp index 656cfe6c5..0555088ab 100644 --- a/tools/chatgui/src/message_text.cpp +++ b/tools/chatgui/src/message_text.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -211,11 +212,24 @@ qreal layoutFormattedMessage(QTextLayout& layout, const MessageText& message, in option.setTabStopDistance(4 * QFontMetricsF(mono).horizontalAdvance(' ')); layout.setTextOption(option); layout.beginLayout(); qreal height = 0; + int block = 0; while (true) { auto line = layout.createLine(); if (!line.isValid()) break; + if (block < message.code.size() && message.code[block].start == line.textStart()) { + height += QFontMetricsF(layout.font()).height() + 8; ++block; + } line.setLineWidth(qMax(1, width)); line.setPosition(QPointF(0, height)); height += line.height(); } layout.endLayout(); return qMax(height, QFontMetricsF(layout.font()).height()); } + +QRectF messageCodeCopyRect(const QTextLayout& layout, const MessageCodeBlock& block, int width) { + const auto line = layout.lineForTextPosition(block.start); + if (!line.isValid()) return {}; + const QFontMetricsF metrics(layout.font()); + const qreal height = metrics.height() + 8; + const qreal buttonWidth = qMin(qreal(width), metrics.horizontalAdvance(QCoreApplication::translate("ChatGui", "Copy")) + 16); + return QRectF(width - buttonWidth, line.y() - height + 2, buttonWidth, height - 4); +} diff --git a/tools/chatgui/src/message_text.h b/tools/chatgui/src/message_text.h index 1d9eb3fc3..f47823b79 100644 --- a/tools/chatgui/src/message_text.h +++ b/tools/chatgui/src/message_text.h @@ -34,3 +34,6 @@ QSharedPointer formattedMessageText(const QModelIndex& index) // Настроить layout с уже заданным базовым font; width > 0, dark выбирает цвета. Возвращает высоту строк. qreal layoutFormattedMessage(QTextLayout& layout, const MessageText& message, int width, bool dark); + +// Прямоугольник Copy в координатах готового layout; пустой, если у блока нет строки. +QRectF messageCodeCopyRect(const QTextLayout& layout, const MessageCodeBlock& block, int width);