More WiP stuff for the MessageModel.
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 29 Apr 2008 22:27:10 +0000 (22:27 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 29 Apr 2008 22:27:10 +0000 (22:27 +0000)
src/client/client.h
src/client/messagemodel.cpp
src/client/messagemodel.h
src/core/core.cpp
src/qtui/chatitem.cpp
src/qtui/chatitem.h
src/qtui/chatline.cpp
src/qtui/chatline.h
src/qtui/chatscene.cpp
src/qtui/chatscene.h
src/qtui/chatview.cpp

index 099d59b..6cd8420 100644 (file)
@@ -93,6 +93,7 @@ public:
 
   static inline NetworkModel *networkModel() { return instance()->_networkModel; }
   static inline BufferModel *bufferModel() { return instance()->_bufferModel; }
 
   static inline NetworkModel *networkModel() { return instance()->_networkModel; }
   static inline BufferModel *bufferModel() { return instance()->_bufferModel; }
+  static inline MessageModel *messageModel() { return instance()->_messageModel; }
   static inline SignalProxy *signalProxy() { return instance()->_signalProxy; }
 
   static inline ClientBacklogManager *backlogManager() { return instance()->_backlogManager; }
   static inline SignalProxy *signalProxy() { return instance()->_signalProxy; }
 
   static inline ClientBacklogManager *backlogManager() { return instance()->_backlogManager; }
index c41ad97..3be7601 100644 (file)
@@ -43,7 +43,7 @@ bool MessageModel::setData(const QModelIndex &index, const QVariant &value, int
   int row = index.row();
   if(row < 0 || row >= _messageList.count()) return false;
   if(_messageList[row]->setData(index.column(), value, role)) {
   int row = index.row();
   if(row < 0 || row >= _messageList.count()) return false;
   if(_messageList[row]->setData(index.column(), value, role)) {
-    emit dataChanged(index, index); // FIXME make msg emit this (too)
+    emit dataChanged(index, index);
     return true;
   }
   return false;
     return true;
   }
   return false;
@@ -95,7 +95,7 @@ MessageItem::~MessageItem() {
 }
 
 QVariant MessageItem::data(int column, int role) const {
 }
 
 QVariant MessageItem::data(int column, int role) const {
-  if(column < TimestampColumn || column > TextColumn) return QVariant();
+  if(column < MessageModel::TimestampColumn || column > MessageModel::TextColumn) return QVariant();
   switch(role) {
     case MessageModel::MsgIdRole: return QVariant::fromValue<MsgId>(_msgId);
     case MessageModel::BufferIdRole: return QVariant::fromValue<BufferId>(_bufferId);
   switch(role) {
     case MessageModel::MsgIdRole: return QVariant::fromValue<MsgId>(_msgId);
     case MessageModel::BufferIdRole: return QVariant::fromValue<BufferId>(_bufferId);
index 336c07e..afbe89f 100644 (file)
@@ -34,15 +34,21 @@ class MessageModel : public QAbstractItemModel {
   Q_OBJECT
 
   public:
   Q_OBJECT
 
   public:
-    enum MessageRoles {
+    enum MessageRole {
       MsgIdRole = Qt::UserRole,
       BufferIdRole,
       TypeRole,
       FlagsRole,
       TimestampRole,
       MsgIdRole = Qt::UserRole,
       BufferIdRole,
       TypeRole,
       FlagsRole,
       TimestampRole,
+      DisplayRole,
+      FormatRole,
       UserRole
     };
 
       UserRole
     };
 
+    enum ColumnType {
+      TimestampColumn, SenderColumn, TextColumn, UserColumnType
+    };
+
     MessageModel(QObject *parent);
     virtual ~MessageModel();
 
     MessageModel(QObject *parent);
     virtual ~MessageModel();
 
@@ -72,10 +78,12 @@ class MessageModel : public QAbstractItemModel {
 class MessageItem {
 
   public:
 class MessageItem {
 
   public:
-    enum {
-      TimestampColumn, SenderColumn, TextColumn
-    };
 
 
+    //! Creates a MessageItem from a Message object.
+    /** This baseclass implementation takes care of all Message data *except* the stylable strings.
+     *  Subclasses need to provide Qt::DisplayRole at least, which should describe the plaintext
+     *  strings without formattings (e.g. for searching purposes).
+     */
     MessageItem(const Message &);
     virtual ~MessageItem();
 
     MessageItem(const Message &);
     virtual ~MessageItem();
 
index 1ad9fe2..1af8926 100644 (file)
@@ -478,7 +478,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) {
       }
       reply["MsgType"] = "ClientLoginAck";
       SignalProxy::writeDataToDevice(socket, reply);
       }
       reply["MsgType"] = "ClientLoginAck";
       SignalProxy::writeDataToDevice(socket, reply);
-      qDebug() << qPrintable(tr("Client %1 initialized and authentificated successfully as \"%2\" (UserId: %3).").arg(socket->peerAddress().toString(), msg["User"].toString()).arg(uid.toInt()));
+      qDebug() << qPrintable(tr("Client %1 initialized and authenticated successfully as \"%2\" (UserId: %3).").arg(socket->peerAddress().toString(), msg["User"].toString()).arg(uid.toInt()));
       setupClientSession(socket, uid);
     }
   }
       setupClientSession(socket, uid);
     }
   }
index e6f602e..1e08605 100644 (file)
@@ -27,8 +27,7 @@
 
 #include "chatitem.h"
 
 
 #include "chatitem.h"
 
-ChatItem::ChatItem(QGraphicsItem *parent) : QGraphicsItem(parent) {
-  _width = 0;
+ChatItem::ChatItem(const QPersistentModelIndex &index_, QGraphicsItem *parent) : QGraphicsItem(parent), _index(index_) {
   //if(_wrapMode == WordWrap) {
   //  setFlags(QGraphicsItem::ItemClipsToShape, true);
   //}
   //if(_wrapMode == WordWrap) {
   //  setFlags(QGraphicsItem::ItemClipsToShape, true);
   //}
@@ -38,6 +37,27 @@ ChatItem::~ChatItem() {
 
 }
 
 
 }
 
+QVariant ChatItem::data(int role) const {
+  if(!_index.isValid()) {
+    qWarning() << "ChatItem::data(): Model index is invalid!";
+    return QVariant();
+  }
+  return _index.data(role);
+}
+
+QRectF ChatItem::boundingRect() const {
+  return QRectF(0, 0, 500,20);
+}
+
+void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+  Q_UNUSED(option); Q_UNUSED(widget);
+
+  painter->drawRect(boundingRect());
+  painter->drawText(boundingRect(), data(MessageModel::DisplayRole).toString());
+}
+
+
+/*
 void ChatItem::setWidth(int w) {
   _width = w;
   layout();
 void ChatItem::setWidth(int w) {
   _width = w;
   layout();
@@ -104,6 +124,7 @@ void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
   _layout.draw(painter, QPointF(0, 0));
 
 }
   _layout.draw(painter, QPointF(0, 0));
 
 }
+*/
 
 /*
 void ChatItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) {
 
 /*
 void ChatItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) {
index 2cd2f3b..451bc98 100644 (file)
 #define _CHATITEM_H_
 
 #include <QGraphicsItem>
 #define _CHATITEM_H_
 
 #include <QGraphicsItem>
+#include <QPersistentModelIndex>
 #include <QTextLayout>
 #include <QTextOption>
 
 #include <QTextLayout>
 #include <QTextOption>
 
+#include "messagemodel.h"
 #include "uistyle.h"
 
 class QGraphicsSceneMouseEvent;
 #include "uistyle.h"
 
 class QGraphicsSceneMouseEvent;
@@ -32,28 +34,33 @@ class QGraphicsSceneMouseEvent;
 class ChatItem : public QGraphicsItem {
 
   public:
 class ChatItem : public QGraphicsItem {
 
   public:
-    ChatItem(QGraphicsItem *parent = 0);
+    ChatItem(const QPersistentModelIndex &index, QGraphicsItem *parent = 0);
     virtual ~ChatItem();
 
     virtual QRectF boundingRect() const;
     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
 
     virtual ~ChatItem();
 
     virtual QRectF boundingRect() const;
     virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
 
-    QString text() const;
-    void setText(const UiStyle::StyledText &text);
+    inline QPersistentModelIndex persistentIndex() const { return _index; }
+    inline const MessageModel *model() const { return _index.isValid() ? qobject_cast<const MessageModel *>(_index.model()) : 0; }
+    inline int row() const { return _index.isValid() ? _index.row() : 0; }
+    QVariant data(int role) const;
+    //QString text() const;
+    //void setText(const UiStyle::StyledText &text);
 
 
-    QTextOption textOption() const;
-    void setTextOption(const QTextOption &option);
+    //QTextOption textOption() const;
+    //void setTextOption(const QTextOption &option);
 
 
-    void setWidth(int width);
-    virtual void layout();
+    //void setWidth(int width);
+    //virtual void layout();
 
   protected:
     //void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
 
   private:
 
   protected:
     //void mouseMoveEvent ( QGraphicsSceneMouseEvent * event );
 
   private:
-    int _width;
-    QTextLayout _layout;
-    QTextOption _textOption;
+    //int _width;
+    //QTextLayout _layout;
+    //QTextOption _textOption;
+    QPersistentModelIndex _index;
 };
 
 #endif
 };
 
 #endif
index ef59fc4..c3e08b9 100644 (file)
 #include "chatline.h"
 
 Chatline::Chatline(const Message &msg) : MessageItem(msg) {
 #include "chatline.h"
 
 Chatline::Chatline(const Message &msg) : MessageItem(msg) {
+  _msg = msg;
 
 
 }
 
 
 QVariant Chatline::data(int column, int role) const {
 
 
 }
 
 
 QVariant Chatline::data(int column, int role) const {
-  return MessageItem::data(column, role);
+  switch(role) {
+    case MessageModel::DisplayRole: return _msg.text();
+    default: return MessageItem::data(column, role);
+  }
 }
 
 bool Chatline::setData(int column, const QVariant &value, int role) {
 }
 
 bool Chatline::setData(int column, const QVariant &value, int role) {
index 087e2e8..24b1372 100644 (file)
@@ -32,6 +32,8 @@ class Chatline : public MessageItem {
     virtual QVariant data(int column, int role) const;
     virtual bool setData(int column, const QVariant &value, int role);
 
     virtual QVariant data(int column, int role) const;
     virtual bool setData(int column, const QVariant &value, int role);
 
+  private:
+    Message _msg;
 };
 
 #endif
 };
 
 #endif
index 669f746..dc2d560 100644 (file)
@@ -19,6 +19,7 @@
  ***************************************************************************/
 
 #include <QGraphicsSceneMouseEvent>
  ***************************************************************************/
 
 #include <QGraphicsSceneMouseEvent>
+#include <QPersistentModelIndex>
 
 #include "buffer.h"
 #include "chatitem.h"
 
 #include "buffer.h"
 #include "chatitem.h"
 #include "chatscene.h"
 #include "quasselui.h"
 
 #include "chatscene.h"
 #include "quasselui.h"
 
-ChatScene::ChatScene(Buffer *buf, QObject *parent) : QGraphicsScene(parent) {
-  _buffer = buf;
-
-  foreach(AbstractUiMsg *msg, buf->contents()) {
-    appendMsg(msg);
+ChatScene::ChatScene(MessageModel *model, QObject *parent) : QGraphicsScene(parent), _model(model) {
+  connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int)));
+  for(int i = 0; i < model->rowCount(); i++) {
+    ChatItem *item = new ChatItem(QPersistentModelIndex(model->index(i, 2)));
+    addItem(item);
+    item->setPos(30, i*item->boundingRect().height());
   }
   }
-  connect(buf, SIGNAL(msgAppended(AbstractUiMsg *)), this, SLOT(appendMsg(AbstractUiMsg *)));
-  connect(buf, SIGNAL(msgPrepended(AbstractUiMsg *)), this, SLOT(prependMsg(AbstractUiMsg *)));
+
+  
 }
 
 ChatScene::~ChatScene() {
 }
 
 ChatScene::~ChatScene() {
@@ -41,26 +43,6 @@ ChatScene::~ChatScene() {
 
 }
 
 
 }
 
-void ChatScene::appendMsg(AbstractUiMsg * msg) {
-  /*
-  ChatLine *line = dynamic_cast<ChatLine*>(msg);
-  Q_ASSERT(line);
-  _lines.append(line);
-  addItem(line);
-  line->setPos(0, _lines.count() * 30);
-  line->setColumnWidths(80, 80, 400);
-  */
-}
-
-void ChatScene::prependMsg(AbstractUiMsg * msg) {
-  /*
-  ChatLine *line = dynamic_cast<ChatLine*>(msg);
-  Q_ASSERT(line); qDebug() << "prepending";
-  _lines.prepend(line);
-  addItem(line);
-  line->setPos(0, _lines.count() * 30);
-  */
-}
 
 void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) {
   /*
 
 void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) {
   /*
index 4dc415b..1ce9304 100644 (file)
 
 #include <QGraphicsScene>
 
 
 #include <QGraphicsScene>
 
+#include "messagemodel.h"
+
 class AbstractUiMsg;
 class Buffer;
 class AbstractUiMsg;
 class Buffer;
+class ChatItem;
 class ChatLine;
 class QGraphicsSceneMouseEvent;
 
 class ChatLine;
 class QGraphicsSceneMouseEvent;
 
@@ -32,22 +35,23 @@ class ChatScene : public QGraphicsScene {
   Q_OBJECT
 
   public:
   Q_OBJECT
 
   public:
-    ChatScene(Buffer *buffer, QObject *parent);
+    ChatScene(MessageModel *model, QObject *parent);
     virtual ~ChatScene();
 
     Buffer *buffer() const;
     virtual ~ChatScene();
 
     Buffer *buffer() const;
+    inline MessageModel *model() const { return _model; }
 
   public slots:
 
   protected slots:
 
   public slots:
 
   protected slots:
-    void appendMsg(AbstractUiMsg *msg);
-    void prependMsg(AbstractUiMsg *msg);
 
     void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent );
 
   private:
 
     void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent );
 
   private:
-    Buffer *_buffer;
-    QList<ChatLine*> _lines;
+    //Buffer *_buffer;
+    //QList<ChatLine*> _lines;
+    MessageModel *_model;
+    QList<ChatItem *> _items;
 
 };
 
 
 };
 
index db93f07..aa62310 100644 (file)
 #include "chatline.h"
 #include "chatscene.h"
 #include "chatview.h"
 #include "chatline.h"
 #include "chatscene.h"
 #include "chatview.h"
+#include "client.h"
 #include "quasselui.h"
 
 ChatView::ChatView(Buffer *buf, QWidget *parent) : QGraphicsView(parent), AbstractChatView() {
 #include "quasselui.h"
 
 ChatView::ChatView(Buffer *buf, QWidget *parent) : QGraphicsView(parent), AbstractChatView() {
-  _scene = new ChatScene(buf, this);
+  _scene = new ChatScene(Client::messageModel(), this);
   setScene(_scene);
 
   setScene(_scene);
 
-  QGraphicsTextItem *item = scene()->addText(buf->bufferInfo().bufferName());
+  //QGraphicsTextItem *item = scene()->addText(buf->bufferInfo().bufferName());
 
 }
 
 
 }
 
@@ -81,7 +82,7 @@ void ChatView::appendChatLines(QList<ChatLine *> list) {
 }
 
 void ChatView::setContents(const QList<AbstractUiMsg *> &list) {
 }
 
 void ChatView::setContents(const QList<AbstractUiMsg *> &list) {
-  qDebug() << "setting" << list.count();
+  //qDebug() << "setting" << list.count();
   //appendChatLines(list);
 }
 
   //appendChatLines(list);
 }