// a) calling prepareGeometryChange() immediately before setColumns()
// b) calling Chatline::setPos() immediately afterwards
inline void setGeometry(qreal width, qreal height) {
+ prepareGeometryChange();
_boundingRect.setWidth(width);
_boundingRect.setHeight(height);
}
- inline void setHeight(const qreal &height) { _boundingRect.setHeight(height); }
- inline void setWidth(const qreal &width) { _boundingRect.setWidth(width); }
+ inline void setHeight(const qreal &height) {
+ prepareGeometryChange();
+ _boundingRect.setHeight(height);
+ }
+ inline void setWidth(const qreal &width) {
+ prepareGeometryChange();
+ _boundingRect.setWidth(width);
+ }
private:
// internal selection stuff
// NOTE: senderPos and contentsPos are in ChatLines coordinate system!
qreal ChatLine::setColumns(const qreal ×tampWidth, const qreal &senderWidth, const qreal &contentsWidth,
const QPointF &senderPos, const QPointF &contentsPos) {
- _height = _contentsItem.setGeometryByWidth(contentsWidth);
- _senderItem.setGeometry(senderWidth, _height);
- _timestampItem.setGeometry(timestampWidth, _height);
+ prepareGeometryChange();
+ qreal height = _contentsItem.setGeometryByWidth(contentsWidth);
+ _senderItem.setGeometry(senderWidth, height);
+ _timestampItem.setGeometry(timestampWidth, height);
_senderItem.setPos(senderPos);
_contentsItem.setPos(contentsPos);
_senderItem.clearLayout();
_timestampItem.clearLayout();
+
+ _height = height;
+
return _height;
}
// a) calling prepareGeometryChange() immediately before setColumns()
// b) calling Chatline::setPos() immediately afterwards
qreal ChatLine::setGeometryByWidth(const qreal &width, const qreal &contentsWidth) {
- _width = width;
- _height = _contentsItem.setGeometryByWidth(contentsWidth);
- _timestampItem.setHeight(_height);
- _senderItem.setHeight(_height);
+ prepareGeometryChange();
+ qreal height = _contentsItem.setGeometryByWidth(contentsWidth);
+ _timestampItem.setHeight(height);
+ _senderItem.setHeight(height);
_contentsItem.clearLayout();
+ _height = height;
+ _width = width;
return _height;
}
#include <QClipboard>
#include <QGraphicsSceneMouseEvent>
#include <QPersistentModelIndex>
+#include <QWebView>
#include "chatitem.h"
#include "chatline.h"
const qreal minContentsWidth = 200;
-class ClearWebPreviewEvent : public QEvent {
+class ChatScene::ClearWebPreviewEvent : public QEvent {
public:
- inline ClearWebPreviewEvent() : QEvent(QEvent::User) {}
+ inline ClearWebPreviewEvent() : QEvent((QEvent::Type)ChatScene::ClearWebPreviewEventType) {}
};
ChatScene::ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, QObject *parent)
webPreview.delayTimer.setSingleShot(true);
connect(&webPreview.delayTimer, SIGNAL(timeout()), this, SLOT(showWebPreview()));
+
+ // installEventFilter(this);
+ // setItemIndexMethod(QGraphicsScene::NoIndex);
}
ChatScene::~ChatScene() {
if(atBottom || (!atTop && !moveTop)) {
emit lastLineChanged(_lines.last(), h);
}
-
}
void ChatScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) {
void ChatScene::updateSceneRect(const QRectF &rect) {
_sceneRect = rect;
setSceneRect(rect);
+ update();
}
void ChatScene::customEvent(QEvent *event) {
- if(event->type() != QEvent::User)
+ switch(event->type()) {
+ case ClearWebPreviewEventType:
+ clearWebPreviewEvent((ClearWebPreviewEvent *)event);
+ break;
+ default:
return;
-
- event->accept();
- clearWebPreviewEvent();
+ }
}
void ChatScene::loadWebPreview(ChatItem *parentItem, const QString &url, const QRectF &urlRect) {
#endif
}
-void ChatScene::clearWebPreviewEvent() {
+void ChatScene::clearWebPreviewEvent(ClearWebPreviewEvent *event) {
#ifdef HAVE_WEBKIT
+ event->accept();
if(webPreview.previewItem) {
if(webPreview.previewItem->scene()) {
removeItem(webPreview.previewItem);
webPreview.urlRect = QRectF();
#endif
}
+
+bool ChatScene::eventFilter(QObject *watched, QEvent *event) {
+ qDebug() << watched << event;
+ return false;
+}
+
Q_OBJECT
public:
+ enum MyEventTypes {
+ ClearWebPreviewEventType = QEvent::User
+ };
+ class ClearWebPreviewEvent;
+
ChatScene(QAbstractItemModel *model, const QString &idString, qreal width, QObject *parent);
virtual ~ChatScene();
inline ColumnHandleItem *firstColumnHandle() const { return firstColHandle; }
inline ColumnHandleItem *secondColumnHandle() const { return secondColHandle; }
+ virtual bool eventFilter(QObject *watched, QEvent *event);
+
public slots:
void updateForViewport(qreal width, qreal height);
void setWidth(qreal, bool forceReposition = false);
private slots:
void handlePositionChanged(qreal xpos);
void showWebPreview();
- void clearWebPreviewEvent();
+ void clearWebPreviewEvent(ClearWebPreviewEvent *event);
private:
void setHandleXLimits();
connect(_scene, SIGNAL(sceneRectChanged(const QRectF &)), this, SLOT(sceneRectChanged(const QRectF &)));
connect(_scene, SIGNAL(lastLineChanged(QGraphicsItem *, qreal)), this, SLOT(lastLineChanged(QGraphicsItem *, qreal)));
setScene(_scene);
+ // installEventFilter(_scene);
connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(verticalScrollbarChanged(int)));
}