Пример #1
0
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();
}
Пример #2
0
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;
  }
}