QVector<QTextLayout::FormatRange> ChatItem::selectionFormats() const { if (!hasSelection()) return QVector<QTextLayout::FormatRange>(); int start, end; if (_selectionMode == FullSelection) { start = 0; end = data(MessageModel::DisplayRole).toString().length(); } else { start = qMin(_selectionStart, _selectionEnd); end = qMax(_selectionStart, _selectionEnd); } UiStyle::FormatList fmtList = formatList(); while (fmtList.count() > 1 && fmtList.at(1).first <= start) fmtList.removeFirst(); fmtList.first().first = start; while (fmtList.count() > 1 && fmtList.last().first >= end) fmtList.removeLast(); return QtUi::style()->toTextLayoutList(fmtList, end, UiStyle::Selected|data(ChatLineModel::MsgLabelRole).toUInt()).toVector(); }
void ChatItem::overlayFormat(UiStyle::FormatList &fmtList, int start, int end, quint32 overlayFmt) const { for(int i = 0; i < fmtList.count(); i++) { int fmtStart = fmtList.at(i).first; int fmtEnd = (i < fmtList.count()-1 ? fmtList.at(i+1).first : data(MessageModel::DisplayRole).toString().length()); if(fmtEnd <= start) continue; if(fmtStart >= end) break; // split the format if necessary if(fmtStart < start) { fmtList.insert(i, fmtList.at(i)); fmtList[++i].first = start; } if(end < fmtEnd) { fmtList.insert(i, fmtList.at(i)); fmtList[i+1].first = end; } fmtList[i].second |= overlayFmt; } }