Wupps, Altlast-Alarm
[quassel.git] / src / qtui / chatlinemodelitem.cpp
index 2264fa5..3613630 100644 (file)
@@ -52,9 +52,22 @@ ChatLineModelItem::ChatLineModelItem(const Message &msg)
     _styledMsg.setFlags(msg.flags() |= Message::ServerMsg);
 }
 
+bool ChatLineModelItem::setData(int column, const QVariant &value, int role) {
+  switch(role) {
+    case MessageModel::FlagsRole:
+      _styledMsg.setFlags((Message::Flags)value.toUInt());
+      return true;
+    default:
+      return MessageModelItem::setData(column, value, role);
+  }
+}
+
 QVariant ChatLineModelItem::data(int column, int role) const {
-  MessageModel::ColumnType col = (MessageModel::ColumnType)column;
+  if(role == ChatLineModel::MsgLabelRole)
+    return messageLabel();
+
   QVariant variant;
+  MessageModel::ColumnType col = (MessageModel::ColumnType)column;
   switch(col) {
   case ChatLineModel::TimestampColumn:
     variant = timestampData(role);
@@ -79,8 +92,13 @@ QVariant ChatLineModelItem::timestampData(int role) const {
     return _styledMsg.decoratedTimestamp();
   case ChatLineModel::EditRole:
     return _styledMsg.timestamp();
+  case ChatLineModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Timestamp);
+  case ChatLineModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Timestamp, true);
   case ChatLineModel::FormatRole:
-    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList() << qMakePair((quint16)0, (quint32)_styledMsg.timestampFormat()));
+    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList()
+                      << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Timestamp));
   }
   return QVariant();
 }
@@ -91,20 +109,26 @@ QVariant ChatLineModelItem::senderData(int role) const {
     return _styledMsg.decoratedSender();
   case ChatLineModel::EditRole:
     return _styledMsg.plainSender();
+  case ChatLineModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Sender);
+  case ChatLineModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Sender, true);
   case ChatLineModel::FormatRole:
-    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList() << qMakePair((quint16)0, (quint32)_styledMsg.senderFormat()));
+    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList()
+                      << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Sender));
   }
   return QVariant();
 }
 
 QVariant ChatLineModelItem::contentsData(int role) const {
-  if(_styledMsg.needsStyling())
-    _styledMsg.style(QtUi::style());
-
   switch(role) {
   case ChatLineModel::DisplayRole:
   case ChatLineModel::EditRole:
     return _styledMsg.plainContents();
+  case ChatLineModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Contents);
+  case ChatLineModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Contents, true);
   case ChatLineModel::FormatRole:
     return QVariant::fromValue<UiStyle::FormatList>(_styledMsg.contentsFormatList());
   case ChatLineModel::WrapListRole:
@@ -115,6 +139,22 @@ QVariant ChatLineModelItem::contentsData(int role) const {
   return QVariant();
 }
 
+quint32 ChatLineModelItem::messageLabel() const {
+  quint32 label = _styledMsg.senderHash() << 16;
+  if(_styledMsg.flags() & Message::Self)
+    label |= UiStyle::OwnMsg;
+  if(_styledMsg.flags() & Message::Highlight)
+    label |= UiStyle::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));
+  if(fmt.hasProperty(QTextFormat::BackgroundBrush))
+    return QVariant::fromValue<QBrush>(fmt.background());
+  return QVariant();
+}
+
 void ChatLineModelItem::computeWrapList() const {
   int length = _styledMsg.plainContents().length();
   if(!length)
@@ -140,7 +180,7 @@ void ChatLineModelItem::computeWrapList() const {
   option.setWrapMode(QTextOption::NoWrap);
   layout.setTextOption(option);
 
-  layout.setAdditionalFormats(QtUi::style()->toTextLayoutList(_styledMsg.contentsFormatList(), length));
+  layout.setAdditionalFormats(QtUi::style()->toTextLayoutList(_styledMsg.contentsFormatList(), length, messageLabel()));
   layout.beginLayout();
   QTextLine line = layout.createLine();
   line.setNumColumns(length);