From 9e0b5872dcf290e375c46c016f951c6ea780fcc0 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Mon, 19 May 2008 23:15:18 +0000 Subject: [PATCH] Make ChatLine/-Items and ChatScene honor ChatView width. The items now fill out the available space and automatically re-adjust to size changes. --- src/qtui/chatitem.cpp | 19 ++++++++++--------- src/qtui/chatitem.h | 6 ++++-- src/qtui/chatline.cpp | 19 ++++++++++++++++--- src/qtui/chatline.h | 3 ++- src/qtui/chatscene.cpp | 13 ++++++++++--- src/qtui/chatscene.h | 6 +++--- src/qtui/chatview.cpp | 7 ++++++- src/qtui/chatview.h | 3 +++ 8 files changed, 54 insertions(+), 22 deletions(-) diff --git a/src/qtui/chatitem.cpp b/src/qtui/chatitem.cpp index 7c0cc9a6..1202b93f 100644 --- a/src/qtui/chatitem.cpp +++ b/src/qtui/chatitem.cpp @@ -28,10 +28,7 @@ #include "chatitem.h" ChatItem::ChatItem(const QPersistentModelIndex &index_, QGraphicsItem *parent) : QGraphicsItem(parent), _index(index_) { - //if(_wrapMode == WordWrap) { - // setFlags(QGraphicsItem::ItemClipsToShape, true); - //} - + _width = _height = 0; } ChatItem::~ChatItem() { @@ -47,23 +44,27 @@ QVariant ChatItem::data(int role) const { } QRectF ChatItem::boundingRect() const { - return QRectF(0, 0, 500,20); + return QRectF(0, 0, _width, _height); } 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()); + painter->setPen(Qt::DotLine); + painter->drawRect(boundingRect()); } -/* -void ChatItem::setWidth(int w) { + +int ChatItem::setWidth(int w) { _width = w; - layout(); + _height = 20; // FIXME + return _height; } +/* + void ChatItem::setTextOption(const QTextOption &option) { _textOption = option; layout(); diff --git a/src/qtui/chatitem.h b/src/qtui/chatitem.h index b58dc032..e41b7b7e 100644 --- a/src/qtui/chatitem.h +++ b/src/qtui/chatitem.h @@ -49,14 +49,16 @@ class ChatItem : public QGraphicsItem { //QTextOption textOption() const; //void setTextOption(const QTextOption &option); - //void setWidth(int width); + // returns height + int setWidth(int width); //virtual void layout(); protected: //void mouseMoveEvent ( QGraphicsSceneMouseEvent * event ); private: - //int _width; + int _width; + int _height; //QTextLayout _layout; //QTextOption _textOption; QPersistentModelIndex _index; diff --git a/src/qtui/chatline.cpp b/src/qtui/chatline.cpp index 71ed2c8d..921258b1 100644 --- a/src/qtui/chatline.cpp +++ b/src/qtui/chatline.cpp @@ -32,18 +32,31 @@ ChatLine::ChatLine(const QModelIndex &index, QGraphicsItem *parent) : QGraphicsI _senderItem = new ChatItem(QPersistentModelIndex(index.sibling(index.row(), ChatLineModel::SenderColumn)), this); _contentsItem = new ChatItem(QPersistentModelIndex(index.sibling(index.row(), ChatLineModel::ContentsColumn)), this); - _senderItem->setPos(80, 0); - _contentsItem->setPos(160, 0); + _timestampItem->setPos(0,0); } ChatLine::~ChatLine() { - + delete _timestampItem; + delete _senderItem; + delete _contentsItem; } +// FIXME make more efficient by caching width/height QRectF ChatLine::boundingRect () const { return childrenBoundingRect(); } +int ChatLine::setColumnWidths(int ts, int sender, int contents) { + _timestampItem->setWidth(ts); + _senderItem->setWidth(sender); + int h = _contentsItem->setWidth(contents); + + _senderItem->setPos(ts, 0); + _contentsItem->setPos(ts + sender, 0); + + return h; +} + void ChatLine::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { } diff --git a/src/qtui/chatline.h b/src/qtui/chatline.h index 8531f39a..a7db7e4a 100644 --- a/src/qtui/chatline.h +++ b/src/qtui/chatline.h @@ -37,7 +37,8 @@ class ChatLine : public QGraphicsItem { virtual void paint (QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0); //void layout(); - //void setColumnWidths(int tsColWidth, int senderColWidth, int textColWidth); + // returns height + int setColumnWidths(int tsColWidth, int senderColWidth, int textColWidth); //void myMousePressEvent ( QGraphicsSceneMouseEvent * event ) { qDebug() << "press"; mousePressEvent(event); } diff --git a/src/qtui/chatscene.cpp b/src/qtui/chatscene.cpp index 85a1787d..d51050f9 100644 --- a/src/qtui/chatscene.cpp +++ b/src/qtui/chatscene.cpp @@ -31,11 +31,9 @@ ChatScene::ChatScene(MessageModel *model, QObject *parent) : QGraphicsScene(pare connect(model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), this, SLOT(rowsInserted(const QModelIndex &, int, int))); for(int i = 0; i < model->rowCount(); i++) { ChatLine *line = new ChatLine(model->index(i, 0)); + _lines.append(line); addItem(line); - line->setPos(30, i*line->boundingRect().height()); } - - } ChatScene::~ChatScene() { @@ -43,6 +41,15 @@ ChatScene::~ChatScene() { } +void ChatScene::setWidth(int w) { + _width = w; + int h = 0; + foreach(ChatLine *line, _lines) { + line->setPos(0, h); + h += line->setColumnWidths(60, 80, w - 60 - 80); + } + setSceneRect(QRectF(0, 0, w, h)); +} void ChatScene::mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ) { /* diff --git a/src/qtui/chatscene.h b/src/qtui/chatscene.h index 1ce9304d..8122872f 100644 --- a/src/qtui/chatscene.h +++ b/src/qtui/chatscene.h @@ -42,16 +42,16 @@ class ChatScene : public QGraphicsScene { inline MessageModel *model() const { return _model; } public slots: + void setWidth(int); protected slots: void mousePressEvent ( QGraphicsSceneMouseEvent * mouseEvent ); private: - //Buffer *_buffer; - //QList _lines; + int _width; MessageModel *_model; - QList _items; + QList _lines; }; diff --git a/src/qtui/chatview.cpp b/src/qtui/chatview.cpp index f76cf2ae..8551a83a 100644 --- a/src/qtui/chatview.cpp +++ b/src/qtui/chatview.cpp @@ -28,10 +28,11 @@ #include "quasselui.h" ChatView::ChatView(Buffer *buf, QWidget *parent) : QGraphicsView(parent), AbstractChatView() { + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); _scene = new ChatScene(Client::messageModel(), this); + _scene->setWidth(width()); setScene(_scene); - //QGraphicsTextItem *item = scene()->addText(buf->bufferInfo().bufferName()); } @@ -45,6 +46,10 @@ ChatScene *ChatView::scene() const { return _scene; } +void ChatView::resizeEvent(QResizeEvent *event) { + scene()->setWidth(event->size().width()); + +} void ChatView::clear() { diff --git a/src/qtui/chatview.h b/src/qtui/chatview.h index 7ae7c8dc..9799142d 100644 --- a/src/qtui/chatview.h +++ b/src/qtui/chatview.h @@ -53,6 +53,9 @@ class ChatView : public QGraphicsView, public AbstractChatView { void setContents(const QList &); + protected: + virtual void resizeEvent(QResizeEvent *event); + private: ChatScene *_scene; }; -- 2.20.1