+ // Transform formatList() into an extended list of LabelFormats
+ std::vector<LabelFormat> labelFmtList;
+ std::transform(fmtList.cbegin(), fmtList.cend(), std::back_inserter(labelFmtList), [itemLabel](const std::pair<quint16, Format> &f) {
+ return LabelFormat{f.first, f.second, itemLabel};
+ });
+ // Append dummy element to avoid special-casing handling the last real format
+ labelFmtList.push_back(LabelFormat{quint16(data(MessageModel::DisplayRole).toString().length()), Format(), itemLabel});
+
+ // Apply the given label to the given range in the format list, splitting formats as necessary
+ auto applyLabel = [&labelFmtList](quint16 start, quint16 end, Label label) {
+ size_t i = 0;
+
+ // Skip unaffected formats
+ for (; i < labelFmtList.size() - 1; ++i) {
+ if (labelFmtList[i+1].offset > start)
+ break;
+ }
+ // Range start doesn't align; split affected format and let the index point to the newly inserted copy
+ if (labelFmtList[i].offset < start) {
+ labelFmtList.insert(labelFmtList.begin() + i, labelFmtList[i]);
+ labelFmtList[++i].offset = start;
+ }