More QML fidgetery
[quassel.git] / src / qmlui / qmlchatline.cpp
index 874437c..3d3c4b4 100644 (file)
 #include "qmlchatline.h"
 
 void QmlChatLine::registerTypes() {
-  qRegisterMetaType<Data>("QmlChatLine::Data");
-  qRegisterMetaTypeStreamOperators<Data>("QmlChatLine::Data");
-  qmlRegisterType<QmlChatLine>("eu.quassel.qmlui", 1, 0, "ChatLine");
+  qRegisterMetaType<RenderData>("QmlChatLine::RenderData");
+  qRegisterMetaTypeStreamOperators<RenderData>("QmlChatLine::RenderData");
+  qmlRegisterType<QmlChatLine>("eu.quassel.qml", 1, 0, "ChatLine");
 }
 
-QDataStream &operator<<(QDataStream &out, const QmlChatLine::Data &data) {
-  out << data.timestamp.text << data.timestamp.formats
-      << data.sender.text << data.sender.formats
-      << data.contents.text << data.contents.formats;
+QDataStream &operator<<(QDataStream &out, const QmlChatLine::RenderData &data) {
+  for(int i = 0; i < (int)QmlChatLine::NumColumns; ++i) {
+    const QmlChatLine::RenderData::Column &col = data[static_cast<QmlChatLine::ColumnType>(i)];
+    out << col.text << col.formats;
+  }
   return out;
 }
 
-QDataStream &operator>>(QDataStream &in, QmlChatLine::Data &data) {
-  in >> data.timestamp.text >> data.timestamp.formats
-     >> data.sender.text >> data.sender.formats
-     >> data.contents.text >> data.contents.formats;
+QDataStream &operator>>(QDataStream &in, QmlChatLine::RenderData &data) {
+  for(int i = 0; i < (int)QmlChatLine::NumColumns; ++i) {
+    QmlChatLine::RenderData::Column &col = data[static_cast<QmlChatLine::ColumnType>(i)];
+    in >> col.text >> col.formats;
+  }
   return in;
 }
 
-QmlChatLine::QmlChatLine(QDeclarativeItem *parent) : QDeclarativeItem(parent) {
+QmlChatLine::QmlChatLine(QDeclarativeItem *parent)
+  : QDeclarativeItem(parent),
+    _timestampWidth(0),
+    _senderWidth(0),
+    _contentsWidth(0),
+    _layout(0)
+{
   setFlag(ItemHasNoContents, false);
   setImplicitHeight(20);
-  setImplicitWidth(100);
+  setImplicitWidth(1000);
+  connect(this, SIGNAL(columnWidthChanged(ColumnType)), SLOT(onColumnWidthChanged(ColumnType)));
 }
 
 QmlChatLine::~QmlChatLine() {
 
 }
 
+void QmlChatLine::setTimestampWidth(qreal w) {
+  if(w != _timestampWidth) {
+    _timestampWidth = w;
+    emit timestampWidthChanged(w);
+    emit columnWidthChanged(TimestampColumn);
+  }
+}
+
+void QmlChatLine::setSenderWidth(qreal w) {
+  if(w != _senderWidth) {
+    _senderWidth = w;
+    emit senderWidthChanged(w);
+    emit columnWidthChanged(SenderColumn);
+  }
+}
+
+void QmlChatLine::setContentsWidth(qreal w) {
+  if(w != _contentsWidth) {
+    _contentsWidth = w;
+    emit contentsWidthChanged(w);
+    emit columnWidthChanged(ContentsColumn);
+  }
+}
+
+void QmlChatLine::setColumnSpacing(qreal s) {
+  if(s != _columnSpacing) {
+    _columnSpacing = s;
+    emit columnSpacingChanged(s);
+  }
+}
+
+QPointF QmlChatLine::columnPos(ColumnType colType) const {
+  switch(colType) {
+  case TimestampColumn:
+    return QPointF(0, 0);
+  case SenderColumn:
+    return QPointF(timestampWidth(), 0);
+  case ContentsColumn:
+    return QPointF(timestampWidth() + senderWidth(), 0);
+  default:
+    return QPointF();
+  }
+}
+
+qreal QmlChatLine::columnWidth(ColumnType colType) const {
+  switch(colType) {
+  case TimestampColumn:
+    return timestampWidth();
+  case SenderColumn:
+    return senderWidth();
+  case ContentsColumn:
+    return contentsWidth();
+  default:
+    return 0;
+  }
+}
+
+QRectF QmlChatLine::columnBoundingRect(ColumnType colType) const {
+  QRectF rect;
+  switch(colType) {
+  case TimestampColumn:
+    return QRectF(columnPos(TimestampColumn), QSizeF(timestampWidth() - columnSpacing(), implicitHeight()));
+  case SenderColumn:
+    return QRectF(columnPos(SenderColumn), QSizeF(senderWidth() - columnSpacing(), implicitHeight()));
+  case ContentsColumn:
+    return QRectF(columnPos(ContentsColumn), QSizeF(contentsWidth(), implicitHeight()));
+  default:
+    return QRectF();
+  }
+}
+
+void QmlChatLine::setRenderData(const RenderData &data) {
+  _data = data;
+  if(_layout) {
+    delete _layout;
+    _layout = 0;
+  }
+
+  //update();
+}
+
+QmlChatLine::ColumnLayout *QmlChatLine::layout() const {
+  if(!_layout) {
+    _layout = new ColumnLayout(this);
+  }
+  return _layout;
+}
+
 void QmlChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
-  painter->drawText(0, 0, data().contents.text);
+  Q_UNUSED(option)
+  Q_UNUSED(widget)
+  //painter->drawText(0, 0, renderData()[TimestampColumn].text);
+  //painter->drawText(timestampWidth() + columnSpacing(), 0, renderData()[SenderColumn].text);
+  //painter->drawText(timestampWidth() + senderWidth() + 2*columnSpacing(), 0, renderData()[ContentsColumn].text);
+  layout()->draw(painter);
+}
+
+void QmlChatLine::onColumnWidthChanged(ColumnType colType) {
+
+  //qDebug() << "changed width" << _timestampWidth << _senderWidth << _contentsWidth;
+  //setImplicitHeight(implicitHeight() + 5);
+
+  if(colType == ContentsColumn) {
+    layout()->prepare();
+    setImplicitHeight(layout()->height());
+  }
+
+  update();
+}
 
+/**************************************************************************************/
+
+QmlChatLine::ColumnLayout::ColumnLayout(const QmlChatLine *parent)
+  : _parent(parent)
+{
+
+}
+
+qreal QmlChatLine::ColumnLayout::height() const {
+  return chatLine()->contentsWidth()/20;
 }
 
+void QmlChatLine::ColumnLayout::prepare() {
 
+}
+
+void QmlChatLine::ColumnLayout::draw(QPainter *p) {
+  p->drawText(chatLine()->boundingRect(), chatLine()->renderData()[ContentsColumn].text);
+  //p->drawText(chatLine()->timestampWidth() + chatLine()->columnSpacing(), 0, chatLine()->renderData()[SenderColumn].text);
+  //p->drawText(chatLine()->timestampWidth() + chatLine()->senderWidth() + 2*chatLine()->columnSpacing(), 0, chatLine()->renderData()[ContentsColumn].text);
+
+}