+ // Apply label to formats fully affected
+ for (; i < labelFmtList.size() - 1; ++i) {
+ if (labelFmtList[i+1].offset <= end) {
+ labelFmtList[i].label |= label;
+ continue;
+ }
+ // Last affected format, split if end of range doesn't align
+ if (labelFmtList[i+1].offset > end) {
+ labelFmtList.insert(labelFmtList.begin() + i, labelFmtList[i]);
+ labelFmtList[i].label |= label;
+ labelFmtList[i+1].offset = end;
+ }
+ break;
+ }
+ };
+
+ // Apply selection label
+ if (hasSelection()) {
+ quint16 start, end;
+ if (_selectionMode == FullSelection) {
+ start = 0;
+ end = data(MessageModel::DisplayRole).toString().length();
+ }
+ else {
+ start = qMin(_selectionStart, _selectionEnd);
+ end = qMax(_selectionStart, _selectionEnd);
+ }
+ applyLabel(start, end, Label::Selected);
+ }
+
+ // Apply hovered label
+ if (hasActiveClickable()) {
+ applyLabel(activeClickableRange().first, activeClickableRange().second, Label::Hovered);
+ }
+
+ // Add all formats that have an extra label to the additionalFormats list
+ QList<QTextLayout::FormatRange> additionalFormats;
+ for (size_t i = 0; i < labelFmtList.size() - 1; ++i) {
+ if (labelFmtList[i].label != itemLabel) {
+ additionalFormats << QtUi::style()->toTextLayoutList({std::make_pair(labelFmtList[i].offset, labelFmtList[i].format)},
+ labelFmtList[i+1].offset,
+ labelFmtList[i].label);
+ }
+ }