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; }
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;
}
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);
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();
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();
}
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);
}
}
#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);
//}
}
+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();
_layout.draw(painter, QPointF(0, 0));
}
+*/
/*
void ChatItem::mouseMoveEvent ( QGraphicsSceneMouseEvent * event ) {
#define _CHATITEM_H_
#include <QGraphicsItem>
+#include <QPersistentModelIndex>
#include <QTextLayout>
#include <QTextOption>
+#include "messagemodel.h"
#include "uistyle.h"
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<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:
- int _width;
- QTextLayout _layout;
- QTextOption _textOption;
+ //int _width;
+ //QTextLayout _layout;
+ //QTextOption _textOption;
+ QPersistentModelIndex _index;
};
#endif
#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) {
virtual QVariant data(int column, int role) const;
virtual bool setData(int column, const QVariant &value, int role);
+ private:
+ Message _msg;
};
#endif
***************************************************************************/
#include <QGraphicsSceneMouseEvent>
+#include <QPersistentModelIndex>
#include "buffer.h"
#include "chatitem.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() {
}
-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 ) {
/*
#include <QGraphicsScene>
+#include "messagemodel.h"
+
class AbstractUiMsg;
class Buffer;
+class ChatItem;
class ChatLine;
class QGraphicsSceneMouseEvent;
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<ChatLine*> _lines;
+ //Buffer *_buffer;
+ //QList<ChatLine*> _lines;
+ MessageModel *_model;
+ QList<ChatItem *> _items;
};
#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());
}
}
void ChatView::setContents(const QList<AbstractUiMsg *> &list) {
- qDebug() << "setting" << list.count();
+ //qDebug() << "setting" << list.count();
//appendChatLines(list);
}