More QML fidgetery
[quassel.git] / src / qmlui / qmlmessagemodelitem.cpp
index 561c9b7..ec11ec4 100644 (file)
@@ -18,6 +18,7 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
+#include "graphicalui.h"
 #include "qmlchatline.h"
 #include "qmlmessagemodel.h"
 #include "qmlmessagemodelitem.h"
@@ -31,23 +32,127 @@ QmlMessageModelItem::QmlMessageModelItem(const Message &msg)
     _styledMsg.setFlags(msg.flags() |= Message::ServerMsg);
 }
 
+bool QmlMessageModelItem::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 QmlMessageModelItem::data(int column, int role) const {
   QVariant variant;
   switch(role) {
-  case QmlMessageModel::ChatLineDataRole: {
-    QmlChatLine::Data data;
-    data.timestamp.text = _styledMsg.decoratedTimestamp();
-    data.timestamp.formats = UiStyle::FormatList() << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Timestamp);
-    data.sender.text = _styledMsg.decoratedSender();
-    data.sender.formats = UiStyle::FormatList() << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Sender);
-    data.contents.text = _styledMsg.plainContents();
-    data.contents.formats = _styledMsg.contentsFormatList();
-    return QVariant::fromValue<QmlChatLine::Data>(data);
+  case QmlMessageModel::MsgLabelRole:
+    return messageLabel();
+
+  case QmlMessageModel::RenderDataRole: {
+    QmlChatLine::RenderData data;
+    data[QmlChatLine::TimestampColumn].text = _styledMsg.decoratedTimestamp();
+    data[QmlChatLine::TimestampColumn].formats = UiStyle::FormatList() << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Timestamp);
+    data[QmlChatLine::TimestampColumn].background = backgroundBrush(UiStyle::Timestamp).value<QBrush>();
+    data[QmlChatLine::TimestampColumn].selectedBackground = backgroundBrush(UiStyle::Timestamp, true).value<QBrush>();
+
+    data[QmlChatLine::SenderColumn].text = _styledMsg.decoratedSender();
+    data[QmlChatLine::SenderColumn].formats = UiStyle::FormatList() << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Sender);
+    data[QmlChatLine::SenderColumn].background = backgroundBrush(UiStyle::Sender).value<QBrush>();
+    data[QmlChatLine::SenderColumn].selectedBackground = backgroundBrush(UiStyle::Sender, true).value<QBrush>();
+
+    data[QmlChatLine::ContentsColumn].text = _styledMsg.plainContents();
+    data[QmlChatLine::ContentsColumn].formats = _styledMsg.contentsFormatList();
+    data[QmlChatLine::ContentsColumn].background = backgroundBrush(UiStyle::Contents).value<QBrush>();
+    data[QmlChatLine::ContentsColumn].selectedBackground = backgroundBrush(UiStyle::Contents, true).value<QBrush>();
+
+    return QVariant::fromValue<QmlChatLine::RenderData>(data);
   }
+
   default:
     break;
   }
+
+  MessageModel::ColumnType col = (MessageModel::ColumnType)column;
+  switch(col) {
+  case QmlMessageModel::TimestampColumn:
+    variant = timestampData(role);
+    break;
+  case QmlMessageModel::SenderColumn:
+    variant = senderData(role);
+    break;
+  case QmlMessageModel::ContentsColumn:
+    variant = contentsData(role);
+    break;
+  default:
+    break;
+  }
+
   if(!variant.isValid())
     return MessageModelItem::data(column, role);
   return variant;
 }
+
+QVariant QmlMessageModelItem::timestampData(int role) const {
+  switch(role) {
+  case QmlMessageModel::DisplayRole:
+    return _styledMsg.decoratedTimestamp();
+  case QmlMessageModel::EditRole:
+    return _styledMsg.timestamp();
+  case QmlMessageModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Timestamp);
+  case QmlMessageModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Timestamp, true);
+  case QmlMessageModel::FormatRole:
+    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList()
+                      << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Timestamp));
+  }
+  return QVariant();
+}
+
+QVariant QmlMessageModelItem::senderData(int role) const {
+  switch(role) {
+  case QmlMessageModel::DisplayRole:
+    return _styledMsg.decoratedSender();
+  case QmlMessageModel::EditRole:
+    return _styledMsg.plainSender();
+  case QmlMessageModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Sender);
+  case QmlMessageModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Sender, true);
+  case QmlMessageModel::FormatRole:
+    return QVariant::fromValue<UiStyle::FormatList>(UiStyle::FormatList()
+                      << qMakePair((quint16)0, (quint32)UiStyle::formatType(_styledMsg.type()) | UiStyle::Sender));
+  }
+  return QVariant();
+}
+
+QVariant QmlMessageModelItem::contentsData(int role) const {
+  switch(role) {
+  case QmlMessageModel::DisplayRole:
+  case QmlMessageModel::EditRole:
+    return _styledMsg.plainContents();
+  case QmlMessageModel::BackgroundRole:
+    return backgroundBrush(UiStyle::Contents);
+  case QmlMessageModel::SelectedBackgroundRole:
+    return backgroundBrush(UiStyle::Contents, true);
+  case QmlMessageModel::FormatRole:
+    return QVariant::fromValue<UiStyle::FormatList>(_styledMsg.contentsFormatList());
+  }
+  return QVariant();
+}
+
+quint32 QmlMessageModelItem::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 QmlMessageModelItem::backgroundBrush(UiStyle::FormatType subelement, bool selected) const {
+  QTextCharFormat fmt = GraphicalUi::uiStyle()->format(UiStyle::formatType(_styledMsg.type()) | subelement, messageLabel() | (selected ? UiStyle::Selected : 0));
+  if(fmt.hasProperty(QTextFormat::BackgroundBrush))
+    return QVariant::fromValue<QBrush>(fmt.background());
+  return QVariant();
+}