From: Manuel Nickschas Date: Tue, 29 Apr 2008 22:27:10 +0000 (+0000) Subject: More WiP stuff for the MessageModel. X-Git-Tag: 0.3.0~425^2~13 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=32b5e6447458a8e6e8074c40988b2d06f327094f More WiP stuff for the MessageModel. --- diff --git a/src/client/client.h b/src/client/client.h index 099d59b3..6cd8420a 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -93,6 +93,7 @@ public: 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; } diff --git a/src/client/messagemodel.cpp b/src/client/messagemodel.cpp index c41ad973..3be7601a 100644 --- a/src/client/messagemodel.cpp +++ b/src/client/messagemodel.cpp @@ -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)) { - emit dataChanged(index, index); // FIXME make msg emit this (too) + emit dataChanged(index, index); return true; } return false; @@ -95,7 +95,7 @@ MessageItem::~MessageItem() { } 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); case MessageModel::BufferIdRole: return QVariant::fromValue(_bufferId); diff --git a/src/client/messagemodel.h b/src/client/messagemodel.h index 336c07eb..afbe89f5 100644 --- a/src/client/messagemodel.h +++ b/src/client/messagemodel.h @@ -34,15 +34,21 @@ class MessageModel : public QAbstractItemModel { Q_OBJECT public: - enum MessageRoles { + enum MessageRole { MsgIdRole = Qt::UserRole, BufferIdRole, TypeRole, FlagsRole, TimestampRole, + DisplayRole, + FormatRole, UserRole }; + enum ColumnType { + TimestampColumn, SenderColumn, TextColumn, UserColumnType + }; + MessageModel(QObject *parent); virtual ~MessageModel(); @@ -72,10 +78,12 @@ class MessageModel : public QAbstractItemModel { 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(); diff --git a/src/core/core.cpp b/src/core/core.cpp index 1ad9fe2c..1af89261 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -478,7 +478,7 @@ void Core::processClientMessage(QTcpSocket *socket, const QVariantMap &msg) { } 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); } } diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index e6f602e1..1e086059 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -27,8 +27,7 @@ #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); //} @@ -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(); @@ -104,6 +124,7 @@ void ChatItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, _layout.draw(painter, QPointF(0, 0)); } +*/ /* void ChatItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) { diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index 2cd2f3b0..451bc98a 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -22,9 +22,11 @@ #define _CHATITEM_H_ #include +#include #include #include +#include "messagemodel.h" #include "uistyle.h" class QGraphicsSceneMouseEvent; @@ -32,28 +34,33 @@ class QGraphicsSceneMouseEvent; 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); - 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(_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: - int _width; - QTextLayout _layout; - QTextOption _textOption; + //int _width; + //QTextLayout _layout; + //QTextOption _textOption; + QPersistentModelIndex _index; }; #endif diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index ef59fc48..c3e08b9e 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -21,13 +21,17 @@ #include "chatline.h" Chatline::Chatline(const Message &msg) : MessageItem(msg) { + _msg = msg; } 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) { diff --git a/src/qtui/chatline.h b/src/qtui/chatline.h index 087e2e86..24b13728 100644 --- a/src/qtui/chatline.h +++ b/src/qtui/chatline.h @@ -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); + private: + Message _msg; }; #endif diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 669f7462..dc2d5607 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -19,6 +19,7 @@ ***************************************************************************/ #include +#include #include "buffer.h" #include "chatitem.h" @@ -26,14 +27,15 @@ #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() { @@ -41,26 +43,6 @@ ChatScene::~ChatScene() { } -void ChatScene::appendMsg(AbstractUiMsg * msg) { - /* - ChatLine *line = dynamic_cast(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(msg); - Q_ASSERT(line); qDebug() << "prepending"; - _lines.prepend(line); - addItem(line); - line->setPos(0, _lines.count() * 30); - */ -} void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { /* diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 4dc415b7..1ce9304d 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -23,8 +23,11 @@ #include +#include "messagemodel.h" + class AbstractUiMsg; class Buffer; +class ChatItem; class ChatLine; class QGraphicsSceneMouseEvent; @@ -32,22 +35,23 @@ class ChatScene : public QGraphicsScene { Q_OBJECT public: - ChatScene(Buffer *buffer, QObject *parent); + ChatScene(MessageModel *model, QObject *parent); virtual ~ChatScene(); Buffer *buffer() const; + inline MessageModel *model() const { return _model; } public slots: protected slots: - void appendMsg(AbstractUiMsg *msg); - void prependMsg(AbstractUiMsg *msg); void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ); private: - Buffer *_buffer; - QList _lines; + //Buffer *_buffer; + //QList _lines; + MessageModel *_model; + QList _items; }; diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index db93f074..aa623104 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -24,13 +24,14 @@ #include "chatline.h" #include "chatscene.h" #include "chatview.h" +#include "client.h" #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); - QGraphicsTextItem *item = scene()->addText(buf->bufferInfo().bufferName()); + //QGraphicsTextItem *item = scene()->addText(buf->bufferInfo().bufferName()); } @@ -81,7 +82,7 @@ void ChatView::appendChatLines(QList list) { } void ChatView::setContents(const QList &list) { - qDebug() << "setting" << list.count(); + //qDebug() << "setting" << list.count(); //appendChatLines(list); }