X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatlinemodelitem.cpp;h=145185858a94f0fc97457a6c5154b3f66af7abbc;hp=1fff2b5074ebf87e6f693937c36df9b49b9eac06;hb=e2188dc438be6f3eb0d9cdf47d28821aefe9835e;hpb=921e54680da16fcf2adb7a90506875aceb6633a4 diff --git a/src/qtui/chatlinemodelitem.cpp b/src/qtui/chatlinemodelitem.cpp index 1fff2b50..14518585 100644 --- a/src/qtui/chatlinemodelitem.cpp +++ b/src/qtui/chatlinemodelitem.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -28,14 +28,14 @@ // This Struct is taken from Harfbuzz. We use it only to calc it's size. // we use a shared memory region so we do not have to malloc a buffer area for every line -typedef struct { +using HB_CharAttributes_Dummy = struct { /*HB_LineBreakType*/ unsigned lineBreakType : 2; /*HB_Bool*/ unsigned whiteSpace : 1; /* A unicode whitespace character, except NBSP, ZWNBSP */ /*HB_Bool*/ unsigned charStop : 1; /* Valid cursor position (for left/right arrow) */ /*HB_Bool*/ unsigned wordBoundary : 1; /*HB_Bool*/ unsigned sentenceBoundary : 1; unsigned unused : 2; -} HB_CharAttributes_Dummy; +}; unsigned char *ChatLineModelItem::TextBoundaryFinderBuffer = (unsigned char *)malloc(512 * sizeof(HB_CharAttributes_Dummy)); int ChatLineModelItem::TextBoundaryFinderBufferSize = 512 * (sizeof(HB_CharAttributes_Dummy) / sizeof(unsigned char)); @@ -49,6 +49,15 @@ ChatLineModelItem::ChatLineModelItem(const Message &msg) { if (!msg.sender().contains('!')) _styledMsg.setFlags(msg.flags() |= Message::ServerMsg); + + if (_styledMsg.type() == Message::Nick) { + // HACK: Work around nick changes on Quassel core not properly being set as Self + // While this is fixed in the core, old cores and past history will still show incorrectly. + if (nickFromMask(_styledMsg.sender()) == stripFormatCodes(_styledMsg.contents()).toLower()) { + _styledMsg.setFlags(msg.flags() |= Message::Self); + } + } + // Unfortunately, the missing Self flag for other message types can't easily be worked around. } @@ -56,7 +65,7 @@ bool ChatLineModelItem::setData(int column, const QVariant &value, int role) { switch (role) { case MessageModel::FlagsRole: - _styledMsg.setFlags((Message::Flags)value.toUInt()); + _styledMsg.setFlags((Message::Flags)value.toInt()); return true; default: return MessageModelItem::setData(column, value, role); @@ -67,10 +76,10 @@ bool ChatLineModelItem::setData(int column, const QVariant &value, int role) QVariant ChatLineModelItem::data(int column, int role) const { if (role == ChatLineModel::MsgLabelRole) - return messageLabel(); + return QVariant::fromValue(messageLabel()); QVariant variant; - MessageModel::ColumnType col = (MessageModel::ColumnType)column; + auto col = (MessageModel::ColumnType)column; switch (col) { case ChatLineModel::TimestampColumn: variant = timestampData(role); @@ -98,12 +107,11 @@ QVariant ChatLineModelItem::timestampData(int role) const case ChatLineModel::EditRole: return _styledMsg.timestamp(); case ChatLineModel::BackgroundRole: - return backgroundBrush(UiStyle::Timestamp); + return backgroundBrush(UiStyle::FormatType::Timestamp); case ChatLineModel::SelectedBackgroundRole: - return backgroundBrush(UiStyle::Timestamp, true); + return backgroundBrush(UiStyle::FormatType::Timestamp, true); case ChatLineModel::FormatRole: - return QVariant::fromValue(UiStyle::FormatList() - << qMakePair((quint16)0, (quint32) UiStyle::formatType(_styledMsg.type()) | UiStyle::Timestamp)); + return QVariant::fromValue({std::make_pair(quint16{0}, UiStyle::Format{UiStyle::formatType(_styledMsg.type()) | UiStyle::FormatType::Timestamp, {}, {}})}); } return QVariant(); } @@ -117,12 +125,11 @@ QVariant ChatLineModelItem::senderData(int role) const case ChatLineModel::EditRole: return _styledMsg.plainSender(); case ChatLineModel::BackgroundRole: - return backgroundBrush(UiStyle::Sender); + return backgroundBrush(UiStyle::FormatType::Sender); case ChatLineModel::SelectedBackgroundRole: - return backgroundBrush(UiStyle::Sender, true); + return backgroundBrush(UiStyle::FormatType::Sender, true); case ChatLineModel::FormatRole: - return QVariant::fromValue(UiStyle::FormatList() - << qMakePair((quint16)0, (quint32) UiStyle::formatType(_styledMsg.type()) | UiStyle::Sender)); + return QVariant::fromValue({std::make_pair(quint16{0}, UiStyle::Format{UiStyle::formatType(_styledMsg.type()) | UiStyle::FormatType::Sender, {}, {}})}); } return QVariant(); } @@ -135,9 +142,9 @@ QVariant ChatLineModelItem::contentsData(int role) const case ChatLineModel::EditRole: return _styledMsg.plainContents(); case ChatLineModel::BackgroundRole: - return backgroundBrush(UiStyle::Contents); + return backgroundBrush(UiStyle::FormatType::Contents); case ChatLineModel::SelectedBackgroundRole: - return backgroundBrush(UiStyle::Contents, true); + return backgroundBrush(UiStyle::FormatType::Contents, true); case ChatLineModel::FormatRole: return QVariant::fromValue(_styledMsg.contentsFormatList()); case ChatLineModel::WrapListRole: @@ -149,20 +156,23 @@ QVariant ChatLineModelItem::contentsData(int role) const } -quint32 ChatLineModelItem::messageLabel() const +UiStyle::MessageLabel ChatLineModelItem::messageLabel() const { - quint32 label = _styledMsg.senderHash() << 16; + using MessageLabel = UiStyle::MessageLabel; + + auto label = static_cast(_styledMsg.senderHash() << 16); if (_styledMsg.flags() & Message::Self) - label |= UiStyle::OwnMsg; + label |= MessageLabel::OwnMsg; if (_styledMsg.flags() & Message::Highlight) - label |= UiStyle::Highlight; + label |= MessageLabel::Highlight; return label; } QVariant ChatLineModelItem::backgroundBrush(UiStyle::FormatType subelement, bool selected) const { - QTextCharFormat fmt = QtUi::style()->format(UiStyle::formatType(_styledMsg.type()) | subelement, messageLabel() | (selected ? UiStyle::Selected : 0)); + QTextCharFormat fmt = QtUi::style()->format({UiStyle::formatType(_styledMsg.type()) | subelement, {}, {}}, + messageLabel() | (selected ? UiStyle::MessageLabel::Selected : UiStyle::MessageLabel::None)); if (fmt.hasProperty(QTextFormat::BackgroundBrush)) return QVariant::fromValue(fmt.background()); return QVariant();